Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of nRF51822 by
nordic/bootloader_dfu/bootloader_util_arm.c@66:b3680699d9a4, 2014-09-22 (annotated)
- Committer:
- Rohit Grover
- Date:
- Mon Sep 22 11:19:51 2014 +0100
- Revision:
- 66:b3680699d9a4
- Child:
- 69:61da91a52bd6
Release 0.2.0
=============
Highlights:
Add support for over-the-air firmware updates.
Features
~~~~~~~~
- Add files to support DFU bootloader.
- charHandle is now a part of GattCharacteristicWriteCBParams.
- nRF51GattServer::addService(): Skip any incompletely defined, read-only
characteristics. For instance, the DeviceInformationService may have many
optional, read-only characteristics which may be safely dropped if the
application hasn't defined them.
Bugfixes
~~~~~~~~
None.
Compatibility
~~~~~~~~~~~~~
Works with 0.2.0 of BLE_API.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Rohit Grover |
66:b3680699d9a4 | 1 | /* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. |
| Rohit Grover |
66:b3680699d9a4 | 2 | * |
| Rohit Grover |
66:b3680699d9a4 | 3 | * The information contained herein is property of Nordic Semiconductor ASA. |
| Rohit Grover |
66:b3680699d9a4 | 4 | * Terms and conditions of usage are described in detail in NORDIC |
| Rohit Grover |
66:b3680699d9a4 | 5 | * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. |
| Rohit Grover |
66:b3680699d9a4 | 6 | * |
| Rohit Grover |
66:b3680699d9a4 | 7 | * Licensees are granted free, non-transferable use of the information. NO |
| Rohit Grover |
66:b3680699d9a4 | 8 | * WARRANTY of ANY KIND is provided. This heading must NOT be removed from |
| Rohit Grover |
66:b3680699d9a4 | 9 | * the file. |
| Rohit Grover |
66:b3680699d9a4 | 10 | * |
| Rohit Grover |
66:b3680699d9a4 | 11 | */ |
| Rohit Grover |
66:b3680699d9a4 | 12 | |
| Rohit Grover |
66:b3680699d9a4 | 13 | #include "bootloader_util.h" |
| Rohit Grover |
66:b3680699d9a4 | 14 | #include <stdint.h> |
| Rohit Grover |
66:b3680699d9a4 | 15 | |
| Rohit Grover |
66:b3680699d9a4 | 16 | |
| Rohit Grover |
66:b3680699d9a4 | 17 | /** |
| Rohit Grover |
66:b3680699d9a4 | 18 | * @brief Function for aborting current handler mode and jump to to other application/bootloader. |
| Rohit Grover |
66:b3680699d9a4 | 19 | * |
| Rohit Grover |
66:b3680699d9a4 | 20 | * @details This functions will use the address provide (reset handler) to be executed after |
| Rohit Grover |
66:b3680699d9a4 | 21 | * handler mode is exited. It creates an initial stack to ensure correct reset behavior |
| Rohit Grover |
66:b3680699d9a4 | 22 | * when the reset handler is executed. |
| Rohit Grover |
66:b3680699d9a4 | 23 | * |
| Rohit Grover |
66:b3680699d9a4 | 24 | * @param[in] reset_handler Address of the reset handler to be executed when handler mode exits. |
| Rohit Grover |
66:b3680699d9a4 | 25 | * |
| Rohit Grover |
66:b3680699d9a4 | 26 | * @note This function must never be called directly from 'C' but is intended only to be used from |
| Rohit Grover |
66:b3680699d9a4 | 27 | * \ref bootloader_util_reset. This function will never return but issue a reset into |
| Rohit Grover |
66:b3680699d9a4 | 28 | * provided address. |
| Rohit Grover |
66:b3680699d9a4 | 29 | */ |
| Rohit Grover |
66:b3680699d9a4 | 30 | __asm void isr_abort(uint32_t reset_handler) |
| Rohit Grover |
66:b3680699d9a4 | 31 | { |
| Rohit Grover |
66:b3680699d9a4 | 32 | xPSR_RESET EQU 0x21000000 ; Default value of xPSR after System Reset. |
| Rohit Grover |
66:b3680699d9a4 | 33 | EXC_RETURN_CMD EQU 0xFFFFFFF9 ; EXC_RETURN for ARM Cortex. When loaded to PC the current interrupt service routine (handler mode) willl exit and the stack will be popped. Execution will continue in thread mode. |
| Rohit Grover |
66:b3680699d9a4 | 34 | |
| Rohit Grover |
66:b3680699d9a4 | 35 | LDR R4,=MASK_ONES ; Fill with ones before jumping to reset handling. We be popped as R12 when exiting ISR (Cleaning up the registers). |
| Rohit Grover |
66:b3680699d9a4 | 36 | LDR R5,=MASK_ONES ; Fill with ones before jumping to reset handling. We be popped as LR when exiting ISR. Ensures no return to application. |
| Rohit Grover |
66:b3680699d9a4 | 37 | MOV R6, R0 ; Move address of reset handler to R6. Will be popped as PC when exiting ISR. Ensures the reset handler will be executed when exist ISR. |
| Rohit Grover |
66:b3680699d9a4 | 38 | LDR R7,=xPSR_RESET ; Move reset value of xPSR to R7. Will be popped as xPSR when exiting ISR. |
| Rohit Grover |
66:b3680699d9a4 | 39 | PUSH {r4-r7} ; Push everything to new stack to allow interrupt handler to fetch it on exiting the ISR. |
| Rohit Grover |
66:b3680699d9a4 | 40 | |
| Rohit Grover |
66:b3680699d9a4 | 41 | LDR R4,=MASK_ZEROS ; Fill with zeros before jumping to reset handling. We be popped as R0 when exiting ISR (Cleaning up of the registers). |
| Rohit Grover |
66:b3680699d9a4 | 42 | LDR R5,=MASK_ZEROS ; Fill with zeros before jumping to reset handling. We be popped as R1 when exiting ISR (Cleaning up of the registers). |
| Rohit Grover |
66:b3680699d9a4 | 43 | LDR R6,=MASK_ZEROS ; Fill with zeros before jumping to reset handling. We be popped as R2 when exiting ISR (Cleaning up of the registers). |
| Rohit Grover |
66:b3680699d9a4 | 44 | LDR R7,=MASK_ZEROS ; Fill with zeros before jumping to reset handling. We be popped as R3 when exiting ISR (Cleaning up of the registers). |
| Rohit Grover |
66:b3680699d9a4 | 45 | PUSH {r4-r7} ; Push zeros (R4-R7) to stack to prepare for exiting the interrupt routine. |
| Rohit Grover |
66:b3680699d9a4 | 46 | |
| Rohit Grover |
66:b3680699d9a4 | 47 | LDR R0,=EXC_RETURN_CMD ; Load the execution return command into register. |
| Rohit Grover |
66:b3680699d9a4 | 48 | BX R0 ; No return - Handler mode will be exited. Stack will be popped and execution will continue in reset handler initializing other application. |
| Rohit Grover |
66:b3680699d9a4 | 49 | ALIGN |
| Rohit Grover |
66:b3680699d9a4 | 50 | } |
| Rohit Grover |
66:b3680699d9a4 | 51 | |
| Rohit Grover |
66:b3680699d9a4 | 52 | |
| Rohit Grover |
66:b3680699d9a4 | 53 | /** |
| Rohit Grover |
66:b3680699d9a4 | 54 | * @brief Function for aborting current application/bootloader jump to to other app/bootloader. |
| Rohit Grover |
66:b3680699d9a4 | 55 | * |
| Rohit Grover |
66:b3680699d9a4 | 56 | * @details This functions will use the address provide to swap the stack pointer and then load |
| Rohit Grover |
66:b3680699d9a4 | 57 | * the address of the reset handler to be executed. It will check current system mode |
| Rohit Grover |
66:b3680699d9a4 | 58 | * (thread/handler) and if in thread mode it will reset into other application. |
| Rohit Grover |
66:b3680699d9a4 | 59 | * If in handler mode \ref isr_abort will be executed to ensure correct exit of handler |
| Rohit Grover |
66:b3680699d9a4 | 60 | * mode and jump into reset handler of other application. |
| Rohit Grover |
66:b3680699d9a4 | 61 | * |
| Rohit Grover |
66:b3680699d9a4 | 62 | * @param[in] start_addr Start address of other application. This address must point to the |
| Rohit Grover |
66:b3680699d9a4 | 63 | initial stack pointer of the application. |
| Rohit Grover |
66:b3680699d9a4 | 64 | * |
| Rohit Grover |
66:b3680699d9a4 | 65 | * @note This function will never return but issue a reset into provided application. |
| Rohit Grover |
66:b3680699d9a4 | 66 | */ |
| Rohit Grover |
66:b3680699d9a4 | 67 | __asm static void bootloader_util_reset(uint32_t start_addr) |
| Rohit Grover |
66:b3680699d9a4 | 68 | { |
| Rohit Grover |
66:b3680699d9a4 | 69 | MASK_ONES EQU 0xFFFFFFFF ; Ones, to be loaded into register as default value before reset. |
| Rohit Grover |
66:b3680699d9a4 | 70 | MASK_ZEROS EQU 0x00000000 ; Zeros, to be loaded into register as default value before reset. |
| Rohit Grover |
66:b3680699d9a4 | 71 | |
| Rohit Grover |
66:b3680699d9a4 | 72 | LDR R1, [R0] ; Get App initial MSP for bootloader. |
| Rohit Grover |
66:b3680699d9a4 | 73 | MSR MSP, R1 ; Set the main stack pointer to the applications MSP. |
| Rohit Grover |
66:b3680699d9a4 | 74 | LDR R0,[R0, #0x04] ; Load Reset handler into register 0. |
| Rohit Grover |
66:b3680699d9a4 | 75 | |
| Rohit Grover |
66:b3680699d9a4 | 76 | LDR R2, =MASK_ZEROS ; Load zeros to R2 |
| Rohit Grover |
66:b3680699d9a4 | 77 | MRS R3, IPSR ; Load IPSR to R3 to check for handler or thread mode |
| Rohit Grover |
66:b3680699d9a4 | 78 | CMP R2, R3 ; Compare, if 0 then we are in thread mode and can continue to reset handler of bootloader |
| Rohit Grover |
66:b3680699d9a4 | 79 | BNE isr_abort ; If not zero we need to exit current ISR and jump to reset handler of bootloader |
| Rohit Grover |
66:b3680699d9a4 | 80 | |
| Rohit Grover |
66:b3680699d9a4 | 81 | LDR R4, =MASK_ONES ; Load ones to R4 to be placed in Link Register. |
| Rohit Grover |
66:b3680699d9a4 | 82 | MOV LR, R4 ; Clear the link register and set to ones to ensure no return. |
| Rohit Grover |
66:b3680699d9a4 | 83 | BX R0 ; Branch to reset handler of bootloader |
| Rohit Grover |
66:b3680699d9a4 | 84 | ALIGN |
| Rohit Grover |
66:b3680699d9a4 | 85 | } |
| Rohit Grover |
66:b3680699d9a4 | 86 | |
| Rohit Grover |
66:b3680699d9a4 | 87 | |
| Rohit Grover |
66:b3680699d9a4 | 88 | void bootloader_util_app_start(uint32_t start_addr) |
| Rohit Grover |
66:b3680699d9a4 | 89 | { |
| Rohit Grover |
66:b3680699d9a4 | 90 | bootloader_util_reset(start_addr); |
| Rohit Grover |
66:b3680699d9a4 | 91 | } |
