Compare commits

..
66 Commits
Author SHA1 Message Date
Ha Thach 97fbda552d Update changelog.md 2021-08-04 19:03:32 +07:00
Ha Thach 142ed6057a Merge pull request #214 from adafruit/fix-flash-51kb
Fix flash with more than 512kb
2021-08-04 18:02:01 +07:00
hathach 2f9ed3e447 more clean up 2021-08-04 16:57:06 +07:00
hathach 9e188d7370 update tinyusb 2021-08-04 16:39:05 +07:00
hathach dedbb74562 increase app reserved size to 40KB to match circuitpython for 840
along with other clean up
2021-08-04 16:35:42 +07:00
hathach eae198000c clean up
- mostly whitespace
- use ceil div
2021-08-03 23:17:57 +07:00
Ha Thach 80fca98113 Merge pull request #211 from DuMaM/update_for_gcc11
GCC 11 Build fixes
2021-07-05 13:22:11 +07:00
dumam a7fe7c98a3 Init header id with invalid value 2021-07-04 21:12:15 +02:00
dumam 6e33825e9f Init header without init whole buffer 2021-06-27 14:29:12 +02:00
dumam b1e0d2fd72 GCC 11 Fixes 2021-06-26 16:53:59 +02:00
Ha Thach 42d9d9fe9d Update changelog.md 2021-06-19 14:37:25 +07:00
Ha Thach 3f528bae0b Merge pull request #210 from adafruit/fix-usb-control-race
update tinyusb to fix control race condition
2021-06-19 14:32:55 +07:00
hathach 13118196d8 update tinyusb to fix control race condition 2021-06-19 14:26:35 +07:00
Ha Thach 6126d1192e Merge pull request #209 from y4m-y4m/master
Add makerdiary m60 keyboard (uses nrf52840_m2)
2021-06-15 00:21:24 +07:00
mfranck 627ce5d9a9 add makerdiary m60 keyboard to ci 2021-06-14 11:40:53 +02:00
mfranck a754296a8a add makerdiary m60 keyboard (uses nrf52840_m2) 2021-06-13 12:52:33 +02:00
Ha Thach 881dac1486 Merge pull request #208 from Nice-Keyboards/nice-nano-v2
Add support for nice!nano v2
2021-06-03 11:22:04 +07:00
Nick Winans 20a5b93402 Add support for nice!nano v2 2021-06-02 17:07:27 -05:00
hathach 2577833136 update changelog 2021-06-02 22:48:12 +07:00
hathach 0ec25a7add update pid for raytac dongle 2021-06-02 22:43:23 +07:00
Ha Thach 81240bfdb9 Merge pull request #206 from jpconstantineau/EByte-E104
EByte-E104: fix to LED direction
2021-05-31 10:07:10 +07:00
Ha Thach 7a728eeaa6 Merge pull request #207 from jpconstantineau/EByte-E73-TBB
EByte E73-TBB (nRF52832): Initial commit of bootloader
2021-05-31 10:05:03 +07:00
Pierre 398ede8f90 swap TX/RX 2021-05-30 16:16:09 -06:00
Pierre cef07b4eeb fix to LED direction 2021-05-30 16:04:33 -06:00
Pierre 0c086c2a4c Adding E73 Test board from EByte 2021-05-30 15:59:51 -06:00
Ha Thach 566410a7e2 Merge pull request #205 from jpconstantineau/EByte-E104
Adding EByte E104-BT5032A module
2021-05-30 14:55:35 +07:00
Pierre 0e87ce6e3e update to comments 2021-05-29 23:04:21 -06:00
Pierre 4c1344c612 fix to buttons 2021-05-29 23:04:14 -06:00
Pierre 4e54deb050 updated CI to include ebyte E104-BT5032A 2021-05-29 23:03:01 -06:00
Pierre 6755bd101c adding EByte E104-BT5032A Module 2021-05-29 23:02:54 -06:00
Ha Thach 7255b55ffe Merge pull request #204 from adafruit/minor-cleanup
clean up
2021-05-19 15:59:17 +07:00
hathach 12d36857c2 clean up 2021-05-12 10:45:15 +07:00
hathach a40d98dca2 add forum link in issue template 2021-04-22 10:43:49 +07:00
Ha Thach f33fdd2e5a Update bug_report.md 2021-04-22 10:40:43 +07:00
Ha Thach 0edf5175a9 Merge pull request #202 from aramcon-badge/aramcon2-badge
Add board definition files for ARAMCON 2 Badge
2021-04-18 21:42:41 +07:00
Benny Meisels 0a677620ab Add board definition files for ARAMCON 2 Badge 2021-04-18 10:07:22 +03:00
Ha Thach fc487794b3 Update changelog.md 2021-04-04 15:11:04 +07:00
Ha Thach 4f74d41871 Merge pull request #160 from KK1423/fix-paired-ota
Resolve OTA failure with bond shared from application
2021-04-04 15:09:01 +07:00
Ha Thach 77c7b7f6dc Merge pull request #200 from adafruit/release-0.5.0
update changelog for release
2021-04-04 15:06:31 +07:00
hathach 488c6c4463 update changelog for release
rename board to all lower case
2021-04-04 14:42:12 +07:00
Ha Thach f1b4740579 Merge pull request #196 from lyusupov/BUTTON_DFU_WAKEUP
Improvement/fix of system wake up by BUTTON_DFU GPIO
2021-04-04 14:31:45 +07:00
hathach 0098324683 skip DFU entirely with DFU_MAGIC_SKIP 2021-04-04 12:58:47 +07:00
hathach 26bafdcf24 Merge branch 'BUTTON_DFU_WAKEUP' of https://github.com/lyusupov/Adafruit_nRF52_Bootloader into lyusupov-BUTTON_DFU_WAKEUP 2021-04-02 23:14:02 +07:00
Ha Thach 5e6690e296 Merge pull request #194 from cmdwtf/board-add-sf-nrf52840-micromod
Add board 'sparkfun_nrf52840_micromod'.
2021-03-23 20:41:11 +07:00
Chris Dailey 78d0c3ae27 Update board.h
Adjust `UF2_BOARD_ID` to fit UF2 format.
2021-03-23 09:11:10 -04:00
Ha Thach 3895ffbda6 Merge pull request #197 from adafruit/update-tinyusb-0.9.0
update tinyusb to nclude nrf usb driver race condition fix
2021-03-19 16:27:53 +07:00
hathach a4b5aa4ad1 update tinyusb to include nrf usb driver race fix 2021-03-19 16:22:13 +07:00
hathach 84e843ac86 update tinyusb to 0.9.0 2021-03-16 23:17:32 +07:00
Linar Yusupov 0299cfedb5 Avoid entering into DFU mode upon wake up by BUTTON_DFU GPIO 2021-03-11 13:20:25 +03:00
Chris Dailey b404dabe15 Add sparkfun_nrf52840_micromod to CI 2021-03-09 13:03:07 -05:00
Chris Dailey d88ab7427a Updated sf micromod USB PIDs
As per the PIDs provide by TheHoff, [here](https://forum.sparkfun.com/viewtopic.php?p=223812#p223812)
2021-03-09 12:53:02 -05:00
nitz d481de3e00 Add SparkFun MicroMod nRF52840 to readme. 2021-03-07 01:04:04 -05:00
nitz 1a5df60739 Add board 'sparkfun_nrf52840_micromod'. 2021-03-07 00:56:50 -05:00
Ha Thach cb916d3087 Merge pull request #192 from jamesadevine/apa102
add support for APA102 LEDs
2021-03-04 23:45:34 +07:00
James Devine 0670265be0 Add ifdef guard for apa102 teardown 2021-03-03 12:47:27 +00:00
James Devine 6f7dc38d3c ifdef guard inclusion of nrf_spim 2021-03-02 23:41:45 +00:00
James Devine 91f16ade72 add support for APA102 LEDs 2021-03-02 23:32:01 +00:00
Ha Thach 81da515ae6 upload update uf2 separately in release 2021-02-17 16:19:09 +07:00
Ha Thach 3aaef724b2 release 0.4.1 2021-02-17 15:59:15 +07:00
Ha Thach ba5d783c20 Merge pull request #189 from glenne/master
Add USB connect timeout for app reset to UF2 or Serial via GPREGRET
2021-02-17 15:52:47 +07:00
Glenn Engel 755cfa95e4 Add USB connect timeout for app reset to UF2 or Serial via GPREGRET 2021-02-15 07:49:52 -08:00
Ha Thach b37c078213 Merge pull request #191 from adafruit/fix-ci-190
fix ci arm gcc install path
2021-02-15 14:16:53 +07:00
hathach ba5977d679 fix ci arm gcc install path 2021-02-15 14:07:20 +07:00
Ha Thach 4ba802d127 Merge pull request #186 from lyusupov/REGOUT0
fix against pollution of REGOUT0 reserved bits
2021-02-01 21:36:54 +07:00
Linar Yusupov f9125593b2 fix against pollution of REGOUT0 reserved bits 2021-01-30 12:27:52 +03:00
Karthik Karyamapudi 8ba551c07e Fix ota failure when paired 2020-08-17 17:26:16 -04:00
35 changed files with 861 additions and 300 deletions

No files matched your search

+13 -13
View File
@@ -1,32 +1,32 @@
---
name: Bug report
about: Create a report to help us improve
title: "[Bug]"
labels: ''
title: 'Please provide all details at least for Setup/Describe/Reproduce'
labels: 'Bug'
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**Set up (please complete the following information)**
**Set up**
- Your Board and BSP version
- Your OS (mac/windows/linux) and its version
- Serial debug log (enable IDE's Debug Mode Level to 1 or 2)
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
3. See error
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.
**Log**
If applicable, provide your Serial log. If the log is too long, attach it as txt file instead.
+4
View File
@@ -0,0 +1,4 @@
contact_links:
- name: Adafruit Support Forum
url: https://forums.adafruit.com
about: If you have other questions or need help, post it here.
+18 -4
View File
@@ -24,15 +24,19 @@ jobs:
- 'itsybitsy_nrf52840_express'
- 'metro_nrf52840_express'
# Alphabetical order
- 'ADM_B_NRF52840_1'
- 'adm_b_nrf52840_1'
- 'ae_bl652_bo'
- 'aramcon_badge_2019'
- 'aramcon2_badge'
- 'arcade_feather_nrf52840_express'
- 'arduino_nano_33_ble'
- 'bast_ble'
- 'bluemicro_nrf52840'
- 'ebyte_e104_bt5032a'
- 'ebyte_e73_tbb'
- 'electronut_labs_papyr'
- 'ikigaisense_vita'
- 'm60_keyboard'
- 'mdk_nrf52840_dongle'
- 'nice_nano'
- 'nrf52840_m2'
@@ -45,6 +49,7 @@ jobs:
- 'pca10100'
- 'pitaya_go'
- 'raytac_mdbt50q_rx'
- 'sparkfun_nrf52840_micromod'
- 'waveshare_nrf52840_eval'
steps:
@@ -66,7 +71,7 @@ jobs:
# 9.3.1-1.2.1 is xpack modified version which significantly increased compiled size to 6-7KB and cause flash overflow.
# Skip this version for now, we will try again with next official release from ARM
xpm install --global @xpack-dev-tools/arm-none-eabi-gcc@9.3.1-1.1.1
echo `echo $HOME/opt/xPacks/@xpack-dev-tools/arm-none-eabi-gcc/*/.content/bin` >> $GITHUB_PATH
echo `echo $HOME/.local/xPacks/@xpack-dev-tools/arm-none-eabi-gcc/*/.content/bin` >> $GITHUB_PATH
- name: Build
run: |
@@ -78,12 +83,11 @@ jobs:
name: ${{ matrix.board }}
path: _bin/${{ matrix.board }}
- name: Creat Release Asset
- name: Create Release Asset
if: ${{ github.event_name == 'release' }}
run: zip -jr ${{ matrix.board }}_bootloader-${{ github.event.release.tag_name }}.zip _bin/${{ matrix.board }}
- name: Upload Release Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -94,3 +98,13 @@ jobs:
asset_name: ${{ matrix.board }}_bootloader-${{ github.event.release.tag_name }}.zip
asset_content_type: application/zip
- name: Upload Release Asset for Self-Update
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: ${{ github.event_name == 'release' }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: _bin/${{ matrix.board }}/update-${{ matrix.board }}_bootloader-${{ github.event.release.tag_name }}_nosd.uf2
asset_name: update-${{ matrix.board }}_bootloader-${{ github.event.release.tag_name }}_nosd.uf2
asset_content_type: application/x-binary
+12 -11
View File
@@ -104,14 +104,17 @@ ifeq ($(MCU_SUB_VARIANT),nrf52)
SD_NAME = s132
DFU_DEV_REV = 0xADAF
CFLAGS += -DNRF52 -DNRF52832_XXAA -DS132
CFLAGS += -DDFU_APP_DATA_RESERVED=7*4096
else ifeq ($(MCU_SUB_VARIANT),nrf52833)
SD_NAME = s140
DFU_DEV_REV = 52840
CFLAGS += -DNRF52833_XXAA -DS140
CFLAGS += -DDFU_APP_DATA_RESERVED=7*4096
else ifeq ($(MCU_SUB_VARIANT),nrf52840)
SD_NAME = s140
DFU_DEV_REV = 52840
CFLAGS += -DNRF52840_XXAA -DS140
CFLAGS += -DDFU_APP_DATA_RESERVED=10*4096
else
$(error Sub Variant $(MCU_SUB_VARIANT) is unknown)
endif
@@ -232,15 +235,6 @@ IPATH += $(SD_PATH)/$(SD_FILENAME)_API/include/nrf52
# Compiler Flags
#------------------------------------------------------------------------------
# Debug option use RTT for printf
ifeq ($(DEBUG), 1)
RTT_SRC = lib/SEGGER_RTT
CFLAGS += -DCFG_DEBUG -DSEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
IPATH += $(RTT_SRC)/RTT
C_SRC += $(RTT_SRC)/RTT/SEGGER_RTT.c
endif
#flags common to all targets
CFLAGS += \
-mthumb \
@@ -286,14 +280,21 @@ ifneq ($(USE_NFCT),yes)
endif
CFLAGS += -DSOFTDEVICE_PRESENT
CFLAGS += -DDFU_APP_DATA_RESERVED=7*4096
CFLAGS += -DUF2_VERSION='"$(GIT_VERSION) $(GIT_SUBMODULE_VERSIONS)"'
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))'
# Debug option use RTT for printf
ifeq ($(DEBUG), 1)
RTT_SRC = lib/SEGGER_RTT
CFLAGS += -DCFG_DEBUG -DCFG_TUSB_DEBUG=1 -DSEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
IPATH += $(RTT_SRC)/RTT
C_SRC += $(RTT_SRC)/RTT/SEGGER_RTT.c
endif
#------------------------------------------------------------------------------
# Linker Flags
#------------------------------------------------------------------------------
+22 -5
View File
@@ -20,6 +20,7 @@ This is a CDC/DFU/UF2 bootloader for nRF52 boards.
- Particle Argon
- Particle Boron
- Particle Xenon
- [SparkFun MicroMod nRF52840](https://www.sparkfun.com/products/16984)
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.
@@ -57,6 +58,14 @@ There are two pins, `DFU` and `FRST` that bootloader will check upon reset/power
- 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.
```c
#include "nrf_nvic.h"
void reset_to_uf2(void) {
NRF_POWER->GPREGRET = 0x57; // 0xA8 OTA, 0x4e Serial
NVIC_SystemReset(); // or sd_nvic_SystemReset();
}
```
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.
@@ -69,7 +78,7 @@ 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 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:
```
@@ -105,6 +114,15 @@ You must have have a J-Link available to "unbrick" your device.
Prerequisites
- ARM GCC
To install for macos
```bash
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
brew link --overwrite arm-none-eabi-gcc # if a prior version was present
```
- Nordic's [nRF5x Command Line Tools](https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Command-Line-Tools)
- [Python IntelHex](https://pypi.org/project/IntelHex/)
@@ -148,7 +166,7 @@ Makefile:90: *** BOARD not defined. Stop
If you get the following error ...
```
$ make BOARD=feather_nrf52840_express all
$ 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
@@ -160,6 +178,8 @@ the variable `CROSS_COMPILE` as below:
$ make CROSS_COMPILE=/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi- BOARD=feather_nrf52832 all
```
For other compile errors, check the gcc version with `arm-none-eabi-gcc --version` to insure it is at least 9.x.
#### 2. `ModuleNotFoundError: No module named 'intelhex'`
Install python-intelhex with
@@ -169,9 +189,6 @@ pip install intelhex
```
#### 3. `make: nrfjprog: No such file or directory`
Make sure that `nrfjprog` is available from the command-line. This binary is
+26
View File
@@ -1,5 +1,31 @@
# Adafruit nRF52 Bootloader Changelog
## 0.6.1 - 2021.08.04
- Fix failed to upgrade ssue when flashing uf2 with more than 512KB payload
- Increased application reserved from 28KB to 40KB for nrf52840 to match circuitpython usage.
## 0.6.0 - 2021.06.19
- Update tinyusb to latest to fix the race condition with control transfer, which could cause failed to connect to DFU Serial occasionally.
## 0.5.1 - 2021.06.02
- more boards support
## 0.5.0 - 2021.04.04
- Update tinyusb to latest to fix the race condition causing cdc out dropping packet. Which cause DFU failed occasionally
- Add support for Dotstar LED (APA102)
- Add sparkfun_nrf52840_micromod board
- Allow skipping DFU entirely when reset or wakeup from deep sleep
- Fix an issue with OTA when using shared bond with application
## 0.4.1 - 2021.02.17
- Add USB connect timeout for app reset to UF2 or Serial via GPREGRET
- Fix pollution of REGOUT0 reserved bits
## 0.4.0 - 2021.01.19
- Decouple bootloader and softdevice i.e bootloader will always work with and/or without softdevice present. This allows application to pack firmware + softdevice into an uf2/serial for DFU.
@@ -463,7 +463,7 @@ uint32_t ble_dfu_init(ble_dfu_t * p_dfu, ble_dfu_init_t * p_dfu_init)
p_dfu->conn_handle = BLE_CONN_HANDLE_INVALID;
ble_uuid_t service_uuid;
ble_uuid_t service_uuid = {0};
uint32_t err_code;
const ble_uuid128_t base_uuid128 =
@@ -207,153 +207,151 @@ void bootloader_dfu_update_process(dfu_update_status_t update_status)
__attribute__((aligned(4))) static bootloader_settings_t settings;
bootloader_settings_t const * p_bootloader_settings;
bootloader_util_settings_get(&p_bootloader_settings);
bootloader_util_settings_get(&p_bootloader_settings);
if (update_status.status_code == DFU_UPDATE_APP_COMPLETE)
if (update_status.status_code == DFU_UPDATE_APP_COMPLETE)
{
settings.bank_0_crc = update_status.app_crc;
settings.bank_0_size = update_status.app_size;
settings.bank_0 = BANK_VALID_APP;
settings.bank_1 = BANK_INVALID_APP;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_UPDATE_SD_COMPLETE)
{
settings.bank_0_crc = update_status.app_crc;
settings.bank_0_size = update_status.sd_size + update_status.bl_size + update_status.app_size;
settings.bank_0 = BANK_VALID_SD;
settings.bank_1 = BANK_INVALID_APP;
settings.sd_image_size = update_status.sd_size;
settings.bl_image_size = update_status.bl_size;
settings.app_image_size = update_status.app_size;
settings.sd_image_start = update_status.sd_image_start;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_UPDATE_BOOT_COMPLETE)
{
settings.bank_0 = p_bootloader_settings->bank_0;
settings.bank_0_crc = p_bootloader_settings->bank_0_crc;
settings.bank_0_size = p_bootloader_settings->bank_0_size;
settings.bank_1 = BANK_VALID_BOOT;
settings.sd_image_size = update_status.sd_size;
settings.bl_image_size = update_status.bl_size;
settings.app_image_size = update_status.app_size;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_UPDATE_SD_SWAPPED)
{
if (p_bootloader_settings->bank_0 == BANK_VALID_SD)
{
settings.bank_0_crc = update_status.app_crc;
settings.bank_0_size = update_status.app_size;
settings.bank_0 = BANK_VALID_APP;
settings.bank_1 = BANK_INVALID_APP;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_UPDATE_SD_COMPLETE)
{
settings.bank_0_crc = update_status.app_crc;
settings.bank_0_size = update_status.sd_size +
update_status.bl_size +
update_status.app_size;
settings.bank_0 = BANK_VALID_SD;
settings.bank_1 = BANK_INVALID_APP;
settings.sd_image_size = update_status.sd_size;
settings.bl_image_size = update_status.bl_size;
settings.app_image_size = update_status.app_size;
settings.sd_image_start = update_status.sd_image_start;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_UPDATE_BOOT_COMPLETE)
{
settings.bank_0 = p_bootloader_settings->bank_0;
settings.bank_0_crc = p_bootloader_settings->bank_0_crc;
settings.bank_0_size = p_bootloader_settings->bank_0_size;
settings.bank_1 = BANK_VALID_BOOT;
settings.sd_image_size = update_status.sd_size;
settings.bl_image_size = update_status.bl_size;
settings.app_image_size = update_status.app_size;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_UPDATE_SD_SWAPPED)
{
if (p_bootloader_settings->bank_0 == BANK_VALID_SD)
{
settings.bank_0_crc = 0;
settings.bank_0_size = 0;
settings.bank_0 = BANK_INVALID_APP;
}
// This handles cases where SoftDevice was not updated, hence bank0 keeps its settings.
else
{
settings.bank_0 = p_bootloader_settings->bank_0;
settings.bank_0_crc = p_bootloader_settings->bank_0_crc;
settings.bank_0_size = p_bootloader_settings->bank_0_size;
}
settings.bank_1 = BANK_INVALID_APP;
settings.sd_image_size = 0;
settings.bl_image_size = 0;
settings.app_image_size = 0;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_TIMEOUT)
{
// Timeout has occurred. Close the connection with the DFU Controller.
uint32_t err_code;
if ( is_ota() )
{
err_code = dfu_transport_ble_close();
}else
{
err_code = dfu_transport_serial_close();
}
APP_ERROR_CHECK(err_code);
m_update_status = BOOTLOADER_TIMEOUT;
}
else if (update_status.status_code == DFU_BANK_0_ERASED)
{
settings.bank_0_crc = 0;
settings.bank_0_size = 0;
settings.bank_0 = BANK_INVALID_APP;
settings.bank_1 = p_bootloader_settings->bank_1;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_RESET)
{
m_update_status = BOOTLOADER_RESET;
settings.bank_0_crc = 0;
settings.bank_0_size = 0;
settings.bank_0 = BANK_INVALID_APP;
}
// This handles cases where SoftDevice was not updated, hence bank0 keeps its settings.
else
{
// No implementation needed.
settings.bank_0 = p_bootloader_settings->bank_0;
settings.bank_0_crc = p_bootloader_settings->bank_0_crc;
settings.bank_0_size = p_bootloader_settings->bank_0_size;
}
settings.bank_1 = BANK_INVALID_APP;
settings.sd_image_size = 0;
settings.bl_image_size = 0;
settings.app_image_size = 0;
m_update_status = BOOTLOADER_SETTINGS_SAVING;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_TIMEOUT)
{
// Timeout has occurred. Close the connection with the DFU Controller.
uint32_t err_code;
if ( is_ota() )
{
err_code = dfu_transport_ble_close();
}else
{
err_code = dfu_transport_serial_close();
}
APP_ERROR_CHECK(err_code);
m_update_status = BOOTLOADER_TIMEOUT;
}
else if (update_status.status_code == DFU_BANK_0_ERASED)
{
settings.bank_0_crc = 0;
settings.bank_0_size = 0;
settings.bank_0 = BANK_INVALID_APP;
settings.bank_1 = p_bootloader_settings->bank_1;
bootloader_settings_save(&settings);
}
else if (update_status.status_code == DFU_RESET)
{
m_update_status = BOOTLOADER_RESET;
}
else
{
// No implementation needed.
}
}
uint32_t bootloader_init(void)
{
uint32_t err_code;
pstorage_module_param_t storage_params = {.cb = pstorage_callback_handler};
uint32_t err_code;
pstorage_module_param_t storage_params = {.cb = pstorage_callback_handler};
err_code = pstorage_init();
VERIFY_SUCCESS(err_code);
err_code = pstorage_init();
VERIFY_SUCCESS(err_code);
m_bootsettings_handle.block_id = BOOTLOADER_SETTINGS_ADDRESS;
err_code = pstorage_register(&storage_params, &m_bootsettings_handle);
m_bootsettings_handle.block_id = BOOTLOADER_SETTINGS_ADDRESS;
err_code = pstorage_register(&storage_params, &m_bootsettings_handle);
return err_code;
return err_code;
}
uint32_t bootloader_dfu_start(bool ota, uint32_t timeout_ms, bool cancel_timeout_on_usb)
{
uint32_t err_code;
uint32_t err_code;
m_cancel_timeout_on_usb = cancel_timeout_on_usb && !ota;
m_cancel_timeout_on_usb = cancel_timeout_on_usb && !ota;
// Clear swap if banked update is used.
err_code = dfu_init();
VERIFY_SUCCESS(err_code);
// Clear swap if banked update is used.
err_code = dfu_init();
VERIFY_SUCCESS(err_code);
if ( ota )
if ( ota )
{
err_code = dfu_transport_ble_update_start();
}else
{
// DFU mode with timeout can be
// - Forced startup DFU for nRF52832 or
// - Makecode single tap reset but no enumerated (battery power)
if ( timeout_ms )
{
err_code = dfu_transport_ble_update_start();
}else
{
// DFU mode with timeout can be
// - Forced startup DFU for nRF52832 or
// - Makecode single tap reset but no enumerated (battery power)
if ( timeout_ms )
{
dfu_startup_packet_received = false;
dfu_startup_packet_received = false;
app_timer_create(&_dfu_startup_timer, APP_TIMER_MODE_SINGLE_SHOT, dfu_startup_timer_handler);
app_timer_start(_dfu_startup_timer, APP_TIMER_TICKS(timeout_ms), NULL);
}
err_code = dfu_transport_serial_update_start();
app_timer_create(&_dfu_startup_timer, APP_TIMER_MODE_SINGLE_SHOT, dfu_startup_timer_handler);
app_timer_start(_dfu_startup_timer, APP_TIMER_TICKS(timeout_ms), NULL);
}
wait_for_events();
err_code = dfu_transport_serial_update_start();
}
return err_code;
wait_for_events();
return err_code;
}
void bootloader_app_start(void)
@@ -408,55 +406,55 @@ bool bootloader_dfu_sd_in_progress(void)
{
bootloader_settings_t const * p_bootloader_settings;
bootloader_util_settings_get(&p_bootloader_settings);
bootloader_util_settings_get(&p_bootloader_settings);
if (p_bootloader_settings->bank_0 == BANK_VALID_SD ||
p_bootloader_settings->bank_1 == BANK_VALID_BOOT)
{
return true;
}
if (p_bootloader_settings->bank_0 == BANK_VALID_SD ||
p_bootloader_settings->bank_1 == BANK_VALID_BOOT)
{
return true;
}
return false;
return false;
}
uint32_t bootloader_dfu_sd_update_continue(void)
{
uint32_t err_code;
uint32_t err_code;
if ((dfu_sd_image_validate() == NRF_SUCCESS) &&
(dfu_bl_image_validate() == NRF_SUCCESS))
{
return NRF_SUCCESS;
}
if ((dfu_sd_image_validate() == NRF_SUCCESS) &&
(dfu_bl_image_validate() == NRF_SUCCESS))
{
return NRF_SUCCESS;
}
// Ensure that flash operations are not executed within the first 100 ms seconds to allow
// a debugger to be attached.
NRFX_DELAY_MS(100);
// Ensure that flash operations are not executed within the first 100 ms seconds to allow
// a debugger to be attached.
NRFX_DELAY_MS(100);
err_code = dfu_sd_image_swap();
APP_ERROR_CHECK(err_code);
err_code = dfu_sd_image_swap();
APP_ERROR_CHECK(err_code);
err_code = dfu_sd_image_validate();
APP_ERROR_CHECK(err_code);
err_code = dfu_sd_image_validate();
APP_ERROR_CHECK(err_code);
err_code = dfu_bl_image_swap();
APP_ERROR_CHECK(err_code);
err_code = dfu_bl_image_swap();
APP_ERROR_CHECK(err_code);
return err_code;
return err_code;
}
uint32_t bootloader_dfu_sd_update_finalize(void)
{
dfu_update_status_t update_status = { 0 };
update_status.status_code = DFU_UPDATE_SD_SWAPPED;
dfu_update_status_t update_status = { 0 };
update_status.status_code = DFU_UPDATE_SD_SWAPPED;
bootloader_dfu_update_process(update_status);
bootloader_dfu_update_process(update_status);
wait_for_events();
wait_for_events();
return NRF_SUCCESS;
return NRF_SUCCESS;
}
@@ -464,14 +462,14 @@ void bootloader_settings_get(bootloader_settings_t * const p_settings)
{
bootloader_settings_t const * p_bootloader_settings;
bootloader_util_settings_get(&p_bootloader_settings);
bootloader_util_settings_get(&p_bootloader_settings);
p_settings->bank_0 = p_bootloader_settings->bank_0;
p_settings->bank_0_crc = p_bootloader_settings->bank_0_crc;
p_settings->bank_0_size = p_bootloader_settings->bank_0_size;
p_settings->bank_1 = p_bootloader_settings->bank_1;
p_settings->sd_image_size = p_bootloader_settings->sd_image_size;
p_settings->bl_image_size = p_bootloader_settings->bl_image_size;
p_settings->app_image_size = p_bootloader_settings->app_image_size;
p_settings->sd_image_start = p_bootloader_settings->sd_image_start;
p_settings->bank_0 = p_bootloader_settings->bank_0;
p_settings->bank_0_crc = p_bootloader_settings->bank_0_crc;
p_settings->bank_0_size = p_bootloader_settings->bank_0_size;
p_settings->bank_1 = p_bootloader_settings->bank_1;
p_settings->sd_image_size = p_bootloader_settings->sd_image_size;
p_settings->bl_image_size = p_bootloader_settings->bl_image_size;
p_settings->app_image_size = p_bootloader_settings->app_image_size;
p_settings->sd_image_start = p_bootloader_settings->sd_image_start;
}
@@ -101,8 +101,8 @@ static void dfu_prepare_func_app_erase(uint32_t image_size)
}
else
{
uint32_t page_count = m_image_size / CODE_PAGE_SIZE;
if ( m_image_size % CODE_PAGE_SIZE ) page_count++;
// ceil div
uint32_t const page_count = NRFX_CEIL_DIV(m_image_size, CODE_PAGE_SIZE);
for ( uint32_t i = 0; i < page_count; i++ )
{
@@ -148,6 +148,7 @@ static uint32_t service_change_indicate()
err_code = sd_ble_gatts_service_changed(m_conn_handle, DFU_SERVICE_HANDLE, BLE_HANDLE_MAX);
if ((err_code == BLE_ERROR_INVALID_CONN_HANDLE) ||
(err_code == BLE_ERROR_INVALID_ATTR_HANDLE) ||
(err_code == NRF_ERROR_INVALID_STATE) ||
(err_code == NRF_ERROR_BUSY))
{
@@ -47,14 +47,14 @@ static inline bool is_sd_existed(void)
#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)
// Flash = 512 KB
#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_MBR_PARAMS_PAGE_ADDRESS 0x0007E000 /**< The field specifies the page location of the mbr params page address. */
#define BOOTLOADER_SETTINGS_ADDRESS 0x0007F000 /**< The field specifies the page location of the bootloader settings address. */
// Flash = 1024 KB
#elif defined(NRF52840_XXAA)
// Flash = 1024 KB
#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. */
#define BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS 0x000FE000 /**< The field specifies the page location of the mbr params page address. */
#define BOOTLOADER_SETTINGS_ADDRESS 0x000FF000 /**< The field specifies the page location of the bootloader settings address. */
@@ -66,18 +66,12 @@ static inline bool is_sd_existed(void)
#define DFU_REGION_TOTAL_SIZE (BOOTLOADER_REGION_START - CODE_REGION_1_START) /**< Total size of the region between SD and Bootloader. */
#ifndef DFU_APP_DATA_RESERVED
#define DFU_APP_DATA_RESERVED CODE_PAGE_SIZE*7 /**< Size of Application Data that must be preserved between application updates. This value must be a multiple of page size. Page size is 0x400 (1024d) bytes, thus this value must be 0x0000, 0x0400, 0x0800, 0x0C00, 0x1000, etc. */
#error "DFU_APP_DATA_RESERVED is not defined"
#endif
#define DFU_IMAGE_MAX_SIZE_FULL (DFU_REGION_TOTAL_SIZE - DFU_APP_DATA_RESERVED) /**< Maximum size of an application, excluding save data from the application. */
#define DFU_IMAGE_MAX_SIZE_BANKED (((DFU_IMAGE_MAX_SIZE_FULL) - \
(DFU_IMAGE_MAX_SIZE_FULL % (2 * CODE_PAGE_SIZE)))/2) /**< Maximum size of an application, excluding save data from the application. */
#define DFU_BL_IMAGE_MAX_SIZE (BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS - BOOTLOADER_REGION_START) /**< Maximum size of a bootloader, excluding save data from the current bootloader. */
#define DFU_BL_IMAGE_MAX_SIZE (BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS - BOOTLOADER_REGION_START) /**< Maximum size of a bootloader, excluding save data from the current bootloader. */
#define DFU_BANK_0_REGION_START CODE_REGION_1_START /**< Bank 0 region start. */
#define DFU_BANK_1_REGION_START (DFU_BANK_0_REGION_START + DFU_IMAGE_MAX_SIZE_BANKED) /**< Bank 1 region start. */
#define EMPTY_FLASH_MASK 0xFFFFFFFF /**< Bit mask that defines an empty address in flash. */
+2 -2
View File
@@ -11,9 +11,9 @@ 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 = 0xFE000-0xF4000-2048 /* 38 KB */
FLASH (rx) : ORIGIN = 0xF4000, LENGTH = 0xFE000-0xF4000 - 2K /* 38 KB */
BOOTLOADER_CONFIG (r): ORIGIN = 0xFE000 - 2048, LENGTH = 2048
BOOTLOADER_CONFIG (r): ORIGIN = 0xFE000 - 2K, LENGTH = 2K
/** Location of mbr params page in flash. */
MBR_PARAMS_PAGE (rw) : ORIGIN = 0xFE000, LENGTH = 0x1000
File renamed without changes.
File renamed without changes.
+65
View File
@@ -0,0 +1,65 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2021 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 _ARAMCON2_BADGE_H
#define _ARAMCON2_BADGE_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 2
#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
// Used as model string in OTA mode
#define BLEDIS_MANUFACTURER "ARAMCON Badge Team"
#define BLEDIS_MODEL "ARAMCON2 Badge"
//--------------------------------------------------------------------+
// USB
//--------------------------------------------------------------------+
#define USB_DESC_VID 0x239A
#define USB_DESC_UF2_PID 0x007B
#define USB_DESC_CDC_ONLY_PID 0x007B
//------------- UF2 -------------//
#define UF2_PRODUCT_NAME "ARAMCON2 Badge"
#define UF2_VOLUME_LABEL "ARAMBOOT"
#define UF2_BOARD_ID "nrf52840-ARAMCON2-Badge"
#define UF2_INDEX_URL "https://github.com/aramcon-badge"
#endif // _ARAMCON2_BADGE_H
+1
View File
@@ -0,0 +1 @@
MCU_SUB_VARIANT = nrf52840
+19
View File
@@ -0,0 +1,19 @@
#include "boards.h"
#include "uf2/configkeys.h"
__attribute__((used, section(".bootloaderConfig")))
const uint32_t bootloaderConfig[] =
{
/* CF2 START */
CFG_MAGIC0, CFG_MAGIC1, // magic
5, 100, // used entries, total entries
204, 0x100000, // FLASH_BYTES = 0x100000
205, 0x40000, // RAM_BYTES = 0x40000
208, (USB_DESC_VID << 16) | USB_DESC_UF2_PID, // BOOTLOADER_BOARD_ID = USB VID+PID, used for verification when updating bootloader via uf2
209, 0xada52840, // UF2_FAMILY = 0xada52840
210, 0x20, // PINS_PORT_SIZE = PA_32
0, 0, 0, 0, 0, 0, 0, 0
/* CF2 END */
};
+100 -7
View File
@@ -27,13 +27,17 @@
#include "app_scheduler.h"
#include "app_timer.h"
#ifdef LED_APA102
#include "nrf_spim.h"
#endif
//--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
//--------------------------------------------------------------------+
#define SCHED_MAX_EVENT_DATA_SIZE sizeof(app_timer_event_t) /**< Maximum size of scheduler events. */
#define SCHED_QUEUE_SIZE 30 /**< Maximum number of events in the scheduler queue. */
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN)
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN) || defined(LED_APA102)
void neopixel_init(void);
void neopixel_write(uint8_t *pixels);
void neopixel_teardown(void);
@@ -71,14 +75,15 @@ void board_init(void)
button_init(BUTTON_FRESET);
NRFX_DELAY_US(100); // wait for the pin state is stable
#if LEDS_NUMBER > 0
// use PMW0 for LED RED
led_pwm_init(LED_PRIMARY, LED_PRIMARY_PIN);
#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)
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN) || defined(LED_APA102)
neopixel_init();
#endif
@@ -94,11 +99,13 @@ void board_init(void)
// #define UICR_REGOUT0_VALUE UICR_REGOUT0_VOUT_3V3
// in board.h when using that power configuration.
#ifdef UICR_REGOUT0_VALUE
if (NRF_UICR->REGOUT0 != UICR_REGOUT0_VALUE)
if ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) !=
(UICR_REGOUT0_VALUE << UICR_REGOUT0_VOUT_Pos))
{
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_UICR->REGOUT0 = UICR_REGOUT0_VALUE;
NRF_UICR->REGOUT0 = (NRF_UICR->REGOUT0 & ~((uint32_t)UICR_REGOUT0_VOUT_Msk)) |
(UICR_REGOUT0_VALUE << UICR_REGOUT0_VOUT_Pos);
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
@@ -124,9 +131,11 @@ void board_teardown(void)
SysTick->CTRL = 0;
// Disable and reset PWM for LEDs
#if LEDS_NUMBER > 0
led_pwm_teardown();
#endif
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN)
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN) || defined(LED_APA102)
neopixel_teardown();
#endif
@@ -315,7 +324,7 @@ void led_state(uint32_t state)
} else if (temp_color_active) {
final_color = (uint8_t*)&rgb_color;
}
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN)
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN) || defined(LED_APA102)
if (final_color != NULL) {
neopixel_write(final_color);
}
@@ -430,6 +439,90 @@ void neopixel_write (uint8_t *pixels)
}
#endif
#ifdef LED_APA102
#define BYTE_PER_PIXEL 4
// 4 zero bytes are required to initiate update
#define PATTERN_SIZE() ((APA102_NUMBER*BYTE_PER_PIXEL) + 4)
// N/2 * 1 bits are required at the end
static uint8_t pixels_pattern[PATTERN_SIZE() + 4];
// use SPIM1 for dotstar
void neopixel_init(void)
{
NRF_SPIM_Type* spi = NRF_SPIM1;
nrf_spim_disable(spi);
nrf_gpio_pin_set(LED_APA102_CLK);
nrf_gpio_cfg(LED_APA102_CLK,
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(LED_APA102_DATA);
nrf_gpio_cfg_output(LED_APA102_DATA);
nrf_spim_pins_set(spi, LED_APA102_CLK, LED_APA102_DATA, 0xFFFFFFFF);
nrf_spim_frequency_set(spi, NRF_SPIM_FREQ_4M);
nrf_spim_configure(spi, NRF_SPIM_MODE_3, NRF_SPIM_BIT_ORDER_MSB_FIRST);
nrf_spim_orc_set(spi, 0);
nrf_spim_tx_list_disable(spi);
// Enable the spi
nrf_spim_enable(spi);
uint8_t rgb[3] = {0, 0, 0 };
neopixel_write(rgb);
}
void neopixel_teardown(void)
{
uint8_t rgb[3] = {0, 0, 0 };
neopixel_write(rgb);
NRF_SPIM_Type* spi = NRF_SPIM1;
nrf_spim_disable(spi);
}
// write 3 bytes color RGB to built-in neopixel
void neopixel_write (uint8_t *pixels)
{
NRF_SPIM_Type* spi = NRF_SPIM1;
//brightness, blue, green, red
uint8_t bbgr[BYTE_PER_PIXEL] = {0xE0 | LED_APA102_BRIGHTNESS, pixels[0], pixels[1], pixels[2]};
pixels_pattern[0] = 0;
pixels_pattern[1] = 0;
pixels_pattern[2] = 0;
pixels_pattern[3] = 0;
for (uint8_t i = 4; i < PATTERN_SIZE(); i+=4) {
pixels_pattern[i] = bbgr[0];
pixels_pattern[i+1] = bbgr[1];
pixels_pattern[i+2] = bbgr[2];
pixels_pattern[i+3] = bbgr[3];
}
pixels_pattern[PATTERN_SIZE()] = 0xff;
pixels_pattern[PATTERN_SIZE()+1] = 0xff;
pixels_pattern[PATTERN_SIZE()+2] = 0xff;
pixels_pattern[PATTERN_SIZE()+3] = 0xff;
nrf_spim_tx_buffer_set(spi, pixels_pattern, PATTERN_SIZE() + 4);
nrf_spim_event_clear(spi, NRF_SPIM_EVENT_ENDTX);
nrf_spim_task_trigger(spi, NRF_SPIM_TASK_START);
while(!nrf_spim_event_check(spi, NRF_SPIM_EVENT_ENDTX));
}
#endif
#if defined(LED_RGB_RED_PIN) && defined(LED_RGB_GREEN_PIN) && defined(LED_RGB_BLUE_PIN)
#ifdef LED_SECONDARY_PIN
+66
View File
@@ -0,0 +1,66 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2021 Pierre Constantineau
*
* 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 _EBYTE_E104_BT5032A_H
#define _EBYTE_E104_BT5032A_H
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
#define LEDS_NUMBER 2
#define LED_PRIMARY_PIN 31 // Red - named "Data"
#define LED_SECONDARY_PIN 30 // Blue - named "Link" (also a red one on the Test Board)
#define LED_STATE_ON 0
/*------------------------------------------------------------------*/
/* BUTTON
*------------------------------------------------------------------*/
#define BUTTONS_NUMBER 2
#define BUTTON_1 29 // DISC Button on E104-BT5032A-TB Test Board
// BUTTON_1 is DFU. The module does not have reset circuitry.
// The Test Board from Ebyte (E104-BT5032A-TB) also does not have reset circuitry
// To be able to upload using the Arduino IDE, (To enter DFU mode)
// Press "DISC", press and release "RST", then release "DISC"
#define BUTTON_2 28 // No button - WKP pin
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
/*------------------------------------------------------------------*/
/* UART (only used by nRF52832)
*------------------------------------------------------------------*/
#define RX_PIN_NUMBER 14
#define TX_PIN_NUMBER 18
#define CTS_PIN_NUMBER 20
#define RTS_PIN_NUMBER 19
#define HWFC false // leaving it false to make GPIO available
//--------------------------------------------------------------------+
// BLE OTA
//--------------------------------------------------------------------+
#define BLEDIS_MANUFACTURER "CDEBYTE"
#define BLEDIS_MODEL "E104-BT5032A"
#define UF2_PRODUCT_NAME "Ebyte E104-BT5032A nRF52832"
#define UF2_INDEX_URL "https://www.ebyte.com/en/product-view-news.html?id=756"
#endif // _EBYTE_E104_BT5032A_H
+2
View File
@@ -0,0 +1,2 @@
# nrf52 is nrf52832
MCU_SUB_VARIANT = nrf52
+67
View File
@@ -0,0 +1,67 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2021 Pierre Constantineau
*
* 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 _EBYTE_E73_TBB_H
#define _EBYTE_E73_TBB_H
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
#define LEDS_NUMBER 2
#define LED_PRIMARY_PIN 17 // Red - named "LED1"
#define LED_SECONDARY_PIN 18 // Blue - named "LED2" (also a red one on the Test Board)
#define LED_STATE_ON 0
/*------------------------------------------------------------------*/
/* BUTTON
*------------------------------------------------------------------*/
#define BUTTONS_NUMBER 2
#define BUTTON_1 14 // BUTTON_1 is DFU. SW1 on E73-TBB Test Board.
// This Test board uses the E73-2G4M04S1B module which contains a nrf52832.
// The module does not have reset circuitry.
// The Test Board from Ebyte (E73-TBB) also does not have reset circuitry
// To be able to upload using the Arduino IDE, (To enter DFU mode)
// Press "SW1", momentarily ground "RST/P0.21", then release "SW1"
#define BUTTON_2 13 // SW2 on board
#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 5
#define RTS_PIN_NUMBER 7
#define HWFC false // leaving it false to make GPIO available
//--------------------------------------------------------------------+
// BLE OTA
//--------------------------------------------------------------------+
#define BLEDIS_MANUFACTURER "CDEBYTE"
#define BLEDIS_MODEL "E73-TBB"
#define UF2_PRODUCT_NAME "Ebyte E73-TBB nRF52832"
#define UF2_INDEX_URL "https://www.ebyte.com/en/product-view-news.aspx?id=889"
#endif // _EBYTE_E73_TBB_H
+2
View File
@@ -0,0 +1,2 @@
# nrf52 is nrf52832
MCU_SUB_VARIANT = nrf52
+71
View File
@@ -0,0 +1,71 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2020 Yihui Xiong for Makerdiary
*
* 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 _MAKERDIARY_M60_KEYBOARD_H_
#define _MAKERDIARY_M60_KEYBOARD_H_
#define _PINNUM(port, pin) ((port)*32 + (pin))
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
#define LEDS_NUMBER 1
#define LED_PRIMARY_PIN _PINNUM(0, 30) // Red
#define LED_STATE_ON 0
#define LED_RGB_RED_PIN _PINNUM(0, 30)
#define LED_RGB_GREEN_PIN _PINNUM(0, 29)
#define LED_RGB_BLUE_PIN _PINNUM(0, 31)
#define BOARD_RGB_BRIGHTNESS 0x404040
/*------------------------------------------------------------------*/
/* BUTTON
*------------------------------------------------------------------*/
#define BUTTONS_NUMBER 2
#define BUTTON_1 _PINNUM(0, 27)
#define BUTTON_2 _PINNUM(1, 7)
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
//--------------------------------------------------------------------+
// BLE OTA
//--------------------------------------------------------------------+
#define BLEDIS_MANUFACTURER "Makerdiary"
#define BLEDIS_MODEL "M60 Mechanical Keyboard"
//--------------------------------------------------------------------+
// USB
//--------------------------------------------------------------------+
#define USB_DESC_VID 0x2886
#define USB_DESC_UF2_PID 0xF00F
#define USB_DESC_CDC_ONLY_PID 0xF00F
//--------------------------------------------------------------------+
// UF2
//--------------------------------------------------------------------+
#define UF2_PRODUCT_NAME "MakerDiary M60 Mechanical Keyboard"
#define UF2_VOLUME_LABEL "M60KEYBOARD"
#define UF2_BOARD_ID "M60KEYBOARD"
#define UF2_INDEX_URL "https://wiki.makerdiary.com/m60/"
#endif /* _MAKERDIARY_M60_KEYBOARD_H_ */
+2
View File
@@ -0,0 +1,2 @@
MCU_SUB_VARIANT = nrf52840
USE_NFCT = yes
+19
View File
@@ -0,0 +1,19 @@
#include "boards.h"
#include "uf2/configkeys.h"
__attribute__((used, section(".bootloaderConfig")))
const uint32_t bootloaderConfig[] =
{
/* CF2 START */
CFG_MAGIC0, CFG_MAGIC1, // magic
5, 100, // used entries, total entries
204, 0x100000, // FLASH_BYTES = 0x100000
205, 0x40000, // RAM_BYTES = 0x40000
208, (USB_DESC_VID << 16) | USB_DESC_UF2_PID, // BOOTLOADER_BOARD_ID = USB VID+PID, used for verification when updating bootloader via uf2
209, 0xada52840, // UF2_FAMILY = 0xada52840
210, 0x20, // PINS_PORT_SIZE = PA_32
0, 0, 0, 0, 0, 0, 0, 0
/* CF2 END */
};
+4 -2
View File
@@ -27,6 +27,8 @@
#define _PINNUM(port, pin) ((port)*32 + (pin))
#define UICR_REGOUT0_VALUE UICR_REGOUT0_VOUT_3V3
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
@@ -57,7 +59,7 @@
#define UF2_PRODUCT_NAME "nice!nano"
#define UF2_VOLUME_LABEL "NICENANO"
#define UF2_BOARD_ID "nRF52840-nicenano-v1"
#define UF2_INDEX_URL "https://docs.nicekeyboards.com/#/nice!nano/"
#define UF2_BOARD_ID "nRF52840-nicenano"
#define UF2_INDEX_URL "https://nicekeyboards.com/docs/nice-nano"
#endif // _NICENANO_H
+2 -3
View File
@@ -53,10 +53,9 @@
// USB
//--------------------------------------------------------------------+
// Shared VID/PID with Feather nRF52840, will be disabled for building in the future
#define USB_DESC_VID 0x239A
#define USB_DESC_UF2_PID 0x0029
#define USB_DESC_CDC_ONLY_PID 0x0029
#define USB_DESC_UF2_PID 0x010B
#define USB_DESC_CDC_ONLY_PID 0x010B
//------------- UF2 -------------//
#define UF2_PRODUCT_NAME "Raytac MDBT50Q-RX"
@@ -0,0 +1,66 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2018 Ha Thach for Adafruit Industries
* Copyright (c) 2021 Chris Marc Dailey
*
* 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 _SPARKFUN_NRF52840_MICROMOD_H_
#define _SPARKFUN_NRF52840_MICROMOD_H_
#define _PINNUM(port, pin) ((port)*32 + (pin))
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
#define LEDS_NUMBER 1
#define LED_PRIMARY_PIN _PINNUM(0, 13)
#define LED_STATE_ON 1
/*------------------------------------------------------------------*/
/* BUTTON
*------------------------------------------------------------------*/
#define BUTTONS_NUMBER 2
#define BUTTON_1 _PINNUM(0, 7)
#define BUTTON_2 _PINNUM(0, 10)
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
//--------------------------------------------------------------------+
// BLE OTA
//--------------------------------------------------------------------+
#define BLEDIS_MANUFACTURER "SparkFun"
#define BLEDIS_MODEL "MicroMod nRF52840"
//--------------------------------------------------------------------+
// USB
//--------------------------------------------------------------------+
#define USB_DESC_VID 0x1B4F
#define USB_DESC_UF2_PID 0x0022
#define USB_DESC_CDC_ONLY_PID 0x0023
//------------- UF2 -------------//
#define UF2_PRODUCT_NAME "SparkFun MicroMod nRF52840"
#define UF2_VOLUME_LABEL "SFMM852BOOT"
#define UF2_BOARD_ID "nRF52840-micromod-v10"
#define UF2_INDEX_URL "https://www.sparkfun.com/products/16984"
#endif /* _SPARKFUN_NRF52840_MICROMOD_H_ */
@@ -0,0 +1 @@
MCU_SUB_VARIANT = nrf52840
@@ -0,0 +1,19 @@
#include "boards.h"
#include "uf2/configkeys.h"
__attribute__((used, section(".bootloaderConfig")))
const uint32_t bootloaderConfig[] =
{
/* CF2 START */
CFG_MAGIC0, CFG_MAGIC1, // magic
5, 100, // used entries, total entries
204, 0x100000, // FLASH_BYTES = 0x100000
205, 0x40000, // RAM_BYTES = 0x40000
208, (USB_DESC_VID << 16) | USB_DESC_UF2_PID, // BOOTLOADER_BOARD_ID = USB VID+PID, used for verification when updating bootloader via uf2
209, 0xada52840, // UF2_FAMILY = 0xada52840
210, 0x20, // PINS_PORT_SIZE = PA_32
0, 0, 0, 0, 0, 0, 0, 0
/* CF2 END */
};
+93 -80
View File
@@ -97,18 +97,20 @@ void usb_teardown(void);
*/
/* Magic that written to NRF_POWER->GPREGRET by application when it wish to go into DFU
* - DFU_MAGIC_OTA_APPJUM used by BLEDfu service : SD is already init
* - DFU_MAGIC_OTA_RESET entered by soft reset : SD is not init
* - DFU_MAGIC_SERIAL_ONLY_RESET with CDC interface only
* - DFU_MAGIC_UF2_RESET with CDC and MSC interfaces
* - DFU_MAGIC_OTA_APPJUM : used by BLEDfu service, SD is already inited
* - DFU_MAGIC_OTA_RESET : entered by soft reset, SD is not inited yet
* - DFU_MAGIC_SERIAL_ONLY_RESET : with CDC interface only
* - DFU_MAGIC_UF2_RESET : with CDC and MSC interfaces
* - DFU_MAGIC_SKIP : skip DFU entirely including double reset delay
*
* Note: for DFU_MAGIC_OTA_APPJUM Softdevice must not initialized.
* since it is already in application. In all other case of OTA SD must be initialized
*/
#define DFU_MAGIC_OTA_APPJUM BOOTLOADER_DFU_START // 0xB1
#define DFU_MAGIC_OTA_APPJUM BOOTLOADER_DFU_START // 0xB1
#define DFU_MAGIC_OTA_RESET 0xA8
#define DFU_MAGIC_SERIAL_ONLY_RESET 0x4e
#define DFU_MAGIC_UF2_RESET 0x57
#define DFU_MAGIC_SKIP 0x6d
#define DFU_DBL_RESET_MAGIC 0x5A1AD5 // SALADS
#define DFU_DBL_RESET_APP 0x4ee5677e
@@ -155,8 +157,6 @@ void softdev_mbr_init(void)
//--------------------------------------------------------------------+
int main(void)
{
PRINTF("Bootlaoder Start\r\n");
// Populate Boot Address and MBR Param into MBR if not already
// MBR_BOOTLOADER_ADDR/MBR_PARAM_PAGE_ADDR are used if available, else UICR registers are used
// Note: skip it for now since this will prevent us to change the size of bootloader in the future
@@ -170,13 +170,16 @@ int main(void)
// Serial only mode
bool serial_only_dfu = (NRF_POWER->GPREGRET == DFU_MAGIC_SERIAL_ONLY_RESET);
bool uf2_dfu = (NRF_POWER->GPREGRET == DFU_MAGIC_UF2_RESET);
// start either serial, uf2 or ble
bool dfu_start = _ota_dfu || serial_only_dfu || (NRF_POWER->GPREGRET == DFU_MAGIC_UF2_RESET) ||
bool dfu_start = _ota_dfu || serial_only_dfu || uf2_dfu ||
(((*dbl_reset_mem) == DFU_DBL_RESET_MAGIC) && (NRF_POWER->RESETREAS & POWER_RESETREAS_RESETPIN_Msk));
bool const dfu_skip = (NRF_POWER->GPREGRET == DFU_MAGIC_SKIP);
// Clear GPREGRET if it is our values
if (dfu_start) NRF_POWER->GPREGRET = 0;
if (dfu_start || dfu_skip) NRF_POWER->GPREGRET = 0;
// Save bootloader version to pre-defined register, retrieved by application
// TODO move to CF2
@@ -185,6 +188,8 @@ int main(void)
board_init();
bootloader_init();
PRINTF("Bootloader Start\r\n");
led_state(STATE_BOOTLOADER_STARTED);
// When updating SoftDevice, bootloader will reset before swapping SD
@@ -192,86 +197,92 @@ int main(void)
{
led_state(STATE_WRITING_STARTED);
APP_ERROR_CHECK( bootloader_dfu_sd_update_continue() );
APP_ERROR_CHECK( bootloader_dfu_sd_update_finalize() );
bootloader_dfu_sd_update_continue();
bootloader_dfu_sd_update_finalize();
led_state(STATE_WRITING_FINISHED);
}
/*------------- Determine DFU mode (Serial, OTA, FRESET or normal) -------------*/
// DFU button pressed
dfu_start = dfu_start || button_pressed(BUTTON_DFU);
// DFU + FRESET are pressed --> OTA
_ota_dfu = _ota_dfu || ( button_pressed(BUTTON_DFU) && button_pressed(BUTTON_FRESET) ) ;
bool const valid_app = bootloader_app_is_valid();
bool const just_start_app = valid_app && !dfu_start && (*dbl_reset_mem) == DFU_DBL_RESET_APP;
if (!just_start_app && APP_ASKS_FOR_SINGLE_TAP_RESET())
dfu_start = 1;
// App mode: register 1st reset and DFU startup (nrf52832)
if ( ! (just_start_app || dfu_start || !valid_app) )
if ( !dfu_skip )
{
// Register our first reset for double reset detection
(*dbl_reset_mem) = DFU_DBL_RESET_MAGIC;
// DFU button pressed
dfu_start = dfu_start || button_pressed(BUTTON_DFU);
// DFU + FRESET are pressed --> OTA
_ota_dfu = _ota_dfu || ( button_pressed(BUTTON_DFU) && button_pressed(BUTTON_FRESET) ) ;
bool const valid_app = bootloader_app_is_valid();
bool const just_start_app = valid_app && !dfu_start && (*dbl_reset_mem) == DFU_DBL_RESET_APP;
if (!just_start_app && APP_ASKS_FOR_SINGLE_TAP_RESET()) dfu_start = 1;
// App mode: register 1st reset and DFU startup (nrf52832)
if ( ! (just_start_app || dfu_start || !valid_app) )
{
// Register our first reset for double reset detection
(*dbl_reset_mem) = DFU_DBL_RESET_MAGIC;
#ifdef NRF52832_XXAA
/* Even DFU is not active, we still force an 1000 ms dfu serial mode when startup
* to support auto programming from Arduino IDE
*
* Note: Supposedly during this time if RST is press, it will count as double reset.
* However Double Reset WONT work with nrf52832 since its SRAM got cleared anyway.
*/
bootloader_dfu_start(false, DFU_SERIAL_STARTUP_INTERVAL, false);
/* Even DFU is not active, we still force an 1000 ms dfu serial mode when startup
* to support auto programming from Arduino IDE
*
* Note: Supposedly during this time if RST is press, it will count as double reset.
* However Double Reset WONT work with nrf52832 since its SRAM got cleared anyway.
*/
bootloader_dfu_start(false, DFU_SERIAL_STARTUP_INTERVAL, false);
#else
// if RST is pressed during this delay --> if will enter dfu
NRFX_DELAY_MS(DFU_DBL_RESET_DELAY);
// if RST is pressed during this delay --> if will enter dfu
NRFX_DELAY_MS(DFU_DBL_RESET_DELAY);
#endif
}
if (APP_ASKS_FOR_SINGLE_TAP_RESET())
(*dbl_reset_mem) = DFU_DBL_RESET_APP;
else
(*dbl_reset_mem) = 0;
if ( dfu_start || !valid_app )
{
if ( _ota_dfu )
{
led_state(STATE_BLE_DISCONNECTED);
softdev_init(!sd_inited);
sd_inited = true;
}
else
{
led_state(STATE_USB_UNMOUNTED);
usb_init(serial_only_dfu);
}
// Initiate an update of the firmware.
if (APP_ASKS_FOR_SINGLE_TAP_RESET())
{
// If USB is not enumerated in 3s (eg. because we're running on battery), we restart into app.
APP_ERROR_CHECK( bootloader_dfu_start(_ota_dfu, 3000, true) );
(*dbl_reset_mem) = DFU_DBL_RESET_APP;
}
else
{
// No timeout if bootloader requires user action (double-reset).
APP_ERROR_CHECK( bootloader_dfu_start(_ota_dfu, 0, false) );
(*dbl_reset_mem) = 0;
}
if ( _ota_dfu )
if ( dfu_start || !valid_app )
{
sd_softdevice_disable();
}else
{
usb_teardown();
if ( _ota_dfu )
{
led_state(STATE_BLE_DISCONNECTED);
softdev_init(!sd_inited);
sd_inited = true;
}
else
{
led_state(STATE_USB_UNMOUNTED);
usb_init(serial_only_dfu);
}
// Initiate an update of the firmware.
if (APP_ASKS_FOR_SINGLE_TAP_RESET() || uf2_dfu || serial_only_dfu)
{
// If USB is not enumerated in 3s (eg. because we're running on battery), we restart into app.
bootloader_dfu_start(_ota_dfu, 3000, true);
}
else
{
// No timeout if bootloader requires user action (double-reset).
bootloader_dfu_start(_ota_dfu, 0, false);
}
if ( _ota_dfu )
{
sd_softdevice_disable();
}else
{
usb_teardown();
}
}
}
// Reset Board
// Reset peripherals
board_teardown();
/* Jump to application if valid
@@ -309,7 +320,7 @@ int main(void)
* "Master Boot Record and SoftDevice initializaton procedure"
*
* @param[in] init_softdevice true if SoftDevice should be initialized. The SoftDevice must only
* be initialized if a chip reset has occured. Soft reset (jump ) from
* be initialized if a chip reset has occurred. Soft reset (jump ) from
* application must not reinitialize the SoftDevice.
*/
static uint32_t softdev_init(bool init_softdevice)
@@ -317,7 +328,7 @@ static uint32_t softdev_init(bool init_softdevice)
if (init_softdevice) softdev_mbr_init();
// Forward vector table to bootloader address so that we can handle BLE events
APP_ERROR_CHECK( sd_softdevice_vector_table_base_set(BOOTLOADER_REGION_START) );
sd_softdevice_vector_table_base_set(BOOTLOADER_REGION_START);
// Enable Softdevice, Use Internal OSC to compatible with all boards
nrf_clock_lf_cfg_t clock_cfg =
@@ -328,7 +339,7 @@ static uint32_t softdev_init(bool init_softdevice)
.accuracy = NRF_CLOCK_LF_ACCURACY_250_PPM
};
APP_ERROR_CHECK( sd_softdevice_enable(&clock_cfg, app_error_fault_handler) );
sd_softdevice_enable(&clock_cfg, app_error_fault_handler);
sd_nvic_EnableIRQ(SD_EVT_IRQn);
/*------------- Configure BLE params -------------*/
@@ -343,35 +354,35 @@ static uint32_t softdev_init(bool init_softdevice)
blecfg.gap_cfg.role_count_cfg.periph_role_count = 1;
blecfg.gap_cfg.role_count_cfg.central_role_count = 0;
blecfg.gap_cfg.role_count_cfg.central_sec_count = 0;
APP_ERROR_CHECK( sd_ble_cfg_set(BLE_GAP_CFG_ROLE_COUNT, &blecfg, ram_start) );
sd_ble_cfg_set(BLE_GAP_CFG_ROLE_COUNT, &blecfg, ram_start);
// NRF_DFU_BLE_REQUIRES_BONDS
varclr(&blecfg);
blecfg.gatts_cfg.service_changed.service_changed = 1;
APP_ERROR_CHECK( sd_ble_cfg_set(BLE_GATTS_CFG_SERVICE_CHANGED, &blecfg, ram_start) );
sd_ble_cfg_set(BLE_GATTS_CFG_SERVICE_CHANGED, &blecfg, ram_start);
// ATT MTU
varclr(&blecfg);
blecfg.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_HIGH_BANDWIDTH;
blecfg.conn_cfg.params.gatt_conn_cfg.att_mtu = BLEGATT_ATT_MTU_MAX;
APP_ERROR_CHECK( sd_ble_cfg_set(BLE_CONN_CFG_GATT, &blecfg, ram_start) );
sd_ble_cfg_set(BLE_CONN_CFG_GATT, &blecfg, ram_start);
// Event Length + HVN queue + WRITE CMD queue setting affecting bandwidth
varclr(&blecfg);
blecfg.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_HIGH_BANDWIDTH;
blecfg.conn_cfg.params.gap_conn_cfg.conn_count = 1;
blecfg.conn_cfg.params.gap_conn_cfg.event_length = BLEGAP_EVENT_LENGTH;
APP_ERROR_CHECK( sd_ble_cfg_set(BLE_CONN_CFG_GAP, &blecfg, ram_start) );
sd_ble_cfg_set(BLE_CONN_CFG_GAP, &blecfg, ram_start);
// Enable BLE stack.
// Note: Interrupt state (enabled, forwarding) is not work properly if not enable ble
APP_ERROR_CHECK( sd_ble_enable(&ram_start) );
sd_ble_enable(&ram_start);
#if 0
ble_opt_t opt;
varclr(&opt);
opt.common_opt.conn_evt_ext.enable = 1; // enable Data Length Extension
APP_ERROR_CHECK( sd_ble_opt_set(BLE_COMMON_OPT_CONN_EVT_EXT, &opt) );
sd_ble_opt_set(BLE_COMMON_OPT_CONN_EVT_EXT, &opt);
#endif
return NRF_SUCCESS;
@@ -403,14 +414,16 @@ uint32_t proc_ble(void)
__ALIGN(4) uint8_t ev_buf[ BLE_EVT_LEN_MAX(BLEGATT_ATT_MTU_MAX) ];
uint16_t ev_len = BLE_EVT_LEN_MAX(BLEGATT_ATT_MTU_MAX);
// Init header
ble_evt_t* evt = (ble_evt_t*) ev_buf;
evt->header.evt_id = BLE_EVT_INVALID;
// Get BLE Event
uint32_t err = sd_ble_evt_get(ev_buf, &ev_len);
// Handle valid event, ignore error
if( NRF_SUCCESS == err)
{
ble_evt_t* evt = (ble_evt_t*) ev_buf;
switch (evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
@@ -437,7 +450,7 @@ uint32_t proc_ble(void)
// process SOC event from SD
uint32_t proc_soc(void)
{
uint32_t soc_evt;
uint32_t soc_evt = 0;
uint32_t err = sd_evt_get(&soc_evt);
if (NRF_SUCCESS == err)
@@ -458,7 +471,7 @@ uint32_t proc_soc(void)
return err;
}
void ada_sd_task(void* evt_data, uint16_t evt_size)
void proc_sd_task(void* evt_data, uint16_t evt_size)
{
(void) evt_data;
(void) evt_size;
@@ -473,7 +486,7 @@ void ada_sd_task(void* evt_data, uint16_t evt_size)
void SD_EVT_IRQHandler(void)
{
// Use App Scheduler to defer handling code in non-isr context
app_sched_event_put(NULL, 0, ada_sd_task);
app_sched_event_put(NULL, 0, proc_sd_task);
}
-1
View File
@@ -587,6 +587,5 @@ int write_block (uint32_t block_no, uint8_t *data, WriteState *state)
}
}
STATIC_ASSERT(BPB_SECTOR_SIZE == 512); // if sector size changes, may need to re-validate this code
return BPB_SECTOR_SIZE;
}
+1 -1
View File
@@ -18,7 +18,7 @@
// Application Address Space
#define USER_FLASH_START MBR_SIZE // skip MBR included in SD hex
#define USER_FLASH_END 0xAD000
#define USER_FLASH_END (BOOTLOADER_REGION_START - DFU_APP_DATA_RESERVED)
// Bootloader start address
#define BOOTLOADER_ADDR_START BOOTLOADER_REGION_START