Compare commits

..
50 Commits
Author SHA1 Message Date
Ha Thach 941b1ddfeb Merge pull request #252 from adafruit/separate-release-artifact
Separate release artifact
2021-12-14 16:21:07 +07:00
hathach f6c9614976 more clean up 2021-12-14 16:13:14 +07:00
hathach 68959e00c4 try wildcard for release assest filename 2021-12-14 15:41:17 +07:00
hathach 1d85a000e2 use softprops/action-gh-release@v1 2021-12-14 15:36:14 +07:00
Ha Thach 05fcc9f32d Merge pull request #245 from markbirss/patch-1
Add ci to build binary for raytac_mdbt50q_db_40
2021-11-30 16:34:45 +07:00
Ha Thach 527aa4df08 Merge pull request #233 from markbirss/master
Add New Board: Raytac MDBT50Q Demo Board 40
2021-11-30 16:28:10 +07:00
Mark Trevor Birss 7211d3847c Add raytac_mdbt50q_db_40 2021-11-30 11:11:39 +02:00
Ha Thach d02d6c8114 Merge pull request #243 from adafruit/update-tinyusb
update tinyusb
2021-11-30 15:57:20 +07:00
Mark Trevor Birss 993ac762ca Changes as requested to UF2_BOARD_ID
from 
https://github.com/microsoft/uf2#files-exposed-by-bootloaders

The Board-ID field is machine-readable and consists of a number of dash-separated tokens. The first token is the CPU type, second is the board type, and third is the board revision. More tokens can be also added.
2021-11-30 09:14:37 +02:00
hathach d099cda94c update tinyusb to commit https://github.com/hathach/tinyusb/commit/9775e76910d569ec73b8dd946f3fa5fe5414acdb 2021-11-30 13:05:35 +07:00
Mark Trevor Birss 569e64f504 Update PID
Changed PID taken from https://github.com/adafruit/circuitpython/issues/3128#issuecomment-655077754
2021-11-26 10:37:37 +02:00
Mark Trevor Birss 4946c0388f error: initializer-string for array of 'unsigned char' is too long
Fix UF2_VOLUME_LABEL too long
2021-11-25 14:29:34 +02:00
Mark Trevor Birss d6743ea8a1 Add files via upload
Add Board support for Raytac MDBT50Q Demo Board 40
2021-11-25 14:10:50 +02:00
Pierre Constantineau f205fcd6fb Add New Board: BlueMicro833 (#226)
* adding BlueMiicro833 files
2021-10-13 15:37:34 +07:00
Ha Thach 41db95f28e Add linkermap target for size analysis (#227)
* correct url link for led glasses driver
* add linkermap to ci
2021-10-13 00:02:52 +07:00
Ha Thach 66b6712682 Merge pull request #223 from adafruit/enhance
only try to detect double reset when reset by nRST
2021-09-17 21:47:07 +07:00
hathach 0d97c2108d only try to detect double reset when reset by nRST 2021-09-17 21:27:52 +07:00
hathach 0889a68a7a comment out ble event string due to lack of flash 2021-09-17 21:18:44 +07:00
hathach 38a67d1896 use ram for configuration descriptor since we have more ram to spare than flash 2021-09-16 12:27:31 +07:00
hathach 0fc9f2f4bd shrink size by not using sprintf() 2021-09-16 12:25:48 +07:00
hathach 3791f9376e remove TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP from config descriptor 2021-09-15 22:23:20 +07:00
hathach 0f052bcee0 remove wildcard in makefile 2021-09-15 22:05:20 +07:00
Ha Thach 3d04d61bc6 Merge pull request #221 from daniel-thompson/fix_gcc-11
Use -fno-ipa-modref when building with gcc-11 (or later)
2021-09-10 23:47:08 +07:00
Ha Thach 58e756e6cc Update changelog.md 2021-09-10 19:25:41 +07:00
Ha Thach 5e1fe6aeb8 Merge pull request #222 from adafruit/refractor
Refractor
2021-09-10 19:23:41 +07:00
Daniel Thompson 235c0fac5b Use -fno-ipa-modref when building with gcc-11 (or later)
As the large comment in the body of the patch, there are mistakes in
the inline assembler fragments contained in the Nordic Softdevice header
files. Fixing the problem is a bit fiddly so for now we'll simply work
around the issue by disabling an optimization pass that was introduced
in gcc-11.
2021-09-07 20:22:56 +01:00
Ha Thach f82d1bc4b6 Merge pull request #219 from adafruit/ledglass
glasses def
2021-08-30 13:13:27 +07:00
lady ada 90f163f6d8 add another button 2021-08-29 17:18:43 -04:00
lady ada a427853ae0 glasses def 2021-08-29 17:15:29 -04:00
hathach d7d084673f use bug tempalte form, update raytac dongle url 2021-08-27 16:06:38 +07:00
hathach 1a6d8eae97 clean up 2021-08-04 19:05:30 +07:00
hathach a2b3ae4970 clean up main 2021-08-04 19:05:30 +07:00
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
34 changed files with 900 additions and 437 deletions

No files matched your search

-32
View File
@@ -1,32 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: 'Please provide all details at least for Setup/Describe/Reproduce'
labels: 'Bug'
assignees: ''
---
**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. See error
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Log**
If applicable, provide your Serial log. If the log is too long, attach it as txt file instead.
+61
View File
@@ -0,0 +1,61 @@
name: Bug Report
description: Report a problem
labels: 'Bug'
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
It's okay to leave some blank if it doesn't apply to your problem.
- type: dropdown
attributes:
label: Operating System
options:
- Linux
- MacOS
- RaspberryPi OS
- Windows 7
- Windows 10
- Windows 11
- Others
validations:
required: true
- type: textarea
attributes:
label: INFO_UF2.TXT
placeholder: Paste your INFO_UF2.TXT contents here
validations:
required: true
- type: textarea
attributes:
label: What happened ?
placeholder: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
attributes:
label: How to reproduce ?
placeholder: |
1. Go to '...'
2. Click on '....'
3. See error
validations:
required: true
- type: textarea
attributes:
label: Debug Log
placeholder: Debug log attached txt file.
validations:
required: false
- type: textarea
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem.
validations:
required: false
+21 -24
View File
@@ -23,7 +23,8 @@ jobs:
- 'feather_nrf52840_sense'
- 'itsybitsy_nrf52840_express'
- 'metro_nrf52840_express'
# Alphabetical order
- 'ledglasses_nrf52840'
# Other Makers (Alphabetical order)
- 'adm_b_nrf52840_1'
- 'ae_bl652_bo'
- 'aramcon_badge_2019'
@@ -31,11 +32,13 @@ jobs:
- 'arcade_feather_nrf52840_express'
- 'arduino_nano_33_ble'
- 'bast_ble'
- 'bluemicro_nrf52833'
- 'bluemicro_nrf52840'
- 'ebyte_e104_bt5032a'
- 'ebyte_e73_tbb'
- 'electronut_labs_papyr'
- 'ikigaisense_vita'
- 'm60_keyboard'
- 'mdk_nrf52840_dongle'
- 'nice_nano'
- 'nrf52840_m2'
@@ -47,6 +50,7 @@ jobs:
- 'pca10059'
- 'pca10100'
- 'pitaya_go'
- 'raytac_mdbt50q_db_40'
- 'raytac_mdbt50q_rx'
- 'sparkfun_nrf52840_micromod'
- 'waveshare_nrf52840_eval'
@@ -61,11 +65,18 @@ jobs:
- name: Checkout Code
uses: actions/checkout@v1
with:
submodules: true
submodules: true
- name: Checkout linkermap
uses: actions/checkout@v2
with:
repository: hathach/linkermap
path: linkermap
- name: Install Toolchains
run: |
pip3 install adafruit-nrfutil uritemplate requests intelhex
pip3 install linkermap/
npm install --global xpm
# 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
@@ -76,34 +87,20 @@ jobs:
run: |
make BOARD=${{ matrix.board }} all
make BOARD=${{ matrix.board }} copy-artifact
- name: Linker Map
run: make BOARD=${{ matrix.board }} linkermap
- uses: actions/upload-artifact@v2
with:
name: ${{ matrix.board }}
path: _bin/${{ matrix.board }}
- 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
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: softprops/action-gh-release@v1
if: ${{ github.event_name == 'release' }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ${{ matrix.board }}_bootloader-${{ github.event.release.tag_name }}.zip
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
files: |
_bin/${{ matrix.board }}/${{ matrix.board }}_bootloader-*.zip
_bin/${{ matrix.board }}/${{ matrix.board }}_bootloader-*.hex
_bin/${{ matrix.board }}/update-${{ matrix.board }}_bootloader-*.uf2
+49 -25
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
@@ -121,13 +124,14 @@ endif
#------------------------------------------------------------------------------
# all files in src
C_SRC += $(wildcard src/*.c)
C_SRC += \
src/dfu_ble_svc.c \
src/dfu_init.c \
src/flash_nrf5x.c \
src/main.c \
# all files in boards
C_SRC += $(wildcard src/boards/*.c)
# all sources files in specific board
C_SRC += $(wildcard src/boards/$(BOARD)/*.c)
C_SRC += src/boards/boards.c
# nrfx
C_SRC += $(NRFX_PATH)/drivers/src/nrfx_power.c
@@ -169,18 +173,25 @@ IPATH += $(SDK_PATH)/drivers_nrf/uart
else
# pinconfig is required for 840 for CF2
C_SRC += src/boards/$(BOARD)/pinconfig.c
# USB Application ( MSC + UF2 )
C_SRC += $(wildcard src/usb/*.c)
C_SRC += $(wildcard src/usb/uf2/*.c)
C_SRC += \
src/usb/msc_uf2.c \
src/usb/usb_desc.c \
src/usb/usb.c \
src/usb/uf2/ghostfat.c
# TinyUSB stack
C_SRC += $(TUSB_PATH)/portable/nordic/nrf5x/dcd_nrf5x.c
C_SRC += $(TUSB_PATH)/common/tusb_fifo.c
C_SRC += $(TUSB_PATH)/device/usbd.c
C_SRC += $(TUSB_PATH)/device/usbd_control.c
C_SRC += $(TUSB_PATH)/class/cdc/cdc_device.c
C_SRC += $(TUSB_PATH)/class/msc/msc_device.c
C_SRC += $(TUSB_PATH)/tusb.c
C_SRC += \
$(TUSB_PATH)/portable/nordic/nrf5x/dcd_nrf5x.c \
$(TUSB_PATH)/common/tusb_fifo.c \
$(TUSB_PATH)/device/usbd.c \
$(TUSB_PATH)/device/usbd_control.c \
$(TUSB_PATH)/class/cdc/cdc_device.c \
$(TUSB_PATH)/class/msc/msc_device.c \
$(TUSB_PATH)/tusb.c
endif
@@ -232,15 +243,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 \
@@ -276,6 +278,18 @@ CFLAGS += -Wno-unused-parameter -Wno-expansion-to-defined
# TinyUSB tusb_hal_nrf_power_event
CFLAGS += -Wno-cast-function-type
# Nordic Softdevice SDK header files contains inline assembler that has
# broken constraints. As a result the IPA-modref pass, introduced in gcc-11,
# is able to "prove" that arguments to wrapper functions generated with
# the SVCALL() macro are unused and, as a result, the optimizer will remove
# code within the callers that sets up these arguments (which results in
# a broken bootloader). The broken headers come from Nordic-supplied zip
# files and are not trivial to patch so, for now, we'll simply disable the
# new gcc-11 inter-procedural optimizations.
ifeq (,$(findstring unrecognized,$(shell $(CC) $(CFLAGS) -fno-ipa-modref 2>&1)))
CFLAGS += -fno-ipa-modref
endif
# Defined Symbol (MACROS)
CFLAGS += -D__HEAP_SIZE=0
CFLAGS += -DCONFIG_GPIO_AS_PINRESET
@@ -286,14 +300,20 @@ 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)
CFLAGS += -DCFG_DEBUG -DSEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
RTT_SRC = lib/SEGGER_RTT
IPATH += $(RTT_SRC)/RTT
C_SRC += $(RTT_SRC)/RTT/SEGGER_RTT.c
endif
#------------------------------------------------------------------------------
# Linker Flags
#------------------------------------------------------------------------------
@@ -353,6 +373,10 @@ clean:
@$(RM) $(BUILD)
@$(RM) $(BIN)
# linkermap must be install previously at https://github.com/hathach/linkermap
linkermap: $(BUILD)/$(OUT_NAME).out
@linkermap -v $<.map
# Create objects from C SRC files
$(BUILD)/%.o: %.c
@echo CC $(notdir $<)
+1
View File
@@ -10,6 +10,7 @@ This is a CDC/DFU/UF2 bootloader for nRF52 boards.
- [Adafruit Feather nRF52840 Express](https://www.adafruit.com/product/4062)
- [Adafruit Feather nRF52840 Sense](https://www.adafruit.com/product/4516)
- [Adafruit ItsyBitsy nRF52840 Express](https://www.adafruit.com/product/4481)
- [Adafruit LED Glasses Driver nRF52840](https://www.adafruit.com/product/5217)
- Adafruit Metro nRF52840 Express
- [Akizukidenshi AE-BL652-BO](https://akizukidenshi.com/catalog/g/gK-15567/)
- [Electronut Labs Papyr](https://docs.electronut.in/papyr/)
+13
View File
@@ -1,5 +1,18 @@
# Adafruit nRF52 Bootloader Changelog
## 0.6.2 - 2021.09.10
- Add new board "LED Glasses Driver nRF52840"
## 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
@@ -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,7 @@ 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++;
uint32_t const page_count = NRFX_CEIL_DIV(m_image_size, CODE_PAGE_SIZE);
for ( uint32_t i = 0; i < page_count; i++ )
{
@@ -736,8 +736,8 @@ static void on_ble_evt(ble_evt_t * p_ble_evt)
ble_gatts_rw_authorize_reply_params_t auth_reply;
#ifdef CFG_DEBUG
extern const char* dbg_ble_event_str(uint16_t evt_id);
PRINTF("BLE %s\r\n", dbg_ble_event_str(p_ble_evt->header.evt_id));
extern void print_ble_event(uint16_t evt_id);
print_ble_event(p_ble_evt->header.evt_id);
#endif
switch (p_ble_evt->header.evt_id)
@@ -1085,6 +1085,7 @@ uint32_t dfu_transport_ble_close()
#ifdef CFG_DEBUG
#if 0
typedef struct
{
uint32_t key;
@@ -1173,18 +1174,22 @@ lookup_table_t const _strevt_table =
.items = _strevt_lookup
};
const char* dbg_ble_event_str(uint16_t evt_id)
{
const char * str = (const char *) lookup_find(&_strevt_table, evt_id);
static char unknown_str[7] = {0};
#endif
void print_ble_event(uint16_t evt_id)
{
// const char * str = (const char *) lookup_find(&_strevt_table, evt_id);
const char * str = NULL;
PRINTF("BLE event: ");
if ( str == NULL )
{
sprintf(unknown_str, "0x%04X", evt_id);
str = unknown_str;
PRINTF("0x%04X", evt_id);
}else
{
PRINTF(str);
}
return str;
PRINTF("\r\n");
}
#endif
@@ -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
+69
View File
@@ -0,0 +1,69 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2020 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 _BLUEMICRO_NRF52833_H
#define _BLUEMICRO_NRF52833_H
#define _PINNUM(port, pin) ((port)*32 + (pin))
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
#define LEDS_NUMBER 2
#define LED_PRIMARY_PIN _PINNUM(1, 4)
#define LED_SECONDARY_PIN _PINNUM(0, 25)
#define LED_STATE_ON 1
#define LED_NEOPIXEL _PINNUM(0, 7)
#define NEOPIXELS_NUMBER 1
#define BOARD_RGB_BRIGHTNESS 0x040404
/*------------------------------------------------------------------*/
/* BUTTON
*------------------------------------------------------------------*/
#define BUTTONS_NUMBER 2 // none connected at all
#define BUTTON_1 _PINNUM(0, 18) // unusable: RESET
#define BUTTON_2 _PINNUM(1, 1) // no connection on E73-2G4M08S1E Module
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
//--------------------------------------------------------------------+
// BLE OTA
//--------------------------------------------------------------------+
#define BLEDIS_MANUFACTURER "BlueMicro"
#define BLEDIS_MODEL "BlueMicro 833"
//--------------------------------------------------------------------+
// USB PID from openmoko:
// PR https://github.com/openmoko/openmoko-usb-oui/pull/34
//--------------------------------------------------------------------+
#define USB_DESC_VID 0x1d50
#define USB_DESC_UF2_PID 0x616f
#define USB_DESC_CDC_ONLY_PID 0x616f
#define UF2_PRODUCT_NAME "BlueMicro"
#define UF2_VOLUME_LABEL "BLUEMICRO"
#define UF2_BOARD_ID "nRF52833-BlueMicro-v1"
#define UF2_INDEX_URL "http://bluemicro.jpconstantineau.com/"
#endif // _BLUEMICRO_H
+1
View File
@@ -0,0 +1 @@
MCU_SUB_VARIANT = nrf52833
+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 -3
View File
@@ -324,13 +324,14 @@ 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) || defined(LED_APA102)
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN) || defined(LED_APA102)
if (final_color != NULL) {
neopixel_write(final_color);
}
#else
#else
(void) final_color;
#endif
#endif
}
#ifdef LED_NEOPIXEL
+3 -2
View File
@@ -60,7 +60,8 @@
#define UF2_BOARD_ID "nRF52840-Papyr-v1"
#define UF2_INDEX_URL "https://docs.electronut.in/papyr"
#define USB_DESC_VID 0x239A
#define USB_DESC_UF2_PID 0x003B
#define USB_DESC_VID 0x239A
#define USB_DESC_UF2_PID 0x003B
#define USB_DESC_CDC_ONLY_PID 0x003B
#endif // PPAPYR_H
+68
View File
@@ -0,0 +1,68 @@
/*
* 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 _LEDGLASSES_NRF52840_H
#define _LEDGLASSES_NRF52840_H
#define _PINNUM(port, pin) ((port)*32 + (pin))
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
#define LEDS_NUMBER 1
#define LED_PRIMARY_PIN _PINNUM(0, 31)
#define LED_STATE_ON 1
#define LED_NEOPIXEL _PINNUM(1, 15)
#define NEOPIXELS_NUMBER 1
#define BOARD_RGB_BRIGHTNESS 0x040404
/*------------------------------------------------------------------*/
/* BUTTON
*------------------------------------------------------------------*/
#define BUTTONS_NUMBER 2
#define BUTTON_1 _PINNUM(0, 30) // user switch
#define BUTTON_2 _PINNUM(0, 28) // NC
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
//--------------------------------------------------------------------+
// BLE OTA
//--------------------------------------------------------------------+
#define BLEDIS_MANUFACTURER "Adafruit Industries"
#define BLEDIS_MODEL "LED Glasses Driver nRF52840"
//--------------------------------------------------------------------+
// USB
//--------------------------------------------------------------------+
#define USB_DESC_VID 0x239A
#define USB_DESC_UF2_PID 0x010D
#define USB_DESC_CDC_ONLY_PID 0x010E
//------------- UF2 -------------//
#define UF2_PRODUCT_NAME "Adafruit LED Glasses Driver nRF52840"
#define UF2_VOLUME_LABEL "GLASSESBOOT"
#define UF2_BOARD_ID "nRF52840-LedGlasses-revA"
#define UF2_INDEX_URL "https://www.adafruit.com/product/5217"
#endif // _LEDGLASSES_NRF52840_H
+1
View File
@@ -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 */
};
+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
+75
View File
@@ -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 RAYTAC_MDBT50Q_DB_40_H
#define RAYTAC_MDBT50Q_DB_40_H
#define _PINNUM(port, pin) ((port)*32 + (pin))
/*------------------------------------------------------------------*/
/* LED
*------------------------------------------------------------------*/
#define LEDS_NUMBER 3
/* This is the Green led marked D1 on the board */
#define LED_PRIMARY_PIN _PINNUM(1, 13)
/* This is the Red led marked D2 on the board */
#define LED_SECONDARY_PIN _PINNUM(1, 14)
/* This is the Blue led marked D3 on the board */
#define LED_TERTIARY_PIN _PINNUM(1, 15)
/* There are one more unpopulated LEDs, but for the purposes of bootloader that
* doesn't matter. */
#define LED_STATE_ON 0
/*------------------------------------------------------------------*/
/* BUTTON
*------------------------------------------------------------------*/
#define BUTTONS_NUMBER 4
#define BUTTON_1 _PINNUM(0, 11)
#define BUTTON_2 _PINNUM(0, 12)
#define BUTTON_3 _PINNUM(0, 24)
#define BUTTON_4 _PINNUM(0, 25)
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
//--------------------------------------------------------------------+
// BLE OTA
//--------------------------------------------------------------------+
#define BLEDIS_MANUFACTURER "Raytac"
#define BLEDIS_MODEL "MDBT50Q-DB-40"
//--------------------------------------------------------------------+
// USB
//--------------------------------------------------------------------+
#define USB_DESC_VID 0x239A
#define USB_DESC_UF2_PID 0x00BB
#define USB_DESC_CDC_ONLY_PID 0x00BB
//------------- UF2 -------------//
#define UF2_PRODUCT_NAME "Raytac MDBT50Q Demo Board 40"
#define UF2_VOLUME_LABEL "MDBT50QBOOT"
#define UF2_BOARD_ID "nRF52840-MDBT50Q-1MV2"
#define UF2_INDEX_URL "https://www.raytac.com/product/ins.php?index_id=81"
#endif // RAYTAC_MDBT50Q_DB_40_H
+1
View File
@@ -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 */
};
+1 -1
View File
@@ -61,6 +61,6 @@
#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"
#define UF2_INDEX_URL "https://www.adafruit.com/product/5199"
#endif // RAYTAC_MDBT50Q_RX_H
+147 -129
View File
@@ -101,7 +101,8 @@ void usb_teardown(void);
* - 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
* - DFU_MAGIC_SKIP : skip DFU entirely including double reset delay,
* Can be used with systemoff or quick reset to app
*
* 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
@@ -122,6 +123,7 @@ void usb_teardown(void);
// Allow for using reset button essentially to swap between application and bootloader.
// This is controlled by a flag in the app and is the behavior of CPX and all Arcade boards when using MakeCode.
// DFU_DBL_RESET magic is used to determined which mode is entered
#define APP_ASKS_FOR_SINGLE_TAP_RESET() (*((uint32_t*)(DFU_BANK_0_REGION_START + 0x200)) == 0x87eeb07c)
// These value must be the same with one in dfu_transport_ble.c
@@ -132,20 +134,24 @@ enum { BLE_CONN_CFG_HIGH_BANDWIDTH = 1 };
//--------------------------------------------------------------------+
//
//--------------------------------------------------------------------+
static uint32_t softdev_init(bool init_softdevice);
uint32_t* dbl_reset_mem = ((uint32_t*) DFU_DBL_RESET_MEM );
// true if ble, false if serial
bool _ota_dfu = false;
bool _ota_connected = false;
bool _sd_inited = false;
bool is_ota(void)
{
return _ota_dfu;
}
void softdev_mbr_init(void)
static void check_dfu_mode(void);
static uint32_t ble_stack_init(void);
// The SoftDevice must only be initialized if a chip reset has occurred.
// Soft reset (jump ) from application must not reinitialize the SoftDevice.
static void mbr_init_sd(void)
{
PRINTF("SD_MBR_COMMAND_INIT_SD\r\n");
sd_mbr_command_t com = { .command = SD_MBR_COMMAND_INIT_SD };
@@ -157,32 +163,11 @@ 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
// bootloader_mbr_addrs_populate();
// SD is already Initialized in case of BOOTLOADER_DFU_OTA_MAGIC
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);
// 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 || 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 || dfu_skip) NRF_POWER->GPREGRET = 0;
// Save bootloader version to pre-defined register, retrieved by application
// TODO move to CF2
BOOTLOADER_VERSION_REGISTER = (MK_BOOTLOADER_VERSION);
@@ -190,6 +175,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
@@ -197,90 +184,15 @@ 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) -------------*/
if ( !dfu_skip )
{
// 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);
#else
// 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() || uf2_dfu || serial_only_dfu)
{
// 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) );
}
else
{
// No timeout if bootloader requires user action (double-reset).
APP_ERROR_CHECK( bootloader_dfu_start(_ota_dfu, 0, false) );
}
if ( _ota_dfu )
{
sd_softdevice_disable();
}else
{
usb_teardown();
}
}
}
// Check all inputs and enter DFU if needed
// Return when DFU process is complete (or not entered at all)
check_dfu_mode();
// Reset peripherals
board_teardown();
@@ -299,7 +211,7 @@ int main(void)
if ( is_sd_existed() )
{
// MBR forward IRQ to SD (if not already)
if ( !sd_inited ) softdev_mbr_init();
if ( !_sd_inited ) mbr_init_sd();
// Make sure SD is disabled
sd_softdevice_disable();
@@ -315,20 +227,124 @@ int main(void)
NVIC_SystemReset();
}
/**
* Initializes the SotdDevice by following SD specs section
* "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
* application must not reinitialize the SoftDevice.
*/
static uint32_t softdev_init(bool init_softdevice)
static void check_dfu_mode(void)
{
if (init_softdevice) softdev_mbr_init();
uint32_t const gpregret = NRF_POWER->GPREGRET;
// SD is already Initialized in case of BOOTLOADER_DFU_OTA_MAGIC
_sd_inited = (gpregret == DFU_MAGIC_OTA_APPJUM);
// Start Bootloader in BLE OTA mode
_ota_dfu = (gpregret == DFU_MAGIC_OTA_APPJUM) || (gpregret == DFU_MAGIC_OTA_RESET);
// Serial only mode
bool const serial_only_dfu = (gpregret == DFU_MAGIC_SERIAL_ONLY_RESET);
bool const uf2_dfu = (gpregret == DFU_MAGIC_UF2_RESET);
bool const dfu_skip = (gpregret == DFU_MAGIC_SKIP);
bool const reason_reset_pin = (NRF_POWER->RESETREAS & POWER_RESETREAS_RESETPIN_Msk) ? true : false;
// start either serial, uf2 or ble
bool dfu_start = _ota_dfu || serial_only_dfu || uf2_dfu ||
(((*dbl_reset_mem) == DFU_DBL_RESET_MAGIC) && reason_reset_pin);
// Clear GPREGRET if it is our values
if (dfu_start || dfu_skip) NRF_POWER->GPREGRET = 0;
// skip dfu entirely
if (dfu_skip) return;
/*------------- 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: Double Reset detection or DFU startup for nrf52832
if ( ! (just_start_app || dfu_start || !valid_app) )
{
#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: Double Reset WONT work with nrf52832 since all its SRAM got cleared with GPIO reset.
*/
bootloader_dfu_start(false, DFU_SERIAL_STARTUP_INTERVAL, false);
#else
// Note: RESETREAS is not clear by bootloader, it should be cleared by application upon init()
if (reason_reset_pin)
{
// Register our first reset for double reset detection
(*dbl_reset_mem) = DFU_DBL_RESET_MAGIC;
// if RST is pressed during this delay (double reset)--> 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;
}
// Enter DFU mode accordingly to input
if ( dfu_start || !valid_app )
{
if ( _ota_dfu )
{
led_state(STATE_BLE_DISCONNECTED);
if (!_sd_inited ) mbr_init_sd();
_sd_inited = true;
ble_stack_init();
}
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();
}
}
}
// Initializes the SotdDevice by following SD specs section
// "Master Boot Record and SoftDevice initializaton procedure"
static uint32_t ble_stack_init(void)
{
// 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 =
@@ -339,7 +355,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 -------------*/
@@ -354,35 +370,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;
@@ -414,14 +430,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:
@@ -448,7 +466,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)
@@ -469,7 +487,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;
@@ -484,7 +502,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);
}
+25 -8
View File
@@ -31,6 +31,7 @@
#include "flash_nrf5x.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "bootloader_settings.h"
#include "bootloader.h"
@@ -119,7 +120,8 @@ STATIC_ASSERT(FAT_ENTRIES_PER_SECTOR == 256); // FAT
char infoUf2File[128*3] =
"UF2 Bootloader " UF2_VERSION "\r\n"
"Model: " UF2_PRODUCT_NAME "\r\n"
"Board-ID: " UF2_BOARD_ID "\r\n";
"Board-ID: " UF2_BOARD_ID "\r\n"
"Date: " __DATE__ "\r\n";
const char indexFile[] =
"<!doctype html>\n"
@@ -250,17 +252,33 @@ void uf2_init(void)
uint32_t const sd_id = SD_ID_GET(MBR_SIZE);
uint32_t const sd_version = SD_VERSION_GET(MBR_SIZE);
uint32_t const ver1 = sd_version / 1000000;
uint32_t const ver2 = (sd_version % 1000000)/1000;
uint32_t const ver3 = sd_version % 1000;
uint32_t ver[3];
ver[0] = sd_version / 1000000;
ver[1] = (sd_version - ver[0]*1000000)/1000;
ver[2] = (sd_version - ver[0]*1000000 - ver[1]*1000);
sprintf(infoUf2File + strlen(infoUf2File), "S%lu version %lu.%lu.%lu\r\n", sd_id, ver1, ver2, ver3);
char str[10];
utoa(sd_id, str, 10);
strcat(infoUf2File, "S");
strcat(infoUf2File, str);
strcat(infoUf2File, " ");
utoa(ver[0], str, 10);
strcat(infoUf2File, str);
strcat(infoUf2File, ".");
utoa(ver[1], str, 10);
strcat(infoUf2File, str);
strcat(infoUf2File, ".");
utoa(ver[2], str, 10);
strcat(infoUf2File, str);
strcat(infoUf2File, "\r\n");
}else
{
strcat(infoUf2File, "not found\r\n");
}
strcat(infoUf2File, "Date: " __DATE__ "\r\n");
}
/*------------------------------------------------------------------*/
@@ -587,6 +605,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
+27 -15
View File
@@ -25,12 +25,12 @@
#include "usb_desc.h"
enum {
ITF_STR_LANGUAGE = 0 ,
ITF_STR_MANUFACTURER ,
ITF_STR_PRODUCT ,
ITF_STR_SERIAL ,
ITF_STR_CDC ,
ITF_STR_MSC
STRID_LANGUAGE = 0 ,
STRID_MANUFACTURER ,
STRID_PRODUCT ,
STRID_SERIAL ,
STRID_CDC ,
STRID_MSC
};
// CDC + MSC or CDC only mode
@@ -84,25 +84,25 @@ enum {
ITF_NUM_TOTAL
};
uint8_t const desc_configuration_cdc_msc[] =
uint8_t desc_configuration_cdc_msc[] =
{
// Interface count, string index, total length, attribute, power in mA
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN, 0, 100),
// 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_CDC_DESCRIPTOR(ITF_NUM_CDC, STRID_CDC, 0x81, 8, 0x02, 0x82, 64),
// Interface number, string index, EP Out & EP In address, EP size
TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, ITF_STR_MSC, 0x03, 0x83, 64),
TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, STRID_MSC, 0x03, 0x83, 64),
};
uint8_t const desc_configuration_cdc_only[] =
uint8_t desc_configuration_cdc_only[] =
{
// Interface count, string index, total length, attribute, power in mA
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL-1, 0, TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL-1, 0, TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN, 0, 100),
// 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_CDC_DESCRIPTOR(ITF_NUM_CDC, STRID_CDC, 0x81, 8, 0x02, 0x82, 64),
};
@@ -127,7 +127,19 @@ void usb_desc_init(bool cdc_only)
}
// Create Serial string descriptor
sprintf(desc_str_serial, "%08lX%08lX", NRF_FICR->DEVICEID[1], NRF_FICR->DEVICEID[0]);
uint8_t const* device_id = (uint8_t const*) &NRF_FICR->DEVICEID;
for ( uint8_t i = 0; i < 8; i++ )
{
for ( uint8_t j = 0; j < 2; j++ )
{
const char nibble_to_hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
uint8_t nibble = (device_id[i] >> (j * 4)) & 0xf;
desc_str_serial[15 - (i * 2 + j)] = nibble_to_hex[nibble]; // memory is little endian
}
}
desc_str_serial[16] = 0;
}
//--------------------------------------------------------------------+
@@ -156,7 +168,7 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
uint8_t chr_count;
if ( index == 0)
if ( index == STRID_LANGUAGE )
{
memcpy(&_desc_str[1], string_desc_arr[0], 2);
chr_count = 1;
-12
View File
@@ -30,16 +30,4 @@
void usb_desc_init(bool cdc_only);
#ifndef USB_DESC_VID
#define USB_DESC_VID 0x239A
#endif
#ifndef USB_DESC_UF2_PID
#define USB_DESC_UF2_PID 0x0029
#endif
#ifndef USB_DESC_CDC_ONLY_PID
#define USB_DESC_CDC_ONLY_PID 0x002A
#endif
#endif /* USB_DESC_H_ */