fix issue with dfu startup on nrf52832, change to adafruit-nrfutil
clean up dfu startup
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -42,7 +42,7 @@ MK_DIS_FIRMWARE = "$(SD_NAME) $(SD_VERSION) r$(SD_VER4)" | |||||||
| #****************************************************************************** | #****************************************************************************** | ||||||
| # Tool configure | # Tool configure | ||||||
| #****************************************************************************** | #****************************************************************************** | ||||||
| NRFUTIL = nrfutil | NRFUTIL = adafruit-nrfutil | ||||||
|  |  | ||||||
|  |  | ||||||
| ifneq ($(JLINK),) | ifneq ($(JLINK),) | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ This repository contains the bootloader for Adafruit nRF52 series and other popu | |||||||
| - Bluefruit Feather nRF52840 Express | - Bluefruit Feather nRF52840 Express | ||||||
| - Nordic nRF52840DK PCA10056 | - Nordic nRF52840DK PCA10056 | ||||||
|  |  | ||||||
| This bootloader is meant to use with [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil), a folk of [Nordic nrfutil](https://github.com/NordicSemiconductor/pc-nrfutil). To install | [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil), modified version of [Nordic nrfutil](https://github.com/NordicSemiconductor/pc-nrfutil), is required to perform DFU. Install python3 to your system if it is not installed already and run this command to install adafruit-nrfutil from PyPi: | ||||||
|  |  | ||||||
| 	$ pip3 install --user adafruit-nrfutil | 	$ pip3 install --user adafruit-nrfutil | ||||||
|  |  | ||||||
|   | |||||||
| @@ -60,9 +60,8 @@ typedef enum | |||||||
| static pstorage_handle_t        m_bootsettings_handle;  /**< Pstorage handle to use for registration and identifying the bootloader module on subsequent calls to the pstorage module for load and store of bootloader setting in flash. */ | static pstorage_handle_t        m_bootsettings_handle;  /**< Pstorage handle to use for registration and identifying the bootloader module on subsequent calls to the pstorage module for load and store of bootloader setting in flash. */ | ||||||
| static bootloader_status_t      m_update_status;        /**< Current update status for the bootloader module to ensure correct behaviour when updating settings and when update completes. */ | static bootloader_status_t      m_update_status;        /**< Current update status for the bootloader module to ensure correct behaviour when updating settings and when update completes. */ | ||||||
|  |  | ||||||
| APP_TIMER_DEF( _forced_startup_dfu_timer ); | APP_TIMER_DEF( _dfu_startup_timer ); | ||||||
| volatile bool forced_startup_dfu_packet_received = false; | volatile bool dfu_startup_packet_received = false; | ||||||
| volatile static bool _terminate_startup_dfu = false; |  | ||||||
|  |  | ||||||
| /**@brief   Function for handling callbacks from pstorage module. | /**@brief   Function for handling callbacks from pstorage module. | ||||||
|  * |  * | ||||||
| @@ -85,25 +84,19 @@ static void pstorage_callback_handler(pstorage_handle_t * p_handle, | |||||||
|     APP_ERROR_CHECK(result); |     APP_ERROR_CHECK(result); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Adafruit modifcation |  | ||||||
| static void terminate_startup_dfu(void * p_event_data, uint16_t event_size) |  | ||||||
| { |  | ||||||
|   (void) p_event_data; |  | ||||||
|   (void) event_size; |  | ||||||
|  |  | ||||||
|   _terminate_startup_dfu = true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* Terminate the forced DFU mode on startup if no packets is received | /* Terminate the forced DFU mode on startup if no packets is received | ||||||
|  * by put an terminal handler to scheduler |  * by put an terminal handler to scheduler | ||||||
|  */ |  */ | ||||||
| static void forced_startup_dfu_timer_handler(void * p_context) | static void dfu_startup_timer_handler(void * p_context) | ||||||
| { | { | ||||||
|   // No packets are received within timeout, terminal and DFU mode |   // No packets are received within timeout, terminal and DFU mode | ||||||
|   // forced_startup_dfu_packet_received is set by process_dfu_packet() in dfu_transport_serial.c |   // dfu_startup_packet_received is set by process_dfu_packet() in dfu_transport_serial.c | ||||||
|   if (!forced_startup_dfu_packet_received) |   if (!dfu_startup_packet_received) | ||||||
|   { |   { | ||||||
|     app_sched_event_put(NULL, 0, terminate_startup_dfu); |     dfu_update_status_t update_status; | ||||||
|  |     update_status.status_code = DFU_TIMEOUT; | ||||||
|  |  | ||||||
|  |     bootloader_dfu_update_process(update_status); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -142,9 +135,6 @@ static void wait_for_events(void) | |||||||
|       // When update has completed or a timeout/reset occured we will return. |       // When update has completed or a timeout/reset occured we will return. | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Forced startup dfu mode timeout without any received packet |  | ||||||
|     if ( _terminate_startup_dfu ) return; |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -339,11 +329,10 @@ uint32_t bootloader_dfu_start(bool ota, uint32_t timeout_ms) | |||||||
|       // timeout_ms > 0 is forced startup DFU |       // timeout_ms > 0 is forced startup DFU | ||||||
|       if ( timeout_ms ) |       if ( timeout_ms ) | ||||||
|       { |       { | ||||||
|         forced_startup_dfu_packet_received = false; |         dfu_startup_packet_received = false; | ||||||
|         _terminate_startup_dfu = false; |  | ||||||
|  |  | ||||||
|         (void) app_timer_create(&_forced_startup_dfu_timer, APP_TIMER_MODE_SINGLE_SHOT, forced_startup_dfu_timer_handler); |         app_timer_create(&_dfu_startup_timer, APP_TIMER_MODE_SINGLE_SHOT, dfu_startup_timer_handler); | ||||||
|         app_timer_start(_forced_startup_dfu_timer, APP_TIMER_TICKS(timeout_ms), NULL); |         app_timer_start(_dfu_startup_timer, APP_TIMER_TICKS(timeout_ms), NULL); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       err_code = dfu_transport_serial_update_start(); |       err_code = dfu_transport_serial_update_start(); | ||||||
| @@ -351,9 +340,6 @@ uint32_t bootloader_dfu_start(bool ota, uint32_t timeout_ms) | |||||||
|  |  | ||||||
|     wait_for_events(); |     wait_for_events(); | ||||||
|  |  | ||||||
|     // Close Serial transport after done |  | ||||||
|     if ( !ota ) dfu_transport_serial_close(); |  | ||||||
|  |  | ||||||
|     return err_code; |     return err_code; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -198,8 +198,8 @@ static void process_dfu_packet(void * p_event_data, uint16_t event_size) | |||||||
|     dfu_update_packet_t * packet; |     dfu_update_packet_t * packet; | ||||||
|  |  | ||||||
|     // Adafruit modification for startup dfu |     // Adafruit modification for startup dfu | ||||||
|     extern bool forced_startup_dfu_packet_received; |     extern bool dfu_startup_packet_received; | ||||||
|     forced_startup_dfu_packet_received = true; |     dfu_startup_packet_received = true; | ||||||
|  |  | ||||||
|         while (false == DATA_QUEUE_EMPTY()) |         while (false == DATA_QUEUE_EMPTY()) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -61,6 +61,9 @@ uint16_t _pwm_blue_seq[PWM_CHANNEL_NUM] = { PWM_MAXCOUNT/2, 0, 0 , 0 }; | |||||||
|  |  | ||||||
| void board_init(void) | void board_init(void) | ||||||
| { | { | ||||||
|  |   NRF_CLOCK->LFCLKSRC = (uint32_t)((CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk); | ||||||
|  |   NRF_CLOCK->TASKS_LFCLKSTART = 1UL; | ||||||
|  |  | ||||||
|   // stop WDT if started by application, when jumping from application using BLE DFU |   // stop WDT if started by application, when jumping from application using BLE DFU | ||||||
|   if ( NRF_WDT->RUNSTATUS ) |   if ( NRF_WDT->RUNSTATUS ) | ||||||
|   { |   { | ||||||
|   | |||||||
							
								
								
									
										130
									
								
								src/sdk_config.h
									
									
									
									
									
								
							
							
						
						
									
										130
									
								
								src/sdk_config.h
									
									
									
									
									
								
							| @@ -252,136 +252,6 @@ | |||||||
| // </e> | // </e> | ||||||
|  |  | ||||||
|  |  | ||||||
| // <e> PWM_ENABLED - nrf_drv_pwm - PWM peripheral driver |  | ||||||
| //========================================================== |  | ||||||
| #ifndef PWM_ENABLED |  | ||||||
| #define PWM_ENABLED 0 |  | ||||||
| #endif |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin  <0-31>  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_OUT0_PIN |  | ||||||
| #define PWM_DEFAULT_CONFIG_OUT0_PIN 31 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin  <0-31>  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_OUT1_PIN |  | ||||||
| #define PWM_DEFAULT_CONFIG_OUT1_PIN 31 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin  <0-31>  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_OUT2_PIN |  | ||||||
| #define PWM_DEFAULT_CONFIG_OUT2_PIN 31 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin  <0-31>  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_OUT3_PIN |  | ||||||
| #define PWM_DEFAULT_CONFIG_OUT3_PIN 31 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_BASE_CLOCK  - Base clock |  | ||||||
|   |  | ||||||
| // <0=> 16 MHz  |  | ||||||
| // <1=> 8 MHz  |  | ||||||
| // <2=> 4 MHz  |  | ||||||
| // <3=> 2 MHz  |  | ||||||
| // <4=> 1 MHz  |  | ||||||
| // <5=> 500 kHz  |  | ||||||
| // <6=> 250 kHz  |  | ||||||
| // <7=> 125 kHz  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_BASE_CLOCK |  | ||||||
| #define PWM_DEFAULT_CONFIG_BASE_CLOCK 4 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_COUNT_MODE  - Count mode |  | ||||||
|   |  | ||||||
| // <0=> Up  |  | ||||||
| // <1=> Up and Down  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_COUNT_MODE |  | ||||||
| #define PWM_DEFAULT_CONFIG_COUNT_MODE 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_TOP_VALUE - Top value  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_TOP_VALUE |  | ||||||
| #define PWM_DEFAULT_CONFIG_TOP_VALUE 1000 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_LOAD_MODE  - Load mode |  | ||||||
|   |  | ||||||
| // <0=> Common  |  | ||||||
| // <1=> Grouped  |  | ||||||
| // <2=> Individual  |  | ||||||
| // <3=> Waveform  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_LOAD_MODE |  | ||||||
| #define PWM_DEFAULT_CONFIG_LOAD_MODE 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_STEP_MODE  - Step mode |  | ||||||
|   |  | ||||||
| // <0=> Auto  |  | ||||||
| // <1=> Triggered  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_STEP_MODE |  | ||||||
| #define PWM_DEFAULT_CONFIG_STEP_MODE 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <o> PWM_DEFAULT_CONFIG_IRQ_PRIORITY  - Interrupt priority |  | ||||||
|   |  | ||||||
|  |  | ||||||
| // <i> Priorities 0,1,4,5 (nRF52) are reserved for SoftDevice |  | ||||||
| // <0=> 0 (highest)  |  | ||||||
| // <1=> 1  |  | ||||||
| // <2=> 2  |  | ||||||
| // <3=> 3  |  | ||||||
| // <4=> 4  |  | ||||||
| // <5=> 5  |  | ||||||
| // <6=> 6  |  | ||||||
| // <7=> 7  |  | ||||||
|  |  | ||||||
| #ifndef PWM_DEFAULT_CONFIG_IRQ_PRIORITY |  | ||||||
| #define PWM_DEFAULT_CONFIG_IRQ_PRIORITY 7 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <q> PWM0_ENABLED  - Enable PWM0 instance |  | ||||||
|   |  | ||||||
|  |  | ||||||
| #ifndef PWM0_ENABLED |  | ||||||
| #define PWM0_ENABLED 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <q> PWM1_ENABLED  - Enable PWM1 instance |  | ||||||
|   |  | ||||||
|  |  | ||||||
| #ifndef PWM1_ENABLED |  | ||||||
| #define PWM1_ENABLED 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <q> PWM2_ENABLED  - Enable PWM2 instance |  | ||||||
|   |  | ||||||
|  |  | ||||||
| #ifndef PWM2_ENABLED |  | ||||||
| #define PWM2_ENABLED 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // <q> PWM3_ENABLED  - Enable PWM3 instance |  | ||||||
|   |  | ||||||
|  |  | ||||||
| #ifndef PWM3_ENABLED |  | ||||||
| #define PWM3_ENABLED 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // </e> |  | ||||||
|  |  | ||||||
|  |  | ||||||
| // <e> RTC_ENABLED - nrf_drv_rtc - RTC peripheral driver | // <e> RTC_ENABLED - nrf_drv_rtc - RTC peripheral driver | ||||||
| //========================================================== | //========================================================== | ||||||
| #ifndef RTC_ENABLED | #ifndef RTC_ENABLED | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user