adding tinyusb support
This commit is contained in:
		@@ -64,7 +64,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
    /* Do not include nrf specific files when building for PC host */
 | 
			
		||||
#elif defined(__unix)
 | 
			
		||||
//#elif defined(__unix)
 | 
			
		||||
    /* Do not include nrf specific files when building for PC host */
 | 
			
		||||
#elif defined(__APPLE__)
 | 
			
		||||
    /* Do not include nrf specific files when building for PC host */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,192 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "dfu_app_handler.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "bootloader_util.h"
 | 
			
		||||
#include "nrf.h"
 | 
			
		||||
#include "nrf_sdm.h"
 | 
			
		||||
#include "ble_gatt.h"
 | 
			
		||||
#include "ble_gatts.h"
 | 
			
		||||
#include "app_error.h"
 | 
			
		||||
#include "dfu_ble_svc.h"
 | 
			
		||||
#include "device_manager.h"
 | 
			
		||||
#include "nrf_delay.h"
 | 
			
		||||
 | 
			
		||||
#define IRQ_ENABLED            0x01                                     /**< Field that identifies if an interrupt is enabled. */
 | 
			
		||||
#define MAX_NUMBER_INTERRUPTS  32                                       /**< Maximum number of interrupts available. */
 | 
			
		||||
 | 
			
		||||
static void                    dfu_app_reset_prepare(void);             /**< Forward declaration of default reset handler. */
 | 
			
		||||
static dfu_app_reset_prepare_t m_reset_prepare = dfu_app_reset_prepare; /**< Callback function to application to prepare for system reset. Allows application to clean up service and memory before reset. */
 | 
			
		||||
static dfu_ble_peer_data_t     m_peer_data;                             /**< Peer data to be used for data exchange when resetting into DFU mode. */
 | 
			
		||||
static dm_handle_t             m_dm_handle;                             /**< Device Manager handle with instance IDs of current BLE connection. */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for reset_prepare handler if the application has not registered a handler.
 | 
			
		||||
 */
 | 
			
		||||
static void dfu_app_reset_prepare(void)
 | 
			
		||||
{
 | 
			
		||||
    // Reset prepare should be handled by application.
 | 
			
		||||
    // This function can be extended to include default handling if application does not implement
 | 
			
		||||
    // own handler.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for disabling all interrupts before jumping from bootloader to application.
 | 
			
		||||
 */
 | 
			
		||||
static void interrupts_disable(void)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t interrupt_setting_mask;
 | 
			
		||||
    uint32_t irq;
 | 
			
		||||
 | 
			
		||||
    // Fetch the current interrupt settings.
 | 
			
		||||
    interrupt_setting_mask = NVIC->ISER[0];
 | 
			
		||||
 | 
			
		||||
    // Loop from interrupt 0 for disabling of all interrupts.
 | 
			
		||||
    for (irq = 0; irq < MAX_NUMBER_INTERRUPTS; irq++)
 | 
			
		||||
    {
 | 
			
		||||
        if (interrupt_setting_mask & (IRQ_ENABLED << irq))
 | 
			
		||||
        {
 | 
			
		||||
            // The interrupt was enabled, hence disable it.
 | 
			
		||||
            NVIC_DisableIRQ((IRQn_Type)irq);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for providing peer information to DFU for re-establishing a bonded connection in
 | 
			
		||||
 *        DFU mode.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] conn_handle   Connection handle for the connection requesting DFU mode.
 | 
			
		||||
 */
 | 
			
		||||
static void dfu_app_peer_data_set(uint16_t conn_handle)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t                 err_code;
 | 
			
		||||
    dm_sec_keyset_t          key_set;
 | 
			
		||||
    uint32_t                 app_context_data = 0;
 | 
			
		||||
    dm_application_context_t app_context;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** [DFU bond sharing] */
 | 
			
		||||
    err_code = dm_handle_get(conn_handle, &m_dm_handle);
 | 
			
		||||
    if (err_code == NRF_SUCCESS)
 | 
			
		||||
    {
 | 
			
		||||
        err_code = dm_distributed_keys_get(&m_dm_handle, &key_set);
 | 
			
		||||
        if (err_code == NRF_SUCCESS)
 | 
			
		||||
        {
 | 
			
		||||
            APP_ERROR_CHECK(err_code);
 | 
			
		||||
 | 
			
		||||
            m_peer_data.addr              = key_set.keys_central.p_id_key->id_addr_info;
 | 
			
		||||
            m_peer_data.irk               = key_set.keys_central.p_id_key->id_info;
 | 
			
		||||
            m_peer_data.enc_key.enc_info  = key_set.keys_periph.enc_key.p_enc_key->enc_info;
 | 
			
		||||
            m_peer_data.enc_key.master_id = key_set.keys_periph.enc_key.p_enc_key->master_id;
 | 
			
		||||
 | 
			
		||||
            err_code = dfu_ble_svc_peer_data_set(&m_peer_data);
 | 
			
		||||
            APP_ERROR_CHECK(err_code);
 | 
			
		||||
 | 
			
		||||
            app_context_data   = (DFU_APP_ATT_TABLE_CHANGED << DFU_APP_ATT_TABLE_POS);
 | 
			
		||||
            app_context.len    = sizeof(app_context_data);
 | 
			
		||||
            app_context.p_data = (uint8_t *)&app_context_data;
 | 
			
		||||
            app_context.flags  = 0;
 | 
			
		||||
 | 
			
		||||
            err_code = dm_application_context_set(&m_dm_handle, &app_context);
 | 
			
		||||
            APP_ERROR_CHECK(err_code);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            // Keys were not available, thus we have a non-encrypted connection.
 | 
			
		||||
            err_code = dm_peer_addr_get(&m_dm_handle, &m_peer_data.addr);
 | 
			
		||||
            APP_ERROR_CHECK(err_code);
 | 
			
		||||
 | 
			
		||||
            err_code = dfu_ble_svc_peer_data_set(&m_peer_data);
 | 
			
		||||
            APP_ERROR_CHECK(err_code);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
/** [DFU bond sharing] */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for preparing the reset, disabling SoftDevice, and jumping to the bootloader.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] conn_handle Connection handle for peer requesting to enter DFU mode.
 | 
			
		||||
 */
 | 
			
		||||
static void bootloader_start(uint16_t conn_handle)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t err_code;
 | 
			
		||||
    uint16_t sys_serv_attr_len = sizeof(m_peer_data.sys_serv_attr);
 | 
			
		||||
 | 
			
		||||
    err_code = sd_ble_gatts_sys_attr_get(conn_handle,
 | 
			
		||||
                                         m_peer_data.sys_serv_attr,
 | 
			
		||||
                                         &sys_serv_attr_len,
 | 
			
		||||
                                         BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS);
 | 
			
		||||
    if (err_code != NRF_SUCCESS)
 | 
			
		||||
    {
 | 
			
		||||
        // Any error at this stage means the system service attributes could not be fetched.
 | 
			
		||||
        // This means the service changed indication cannot be sent in DFU mode, but connection
 | 
			
		||||
        // is still possible to establish.
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_reset_prepare();
 | 
			
		||||
 | 
			
		||||
    err_code = sd_power_gpregret_set(BOOTLOADER_DFU_START);
 | 
			
		||||
    APP_ERROR_CHECK(err_code);
 | 
			
		||||
 | 
			
		||||
    err_code = sd_softdevice_disable();
 | 
			
		||||
    APP_ERROR_CHECK(err_code);
 | 
			
		||||
 | 
			
		||||
    err_code = sd_softdevice_vector_table_base_set(NRF_UICR->NRFFW[0]);
 | 
			
		||||
    APP_ERROR_CHECK(err_code);
 | 
			
		||||
 | 
			
		||||
    dfu_app_peer_data_set(conn_handle);
 | 
			
		||||
 | 
			
		||||
    NVIC_ClearPendingIRQ(SWI2_IRQn);
 | 
			
		||||
    interrupts_disable();
 | 
			
		||||
    bootloader_util_app_start(NRF_UICR->NRFFW[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void dfu_app_on_dfu_evt(ble_dfu_t * p_dfu, ble_dfu_evt_t * p_evt)
 | 
			
		||||
{
 | 
			
		||||
    switch (p_evt->ble_dfu_evt_type)
 | 
			
		||||
    {
 | 
			
		||||
        case BLE_DFU_START:
 | 
			
		||||
            // Starting the bootloader - will cause reset.
 | 
			
		||||
            bootloader_start(p_dfu->conn_handle);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
            {
 | 
			
		||||
                // Unsupported event received from DFU Service. 
 | 
			
		||||
                // Send back BLE_DFU_RESP_VAL_NOT_SUPPORTED message to peer.
 | 
			
		||||
                uint32_t err_code = ble_dfu_response_send(p_dfu,
 | 
			
		||||
                                                          BLE_DFU_START_PROCEDURE,
 | 
			
		||||
                                                          BLE_DFU_RESP_VAL_NOT_SUPPORTED);
 | 
			
		||||
                APP_ERROR_CHECK(err_code);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void dfu_app_reset_prepare_set(dfu_app_reset_prepare_t reset_prepare_func)
 | 
			
		||||
{
 | 
			
		||||
    m_reset_prepare = reset_prepare_func;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void dfu_app_dm_appl_instance_set(dm_application_instance_t app_instance)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t err_code;
 | 
			
		||||
    
 | 
			
		||||
    err_code = dm_application_instance_set(&app_instance, &m_dm_handle);
 | 
			
		||||
    APP_ERROR_CHECK(err_code);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,86 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
  
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup nrf_dfu_app_handler DFU BLE packet handling in application
 | 
			
		||||
 * @{
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Handling of DFU BLE packets in the application.
 | 
			
		||||
 *
 | 
			
		||||
 * @details This module implements the handling of DFU packets for switching 
 | 
			
		||||
 *          from an application to the bootloader and start DFU mode. The DFU
 | 
			
		||||
 *          packets are transmitted over BLE. 
 | 
			
		||||
 *          This module handles only the StartDFU packet, which allows a BLE 
 | 
			
		||||
 *          application to expose support for the DFU Service.
 | 
			
		||||
 *          The actual DFU Service runs in a dedicated environment after a BLE 
 | 
			
		||||
 *          disconnect and reset of the \nRFXX device. 
 | 
			
		||||
 *          The host must reconnect and continue the update procedure with 
 | 
			
		||||
 *          access to the full DFU Service.
 | 
			
		||||
 *
 | 
			
		||||
 * @note The application must propagate DFU events to this module by calling
 | 
			
		||||
 *       @ref dfu_app_on_dfu_evt from the @ref ble_dfu_evt_handler_t callback.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
#ifndef DFU_APP_HANDLER_H__
 | 
			
		||||
#define DFU_APP_HANDLER_H__
 | 
			
		||||
 | 
			
		||||
#include "ble_dfu.h"
 | 
			
		||||
#include "nrf_svc.h"
 | 
			
		||||
#include "bootloader_types.h"
 | 
			
		||||
#include "device_manager.h"
 | 
			
		||||
 | 
			
		||||
#define DFU_APP_ATT_TABLE_POS     0                     /**< Position for the ATT table changed setting. */
 | 
			
		||||
#define DFU_APP_ATT_TABLE_CHANGED 1                     /**< Value indicating that the ATT table might have changed. This value will be set in the application-specific context in Device Manager when entering DFU mode. */
 | 
			
		||||
 | 
			
		||||
/**@brief DFU application reset_prepare function. This function is a callback that allows the 
 | 
			
		||||
 *        application to prepare for an upcoming application reset. 
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*dfu_app_reset_prepare_t)(void);
 | 
			
		||||
 | 
			
		||||
/**@brief   Function for handling events from the DFU Service. 
 | 
			
		||||
 *
 | 
			
		||||
 * @details The application must inject this function into the DFU Service or propagate DFU events 
 | 
			
		||||
 *          to the dfu_app_handler module by calling this function in the application-specific DFU event 
 | 
			
		||||
 *          handler.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param[in] p_dfu  Pointer to the DFU Service structure to which the include event relates.
 | 
			
		||||
 * @param[in] p_evt  Pointer to the DFU event.
 | 
			
		||||
 */
 | 
			
		||||
void dfu_app_on_dfu_evt(ble_dfu_t * p_dfu, ble_dfu_evt_t * p_evt);
 | 
			
		||||
 | 
			
		||||
/**@brief Function for registering a function to prepare a reset.
 | 
			
		||||
 *
 | 
			
		||||
 * @details The provided function is executed before resetting the system into bootloader/DFU
 | 
			
		||||
 *          mode. By registering this function, the caller is notified before the reset and can
 | 
			
		||||
 *          thus prepare the application for reset. For example, the application can gracefully
 | 
			
		||||
 *          disconnect any peers on BLE, turn of LEDS, ensure that all pending flash operations
 | 
			
		||||
 *          have completed, and so on.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] reset_prepare_func  Function to be executed before a reset.
 | 
			
		||||
 */
 | 
			
		||||
void dfu_app_reset_prepare_set(dfu_app_reset_prepare_t reset_prepare_func);
 | 
			
		||||
 | 
			
		||||
/**@brief Function for setting the Device Manager application instance.
 | 
			
		||||
 *
 | 
			
		||||
 * @details This function allows to set the @ref dm_application_instance_t value that is returned by the 
 | 
			
		||||
 *          Device Manager when the application registers using @ref dm_register.
 | 
			
		||||
 *          If this function is not called, it is not be possible to share bonding information
 | 
			
		||||
 *          from the application to the bootloader/DFU when entering DFU mode.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] app_instance Value for the application instance in use.
 | 
			
		||||
 */
 | 
			
		||||
void dfu_app_dm_appl_instance_set(dm_application_instance_t app_instance);
 | 
			
		||||
 | 
			
		||||
#endif // DFU_APP_HANDLER_H__
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
@@ -1,52 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
void HardFault_Handler(void) __attribute__(( naked ));
 | 
			
		||||
 | 
			
		||||
void HardFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
    __asm volatile(
 | 
			
		||||
    "   .syntax unified                        \n"
 | 
			
		||||
 | 
			
		||||
    "   ldr   r0, =0xFFFFFFFD                  \n"
 | 
			
		||||
    "   cmp   r0, lr                           \n"
 | 
			
		||||
    "   bne   HardFault_Handler_ChooseMSP      \n"
 | 
			
		||||
    /* Reading PSP into R0 */
 | 
			
		||||
    "   mrs   r0, PSP                          \n"
 | 
			
		||||
    "   b     HardFault_Handler_Continue       \n"
 | 
			
		||||
    "HardFault_Handler_ChooseMSP:              \n"
 | 
			
		||||
    /* Reading MSP into R0 */
 | 
			
		||||
    "   mrs   r0, MSP                          \n"
 | 
			
		||||
    /* -----------------------------------------------------------------
 | 
			
		||||
     * If we have selected MSP check if we may use stack safetly.
 | 
			
		||||
     * If not - reset the stack to the initial value. */
 | 
			
		||||
    "   ldr   r1, =__StackTop                  \n"
 | 
			
		||||
    "   ldr   r2, =__StackLimit                \n"
 | 
			
		||||
 | 
			
		||||
    /* MSP is in the range of <__StackTop, __StackLimit) */
 | 
			
		||||
    "   cmp   r0, r1                           \n"
 | 
			
		||||
    "   bhi   HardFault_MoveSP                 \n"
 | 
			
		||||
    "   cmp   r0, r2                           \n"
 | 
			
		||||
    "   bhi   HardFault_Handler_Continue       \n"
 | 
			
		||||
    /* ----------------------------------------------------------------- */
 | 
			
		||||
    "HardFault_MoveSP:                         \n"
 | 
			
		||||
    "   mov   SP, r1                           \n"
 | 
			
		||||
    "   movs  r0, #0                           \n"
 | 
			
		||||
 | 
			
		||||
    "HardFault_Handler_Continue:               \n"
 | 
			
		||||
    "   ldr r3, =HardFault_c_handler           \n"
 | 
			
		||||
    "   bx r3                                  \n"
 | 
			
		||||
 | 
			
		||||
    "   .align                                 \n"
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
@@ -1,65 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#pragma section = "CSTACK"
 | 
			
		||||
extern void HardFault_c_handler( uint32_t * );
 | 
			
		||||
 | 
			
		||||
__stackless void HardFault_Handler(void);
 | 
			
		||||
 | 
			
		||||
__stackless void HardFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
    __asm volatile(
 | 
			
		||||
    "   ldr   r0, 100f                         \n"
 | 
			
		||||
    "   cmp   r0, lr                           \n"
 | 
			
		||||
    "   bne   1f                               \n"
 | 
			
		||||
    /* Reading PSP into R0 */
 | 
			
		||||
    "   mrs   r0, PSP                          \n"
 | 
			
		||||
    "   b     3f                               \n"
 | 
			
		||||
    "1:                                        \n"
 | 
			
		||||
    /* Reading MSP into R0 */
 | 
			
		||||
    "   mrs   r0, MSP                          \n"
 | 
			
		||||
    /* -----------------------------------------------------------------
 | 
			
		||||
     * If we have selected MSP check if we may use stack safetly.
 | 
			
		||||
     * If not - reset the stack to the initial value. */
 | 
			
		||||
    "   ldr   r1, 101f                         \n"
 | 
			
		||||
    "   ldr   r2, 102f                         \n"
 | 
			
		||||
 | 
			
		||||
    /* MSP is in the range of <__StackTop, __StackLimit) */
 | 
			
		||||
    "   cmp   r0, r1                           \n"
 | 
			
		||||
    "   bhi   2f                               \n"
 | 
			
		||||
    "   cmp   r0, r2                           \n"
 | 
			
		||||
    "   bhi   3f                               \n"
 | 
			
		||||
    /* ----------------------------------------------------------------- */
 | 
			
		||||
    "2:                                        \n"
 | 
			
		||||
    "   mov   SP, r1                           \n"
 | 
			
		||||
    "   movs  r0, #0                           \n"
 | 
			
		||||
 | 
			
		||||
    "3:                                        \n"
 | 
			
		||||
    "   ldr r3, 103f                           \n"
 | 
			
		||||
    "   bx r3                                  \n"
 | 
			
		||||
 | 
			
		||||
    "100:                                      \n"
 | 
			
		||||
    "   DC32 0xFFFFFFFD                        \n"
 | 
			
		||||
    "101:                                      \n"
 | 
			
		||||
    "   DC32 %c0                               \n"
 | 
			
		||||
    "102:                                      \n"
 | 
			
		||||
    "   DC32 %c1                               \n"
 | 
			
		||||
    "103:                                      \n"
 | 
			
		||||
    "   DC32 %c2                               \n"
 | 
			
		||||
    : /* Outputs */
 | 
			
		||||
    : /* Inputs */
 | 
			
		||||
    "i"(__section_end("CSTACK")),
 | 
			
		||||
    "i"(__section_begin("CSTACK")),
 | 
			
		||||
    "i"(&HardFault_c_handler)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
@@ -1,61 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
//lint -save -e27 -e10 -e19 -e40
 | 
			
		||||
extern char STACK$$Base;
 | 
			
		||||
 | 
			
		||||
/* This variable should be static but then it cannot be used in assembly code below.
 | 
			
		||||
 * The problem here is that the address of the section can be archived by $$ operator
 | 
			
		||||
 * that is not allowed in assembly code. */
 | 
			
		||||
char const * HardFault_Handler_stack_bottom = &STACK$$Base;
 | 
			
		||||
//lint -restore
 | 
			
		||||
 | 
			
		||||
__asm void HardFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
    PRESERVE8
 | 
			
		||||
    EXTERN HardFault_c_handler
 | 
			
		||||
    EXTERN __initial_sp
 | 
			
		||||
    EXTERN HardFault_Handler_stack_bottom
 | 
			
		||||
 | 
			
		||||
    ldr   r0, =0xFFFFFFFD
 | 
			
		||||
    cmp   r0, lr
 | 
			
		||||
    bne   HardFault_Handler_ChooseMSP
 | 
			
		||||
    /* Reading PSP into R0 */
 | 
			
		||||
    mrs   r0, PSP
 | 
			
		||||
    b     HardFault_Handler_Continue
 | 
			
		||||
HardFault_Handler_ChooseMSP
 | 
			
		||||
    /* Reading MSP into R0 */
 | 
			
		||||
    mrs   r0, MSP
 | 
			
		||||
    /* -----------------------------------------------------------------
 | 
			
		||||
     * If we have selected MSP, check if we may use stack safely.
 | 
			
		||||
     * If not - reset the stack to the initial value. */
 | 
			
		||||
    ldr   r1, =__initial_sp
 | 
			
		||||
    ldr   r2, =HardFault_Handler_stack_bottom
 | 
			
		||||
    ldr   r2, [r2]
 | 
			
		||||
 | 
			
		||||
    /* MSP is in the range of <__StackTop, __StackLimit) */
 | 
			
		||||
    cmp   r0, r1
 | 
			
		||||
    bhi   HardFault_MoveSP
 | 
			
		||||
    cmp   r0, r2
 | 
			
		||||
    bhi   HardFault_Handler_Continue
 | 
			
		||||
    /* ----------------------------------------------------------------- */
 | 
			
		||||
HardFault_MoveSP
 | 
			
		||||
    mov   SP, r1
 | 
			
		||||
    movs  r0, #0
 | 
			
		||||
 | 
			
		||||
HardFault_Handler_Continue
 | 
			
		||||
    ldr r3, =HardFault_c_handler
 | 
			
		||||
    bx r3
 | 
			
		||||
 | 
			
		||||
    ALIGN
 | 
			
		||||
}
 | 
			
		||||
@@ -1,64 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#pragma section = "CSTACK"
 | 
			
		||||
extern void HardFault_c_handler( uint32_t * );
 | 
			
		||||
 | 
			
		||||
__stackless void HardFault_Handler(void);
 | 
			
		||||
 | 
			
		||||
__stackless void HardFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
    __asm volatile(
 | 
			
		||||
    "   ldr.n r3, 103f                          \n"
 | 
			
		||||
    "   tst   lr, #4                            \n"
 | 
			
		||||
 | 
			
		||||
    /* PSP is quite simple and does not require additional handler */
 | 
			
		||||
    "   itt   ne                                \n"
 | 
			
		||||
    "   mrsne r0, psp                           \n"
 | 
			
		||||
    /* Jump to the handler, do not store LR - returning from handler just exits exception */
 | 
			
		||||
    "   bxne  r3                                \n"
 | 
			
		||||
 | 
			
		||||
    /* Processing MSP requires stack checking */
 | 
			
		||||
    "   mrs r0, msp                             \n"
 | 
			
		||||
 | 
			
		||||
    "   ldr.n r1, 101f                          \n"
 | 
			
		||||
    "   ldr.n r2, 102f                          \n"
 | 
			
		||||
 | 
			
		||||
    /* MSP is in the range of <__StackTop, __StackLimit) */
 | 
			
		||||
    "   cmp   r0, r1                            \n"
 | 
			
		||||
    "   bhi.n 1f                                \n"
 | 
			
		||||
    "   cmp   r0, r2                            \n"
 | 
			
		||||
    "   bhi.n 2f                                \n"
 | 
			
		||||
 | 
			
		||||
    "1:                                         \n"
 | 
			
		||||
    "   mov   sp, r1                            \n"
 | 
			
		||||
    "   mov   r0, #0                            \n"
 | 
			
		||||
 | 
			
		||||
    "2:                                         \n"
 | 
			
		||||
    "   bx r3                                   \n"
 | 
			
		||||
    /* Data alignment if required */
 | 
			
		||||
    "   nop                                     \n"
 | 
			
		||||
 | 
			
		||||
    "101:                                       \n"
 | 
			
		||||
    "   DC32 %c0                                \n"
 | 
			
		||||
    "102:                                       \n"
 | 
			
		||||
    "   DC32 %c1                                \n"
 | 
			
		||||
    "103:                                       \n"
 | 
			
		||||
    "   DC32 %c2                                \n"
 | 
			
		||||
    : /* Outputs */
 | 
			
		||||
    : /* Inputs */
 | 
			
		||||
    "i"(__section_end("CSTACK")),
 | 
			
		||||
    "i"(__section_begin("CSTACK")),
 | 
			
		||||
    "i"(&HardFault_c_handler)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
@@ -1,60 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
//lint -save -e27 -e10 -e19 -e40
 | 
			
		||||
extern char STACK$$Base;
 | 
			
		||||
 | 
			
		||||
/* This variable should be static but then it cannot be used in assembly code below.
 | 
			
		||||
 * The problem here is that the address of the section can be archived by $$ operator
 | 
			
		||||
 * that is not allowed in assembly code. */
 | 
			
		||||
char const * HardFault_Handler_stack_bottom = &STACK$$Base;
 | 
			
		||||
//lint -restore
 | 
			
		||||
 | 
			
		||||
__asm void HardFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
    PRESERVE8
 | 
			
		||||
    EXTERN HardFault_c_handler
 | 
			
		||||
    EXTERN __initial_sp
 | 
			
		||||
    EXTERN HardFault_Handler_stack_bottom
 | 
			
		||||
 | 
			
		||||
    ldr r3, =HardFault_c_handler
 | 
			
		||||
    tst lr, #4
 | 
			
		||||
 | 
			
		||||
    /* PSP is quite simple and does not require additional handler */
 | 
			
		||||
    itt ne
 | 
			
		||||
    mrsne r0, psp
 | 
			
		||||
    /* Jump to the handler, do not store LR - returning from handler just exits exception */
 | 
			
		||||
    bxne  r3
 | 
			
		||||
 | 
			
		||||
    /* Processing MSP requires stack checking */
 | 
			
		||||
    mrs r0, msp
 | 
			
		||||
 | 
			
		||||
    ldr   r1, =__initial_sp
 | 
			
		||||
    ldr   r2, =HardFault_Handler_stack_bottom
 | 
			
		||||
    ldr   r2, [r2]
 | 
			
		||||
 | 
			
		||||
    /* MSP is in the range of <__StackTop, __StackLimit) */
 | 
			
		||||
    cmp   r0, r1
 | 
			
		||||
    bhi   HardFault_MoveSP
 | 
			
		||||
    cmp   r0, r2
 | 
			
		||||
    bhi   HardFault_Handler_Continue
 | 
			
		||||
 | 
			
		||||
HardFault_MoveSP
 | 
			
		||||
    mov   sp, r1
 | 
			
		||||
    mov   r0, #0
 | 
			
		||||
 | 
			
		||||
HardFault_Handler_Continue
 | 
			
		||||
    bx r3
 | 
			
		||||
 | 
			
		||||
    ALIGN
 | 
			
		||||
}
 | 
			
		||||
@@ -1,53 +0,0 @@
 | 
			
		||||
/* Copyright (c) 2016 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "app_error.h"
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
#include "bsp.h"
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
/*lint -save -e14 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function is implemented as weak so that it can be overwritten by custom application error handler
 | 
			
		||||
 * when needed.
 | 
			
		||||
 */
 | 
			
		||||
__WEAK void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info)
 | 
			
		||||
{
 | 
			
		||||
    // On assert, the system can only recover with a reset.
 | 
			
		||||
#ifndef DEBUG
 | 
			
		||||
    NVIC_SystemReset();
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#ifdef BSP_DEFINES_ONLY
 | 
			
		||||
    LEDS_ON(LEDS_MASK);
 | 
			
		||||
#else
 | 
			
		||||
    UNUSED_VARIABLE(bsp_indication_set(BSP_INDICATE_FATAL_ERROR));
 | 
			
		||||
    // This call can be used for debug purposes during application development.
 | 
			
		||||
    // @note CAUTION: Activating this code will write the stack to flash on an error.
 | 
			
		||||
    //                This function should NOT be used in a final product.
 | 
			
		||||
    //                It is intended STRICTLY for development/debugging purposes.
 | 
			
		||||
    //                The flash write will happen EVEN if the radio is active, thus interrupting
 | 
			
		||||
    //                any communication.
 | 
			
		||||
    //                Use with care. Uncomment the line below to use.
 | 
			
		||||
    //ble_debug_assert_handler(error_code, line_num, p_file_name);
 | 
			
		||||
#endif // BSP_DEFINES_ONLY
 | 
			
		||||
 | 
			
		||||
    app_error_save_and_stop(id, pc, info);
 | 
			
		||||
 | 
			
		||||
#endif // DEBUG
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*lint -restore */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user