Compare commits

..
6 Commits
Author SHA1 Message Date
Dan Halbert 14f87f61e6 Add 0.2.0 to changelog
@hathach Tested, so making a new release.
2019-02-22 15:52:57 -05:00
Dan Halbert 7df44a5425 Merge pull request #47 from adafruit/develop
fix #46 issue with windows 10 build 18.09
2019-02-22 15:41:58 -05:00
hathach 0cc0289c60 update dfu-flash for upgrading bootloader
clean up makefile
2019-02-22 23:55:01 +07:00
hathach 992229cf2f Merge branch 'master' into develop 2019-02-22 23:06:07 +07:00
hathach 57aa554430 update tinyusb to latest for scsi write10 complete fix 2019-02-22 14:46:16 +07:00
hathach 9ed3f5ea32 fix #46 complete uf2 writing using tud_msc_write10_complete_cb 2019-02-22 00:21:34 +07:00
11 changed files with 59 additions and 96 deletions

No files matched your search

-1
View File
@@ -1,7 +1,6 @@
[submodule "tinyusb"]
path = lib/tinyusb
url = https://github.com/hathach/tinyusb.git
branch = develop
[submodule "lib/nrfx"]
path = lib/nrfx
url = https://github.com/NordicSemiconductor/nrfx.git
+4 -43
View File
@@ -28,7 +28,6 @@ SD_HEX = $(SD_PATH)/$(SD_FILENAME)_softdevice.hex
LD_FILE = $(SRC_PATH)/linker/$(SD_NAME)_v$(SD_VER1).ld
MERGED_FNAME = $(OUTPUT_FILENAME)_$(SD_NAME)_$(SD_VERSION)
RELEASE_DIR = bin/$(BOARD)
MK_DIS_FIRMWARE = "$(SD_NAME) $(SD_VERSION)"
@@ -86,7 +85,7 @@ BOARD_LIST = $(sort $(subst .h,,$(subst src/boards/,,$(wildcard src/boards/*.h))
NRF52832_BOARDLIST = feather_nrf52832
IS_52832 = $(filter $(BOARD),$(NRF52832_BOARDLIST))
ifeq ($(filter $(MAKECMDGOALS),all-board all-release help),)
ifeq ($(filter $(MAKECMDGOALS),all-board help),)
ifeq ($(BOARD),)
$(info You must provide a BOARD parameter with 'BOARD=')
$(info Supported boards are: $(BOARD_LIST))
@@ -360,20 +359,11 @@ _make_all_board = $(foreach b,$(BOARD_LIST), $(call _make_board,$b,$1))
all-board:
$(call _make_all_board,clean all)
all-release:
$(call _make_all_board,clean all release)
help:
@echo To flash (with jlink) a pre-built binary with a specific version to a board
@echo $$ make BOARD=feather_nrf52840_express VERSION=6.1.1r0 flash
@echo
@echo To flash (with dfu) a pre-built binary with a specific version to a board
@echo $$ make BOARD=feather_nrf52840_express VERSION=6.1.1r0 SERIAL=/dev/ttyACM0 dfu0-flash
@echo
@echo To compile and build the current code for a board
@echo $$ make BOARD=feather_nrf52840_express all
@echo
@echo To flash current code using jlink
@echo To flash current code using Jlink
@echo $$ make BOARD=feather_nrf52840_express flash
@echo
@echo To flash current code using existing bootloader dfu
@@ -388,8 +378,6 @@ __check_defined = \
$(if $(value $1),, \
$(error Undefined make flag: $1$(if $2, ($2))))
ifeq ($(VERSION),)
# Flash the compiled
flash: $(BUILD)/$(OUTPUT_FILENAME)-nosd.hex
@echo Flashing: $<
@@ -397,26 +385,7 @@ flash: $(BUILD)/$(OUTPUT_FILENAME)-nosd.hex
dfu-flash: $(BUILD)/$(MERGED_FNAME).zip
@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)
$(NRFUTIL) --verbose dfu serial --package $< -p $(SERIAL) -b 115200 --singlebank
else
ifeq ($(VERSION),latest)
VERSION_FPATH = $(RELEASE_DIR)/$(MERGED_FNAME)
else
VERSION_FPATH = bin/$(BOARD)/$(VERSION)/$(OUTPUT_FILENAME)_$(SD_NAME)_$(VERSION)
endif
# Flash specific version in binary release folder
flash:
@echo Flashing: $(VERSION_FPATH).hex
$(NRFJPROG) --program $(VERSION_FPATH).hex --chiperase -f nrf52 --reset
dfu-flash:
@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)
$(NRFUTIL) --verbose dfu serial --package $(VERSION_FPATH).zip -p $(SERIAL) -b 115200 --singlebank
endif
$(NRFUTIL) --verbose dfu serial --package $< -p $(SERIAL) -b 115200 --singlebank --touch 1200
sd:
@echo Flashing: $(SD_HEX)
@@ -457,7 +426,7 @@ size: $(BUILD)/$(OUTPUT_FILENAME)-nosd.out
#******************* Binary generator *******************
.phony: genhex genpkg release
.phony: genhex genpkg
## Create binary .hex file from the .out file
genhex: $(BUILD)/$(OUTPUT_FILENAME)-nosd.hex
@@ -478,11 +447,3 @@ genpkg: $(BUILD)/$(MERGED_FNAME).zip
$(BUILD)/$(MERGED_FNAME).zip: $(BUILD)/$(OUTPUT_FILENAME)-nosd.hex
@$(NRFUTIL) dfu genpkg --dev-type 0x0052 --dev-revision $(DFU_DEV_REV) --bootloader $< --softdevice $(SD_HEX) $@
# Create SD+bootloader combo with hex & dfu package at release folder
release: combinehex genpkg
@echo CR $(RELEASE_DIR)/$(MERGED_FNAME).hex
@echo CR $(RELEASE_DIR)/$(MERGED_FNAME).zip
@mkdir -p $(RELEASE_DIR)
@cp $(BUILD)/$(MERGED_FNAME).hex $(RELEASE_DIR)/$(MERGED_FNAME).hex
@cp $(BUILD)/$(MERGED_FNAME).zip $(RELEASE_DIR)/$(MERGED_FNAME).zip
+7 -1
View File
@@ -97,12 +97,18 @@ To build:
make BOARD=feather_nrf52840_express all combinehex
```
To flash the bootloader:
To flash the bootloader with JLink:
```
make BOARD=feather_nrf52840_express flash
```
To upgrade the bootloader using DFU Serial via port /dev/ttyACM0
```
make BOARD=feather_nrf52840_express SERIAL=/dev/ttyACM0 dfu-flash
```
To flash SoftDevice (and chip erase):
```
+4
View File
@@ -1,5 +1,9 @@
# Adafruit nRF52 Bootloader Changelog
## 0.2.9
- Fixed incomplete writes on Windows. Upated tinyusb to handle write10 completion, and use it for finalizing dfu process. Will prevent windows error message pop up. This will also give an extra time for flash writing to complete.
## 0.2.8
- Fixed OTA issue with nrfConnect on iOS
@@ -130,9 +130,9 @@ static void wait_for_events(void)
#ifdef NRF52840_XXAA
// skip if usb is not inited ( e.g OTA / finializing sd/bootloader )
extern bool usb_inited(void);
if ( usb_inited() )
if ( tusb_inited() )
{
tusb_task();
tud_task();
tud_cdc_write_flush();
}
#endif
+3 -2
View File
@@ -53,8 +53,9 @@ void flash_nrf5x_flush (bool need_erase)
{
// - nRF52832 dfu via uart can miss incoming byte when erasing because cpu is blocked for > 2ms.
// Since dfu_prepare_func_app_erase() already erase the page for us, we can skip it here.
// - nRF52840 dfu serial/uf2 are USB-based which are DMA and should have no problems. Note MSC uf2
// does not erase page in advance like dfu serial
// - nRF52840 dfu serial/uf2 are USB-based which are DMA and should have no problems.
//
// Note: MSC uf2 does not erase page in advance like dfu serial
if ( need_erase ) nrf_nvmc_page_erase(_fl_addr);
nrf_nvmc_write_words(_fl_addr, (uint32_t *) _fl_buf, FLASH_PAGE_SIZE / 4);
+25 -2
View File
@@ -39,6 +39,8 @@
#if CFG_TUD_MSC
#include "bootloader.h"
/*------------------------------------------------------------------*/
/* MACRO TYPEDEF CONSTANT ENUM
*------------------------------------------------------------------*/
@@ -46,8 +48,10 @@
/*------------------------------------------------------------------*/
/* UF2
*------------------------------------------------------------------*/
static WriteState _wr_state = { 0 };
void read_block(uint32_t block_no, uint8_t *data);
int write_block(uint32_t block_no, uint8_t *data, bool quiet/*, WriteState *state*/);
int write_block(uint32_t block_no, uint8_t *data, bool quiet, WriteState *state);
//--------------------------------------------------------------------+
// tinyusb callbacks
@@ -137,7 +141,7 @@ int32_t tud_msc_write10_cb (uint8_t lun, uint32_t lba, uint32_t offset, uint8_t*
uint32_t count = 0;
int wr_ret;
while ( (count < bufsize) && ((wr_ret = write_block(lba, buffer, false)) > 0) )
while ( (count < bufsize) && ((wr_ret = write_block(lba, buffer, false, &_wr_state)) > 0) )
{
lba++;
buffer += 512;
@@ -148,6 +152,25 @@ int32_t tud_msc_write10_cb (uint8_t lun, uint32_t lba, uint32_t offset, uint8_t*
return (wr_ret < 0) ? bufsize : count;
}
// Callback invoked when WRITE10 command is completed (status received and accepted by host).
void tud_msc_write10_complete_cb(uint8_t lun)
{
// uf2 file writing is complete --> complete DFU process
if ( _wr_state.numBlocks && (_wr_state.numWritten >= _wr_state.numBlocks) )
{
led_state(STATE_WRITING_FINISHED);
dfu_update_status_t update_status;
memset(&update_status, 0, sizeof(dfu_update_status_t ));
update_status.status_code = DFU_UPDATE_APP_COMPLETE;
update_status.app_crc = 0; // skip CRC checking with uf2 upgrade
update_status.app_size = _wr_state.numBlocks*256;
bootloader_dfu_update_process(update_status);
}
}
void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)
{
(void) lun;
+1 -21
View File
@@ -119,8 +119,6 @@ static FAT_BootBlock const BootBlock = {
#define NRF_LOG_DEBUG(...)
#define NRF_LOG_WARNING(...)
static WriteState _wr_state = { 0 };
// get current.uf2 flash size in bytes, round up to 256 bytes
static uint32_t current_flash_size(void)
{
@@ -241,21 +239,6 @@ void read_block(uint32_t block_no, uint8_t *data) {
/* Write UF2
*------------------------------------------------------------------*/
/** uf2 upgrade complete -> inform bootloader to update setting and reset */
static void uf2_write_complete(uint32_t numBlocks)
{
led_state(STATE_WRITING_FINISHED);
dfu_update_status_t update_status;
memset(&update_status, 0, sizeof(dfu_update_status_t ));
update_status.status_code = DFU_UPDATE_APP_COMPLETE;
update_status.app_crc = 0; // skip CRC checking with uf2 upgrade
update_status.app_size = numBlocks*256;
bootloader_dfu_update_process(update_status);
}
/** Write an block
*
* @return number of bytes processed, only 3 following values
@@ -263,9 +246,8 @@ static void uf2_write_complete(uint32_t numBlocks)
* 512 : write is successful
* 0 : is busy with flashing, tinyusb stack will call write_block again with the same parameters later on
*/
int write_block(uint32_t block_no, uint8_t *data, bool quiet/*, WriteState *state*/) {
int write_block(uint32_t block_no, uint8_t *data, bool quiet, WriteState *state) {
UF2_Block *bl = (void *)data;
WriteState* state = &_wr_state;
NRF_LOG_DEBUG("Write magic: %x", bl->magicStart0);
@@ -318,8 +300,6 @@ int write_block(uint32_t block_no, uint8_t *data, bool quiet/*, WriteState *stat
if (state->numWritten >= state->numBlocks) {
// flush last blocks
flash_nrf5x_flush(true);
uf2_write_complete(state->numBlocks);
}
}
NRF_LOG_DEBUG("wr %d=%d (of %d)", state->numWritten, bl->blockNo, bl->numBlocks);
-13
View File
@@ -63,22 +63,9 @@ extern uint16_t usb_desc_str_serial[1+16];
* We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. */
extern void tusb_hal_nrf_power_event(uint32_t event);
//------------- IMPLEMENTATION -------------//
static bool _inited = false;
bool usb_inited(void)
{
return _inited;
}
void usb_init(bool cdc_only)
{
// skipped if already inited
if ( _inited ) return;
_inited = true;
NVIC_SetPriority(USBD_IRQn, 2);
// USB power may already be ready at this time -> no event generated
+12 -10
View File
@@ -59,19 +59,21 @@ enum {
};
/*------------- Endpoint Numbering & Size -------------*/
#define _EP_IN(x) (0x80 | (x))
#define _EP_OUT(x) (x)
#define _EP_IN(x) (0x80 | (x))
#define _EP_OUT(x) (x)
// CDC
#define EP_CDC_NOTIF _EP_IN ( ITF_NUM_CDC+1 )
#define EP_CDC_NOTIF_SIZE 8
#define EP_CDC_NOTIF _EP_IN ( ITF_NUM_CDC+1 )
#define EP_CDC_NOTIF_SIZE 8
#define EP_CDC_OUT _EP_OUT( ITF_NUM_CDC+2 )
#define EP_CDC_IN _EP_IN ( ITF_NUM_CDC+2 )
#define EP_CDC_OUT _EP_OUT( ITF_NUM_CDC+2 )
#define EP_CDC_IN _EP_IN ( ITF_NUM_CDC+2 )
// Mass Storage
#define EP_MSC_OUT _EP_OUT( ITF_NUM_MSC+1 )
#define EP_MSC_IN _EP_IN ( ITF_NUM_MSC+1 )
#define EP_MSC_OUT _EP_OUT( ITF_NUM_MSC+1 )
#define EP_MSC_IN _EP_IN ( ITF_NUM_MSC+1 )
#define EP_MSC_SIZE 64
//--------------------------------------------------------------------+
// STRING DESCRIPTORS
@@ -280,7 +282,7 @@ usb_desc_cfg_t usb_desc_cfg =
.bDescriptorType = TUSB_DESC_ENDPOINT,
.bEndpointAddress = EP_MSC_OUT,
.bmAttributes = { .xfer = TUSB_XFER_BULK },
.wMaxPacketSize = { .size = CFG_TUD_MSC_EPSIZE},
.wMaxPacketSize = { .size = EP_MSC_SIZE},
.bInterval = 1
},
@@ -290,7 +292,7 @@ usb_desc_cfg_t usb_desc_cfg =
.bDescriptorType = TUSB_DESC_ENDPOINT,
.bEndpointAddress = EP_MSC_IN,
.bmAttributes = { .xfer = TUSB_XFER_BULK },
.wMaxPacketSize = { .size = CFG_TUD_MSC_EPSIZE},
.wMaxPacketSize = { .size = EP_MSC_SIZE },
.bInterval = 1
}
}