hpw422移植新的sdk
This commit is contained in:
@@ -0,0 +1,347 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_task.h
|
||||
*
|
||||
* @brief Header file - APPTASK.
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef APP_TASK_H_
|
||||
#define APP_TASK_H_
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APPTASK Task
|
||||
* @ingroup APP
|
||||
* @brief Routes ALL messages to/from APP block.
|
||||
*
|
||||
* The APPTASK is the block responsible for bridging the final application with
|
||||
*the RWBLE software host stack. It communicates with the different modules of
|
||||
*the BLE host, i.e. @ref SMP, @ref GAP and @ref GATT.
|
||||
*
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "app_sec.h"
|
||||
#include "co_bt_defines.h"
|
||||
#include "dbg.h"
|
||||
#include "gapm_int.h"
|
||||
#include "gatt_msg_int.h" // GATTC Definitions
|
||||
#include "ke_task.h" // Kernel Task
|
||||
#include "rwip_task.h" // Task definitions
|
||||
#include "usr_client.h"
|
||||
#include "xc_gap_api.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h> // Standard Integer Definition
|
||||
#include <stdio.h>
|
||||
|
||||
#define BOND_TEST 0
|
||||
#define MULTI_ROLE_TEST 1
|
||||
#define WHITE_LIST_TEST 0
|
||||
|
||||
#define CONNECT_DEV_NUM 5
|
||||
extern struct app_env_tag app_env;
|
||||
#if (NVDS_SUPPORT)
|
||||
#include "nvds.h"
|
||||
#endif // (NVDS_SUPPORT)
|
||||
|
||||
#define APP_HANDLERS(subtask) \
|
||||
{ \
|
||||
&subtask##_msg_handler_list[0], ARRAY_LEN(subtask##_msg_handler_list) \
|
||||
}
|
||||
|
||||
#define APP_DEVICE_NAME_MAX_LEN (18)
|
||||
/// Default Device Name
|
||||
#define APP_DFLT_DEVICE_NAME ("XC_BLE_MULTI_ROLE")
|
||||
#define APP_DFLT_DEVICE_NAME_LEN (sizeof(APP_DFLT_DEVICE_NAME))//must not be greater than APP_DEVICE_NAME_MAX_LEN
|
||||
#define APP_SINGLEOTA_DEVICE_NAME "OTA_TEST"
|
||||
#define APP_SINGLEOTA_DEVICE_NAME_LEN (sizeof(APP_SINGLEOTA_DEVICE_NAME))
|
||||
/// Maximal length of the Device Name value
|
||||
#define APP_DEVICE_NAME_MAX_LEN (18)
|
||||
#define APP_MAX_TX_POWER (0)
|
||||
// Advertising channel map - 37, 38, 39
|
||||
#define APP_ADV_CHMAP (0x07)
|
||||
// Advertising minimum interval - 40ms (64*0.625ms)
|
||||
#define APP_ADV_INT_MIN (64)
|
||||
// Advertising maximum interval - 40ms (64*0.625ms)
|
||||
#define APP_ADV_INT_MAX (64)
|
||||
|
||||
#define ADV_DATA_MAX_LENGTH 28
|
||||
|
||||
#define MANUFACTURER_DATA "\x09\xFF\x00\x60\x52\x57\x2D\x42\x4C\x45"
|
||||
#define MANUFACTURER_DATA_LEN 10
|
||||
/// Advertising duration (in unit of 10ms). 0 means that advertising continues
|
||||
/// until the host disable it
|
||||
#define ADV_DURATION 0
|
||||
|
||||
#define APP_SCAN_INTERVAL (0xa0)
|
||||
#define APP_SCAN_WINDOW (0x50)
|
||||
|
||||
#define APP_CONN_EST_TIME_OUT (0)
|
||||
#define APP_CONN_SCNA_INTV (32)
|
||||
#define APP_CONN_SCAN_WD (20)
|
||||
#define APP_CONN_INTV_MIN (80)
|
||||
#define APP_CONN_INV_MAX (80)
|
||||
#define APP_CONN_LATENCY (0)
|
||||
#define APP_CONN_TIME_OUT (500)
|
||||
|
||||
/// Number of APP Task Instances
|
||||
#define APP_IDX_MAX 1
|
||||
#define DEV_APPEARANCE 0
|
||||
|
||||
#define BLE_UAPDATA_MIN_INTVALUE 8
|
||||
#define BLE_UAPDATA_MAX_INTVALUE 10
|
||||
#define BLE_UAPDATA_LATENCY 0
|
||||
#define BLE_UAPDATA_TIMEOUT 200
|
||||
|
||||
#define INVALID_DATA 0xFF
|
||||
// #define TAGET_DEVICE_ADDR ("\x02\x6e\x00\x05\x21\x41")
|
||||
#define TAGET_DEVICE_ADDR ("\x41\x21\x05\x00\x6e\x02")
|
||||
|
||||
/// Application environment structure
|
||||
struct app_env_tag
|
||||
{
|
||||
/// Connection handle
|
||||
uint16_t conhdl;
|
||||
/// Connection Index
|
||||
uint8_t conidx;
|
||||
/// Current advertising state (@see enum app_adv_state)
|
||||
uint8_t adv_state;
|
||||
/// Current advertising state (@see enum app_adv_state)
|
||||
uint8_t scan_state;
|
||||
/// Current advertising state (@see enum app_adv_state)
|
||||
uint8_t init_state;
|
||||
/// Next expected operation completed event
|
||||
uint8_t adv_op;
|
||||
|
||||
/// Last initialized profile
|
||||
uint8_t next_svc;
|
||||
|
||||
/// Bonding status
|
||||
bool bonded;
|
||||
|
||||
/// Device Name length
|
||||
uint8_t dev_name_len;
|
||||
/// Device Name
|
||||
uint8_t dev_name[APP_DEVICE_NAME_MAX_LEN];
|
||||
|
||||
/// Local device IRK
|
||||
uint8_t loc_irk[KEY_LEN];
|
||||
|
||||
/// Secure Connections on current link
|
||||
bool sec_con_enabled;
|
||||
|
||||
/// Counter used to generate IRK
|
||||
uint8_t rand_cnt;
|
||||
|
||||
/// Demonstration type length
|
||||
uint8_t demo_type_len;
|
||||
/// Demonstration type
|
||||
uint8_t demo_type;
|
||||
/// GATT user local identifier
|
||||
uint8_t user_lid;
|
||||
uint8_t adv_actv_idx;
|
||||
uint8_t scan_actv_idx;
|
||||
uint8_t init_actv_idx;
|
||||
uint8_t slave_conidx;
|
||||
uint8_t master_conidx;
|
||||
bool slave_connected;
|
||||
bool master_connected;
|
||||
};
|
||||
#define APP_ADDR_MAXLEN 6
|
||||
#define APP_NAME_MAXLEN 21
|
||||
struct conn_dev_info
|
||||
{
|
||||
uint8_t conidx;
|
||||
uint8_t addr[APP_ADDR_MAXLEN];
|
||||
bool connnectd;
|
||||
bool role;
|
||||
};
|
||||
struct ADV_INFO{
|
||||
uint8_t addr[APP_ADDR_MAXLEN];
|
||||
uint8_t name_length;
|
||||
uint8_t name[APP_NAME_MAXLEN];
|
||||
};
|
||||
#if (NVDS_SUPPORT)
|
||||
/// List of Application NVDS TAG identifiers
|
||||
enum app_nvds_tag
|
||||
{
|
||||
/// Device Name
|
||||
NVDS_TAG_DEVICE_NAME = 0x02,
|
||||
NVDS_LEN_DEVICE_NAME = 62,
|
||||
|
||||
/// BD Address
|
||||
NVDS_TAG_BD_ADDRESS = 0x01,
|
||||
NVDS_LEN_BD_ADDRESS = 6,
|
||||
|
||||
/// Local device Identity resolving key
|
||||
NVDS_TAG_LOC_IRK = 0xA0,
|
||||
NVDS_LEN_LOC_IRK = KEY_LEN,
|
||||
|
||||
#if (BLE_APP_PRF)
|
||||
/// BLE Application Advertising data
|
||||
NVDS_TAG_APP_BLE_ADV_DATA = 0x0B,
|
||||
NVDS_LEN_APP_BLE_ADV_DATA = 32,
|
||||
|
||||
/// BLE Application Scan response data
|
||||
NVDS_TAG_APP_BLE_SCAN_RESP_DATA = 0x0C,
|
||||
NVDS_LEN_APP_BLE_SCAN_RESP_DATA = 32,
|
||||
|
||||
/// Mouse Sample Rate
|
||||
NVDS_TAG_MOUSE_SAMPLE_RATE = 0x38,
|
||||
NVDS_LEN_MOUSE_SAMPLE_RATE = 1,
|
||||
|
||||
/// Peripheral Bonded
|
||||
NVDS_TAG_PERIPH_BONDED = 0x39,
|
||||
NVDS_LEN_PERIPH_BONDED = 1,
|
||||
|
||||
/// Mouse NTF Cfg
|
||||
NVDS_TAG_MOUSE_NTF_CFG = 0x3A,
|
||||
NVDS_LEN_MOUSE_NTF_CFG = 2,
|
||||
|
||||
/// Mouse Timeout value
|
||||
NVDS_TAG_MOUSE_TIMEOUT = 0x3B,
|
||||
NVDS_LEN_MOUSE_TIMEOUT = 2,
|
||||
|
||||
/// Peer Device BD Address
|
||||
NVDS_TAG_PEER_BD_ADDRESS = 0x3C,
|
||||
NVDS_LEN_PEER_BD_ADDRESS = 7,
|
||||
|
||||
/// Mouse Energy Safe
|
||||
NVDS_TAG_MOUSE_ENERGY_SAFE = 0x3D,
|
||||
NVDS_LEN_MOUSE_SAFE_ENERGY = 2,
|
||||
|
||||
/// EDIV (2bytes), RAND NB (8bytes), LTK (16 bytes), Key Size (1 byte)
|
||||
NVDS_TAG_LTK = 0x3E,
|
||||
NVDS_LEN_LTK = 28,
|
||||
|
||||
/// PAIRING
|
||||
NVDS_TAG_PAIRING = 0x3F,
|
||||
NVDS_LEN_PAIRING = 54,
|
||||
|
||||
/// Audio mode 0 task
|
||||
NVDS_TAG_AM0_FIRST = 0x90,
|
||||
NVDS_TAG_AM0_LAST = 0x9F,
|
||||
|
||||
/// Peer device Resolving identity key (+identity address)
|
||||
NVDS_TAG_PEER_IRK = 0xA1,
|
||||
NVDS_LEN_PEER_IRK = sizeof(struct gapc_irk),
|
||||
|
||||
#endif //(BLE_APP_PRF)
|
||||
};
|
||||
#endif // (NVDS_SUPPORT)
|
||||
|
||||
/// Advertising state machine
|
||||
enum app_adv_state
|
||||
{
|
||||
/// Advertising activity does not exists
|
||||
APP_ADV_STATE_IDLE = 0,
|
||||
#if BLE_APP_PRF
|
||||
/// Creating advertising activity
|
||||
APP_ADV_STATE_CREATING,
|
||||
/// Setting advertising data
|
||||
APP_ADV_STATE_SETTING_ADV_DATA,
|
||||
/// Setting scan response data
|
||||
APP_ADV_STATE_SETTING_SCAN_RSP_DATA,
|
||||
|
||||
/// Advertising activity created
|
||||
APP_ADV_STATE_CREATED,
|
||||
/// Starting advertising activity
|
||||
APP_ADV_STATE_STARTING,
|
||||
/// Advertising activity started
|
||||
APP_ADV_STATE_STARTED,
|
||||
/// Stopping advertising activity
|
||||
APP_ADV_STATE_STOPPING,
|
||||
APP_ADV_STATE_STOPPED,
|
||||
#endif //(BLE_APP_PRF)
|
||||
};
|
||||
|
||||
/// Scanning state machine
|
||||
enum app_scan_state
|
||||
{
|
||||
APP_SCAN_STATE_IDLE = 0,
|
||||
APP_SCAN_STATE_CREATING,
|
||||
APP_SCAN_STATE_CREATED,
|
||||
APP_SCAN_STATE_STARTING,
|
||||
APP_SCAN_STATE_STARTED,
|
||||
APP_SCAN_STATE_STOPPING,
|
||||
APP_SCAN_STATE_STOPPED,
|
||||
};
|
||||
|
||||
/// initting state machine
|
||||
enum app_init_state
|
||||
{
|
||||
APP_INIT_STATE_IDLE = 0,
|
||||
APP_INIT_STATE_CREATING,
|
||||
APP_INIT_STATE_CREATED,
|
||||
APP_INIT_STATE_STARTING,
|
||||
APP_INIT_STATE_STARTED,
|
||||
APP_INIT_STATE_STOPPING,
|
||||
APP_INIT_STATE_STOPPED,
|
||||
};
|
||||
|
||||
/// States of APP task
|
||||
enum app_state
|
||||
{
|
||||
/// Initialization state
|
||||
APP_INIT,
|
||||
/// Database create state
|
||||
APP_CREATE_DB,
|
||||
/// Ready State
|
||||
APP_READY,
|
||||
/// Connected state
|
||||
APP_CONNECTED,
|
||||
|
||||
/// Number of defined states.
|
||||
APP_STATE_MAX
|
||||
};
|
||||
|
||||
/// APP Task messages
|
||||
/*@TRACE*/
|
||||
enum app_msg_id
|
||||
{
|
||||
APP_DUMMY_MSG = TASK_FIRST_MSG(TASK_ID_APP),
|
||||
|
||||
#if (BLE_APP_PRF)
|
||||
#if (BLE_APP_HT)
|
||||
/// Timer used to refresh the temperature measurement value
|
||||
APP_HT_MEAS_INTV_TIMER,
|
||||
#endif //(BLE_APP_HT)
|
||||
|
||||
#if (BLE_APP_HID)
|
||||
/// Timer used to disconnect the moue if no activity is detecter
|
||||
APP_HID_MOUSE_TIMEOUT_TIMER,
|
||||
#endif //(BLE_APP_HID)
|
||||
#endif //(BLE_APP_PRF)
|
||||
#if (FLASH_TEST_IN_TASK || FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
ONE_SEC_TIMER_MSG,
|
||||
#endif // (FLASH_TEST_IN_TASK || FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
#if (CENTRAL_SEND_TEST_DATA)
|
||||
CENTRAL_SEND_DATA_TIMER,
|
||||
#endif // (CENTRAL_SEND_TEST_DATA)
|
||||
};
|
||||
|
||||
struct app_subtask_handlers
|
||||
{
|
||||
/// Pointer to the message handler table
|
||||
const struct ke_msg_handler *p_msg_handler_tab;
|
||||
/// Number of messages handled
|
||||
uint16_t msg_cnt;
|
||||
};
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Initialize the BLE demo application.
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_init(void);
|
||||
struct app_env_tag *get_app_env(void);
|
||||
/// @} APPTASK
|
||||
|
||||
#endif // APP_TASK_H_
|
||||
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file rwapp_config.h
|
||||
*
|
||||
* @brief Application configuration definition
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2016
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _RWAPP_CONFIG_H_
|
||||
#define _RWAPP_CONFIG_H_
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup app
|
||||
* @brief Application configuration definition
|
||||
*
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#define CFG_APP_BATT
|
||||
/******************************************************************************************/
|
||||
/* ------------------------- BLE APPLICATION SETTINGS
|
||||
* -----------------------------*/
|
||||
/******************************************************************************************/
|
||||
|
||||
/// Application Profile
|
||||
#if defined(CFG_APP_PRF)
|
||||
#define BLE_APP_PRF 1
|
||||
#else // defined(CFG_APP_PRF)
|
||||
#define BLE_APP_PRF 0
|
||||
#endif // defined(CFG_APP_PRF)
|
||||
|
||||
/// Health Thermometer Application
|
||||
#if defined(CFG_APP_HT)
|
||||
#define BLE_APP_HT 1
|
||||
#else // defined(CFG_APP_HT)
|
||||
#define BLE_APP_HT 0
|
||||
#endif // defined(CFG_APP_HT)
|
||||
|
||||
/// HID Application
|
||||
#if defined(CFG_APP_HID)
|
||||
#define BLE_APP_HID 1
|
||||
#else // defined(CFG_APP_HID)
|
||||
#define BLE_APP_HID 0
|
||||
#endif // defined(CFG_APP_HID)
|
||||
|
||||
/// DIS Application
|
||||
#if defined(CFG_APP_DIS)
|
||||
#define BLE_APP_DIS 1
|
||||
#else // defined(CFG_APP_DIS)
|
||||
#define BLE_APP_DIS 0
|
||||
#endif // defined(CFG_APP_DIS)
|
||||
|
||||
/// Battery Service Application
|
||||
#if defined(CFG_APP_BATT)
|
||||
#define BLE_APP_BATT 1
|
||||
#else
|
||||
#define BLE_APP_BATT 0
|
||||
#endif //(BLE_APP_BATT)
|
||||
|
||||
// There are 3 modes of flash operation, turn on one of them according to your needs.
|
||||
// This method can be operated at any time without affecting the Bluetooth send and receive packets.
|
||||
#define FLASH_TEST_IN_INTERRUPT (0)
|
||||
// This method can be operated at any time, and will affect the Bluetooth send and receive packets.
|
||||
#define FLASH_TEST_IN_TASK (0)
|
||||
// This way operates in the gap of Bluetooth and will not affect the Bluetooth sending and receiving packets,
|
||||
// but the flash operation may not be successful immediately.
|
||||
#define FLASH_TEST_IN_BLUETOOTH_GAP (0)
|
||||
|
||||
// The master sends test data to the slave once per second.
|
||||
#define CENTRAL_SEND_TEST_DATA (0)
|
||||
|
||||
|
||||
/// @} rwapp_config
|
||||
|
||||
#endif /* _RWAPP_CONFIG_H_ */
|
||||
@@ -0,0 +1,152 @@
|
||||
|
||||
#ifndef SDK_DRIVER_CONFIG_H
|
||||
#define SDK_DRIVER_CONFIG_H
|
||||
// <<< Use Configuration Wizard in Context Menu >>>\n
|
||||
#ifdef USE_APP_CONFIG
|
||||
#include "app_config.h"
|
||||
#endif
|
||||
// <h> XC_Drivers
|
||||
|
||||
// <e> XC_CLOCK_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_CLOCK_ENABLED
|
||||
#define XC_CLOCK_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_PWR_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_PWR_ENABLED
|
||||
#define XC_PWR_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_WDT_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_WDT_ENABLED
|
||||
#define XC_WDT_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_BOR_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_BOR_ENABLED
|
||||
#define XC_BOR_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_SYSTICK_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_SYSTICK_ENABLED
|
||||
#define XC_SYSTICK_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_TIMER_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_TIMER_ENABLED
|
||||
#define XC_TIMER_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_AOTIMER_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_AOTIMER_ENABLED
|
||||
#define XC_AOTIMER_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_GPIO_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_GPIO_ENABLED
|
||||
#define XC_GPIO_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_ADC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_ADC_ENABLED
|
||||
#define XC_ADC_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_UART_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_UART_ENABLED
|
||||
#define XC_UART_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_PWM_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_PWM_ENABLED
|
||||
#define XC_PWM_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_FMC_SPI_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_FMC_SPI_ENABLED
|
||||
#define XC_FMC_SPI_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_SPI_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_SPI_ENABLED
|
||||
#define XC_SPI_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_IIC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_IIC_ENABLED
|
||||
#define XC_IIC_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_RTC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_RTC_ENABLED
|
||||
#define XC_RTC_ENABLED 0
|
||||
#endif
|
||||
|
||||
//==========================================================
|
||||
// <q> XC_RTC_DATE_INT_ENABLED
|
||||
|
||||
#ifndef XC_RTC_DATE_INT_ENABLED
|
||||
#define XC_RTC_DATE_INT_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_DMA_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_DMA_ENABLED
|
||||
#define XC_DMA_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_PGA_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_PGA_ENABLED
|
||||
#define XC_PGA_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_QDEC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_QDEC_ENABLED
|
||||
#define XC_QDEC_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_CALIB_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_CALIB_ENABLED
|
||||
#define XC_CALIB_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <<< end of configuration section >>>
|
||||
#endif //SDK_DRIVER_CONFIG_H
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_batt.c
|
||||
*
|
||||
* @brief Battery Application Module entry point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // SW configuration
|
||||
|
||||
#if (BLE_APP_BATT)
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "app_batt.h" // Battery Application Module Definitions
|
||||
#include "app_task.h" // application task definitions
|
||||
#include "bass_msg.h" // health thermometer functions
|
||||
#include "co_bt.h"
|
||||
#include "co_utils.h"
|
||||
#include "prf_types.h" // Profile common types definition
|
||||
#include "arch.h" // Platform Definitions
|
||||
#include "prf.h"
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Battery Application Module Environment Structure
|
||||
struct app_batt_env_tag app_batt_env;
|
||||
|
||||
/*
|
||||
* GLOBAL FUNCTION DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
void app_batt_init(void)
|
||||
{
|
||||
// Reset the environment
|
||||
memset(&app_batt_env, 0, sizeof(struct app_batt_env_tag));
|
||||
|
||||
// Initial battery level: 100
|
||||
app_batt_env.batt_lvl = 100;
|
||||
}
|
||||
|
||||
void app_batt_add_bas(void)
|
||||
{
|
||||
struct bass_db_cfg* db_cfg;
|
||||
// Allocate the BASS_CREATE_DB_REQ
|
||||
struct gapm_profile_task_add_cmd *req = KE_MSG_ALLOC_DYN(GAPM_PROFILE_TASK_ADD_CMD,
|
||||
TASK_GAPM, TASK_APP,
|
||||
gapm_profile_task_add_cmd, sizeof(struct bass_db_cfg));
|
||||
// Fill message
|
||||
req->operation = GAPM_PROFILE_TASK_ADD;
|
||||
req->sec_lvl = 0;//PERM(SVC_AUTH, AUTH);
|
||||
req->prf_api_id = TASK_ID_BASS;
|
||||
req->app_task = TASK_APP;
|
||||
req->start_hdl = 0;
|
||||
|
||||
// Set parameters
|
||||
db_cfg = (struct bass_db_cfg* ) req->param;
|
||||
|
||||
// Add a BAS instance
|
||||
db_cfg->bas_nb = 1;
|
||||
// Sending of notifications is supported
|
||||
db_cfg->features[0] = BAS_BATT_LVL_NTF_SUP;
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(req);
|
||||
}
|
||||
|
||||
void app_batt_enable_prf(uint8_t conidx)
|
||||
{
|
||||
app_batt_env.conidx = conidx;
|
||||
|
||||
// Allocate the message
|
||||
struct bass_enable_req * req = KE_MSG_ALLOC(BASS_ENABLE_REQ,
|
||||
prf_dst_task_get(TASK_ID_BASS),
|
||||
TASK_APP,
|
||||
bass_enable_req);
|
||||
|
||||
// Fill in the parameter structure
|
||||
req->conidx = conidx;
|
||||
|
||||
// NTF initial status - Disabled
|
||||
req->ntf_cfg = PRF_CLI_STOP_NTFIND;
|
||||
req->old_batt_lvl[0] = 50;
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(req);
|
||||
}
|
||||
|
||||
void app_batt_send_lvl(uint8_t batt_lvl)
|
||||
{
|
||||
ASSERT_ERR(batt_lvl <= BAS_BATTERY_LVL_MAX);
|
||||
|
||||
// Allocate the message
|
||||
struct bass_batt_level_upd_req * req = KE_MSG_ALLOC(BASS_BATT_LEVEL_UPD_REQ,
|
||||
prf_dst_task_get(TASK_ID_BASS),
|
||||
TASK_APP,
|
||||
bass_batt_level_upd_req);
|
||||
|
||||
// Fill in the parameter structure
|
||||
req->bas_instance = 0;
|
||||
req->batt_level = batt_lvl;
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(req);
|
||||
}
|
||||
|
||||
static int bass_batt_level_ntf_cfg_ind_handler(ke_msg_id_t const msgid,
|
||||
struct bass_batt_level_ntf_cfg_ind const *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
static int batt_level_upd_handler(ke_msg_id_t const msgid,
|
||||
struct bass_batt_level_upd_rsp const *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief
|
||||
*
|
||||
* @param[in] msgid Id of the message received.
|
||||
* @param[in] param Pointer to the parameters of the message.
|
||||
* @param[in] dest_id ID of the receiving task instance (TASK_GAP).
|
||||
* @param[in] src_id ID of the sending task instance.
|
||||
*
|
||||
* @return If the message was consumed or not.
|
||||
****************************************************************************************
|
||||
*/
|
||||
static int app_batt_msg_dflt_handler(ke_msg_id_t const msgid,
|
||||
void const *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
// Drop the message
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
/*
|
||||
* LOCAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Default State handlers definition
|
||||
const struct ke_msg_handler app_batt_msg_handler_list[] =
|
||||
{
|
||||
// Note: first message is latest message checked by kernel so default is put on top.
|
||||
{KE_MSG_DEFAULT_HANDLER, (ke_msg_func_t)app_batt_msg_dflt_handler},
|
||||
|
||||
{BASS_BATT_LEVEL_NTF_CFG_IND, (ke_msg_func_t)bass_batt_level_ntf_cfg_ind_handler},
|
||||
{BASS_BATT_LEVEL_UPD_RSP, (ke_msg_func_t)batt_level_upd_handler},
|
||||
};
|
||||
|
||||
const struct app_subtask_handlers app_batt_handlers = APP_HANDLERS(app_batt);
|
||||
|
||||
#endif //BLE_APP_BATT
|
||||
|
||||
/// @} APP
|
||||
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_batt.h
|
||||
*
|
||||
* @brief Battery Application Module entry point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef APP_BATT_H_
|
||||
#define APP_BATT_H_
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP
|
||||
* @ingroup RICOW
|
||||
*
|
||||
* @brief Battery Application Module entry point
|
||||
*
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // SW configuration
|
||||
|
||||
#if (BLE_APP_BATT)
|
||||
|
||||
#include <stdint.h> // Standard Integer Definition
|
||||
#include "ke_task.h" // Kernel Task Definition
|
||||
|
||||
/*
|
||||
* STRUCTURES DEFINITION
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Battery Application Module Environment Structure
|
||||
struct app_batt_env_tag
|
||||
{
|
||||
/// Connection handle
|
||||
uint8_t conidx;
|
||||
/// Current Battery Level
|
||||
uint8_t batt_lvl;
|
||||
};
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLES DECLARATIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Battery Application environment
|
||||
extern struct app_batt_env_tag app_batt_env;
|
||||
|
||||
/// Table of message handlers
|
||||
extern const struct app_subtask_handlers app_batt_handlers;
|
||||
|
||||
/*
|
||||
* FUNCTIONS DECLARATION
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* Health Thermometer Application Functions
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Initialize Battery Application Module
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_init(void);
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Add a Battery Service instance in the DB
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_add_bas(void);
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Enable the Battery Service
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_enable_prf(uint8_t conidx);
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Send a Battery level value
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_send_lvl(uint8_t batt_lvl);
|
||||
|
||||
#endif //(BLE_APP_BATT)
|
||||
|
||||
/// @} APP
|
||||
|
||||
#endif // APP_BATT_H_
|
||||
@@ -0,0 +1,56 @@
|
||||
#if 0
|
||||
/*@TRACE*/
|
||||
enum basc_msg_id
|
||||
{
|
||||
/// Start the Battery Service Client Role - at connection
|
||||
// BASC_ENABLE_REQ = MSG_ID(BASC, 0x00),
|
||||
///Confirm that cfg connection has finished with discovery results, or that normal cnx started
|
||||
BASC_ENABLE_RSP = MSG_ID(BASC, 0x01),
|
||||
|
||||
/// Read Characteristic Value Request
|
||||
// BASC_READ_INFO_REQ = MSG_ID(BASC, 0x02),
|
||||
/// Read Characteristic Value Request
|
||||
BASC_READ_INFO_RSP = MSG_ID(BASC, 0x03),
|
||||
|
||||
/// Write Battery Level Notification Configuration Value request
|
||||
// BASC_BATT_LEVEL_NTF_CFG_REQ = MSG_ID(BASC, 0x04),
|
||||
/// Write Battery Level Notification Configuration Value response
|
||||
BASC_BATT_LEVEL_NTF_CFG_RSP = MSG_ID(BASC, 0x05),
|
||||
|
||||
/// Indicate to APP that the Battery Level value has been received
|
||||
BASC_BATT_LEVEL_IND = MSG_ID(BASC, 0x06),
|
||||
};
|
||||
#endif
|
||||
|
||||
void xc_basc_enbale_req()
|
||||
{
|
||||
//send msg
|
||||
BASC_ENABLE_REQ
|
||||
}
|
||||
|
||||
void xc_basc_read_info_req()
|
||||
{
|
||||
//send msg
|
||||
BASC_READ_INFO_REQ
|
||||
}
|
||||
|
||||
void xc_basc_batt_leval_ntf_cfg_req()
|
||||
{
|
||||
//send msg
|
||||
BASC_BATT_LEVEL_NTF_CFG_REQ
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Default State handlers definition
|
||||
KE_MSG_HANDLER_TAB(basc)
|
||||
{
|
||||
// Note: all messages must be sorted in ID ascending order
|
||||
|
||||
{BASC_ENABLE_RSP, (ke_msg_func_t) xxx_handler },
|
||||
{BASC_READ_INFO_RSP, (ke_msg_func_t) xxx_handler },
|
||||
{BASC_BATT_LEVEL_NTF_CFG_RSP, (ke_msg_func_t) xxx_handler },
|
||||
{BASC_BATT_LEVEL_IND, (ke_msg_func_t) xxx_handler },
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,546 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_sec.c
|
||||
*
|
||||
* @brief Application Security Entry Point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
#include "rwip_config.h"
|
||||
#if (BLE_APP_PRESENT)
|
||||
#if (BLE_HOST_SUPPORT_SMP)
|
||||
#include "rwip_config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include "co_utils.h"
|
||||
#include "co_math.h"
|
||||
//#include "gapc_task.h" // GAP Controller Task API Definition
|
||||
#include "gap.h" // GAP Definition
|
||||
#include "gapc.h" // GAPC Definition
|
||||
#include "gapc_int.h"
|
||||
#include "prf_types.h"
|
||||
|
||||
#include "app_sec.h" // Application Security API Definition
|
||||
#include "app_task.h" // Application Manager API Definition
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
#include "nvds.h" // NVDS API Definitions
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
#include "app_task.h"
|
||||
uint8_t bond_flag = 0;
|
||||
struct gapc_ltk g_ltk = {0};
|
||||
/*
|
||||
* GLOBAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Application Security Environment Structure
|
||||
struct app_sec_env_tag app_sec_env;
|
||||
|
||||
/*
|
||||
* GLOBAL FUNCTION DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
void app_sec_init()
|
||||
{
|
||||
/*------------------------------------------------------
|
||||
* RETRIEVE BOND STATUS
|
||||
*------------------------------------------------------*/
|
||||
#if (NVDS_SUPPORT)
|
||||
uint8_t length = NVDS_LEN_PERIPH_BONDED;
|
||||
|
||||
// Get bond status from NVDS
|
||||
if (nvds_get(NVDS_TAG_PERIPH_BONDED, &length, (uint8_t *)&app_sec_env.bonded) != NVDS_OK)
|
||||
{
|
||||
// If read value is invalid, set status to not bonded
|
||||
app_sec_env.bonded = false;
|
||||
}
|
||||
|
||||
if ((app_sec_env.bonded != true) && (app_sec_env.bonded != false))
|
||||
{
|
||||
app_sec_env.bonded = false;
|
||||
}
|
||||
LOGI("===bond_state:%d\r\n",app_sec_env.bonded);
|
||||
#endif //(NVDS_SUPPORT)
|
||||
}
|
||||
|
||||
bool app_sec_get_bond_status(void)
|
||||
{
|
||||
return app_sec_env.bonded;
|
||||
}
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
void app_sec_remove_bond(void)
|
||||
{
|
||||
#if (BLE_APP_HID)
|
||||
uint16_t ntf_cfg = PRF_CLI_STOP_NTFIND;
|
||||
#endif //(BLE_APP_HID)
|
||||
|
||||
// Check if we are well bonded
|
||||
if (app_sec_env.bonded == true)
|
||||
{
|
||||
// Update the environment variable
|
||||
app_sec_env.bonded = false;
|
||||
|
||||
if (nvds_put(NVDS_TAG_PERIPH_BONDED, NVDS_LEN_PERIPH_BONDED,
|
||||
(uint8_t *)&app_sec_env.bonded) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
if (nvds_del(NVDS_TAG_LTK) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
if (nvds_del(NVDS_TAG_PEER_BD_ADDRESS) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
#if (BLE_APP_HID)
|
||||
if (nvds_put(NVDS_TAG_MOUSE_NTF_CFG, NVDS_LEN_MOUSE_NTF_CFG,
|
||||
(uint8_t *)&ntf_cfg) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
#endif //(BLE_APP_HID)
|
||||
}
|
||||
}
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
|
||||
/*
|
||||
* MESSAGE HANDLERS
|
||||
****************************************************************************************
|
||||
*/
|
||||
static int app_sec_msg_dflt_handler(ke_msg_id_t const msgid,
|
||||
void *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
// Drop the message
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static int gapc_bond_req_ind_handler(ke_msg_id_t const msgid,
|
||||
void const * p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
struct gapc_bond_req_ind *param = (struct gapc_bond_req_ind *)p_param;
|
||||
LOGI(" [debug] gapc_bond_req_ind_handler,request:0x%x \r\n",param->request);
|
||||
// Prepare the GAPC_BOND_CFM message
|
||||
struct gapc_bond_cfm *cfm = KE_MSG_ALLOC(GAPC_BOND_CFM,
|
||||
src_id, TASK_APP,
|
||||
gapc_bond_cfm);
|
||||
switch (param->request)
|
||||
{
|
||||
case (GAPC_PAIRING_REQ):
|
||||
{
|
||||
cfm->request = GAPC_PAIRING_RSP;
|
||||
{
|
||||
cfm->accept = true;
|
||||
#if (BLE_SEC_CON)
|
||||
cfm->data.pairing_feat.auth = GAP_AUTH_REQ_SEC_CON_BOND;
|
||||
#else // (BLE_SEC_CON)
|
||||
cfm->data.pairing_feat.auth = GAP_AUTH_REQ_NO_MITM_BOND;
|
||||
#endif // (BLE_SEC_CON)
|
||||
|
||||
app_env.sec_con_enabled = true;
|
||||
cfm->data.pairing_feat.iocap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT;//GAP_IO_CAP_KB_ONLY;//GAP_IO_CAP_DISPLAY_ONLY;//GAP_IO_CAP_NO_INPUT_NO_OUTPUT;
|
||||
cfm->data.pairing_feat.key_size = 16;
|
||||
cfm->data.pairing_feat.oob = GAP_OOB_AUTH_DATA_NOT_PRESENT;
|
||||
cfm->data.pairing_feat.sec_req = GAP_SEC1_NOAUTH_PAIR_ENC;//GAP_SEC1_AUTH_PAIR_ENC;//GAP_NO_SEC;
|
||||
cfm->data.pairing_feat.rkey_dist = GAP_KDIST_ENCKEY | GAP_KDIST_IDKEY;
|
||||
cfm->data.pairing_feat.ikey_dist = GAP_KDIST_ENCKEY | GAP_KDIST_IDKEY;
|
||||
}
|
||||
} break;
|
||||
|
||||
case (GAPC_LTK_EXCH):
|
||||
{
|
||||
// Counter
|
||||
uint8_t counter;
|
||||
cfm->accept = true;
|
||||
cfm->request = GAPC_LTK_EXCH;
|
||||
// Generate all the values
|
||||
cfm->data.ltk.ediv = (uint16_t)co_rand_word();
|
||||
|
||||
for (counter = 0; counter < RAND_NB_LEN; counter++)
|
||||
{
|
||||
cfm->data.ltk.ltk.key[counter] = (uint8_t)co_rand_word();
|
||||
cfm->data.ltk.randnb.nb[counter] = (uint8_t)co_rand_word();
|
||||
}
|
||||
|
||||
for (counter = RAND_NB_LEN; counter < KEY_LEN; counter++)
|
||||
{
|
||||
cfm->data.ltk.ltk.key[counter] = (uint8_t)co_rand_word();
|
||||
}
|
||||
#if (1)
|
||||
LOGI( "nvds_put cfm->ediv=0x%x\r\nparam_randnb:",cfm->data.ltk.ediv);
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",cfm->data.ltk.randnb.nb[i]);
|
||||
LOGI("\r\nltk:");
|
||||
for(uint8_t i=0;i<GAP_KEY_LEN;i++)
|
||||
LOGI( "%x",cfm->data.ltk.ltk.key[i]);
|
||||
LOGI("\r\n");
|
||||
#endif
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
uint8_t err = nvds_del(NVDS_TAG_LTK);
|
||||
LOGI("err2 =%d \n", err);
|
||||
// Store the generated value in NVDS
|
||||
if (nvds_put(NVDS_TAG_LTK, NVDS_LEN_LTK, (uint8_t *)&cfm->data.ltk) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
// uint8_t buff5[10] = {1,2,3,4,5,6,9,8,9,11};
|
||||
// // LOGI("nvds del:%d \r\n",nvds_del(16));
|
||||
// if (nvds_put(18, 10, buff5) != NVDS_OK)
|
||||
// {
|
||||
// LOGI("77111\r\n");
|
||||
// ASSERT_ERR(0);
|
||||
// }
|
||||
// LOGI("77222\r\n");
|
||||
|
||||
#endif // #if (NVDS_SUPPORT)
|
||||
} break;
|
||||
|
||||
|
||||
case (GAPC_IRK_EXCH):
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
uint8_t addr_len = BD_ADDR_LEN;
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
cfm->accept = true;
|
||||
cfm->request = GAPC_IRK_EXCH;
|
||||
|
||||
// Load IRK
|
||||
memcpy(cfm->data.irk.irk.key, app_env.loc_irk, KEY_LEN);
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
if (nvds_get(NVDS_TAG_BD_ADDRESS, &addr_len, cfm->data.irk.addr.addr) != NVDS_OK)
|
||||
#endif //(NVDS_SUPPORT)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
// load device address
|
||||
cfm->data.irk.addr.addr_type = (cfm->data.irk.addr.addr[5] & 0xC0) ? ADDR_RAND : ADDR_PUBLIC;
|
||||
} break;
|
||||
|
||||
|
||||
//#if (BLE_APP_HT)
|
||||
case (GAPC_TK_EXCH):
|
||||
{
|
||||
// Generate a PIN Code- (Between 100000 and 999999)
|
||||
uint32_t pin_code = (100000 + (co_rand_word()%900000));
|
||||
|
||||
LOGI("app_sec GAPC_TK_EXCH: tk_type=%d\r\n",param->data.tk_type);
|
||||
cfm->accept = true;
|
||||
cfm->request = GAPC_TK_EXCH;
|
||||
|
||||
// Set the TK value
|
||||
memset(cfm->data.tk.key, 0, KEY_LEN);
|
||||
|
||||
cfm->data.tk.key[0] = (uint8_t)((pin_code & 0x000000FF) >> 0);
|
||||
cfm->data.tk.key[1] = (uint8_t)((pin_code & 0x0000FF00) >> 8);
|
||||
cfm->data.tk.key[2] = (uint8_t)((pin_code & 0x00FF0000) >> 16);
|
||||
cfm->data.tk.key[3] = (uint8_t)((pin_code & 0xFF000000) >> 24);
|
||||
|
||||
LOGI("###GAPC_TK_EXCH pincode=%d\r\n", pin_code);
|
||||
|
||||
} break;
|
||||
//#endif //(BLE_APP_HT)
|
||||
|
||||
default:
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
} break;
|
||||
}
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(cfm);
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
static int gapc_bond_ind_handler(ke_msg_id_t const msgid,
|
||||
void const *p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
struct gapc_bond_ind const *param = (struct gapc_bond_ind const *)p_param;
|
||||
|
||||
LOGI(" [debug] gapc_bond_ind_handler : info=%d\r\n", param->info);
|
||||
switch (param->info)
|
||||
{
|
||||
case (GAPC_PAIRING_SUCCEED):
|
||||
{
|
||||
// Update the bonding status in the environment
|
||||
app_sec_env.bonded = true;
|
||||
bond_flag = 1;
|
||||
LOGI("GAPC_PAIRING_SUCCEED auth=%d,ltk_present=%d\r\n",
|
||||
param->data.pairing.level,param->data.pairing.ltk_present);
|
||||
|
||||
// Update the bonding status in the environment
|
||||
#if (PLF_NVDS)
|
||||
uint8_t err = nvds_del(NVDS_TAG_PERIPH_BONDED);
|
||||
LOGI("err1 =%d \n", err);
|
||||
if (nvds_put(NVDS_TAG_PERIPH_BONDED, NVDS_LEN_PERIPH_BONDED,
|
||||
(uint8_t *)&app_sec_env.bonded) != NVDS_OK)
|
||||
{
|
||||
// An error has occurred during access to the NVDS
|
||||
ASSERT_ERR(0);
|
||||
LOGI("3\n");
|
||||
}
|
||||
LOGI("4\n");
|
||||
// Set the BD Address of the peer device in NVDS
|
||||
uint8_t err2 = nvds_del(NVDS_TAG_PEER_BD_ADDRESS);
|
||||
LOGI("err2 =%d \n", err);
|
||||
struct app_env_tag *app_env = get_app_env();
|
||||
if (nvds_put(NVDS_TAG_PEER_BD_ADDRESS, NVDS_LEN_PEER_BD_ADDRESS,
|
||||
(uint8_t *)gapc_get_bdaddr(app_env->slave_conidx, GAPC_SMP_INFO_PEER)) != NVDS_OK)
|
||||
{
|
||||
// An error has occurred during access to the NVDS
|
||||
ASSERT_ERR(0);
|
||||
LOGI("5\n");
|
||||
}
|
||||
LOGI("6\n");
|
||||
#endif //(PLF_NVDS)
|
||||
|
||||
|
||||
|
||||
} break;
|
||||
|
||||
case (GAPC_REPEATED_ATTEMPT):
|
||||
{
|
||||
// app_disconnect();
|
||||
} break;
|
||||
|
||||
case (GAPC_IRK_EXCH):
|
||||
{
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
// Store peer identity in NVDS
|
||||
LOGI("GAPC_IRK_EXCH\r\n");
|
||||
uint8_t err = nvds_del(NVDS_TAG_PEER_IRK);
|
||||
LOGI("err2 =%d \n", err);
|
||||
if (nvds_put(NVDS_TAG_PEER_IRK, NVDS_LEN_PEER_IRK, (uint8_t *)¶m->data.irk.irk.key[0]) != NVDS_OK)
|
||||
|
||||
{
|
||||
LOGI("1\r\n");
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
LOGI("2\r\n");
|
||||
|
||||
#endif // (NVDS_SUPPORT)
|
||||
} break;
|
||||
|
||||
case (GAPC_PAIRING_FAILED):
|
||||
{
|
||||
// app_sec_send_security_req(0);
|
||||
} break;
|
||||
|
||||
// In Secure Connections we get BOND_IND with SMPC calculated LTK
|
||||
case (GAPC_LTK_EXCH) :
|
||||
{
|
||||
LOGI( "GAPC_LTK_EXCH sec_con_enabled=%d\r\n",app_env.sec_con_enabled);
|
||||
|
||||
LOGI( " param->ediv=0x%x\r\nparam_randnb:",param->data.ltk.ediv);
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",param->data.ltk.randnb.nb[i]);
|
||||
LOGI("\r\nltk:");
|
||||
for(uint8_t i=0;i<GAP_KEY_LEN;i++)
|
||||
LOGI( "%x",param->data.ltk.ltk.key[i]);
|
||||
LOGI("\r\n");
|
||||
|
||||
#if (0)
|
||||
if (app_env.sec_con_enabled == true)
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
// Store LTK in NVDS
|
||||
if (nvds_put(NVDS_TAG_LTK, NVDS_LEN_LTK,(uint8_t *)¶m->data.ltk.ltk.key[0]) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
#endif // (NVDS_SUPPORT)
|
||||
}
|
||||
#endif // (BLE_APP_SEC_CON)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
} break;
|
||||
}
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
static int gapc_encrypt_req_ind_handler(ke_msg_id_t const msgid,
|
||||
void const *p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
struct gapc_encrypt_req_ind const *param = (struct gapc_encrypt_req_ind const *)p_param;
|
||||
#endif // (NVDS_SUPPORT)
|
||||
LOGI(" [debug] gapc_encrypt_req_ind_handler \r\n");
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
// LTK value
|
||||
struct gapc_ltk ltk;
|
||||
// Length
|
||||
uint8_t length = NVDS_LEN_LTK;
|
||||
#endif // #if (NVDS_SUPPORT)
|
||||
|
||||
// Prepare the GAPC_ENCRYPT_CFM message
|
||||
struct gapc_encrypt_cfm *cfm = KE_MSG_ALLOC(GAPC_ENCRYPT_CFM,
|
||||
src_id, TASK_APP,
|
||||
gapc_encrypt_cfm);
|
||||
|
||||
cfm->found = false;
|
||||
|
||||
|
||||
LOGI("app_sec gapc_encrypt_req_ind_handler: bonded=%d\r\n", app_sec_env.bonded);
|
||||
|
||||
|
||||
// if (app_sec_env.bonded)
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
// Retrieve the required informations from NVDS
|
||||
if (nvds_get(NVDS_TAG_LTK, &length, (uint8_t *)<k) == NVDS_OK)
|
||||
{
|
||||
|
||||
|
||||
LOGI( "nvds_get param->ediv=0x%x,ltk.ediv=0x%x\r\nparam_randnb:",param->ediv,ltk.ediv);
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",param->rand_nb.nb[i]);
|
||||
LOGI("\r\nltk.randnb.nb:");
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",ltk.randnb.nb[i]);
|
||||
LOGI("\r\n");
|
||||
|
||||
|
||||
// Check if the provided EDIV and Rand Nb values match with the stored values
|
||||
if ((param->ediv == ltk.ediv) &&
|
||||
!memcmp(¶m->rand_nb.nb[0], <k.randnb.nb[0], sizeof(struct rand_nb)))
|
||||
{
|
||||
LOGI("EDIV and randnb are same!!!\r\n");
|
||||
cfm->found = true;
|
||||
cfm->key_size = 16;
|
||||
memcpy(&cfm->ltk, <k.ltk, sizeof(struct gap_sec_key));
|
||||
bond_flag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGI("EDIV and randnb not same!!!\r\n");
|
||||
}
|
||||
/*
|
||||
* else we are bonded with another device, disconnect the link
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
#endif // (NVDS_SUPPORT)
|
||||
}
|
||||
/*
|
||||
* else the peer device is not known, an error should trigger a new pairing procedure.
|
||||
*/
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(cfm);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
|
||||
static int gapc_encrypt_ind_handler(ke_msg_id_t const msgid,
|
||||
void const *p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
struct gapc_encrypt_ind const *param = (struct gapc_encrypt_ind const *)p_param;
|
||||
LOGI(" [debug] gapc_encrypt_ind_handler \r\n");
|
||||
|
||||
// encryption/ re-encryption succeeded
|
||||
|
||||
LOGI("app_sec gapc_encrypt_ind_handler: auth=%d\r\n", param->pairing_lvl);
|
||||
|
||||
|
||||
// struct gapc_set_le_pkt_size_cmd *req = KE_MSG_ALLOC(GAPC_SET_LE_PKT_SIZE_CMD,
|
||||
// KE_BUILD_ID(TASK_GAPC, KE_IDX_GET(src_id)), TASK_APP,
|
||||
// gapc_set_le_pkt_size_cmd);
|
||||
|
||||
// req->operation = GAPC_SET_LE_PKT_SIZE;
|
||||
// req->tx_octets = 0xFB;
|
||||
// req->tx_time = 2120;
|
||||
|
||||
// // Send the message
|
||||
// ke_msg_send(req);
|
||||
|
||||
|
||||
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* LOCAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Default State handlers definition
|
||||
const struct ke_msg_handler app_sec_msg_handler_list[] =
|
||||
{
|
||||
// Note: first message is latest message checked by kernel so default is put on top.
|
||||
{KE_MSG_DEFAULT_HANDLER, (ke_msg_func_t)app_sec_msg_dflt_handler},
|
||||
|
||||
{GAPC_BOND_REQ_IND, (ke_msg_func_t)gapc_bond_req_ind_handler},
|
||||
{GAPC_BOND_IND, (ke_msg_func_t)gapc_bond_ind_handler},
|
||||
|
||||
{GAPC_ENCRYPT_REQ_IND, (ke_msg_func_t)gapc_encrypt_req_ind_handler},
|
||||
{GAPC_ENCRYPT_IND, (ke_msg_func_t)gapc_encrypt_ind_handler},
|
||||
};
|
||||
|
||||
const struct app_subtask_handlers app_sec_handlers = {&app_sec_msg_handler_list[0], ARRAY_LEN(app_sec_msg_handler_list)};
|
||||
#endif
|
||||
#endif // (BLE_APP_PRESENT)
|
||||
|
||||
/// @} APP
|
||||
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_sec.h
|
||||
*
|
||||
* @brief Application Security Entry Point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP_SEC
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef APP_SEC_H_
|
||||
#define APP_SEC_H_
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h> // Standard Integer Definition
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* STRUCTURES DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
struct app_sec_env_tag
|
||||
{
|
||||
// Bond status
|
||||
bool bonded;
|
||||
};
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLE DECLARATIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Application Security Environment
|
||||
extern struct app_sec_env_tag app_sec_env;
|
||||
|
||||
/// Table of message handlers
|
||||
extern const struct app_subtask_handlers app_sec_handlers;
|
||||
|
||||
/*
|
||||
* GLOBAL FUNCTIONS DECLARATIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Initialize the Application Security Module
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_sec_init(void);
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Remove all bond data stored in NVDS
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_sec_remove_bond(void);
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Send a security request to the peer device. This function is used to
|
||||
*require the central to start the encryption with a LTK that would have shared
|
||||
*during a previous bond procedure.
|
||||
*
|
||||
* @param[in] - conidx: Connection Index
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_sec_send_security_req(uint8_t conidx);
|
||||
|
||||
#endif // APP_SEC_H_
|
||||
|
||||
/// @} APP_SEC
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,499 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file arch_main.c
|
||||
*
|
||||
* @brief Main loop of the application.
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // RW SW configuration
|
||||
#include "xc_drv_pwr.h"
|
||||
#if (USE_ROM_FLASH)
|
||||
#include "xc6xxx_fmc_spi.h"
|
||||
#endif // (USE_ROM_FLASH)
|
||||
#include "app_task.h"
|
||||
#include "rom_port.h"
|
||||
#include "xc_drv_bor.h"
|
||||
#if (BLE_TEST_MODE_SUPPORT)
|
||||
#include "uart.h" // UART initialization
|
||||
#endif // (BLE_TEST_MODE_SUPPORT)
|
||||
|
||||
#if (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||||
#include "rf.h" // RF initialization
|
||||
#endif // BLE_EMB_PRESENT || BT_EMB_PRESENT
|
||||
|
||||
#if (PLF_NVDS)
|
||||
#include "nvds.h" // NVDS definitions
|
||||
#endif // PLF_NVDS
|
||||
|
||||
#include "xc6xxx.h"
|
||||
#include "xc_drv_fmc_spi.h"
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup DRIVERS
|
||||
* @{
|
||||
*
|
||||
*
|
||||
* ****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
/// NVDS location in FLASH : 0x000E0000 (896KB (1Mo - 128KB))
|
||||
#define NVDS_FLASH_ADDRESS (0x0003E000)
|
||||
|
||||
/// NVDS size in RAM : 0x00010000 (128KB)
|
||||
#define NVDS_FLASH_SIZE (0x00000200)
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* MAIN FUNCTION
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief RW main function.
|
||||
*
|
||||
* This function is called right after the booting process has completed.
|
||||
*
|
||||
* @return status exit status
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
void flash_init()
|
||||
{
|
||||
// uint32_t mid = 0;
|
||||
// uint32_t flash_size;
|
||||
// uint16_t flash_type;
|
||||
// xc_fmc_spi_init_oprt();
|
||||
// xc_fmc_spi_flash_wake_up();
|
||||
|
||||
// xc_fmc_spi_flash_rdid((uint8_t *)&mid);
|
||||
// LOGI("Flash RDID: 0x%08x\n", mid);
|
||||
|
||||
|
||||
#if (PLF_NVDS)
|
||||
if (false == flash_size_and_type_get(&flash_size, &flash_type)) {
|
||||
LOGI("Flash Memory size Get ERROR ! ");
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
nvds_space_init(flash_size);
|
||||
#endif
|
||||
// if chip unique get failed,then use flash RUID
|
||||
if (false == xc_unique_identification_read(co_default_bdaddr.addr)) {
|
||||
uint8_t ruid[16];
|
||||
xc_fmc_spi_flash_ruid(ruid);
|
||||
LOGI("Flash RUID11: ");
|
||||
for (int i = 0; i < 16; i++) {
|
||||
LOGI("%02x ", ruid[i]);
|
||||
}
|
||||
LOGI("\n");
|
||||
LOGI("The chip does not have unique , then use flash RUID\n");
|
||||
memset(co_default_bdaddr.addr, 0, 6);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
co_default_bdaddr.addr[i % 6] += ruid[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define clrbit(x, y) ((x) &= ~(1 << (y)))
|
||||
#define AHB_CTL clrbit(*(uint32_t volatile *)(0x40000000 + 0x130), 0)
|
||||
#define _TOSTRING(s) #s
|
||||
#define TOSTRING(s) _TOSTRING(s)
|
||||
|
||||
extern void clock_init(void);
|
||||
void app_uart_init(void)
|
||||
{
|
||||
GPIO_InitCfg_t gpio_cfg = {0};
|
||||
|
||||
gpio_cfg.Mux = GPIO_Mux0;
|
||||
gpio_cfg.Pull = GPIO_PULLUP;
|
||||
gpio_cfg.Int = NOT_INT;
|
||||
gpio_cfg.FunSel = UART0_TX;
|
||||
|
||||
gpio_cfg.Pin = GPIO_18;
|
||||
gpio_cfg.Dir = GPIO_DIR_OUTPUT;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
|
||||
gpio_cfg.FunSel = UART0_RX;
|
||||
gpio_cfg.Pin = GPIO_19;
|
||||
gpio_cfg.Dir = GPIO_DIR_INPUT;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
|
||||
UART_InitCfg_t uart_cfg = {0};
|
||||
|
||||
uart_cfg.Parity = UART_PARITY_DISABLE;
|
||||
uart_cfg.StopBits = UART_STOP_1_BITS;
|
||||
uart_cfg.WordLength = UART_DATA_8_BITS;
|
||||
uart_cfg.BaudRate = UART_BAUDRATE_115200;
|
||||
uart_cfg.HardwareFlowControl = UART_HWFC_DISABLE;
|
||||
|
||||
xc_uart_init(UART0_IDX, &uart_cfg);
|
||||
}
|
||||
void wdt_init(void)
|
||||
{
|
||||
WDT_InitCfg_t wdt_cfg ;
|
||||
|
||||
wdt_cfg.WorkMode = WDT_WORK_MODE0;
|
||||
wdt_cfg.ReloadValue = WDT_CLK_32K_RESET_MODE0_2048MS;
|
||||
wdt_cfg.PclkSel = WDT_WORK_32K;
|
||||
xc_wdt_init(&wdt_cfg);
|
||||
xc_wdt_start();
|
||||
}
|
||||
|
||||
void system_lightsleep_cfg()
|
||||
{
|
||||
#if (USE_XIP != 1)
|
||||
cprao_aon_puctrl1_set(0x4); /* puctrl1= 0x4 , SSI0RX must pulldown*/
|
||||
#endif
|
||||
cprao_aon_sys_time_set((RST_READY_TIME << 12) | (OSC32_STABLE_TIME));
|
||||
|
||||
xc_pwr_pd_lightsleep_set();
|
||||
xc_pwr_sleepsrc_mask_set(0x1e001e);
|
||||
xc_pwr_osc_off();
|
||||
}
|
||||
|
||||
struct ADV_INFO adv_info;
|
||||
void set_single_addr_name(uint8_t conidx, uint8_t reason)
|
||||
{
|
||||
uint32_t flash_type=0;
|
||||
uint32_t flash_size=0;
|
||||
uint8_t spi_idx=0;
|
||||
int32_t mid = 0;
|
||||
xc_fmc_spi_flash_rdid((uint8_t *)&mid);
|
||||
flash_type = (mid & 0xffff);
|
||||
flash_size = (mid >> 16) & 0xff;
|
||||
|
||||
flash_type = (mid & 0xffff);
|
||||
uint32_t write_addr=0;
|
||||
switch(flash_size)
|
||||
{
|
||||
case FLASH_128K_FLAG:
|
||||
write_addr = (1024 * 128)-256;
|
||||
if(flash_type==PURAN_128K_FLASH)
|
||||
{
|
||||
write_addr = (1024 * 124)-256;
|
||||
}
|
||||
break;
|
||||
case FLASH_256K_FLAG:
|
||||
write_addr = (1024 * 256)-256;
|
||||
break;
|
||||
case FLASH_512K_FLAG:
|
||||
write_addr = (1024 * 512)-256;
|
||||
break;
|
||||
case FLASH_1M_FLAG:
|
||||
write_addr = (1024 * 1024)-256;
|
||||
break;
|
||||
case FLASH_2M_FLAG:
|
||||
write_addr = (1024 * 2048)-256;
|
||||
break;
|
||||
}
|
||||
uint8_t para_buf[256];
|
||||
memset(¶_buf,0xFF,256);
|
||||
memcpy(&adv_info.addr,&co_default_bdaddr.addr,6);
|
||||
memcpy(¶_buf,&adv_info,28);
|
||||
xc_fmc_spi_flash_erase_page(write_addr);
|
||||
xc_fmc_spi_flash_write_page(write_addr, para_buf,FLASH_PAGE_SIZE);
|
||||
}
|
||||
/* Zero the host global variable. */
|
||||
void rom_env_host_init()
|
||||
{
|
||||
uint32_t *ptr = (uint32_t *)(0x10000800);
|
||||
memset(ptr, 0, 0x10001300 - 0x10000800);
|
||||
rom_env.prf_cleanup = set_single_addr_name;
|
||||
rom_env.stack_printf = printf;
|
||||
}
|
||||
|
||||
void board_init()
|
||||
{
|
||||
clock_init();
|
||||
|
||||
app_uart_init();
|
||||
|
||||
LOGI("sdk version: %s build time: %s %s\n", TOSTRING(SDK_VERSION), __DATE__,
|
||||
__TIME__);
|
||||
// xc_fmc_spi_init_oprt();
|
||||
#if (SLEEP_ENABLE)
|
||||
// xc_rc32k_calib_by_hw();
|
||||
// xc_rc32k_calib_by_soft();
|
||||
#endif // (SLEEP_ENABLE)
|
||||
rom_env_host_init();
|
||||
rom_env_init();
|
||||
AHB_CTL;
|
||||
|
||||
// Initialize random process
|
||||
// srand(1);
|
||||
}
|
||||
|
||||
__RAM_CODE __STATIC int8_t rf_rssi_convert(uint8_t rssi_reg)
|
||||
{
|
||||
int8_t rssi_dbm;
|
||||
// uint16_t power_modem;
|
||||
|
||||
if (rssi_reg < 128) {
|
||||
rssi_dbm = rssi_reg - 50;
|
||||
} else {
|
||||
rssi_dbm = rssi_reg - 256 - 50;
|
||||
}
|
||||
#if (CONN_RSSI_DEBUG)
|
||||
if(evt_start){
|
||||
printf("con rssi %d\n", rssi_dbm);
|
||||
}
|
||||
#endif
|
||||
return (rssi_dbm);
|
||||
}
|
||||
|
||||
void bluetooth_init()
|
||||
{
|
||||
|
||||
uint32_t error = RESET_NO_ERROR;
|
||||
flash_init();
|
||||
#if (PLF_NVDS)
|
||||
|
||||
// Initialize NVDS module
|
||||
nvds_init(NVDS_FLASH_SIZE);
|
||||
#endif // PLF_NVDS
|
||||
/*
|
||||
************************************************************************************
|
||||
* RW SW stack initialization
|
||||
************************************************************************************
|
||||
*/
|
||||
NVIC_SetPriority((IRQn_Type)BLE_IRQn, 0);
|
||||
NVIC_EnableIRQ((IRQn_Type)BLE_IRQn);
|
||||
|
||||
#if defined(CFG_RSSI_ENABLE)
|
||||
// Initialize modem
|
||||
modem_init(1);
|
||||
#else
|
||||
modem_init(0);
|
||||
#endif // defined(CFG_RSSI_ENABLE)
|
||||
// Measure the single carrier and configure the correct frequency offset.
|
||||
// rf_xtal_cal_set(uint8_t set_value);
|
||||
rf_tx_power_set(TRANS_POWER_0_5DBM);
|
||||
|
||||
// Initialize RF
|
||||
#if (BT_EMB_PRESENT || BLE_EMB_PRESENT)
|
||||
rf_init(&rwip_rf);
|
||||
rwip_rf.rssi_convert = rf_rssi_convert;
|
||||
#endif // BT_EMB_PRESENT || BLE_EMB_PRESENT
|
||||
// Initialize RW SW stack
|
||||
rwip_init(error);
|
||||
|
||||
uint32_t seed;
|
||||
rwip_time_t current_time = rwip_time_get();
|
||||
seed = current_time.hs;
|
||||
seed += current_time.hus;
|
||||
//Init the random seed
|
||||
co_random_init(seed);
|
||||
|
||||
#if (BLE_TEST_MODE_SUPPORT)
|
||||
enter_test_mode();
|
||||
#else // (BLE_TEST_MODE_SUPPORT)
|
||||
// Initialize APP
|
||||
app_init();
|
||||
#endif // (BLE_TEST_MODE_SUPPORT)
|
||||
// finally start interrupt handling
|
||||
GLOBAL_INT_START();
|
||||
}
|
||||
|
||||
#if ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
extern uint8_t adv_evt_start ; // adv event
|
||||
extern uint8_t evt_start ; // conn event
|
||||
extern volatile uint8_t sv_lock;
|
||||
extern volatile uint8_t sv_txlen;
|
||||
__RAM_CODE void PendSV_Handler(void)
|
||||
{
|
||||
if(adv_evt_start){ // adv event
|
||||
#if (ADV_EVENT_NOT_RUN_XIP ==1)
|
||||
while (!sv_lock)
|
||||
;
|
||||
#endif // (ADV_EVENT_NOT_RUN_XIP ==1)
|
||||
}else if(evt_start){ // conn event
|
||||
#if (CONN_EVENT_NOT_RUN_XIP == 0)
|
||||
uint32_t nus = sv_txlen * 8 + 148;
|
||||
uint32_t unit = 32;
|
||||
uint32_t temp;
|
||||
|
||||
SysTick->CTRL = 0x00;
|
||||
SysTick->LOAD = unit * nus - unit + 1;
|
||||
|
||||
SysTick->VAL = 0;
|
||||
SysTick->CTRL = 0x05;
|
||||
|
||||
do {
|
||||
temp = SysTick->CTRL;
|
||||
if (sv_lock) {
|
||||
break;
|
||||
}
|
||||
} while ((temp & 0x01) && (!(temp & (1 << 16))));
|
||||
#endif // (CONN_EVENT_NOT_RUN_XIP == 0)
|
||||
|
||||
#if (CONN_EVENT_NOT_RUN_XIP == 1)
|
||||
while (!sv_lock)
|
||||
;
|
||||
#endif // (CONN_EVENT_NOT_RUN_XIP == 1)
|
||||
}
|
||||
|
||||
}
|
||||
#endif // ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
|
||||
#if (FLASH_TEST_IN_INTERRUPT)
|
||||
void flash_test_in_interrupt(void)
|
||||
{
|
||||
uint8_t wr_data[10] = {0x63,0x89,0x63,0x89,0x63,0x89};
|
||||
uint8_t rd_data[10] ={0};
|
||||
// Timer 1 can be used for flash, interrupt priority is lower than bluetooth, then higher than other interrupts.
|
||||
// Operate flash in timer 1 interrupt context, no need to lock interrupt, won't affect bluetooth send/receive packets.
|
||||
// xc_fmc_spi_flash_write(0x32000 , wr_data, sizeof(wr_data));
|
||||
xc_fmc_spi_flash_write_page(0x32000, wr_data,
|
||||
sizeof(wr_data));
|
||||
xc_fmc_spi_flash_read(0x32000 , rd_data, sizeof(rd_data));
|
||||
for(uint8_t i = 0;i<sizeof(rd_data);i++)
|
||||
{
|
||||
printf(" %02x ",rd_data[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
|
||||
|
||||
void timer_init(uint8_t timer_idx,uint32_t us)
|
||||
{
|
||||
Timer_InitCfg_t timer_cfg;
|
||||
|
||||
timer_cfg.timer_src_clk = TIMER_CLK_SRC_32K;
|
||||
timer_cfg.timer_div_clk = TIMER_DIV_CLK_16MHzOr16K;
|
||||
timer_cfg.timer_mode = TIMER_MODE_CYCLE;
|
||||
|
||||
xc_timer_init(timer_idx, &timer_cfg);
|
||||
xc_timer_set_value(timer_idx, us);
|
||||
xc_timer_start(timer_idx);
|
||||
NVIC_SetPriority((IRQn_Type)TIMER0_IRQn + timer_idx, 1);
|
||||
}
|
||||
|
||||
void timer1_callback(void *context) {
|
||||
flash_test_in_interrupt();
|
||||
}
|
||||
#endif // (FLASH_TEST_IN_INTERRUPT)
|
||||
|
||||
|
||||
#if (FLASH_TEST_IN_TASK)
|
||||
void flash_test_in_task(void)
|
||||
{
|
||||
uint8_t wr_data[10] = {0x63,0x89,0x63,0x89,0x63,0x89};
|
||||
static uint8_t wr_cnt= 0;
|
||||
uint8_t rd_data[10] ={0};
|
||||
wr_cnt++;
|
||||
if(wr_cnt >= 252)
|
||||
{
|
||||
wr_cnt = 0;
|
||||
}
|
||||
wr_data[9] = wr_cnt;
|
||||
GLOBAL_INT_DISABLE();
|
||||
xc_fmc_spi_flash_write_page(0x32000, wr_data,
|
||||
sizeof(wr_data));
|
||||
xc_fmc_spi_flash_read(0x32000 , rd_data, sizeof(rd_data));
|
||||
|
||||
GLOBAL_INT_RESTORE();
|
||||
for(uint8_t i = 0;i<sizeof(rd_data);i++)
|
||||
{
|
||||
printf(" %02x ",rd_data[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
#endif // (FLASH_TEST_IN_TASK)
|
||||
|
||||
#if (FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
#include "rwip_int.h"
|
||||
extern struct rwip_env_tag rwip_env;
|
||||
void flash_test_in_bluetooth_gap(void)
|
||||
{
|
||||
uint8_t wr_data[10] = {0x63,0x89,0x63,0x89,0x63,0x89};
|
||||
static uint8_t wr_cnt= 0;
|
||||
uint8_t rd_data[10] ={0};
|
||||
wr_cnt++;
|
||||
if(wr_cnt >= 252)
|
||||
{
|
||||
wr_cnt = 0;
|
||||
}
|
||||
wr_data[9] = wr_cnt;
|
||||
|
||||
if (rwip_env.prevent_sleep != 0)
|
||||
return;
|
||||
|
||||
rwip_time_t current_time;
|
||||
current_time = rwip_time_get();
|
||||
// Get the most recent Bluetooth event interval.
|
||||
int32_t duration = CLK_DIFF(current_time.hs, rwip_env.timer_arb_target); //312.5us
|
||||
if(duration < 64){ // 20ms = 64*312.5
|
||||
return;
|
||||
}
|
||||
|
||||
GLOBAL_INT_DISABLE();
|
||||
xc_fmc_spi_flash_write_page(0x32000, wr_data,
|
||||
sizeof(wr_data));
|
||||
xc_fmc_spi_flash_read(0x32000 , rd_data, sizeof(rd_data));
|
||||
|
||||
GLOBAL_INT_RESTORE();
|
||||
for(uint8_t i = 0;i<sizeof(rd_data);i++)
|
||||
{
|
||||
printf(" %02x ",rd_data[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
#endif // (FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
wdt_init();
|
||||
board_init();
|
||||
bluetooth_init();
|
||||
|
||||
//lvr bor_intr
|
||||
Bor_InitCfg_t bor_cfg = {
|
||||
.mode = BOR_MODE_INTRST,
|
||||
.rst_volt = BOR_RST_VOLT_1_76V,
|
||||
};
|
||||
xc_bor_init(&bor_cfg);
|
||||
|
||||
#if ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
NVIC_SetPriority(PendSV_IRQn, 0xff);
|
||||
NVIC_EnableIRQ(PendSV_IRQn);
|
||||
#endif // ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
#if (FLASH_TEST_IN_INTERRUPT)
|
||||
timer_init(TIMER1_IDX,1000*1000);
|
||||
#endif //(FLASH_TEST_IN_INTERRUPT)
|
||||
xc_system_param_check();
|
||||
// rf_test_pin_init();
|
||||
#if (BLE_APP_PRESENT)
|
||||
while (1) {
|
||||
// schedule all pending events
|
||||
rwip_schedule();
|
||||
#if (SLEEP_ENABLE)
|
||||
sleep_schedule();
|
||||
#endif // (SLEEP_ENABLE)
|
||||
xc_wdt_reload();
|
||||
}
|
||||
#endif // (BLE_APP_PRESENT)
|
||||
}
|
||||
|
||||
/// @} DRIVERS
|
||||
@@ -0,0 +1,305 @@
|
||||
#<SYMDEFS># ARM Linker, 5060750: Last Updated: Tue Sep 05 15:30:26 2023
|
||||
0x10000808 D co_default_bdaddr
|
||||
0x00004169 T ke_msg_alloc
|
||||
0x000041ed T ke_msg_send
|
||||
0x00004225 T ke_msg_send_basic
|
||||
0x000042e9 T ke_state_set
|
||||
0x00004359 T ke_task_create
|
||||
0x000042b9 T ke_state_get
|
||||
0x000041af T ke_msg_discard
|
||||
0x000041b3 T ke_msg_forward
|
||||
0x000041dd T ke_msg_in_queue
|
||||
0x00004233 T ke_msg_src_id_get
|
||||
0x00003e05 T ke_free
|
||||
0x000041d5 T ke_msg_free
|
||||
0x00003c21 T ke_check_malloc
|
||||
0x0000dbf5 T rwip_init
|
||||
0x0000de79 T rwip_schedule
|
||||
0x10000938 D rwip_rf
|
||||
0x00000df9 T BLE_Handler
|
||||
0x0000238d T co_buf_alloc
|
||||
0x000024fd T co_buf_copy_data_from_mem
|
||||
0x00002721 T co_buf_release
|
||||
0x000028c9 T co_djob_prepare
|
||||
0x000028d5 T co_djob_reg
|
||||
0x0000291d T co_djob_unreg
|
||||
0x00002969 T co_list_extract
|
||||
0x000029ad T co_list_extract_after
|
||||
0x00002ac5 T co_list_pop_front
|
||||
0x00002ae9 T co_list_push_back
|
||||
0x00002b39 T co_list_push_front
|
||||
0x00002b55 T co_time_get
|
||||
0x00002ce5 T co_time_timer_init
|
||||
0x00002dcd T co_time_timer_set
|
||||
0x00002df9 T co_time_timer_stop
|
||||
0x00000e95 T aes_c1
|
||||
0x00001465 T aes_encrypt
|
||||
0x000014cd T aes_f4
|
||||
0x00001521 T aes_f5
|
||||
0x00001641 T aes_f6
|
||||
0x000016bd T aes_g2
|
||||
0x00001c35 T aes_rand
|
||||
0x000012a1 T aes_cmac
|
||||
0x000025b1 T co_buf_head_release
|
||||
0x000025dd T co_buf_head_reserve
|
||||
0x00002ec5 T co_util_pack
|
||||
0x000030d5 T co_util_unpack
|
||||
0x0000ddd9 T rwip_reset
|
||||
0x00001da5 T aes_rpa_resolve
|
||||
0x00002799 T co_buf_reuse
|
||||
0x000027dd T co_buf_size
|
||||
0x00002489 T co_buf_copy
|
||||
0x00002569 T co_buf_duplicate
|
||||
0x000027ed T co_buf_tail_release
|
||||
0x00002a0d T co_list_init
|
||||
0x00002285 T ble_util_buf_rx_free
|
||||
0x00001f69 T ble_util_buf_acl_tx_alloc
|
||||
0x00002439 T co_buf_cb_free_set
|
||||
0x00003fad T ke_malloc
|
||||
0x00002a25 T co_list_insert_after
|
||||
0x0000459d T ke_timer_active
|
||||
0x000045ad T ke_timer_clear
|
||||
0x00004641 T ke_timer_set
|
||||
0x00002369 T co_buf_acquire
|
||||
0x00002819 T co_buf_tail_reserve
|
||||
0x00002531 T co_buf_copy_data_to_mem
|
||||
0x00002a55 T co_list_insert_before
|
||||
0x10000e90 D rom_env
|
||||
0x1000096c D rwip_param
|
||||
0x0000fe8d D one_bits
|
||||
0x000039bd T hci_rd_rem_ver_info_cmd_handler
|
||||
0x00003445 T hci_le_con_upd_cmd_handler
|
||||
0x00003705 T hci_le_rd_chnl_map_cmd_handler
|
||||
0x00003761 T hci_le_rd_rem_feats_cmd_handler
|
||||
0x0000354d T hci_le_en_enc_cmd_handler
|
||||
0x0000369d T hci_le_ltk_req_reply_cmd_handler
|
||||
0x0000360d T hci_le_ltk_req_neg_reply_cmd_handler
|
||||
0x00003851 T hci_le_rem_con_param_req_reply_cmd_handler
|
||||
0x000037f9 T hci_le_rem_con_param_req_neg_reply_cmd_handler
|
||||
0x000038d9 T hci_le_set_data_len_cmd_handler
|
||||
0x00003be5 T hci_vs_set_pref_slave_latency_cmd_handler
|
||||
0x00003b9d T hci_vs_set_pref_slave_evt_dur_cmd_handler
|
||||
0x00003ab9 T hci_vs_set_max_rx_size_and_time_cmd_handler
|
||||
0x00003a39 T hci_rd_rssi_cmd_handler
|
||||
0x0000d749 T llm_ch_map_update_ind_handler
|
||||
0x0000650d T llc_loc_llcp_rsp_to_handler
|
||||
0x00007161 T llc_rem_llcp_rsp_to_handler
|
||||
0x00005255 T llc_encrypt_ind_handler
|
||||
0x00006739 T llc_op_ver_exch_ind_handler
|
||||
0x000066d5 T llc_op_feats_exch_ind_handler
|
||||
0x00006675 T llc_op_encrypt_ind_handler
|
||||
0x00006609 T llc_op_dl_upd_ind_handler
|
||||
0x0000657d T llc_op_con_upd_ind_handler
|
||||
0x00006525 T llc_op_ch_map_upd_ind_handler
|
||||
0x0000bda9 T lld_llcp_rx_ind_handler
|
||||
0x0000bf1d T lld_llcp_tx_cfm_handler
|
||||
0x00007551 T lld_acl_rx_ind_handler
|
||||
0x000075dd T lld_acl_tx_cfm_handler
|
||||
0x00009509 T lld_con_param_upd_cfm_handler
|
||||
0x00008921 T lld_ch_map_upd_cfm_handler
|
||||
0x000094cd T lld_con_offset_upd_ind_handler
|
||||
0x00003435 T hci_command_llc_handler
|
||||
0x00003385 T hci_acl_data_handler
|
||||
0x00003cc1 T ke_event_callback_set
|
||||
0x00003cd9 T ke_event_clear
|
||||
0x00003db1 T ke_event_set
|
||||
0x000022e5 T ble_util_nb_good_channels
|
||||
0x0000230d T ble_util_pkt_dur_in_us
|
||||
0x0000234d T co_bdaddr_compare
|
||||
0x000088bd T lld_ch_assess_data_get
|
||||
0x000088c5 T lld_ch_map_set
|
||||
0x0000c16d T lld_read_clock
|
||||
0x0000c30d T lld_res_list_peer_update
|
||||
0x0000d60d T lld_white_list_add
|
||||
0x0000dd99 T rwip_prevent_sleep_clear
|
||||
0x0000ddb9 T rwip_prevent_sleep_set
|
||||
0x0000f071 T sch_plan_rem
|
||||
0x00001ce5 T aes_rpa_gen
|
||||
0x00002029 T ble_util_buf_adv_tx_alloc
|
||||
0x00002061 T ble_util_buf_adv_tx_free
|
||||
0x0000feae D co_null_bdaddr
|
||||
0x0000feb4 D co_null_key
|
||||
0x000050c9 T llc_con_move_cbk
|
||||
0x000071d9 T llc_start
|
||||
0x00007669 T lld_adv_adv_data_update
|
||||
0x00007ff5 T lld_adv_rand_addr_update
|
||||
0x00008071 T lld_adv_restart
|
||||
0x0000817d T lld_adv_scan_rsp_data_update
|
||||
0x000081c5 T lld_adv_start
|
||||
0x00008831 T lld_adv_stop
|
||||
0x0000d6c1 T lld_white_list_rem
|
||||
0x0000b401 T lld_init_rand_addr_update
|
||||
0x0000c179 T lld_res_list_add
|
||||
0x0000c251 T lld_res_list_clear
|
||||
0x0000c27d T lld_res_list_local_rpa_get
|
||||
0x0000c2c5 T lld_res_list_peer_rpa_get
|
||||
0x0000c341 T lld_res_list_priv_mode_update
|
||||
0x0000c37d T lld_res_list_rem
|
||||
0x0000cedd T lld_scan_rand_addr_update
|
||||
0x0000b699 T lld_init_start
|
||||
0x0000bc9d T lld_init_stop
|
||||
0x0000f081 T sch_plan_req
|
||||
0x0000f0d5 T sch_plan_set
|
||||
0x0000fec4 D co_rate_to_phy
|
||||
0x0000cb81 T lld_scan_params_update
|
||||
0x0000d115 T lld_scan_start
|
||||
0x0000d5c5 T lld_scan_stop
|
||||
0x0000c3ad T lld_rpa_renew
|
||||
0x0000408d T ke_mem_init
|
||||
0x00002609 T co_buf_init
|
||||
0x0000de9d T rwip_sleep
|
||||
0x10000810 D em_ble_base_address_table_0
|
||||
0x10000812 D em_ble_base_address_table_1
|
||||
0x10000814 D em_ble_base_address_table_2
|
||||
0x10000816 D em_ble_base_address_table_3
|
||||
0x10000818 D em_ble_base_address_table_4
|
||||
0x1000081a D em_ble_base_address_table_5
|
||||
0x10000822 D em_ble_base_address_table_6
|
||||
0x1000081c D em_ble_base_address_table_7
|
||||
0x10000824 D em_ble_base_address_table_8
|
||||
0x1000081e D em_ble_base_address_table_9
|
||||
0x10000820 D em_ble_base_address_table_10
|
||||
0x000021d9 T ble_util_buf_init_env
|
||||
0x10000978 D PATCH_FUN
|
||||
0x1000108c D lld_adv_env
|
||||
0x0000ebe5 T sch_arb_remove
|
||||
0x0000f739 T sch_slice_fg_remove
|
||||
0x10000f44 D llc_env
|
||||
0x0000693d T llc_proc_err_ind
|
||||
0x000073c1 T llc_stop
|
||||
0x00004695 T ll_channel_map_ind_handler
|
||||
0x0000471d T ll_connection_param_req_handler
|
||||
0x00004809 T ll_connection_param_rsp_handler
|
||||
0x0000489d T ll_connection_update_ind_handler
|
||||
0x000049c1 T ll_enc_req_handler
|
||||
0x00004a85 T ll_enc_rsp_handler
|
||||
0x00004af9 T ll_feature_req_handler
|
||||
0x00004b4d T ll_feature_rsp_handler
|
||||
0x00004ba1 T ll_length_req_handler
|
||||
0x00004bf9 T ll_length_rsp_handler
|
||||
0x00004c75 T ll_min_used_channels_ind_handler
|
||||
0x00004cf1 T ll_pause_enc_req_handler
|
||||
0x00004d5d T ll_pause_enc_rsp_handler
|
||||
0x00004db5 T ll_reject_ext_ind_handler
|
||||
0x00004dd5 T ll_reject_ind_handler
|
||||
0x00004df5 T ll_slave_feature_req_handler
|
||||
0x00004e49 T ll_start_enc_req_handler
|
||||
0x00004e99 T ll_start_enc_rsp_handler
|
||||
0x00004ee9 T ll_unknown_rsp_handler
|
||||
0x00004ef9 T ll_version_ind_handler
|
||||
0x00001fd9 T ble_util_buf_acl_tx_free
|
||||
0x0000c5c1 T lld_rxdesc_check
|
||||
0x0000c609 T lld_rxdesc_free
|
||||
0x0000fee4 D rwip_priority
|
||||
0x0000e8b1 T sch_arb_insert
|
||||
0x0000f355 T sch_prog_push
|
||||
0x0000fde5 T FMC_SPI_Flash_RDID
|
||||
0x0000fd8d T FMC_SPI_Flash_RUID
|
||||
0x0000fa71 T FMC_SPI_Flash_WakeUp
|
||||
0x0000f9f1 T FMC_SPI_Init_Oprt
|
||||
0x0000fa49 T FMC_SPI_Flash_PowerDown
|
||||
0x0000fceb T FMC_SPI_FlashRead
|
||||
0x0000fc1f T FMC_SPI_FlashWrite
|
||||
0x0000fb09 T FMC_SPI_Flash_Erase_Sector
|
||||
0x00004fc9 T llc_cleanup
|
||||
0x00005091 T llc_cmd_stat_send
|
||||
0x00005a39 T llc_llcp_send
|
||||
0x00005ac9 T llc_llcp_state_set
|
||||
0x00006981 T llc_proc_get
|
||||
0x00006999 T llc_proc_id_get
|
||||
0x000069b5 T llc_proc_init
|
||||
0x000069c1 T llc_proc_reg
|
||||
0x00006a05 T llc_proc_state_get
|
||||
0x00006a09 T llc_proc_state_set
|
||||
0x00006a0d T llc_proc_timer_pause_set
|
||||
0x00006a7d T llc_proc_timer_set
|
||||
0x00006ae5 T llc_proc_unreg
|
||||
0x0000a1c1 T lld_con_stop
|
||||
0x00007869 T lld_adv_evt_start_cbk
|
||||
0x10000e68 D rwip_env
|
||||
0x1000080e D rwip_prog_delay
|
||||
0x0000e041 T rwip_time_get
|
||||
0x0000e2cd T rwip_wakeup_end
|
||||
0x1000112c D sch_arb_env
|
||||
0x00007905 T lld_adv_frm_cbk
|
||||
0x0000e0b1 T rwip_timer_alarm_handler
|
||||
0x0000e11d T rwip_timer_arb_handler
|
||||
0x0000e189 T rwip_timer_co_handler
|
||||
0x10000f94 D lld_env
|
||||
0x10000828 D aa_gen
|
||||
0x00007c25 T lld_adv_init
|
||||
0x00009301 T lld_con_init
|
||||
0x0000a7f1 T lld_core_init
|
||||
0x1000082c D lld_rpa_renew_env
|
||||
0x00008959 T lld_channel_assess
|
||||
0x100010dc D lld_con_env
|
||||
0x0000a4ad T lld_con_tx_len_update
|
||||
0x10000830 D lld_exp_sync_pos_tab
|
||||
0x0000bce5 T lld_instant_proc_end
|
||||
0x110134fd T prf_dst_task_get
|
||||
0x11013abd T rom_env_init
|
||||
0x11005201 T gapc_get_bdaddr
|
||||
0x1100c77d T gatt_db_svc16_add
|
||||
0x1100c901 T gatt_db_svc_add
|
||||
0x1100df41 T gatt_srv_event_send
|
||||
0x1100e349 T gatt_user_srv_register
|
||||
0x11014afc D llc_msg_handler_tab
|
||||
0x1000217c D rom_llc_state
|
||||
0x00008e4d T lld_con_evt_start_cbk
|
||||
0x00008ddd T lld_con_evt_canceled_cbk
|
||||
0x0000fe9e D co_sca2ppm
|
||||
0x00009051 T lld_con_evt_time_update
|
||||
0x00009415 T lld_con_max_lat_calc
|
||||
0x00009a69 T lld_con_sched
|
||||
0x0000f7e1 T sch_slice_per_add
|
||||
0x0000d801 T rwble_isr
|
||||
0x0000dc75 T rwip_isr
|
||||
0x00009189 T lld_con_frm_isr
|
||||
0x000044f9 T ke_task_schedule
|
||||
0x00007949 T lld_adv_frm_isr
|
||||
0x1000219d D sv_lock
|
||||
0x1000219e D sv_txlen
|
||||
0x100017e5 T rom_lld_con_rx
|
||||
0x10001a55 T rom_lld_con_evt_start_cbk
|
||||
0x10001aad T rom_lld_con_frm_isr
|
||||
0x1100b661 T gatt_cli_mtu_exch
|
||||
0x1000219c D evt_start
|
||||
0x1100a791 T gatt_cli_discover_svc
|
||||
0x1100e3e9 T gatt_uuid16_comp
|
||||
0x11009eb9 T gatt_cli_att_event_cfm
|
||||
0x1100a1cd T gatt_cli_discover_cancel
|
||||
0x1100a221 T gatt_cli_discover_char
|
||||
0x1100a287 T gatt_cli_discover_desc
|
||||
0x1100ac5d T gatt_cli_event_register
|
||||
0x1100b741 T gatt_cli_read
|
||||
0x1100b775 T gatt_cli_read_by_uuid
|
||||
0x1100be0d T gatt_cli_write
|
||||
0x1100e251 T gatt_user_cli_register
|
||||
0x110041e9 T co_rand_word
|
||||
0x110041f1 T co_random_init
|
||||
0x10002194 D adv_evt_start
|
||||
0x1000213c D gatt_srv_read_api_tbl
|
||||
0x10002150 D gatt_srv_write_api_tbl
|
||||
0x110132a9 T modem_init
|
||||
0x1101381d T rf_init
|
||||
0x11014095 T xc_ble_set_dev_info_cfm
|
||||
0x11013fe5 T xc_ble_get_dev_info_cfm
|
||||
0x11013f0d T xc_ble_gatt_cli_mtu_exch
|
||||
0x110140bd T xc_ble_update_param
|
||||
0x11013fdd T xc_ble_gatt_user_srv_register
|
||||
0x11013fcd T xc_ble_gatt_srv_write_cfm
|
||||
0x11013f75 T xc_ble_gatt_srv_read_cfm
|
||||
0x11013f2b T xc_ble_gatt_srv_notify
|
||||
0x11013f15 T xc_ble_gatt_service16_add
|
||||
0x11013ffd T xc_ble_param_update_cfm
|
||||
0x11014069 T xc_ble_set_dev_config
|
||||
0x11013ef1 T xc_ble_gapm_reset
|
||||
0x11013ec5 T xc_ble_conn_cfm
|
||||
0x11013e99 T xc_ble_advertise_start
|
||||
0x11014031 T xc_ble_set_adv_data
|
||||
0x11013e71 T xc_ble_advertise_create
|
||||
0x10001f83 T rom_xc_fmc_spi_flash_erase_page
|
||||
0x1000203b T rom_xc_fmc_spi_flash_read_page
|
||||
0x10001fd3 T rom_xc_fmc_spi_flash_write_page
|
||||
0x11013a85 T rf_xtal_cal_set
|
||||
0x11013a71 T rf_tx_power_set
|
||||
@@ -0,0 +1,219 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file arch_main.c
|
||||
*
|
||||
* @brief Main loop of the application.
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // RW SW configuration
|
||||
|
||||
#include "arch.h" // architectural platform definitions
|
||||
#include "boot.h" // boot definition
|
||||
#include "rwip.h" // RW SW initialization
|
||||
#include "xc_drv_pwr.h"
|
||||
#include <stdbool.h> // boolean definition
|
||||
#include <stddef.h> // standard definitions
|
||||
#include <stdint.h> // standard integer definition
|
||||
#include <stdlib.h> // standard lib functions
|
||||
|
||||
#if (BLE_TEST_MODE_SUPPORT)
|
||||
#include "uart.h" // UART initialization
|
||||
#endif // (BLE_TEST_MODE_SUPPORT)
|
||||
|
||||
#if (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||||
#include "rf.h" // RF initialization
|
||||
#endif // BLE_EMB_PRESENT || BT_EMB_PRESENT
|
||||
|
||||
#if (BLE_APP_PRESENT)
|
||||
// #include "app.h" // application functions
|
||||
#endif // BLE_APP_PRESENT
|
||||
|
||||
#if PLF_DMA
|
||||
#include "dma.h" // DMA initialization
|
||||
#endif // PLF_DMA
|
||||
|
||||
#if (PLF_NVDS)
|
||||
#include "nvds.h" // NVDS definitions
|
||||
#endif // PLF_NVDS
|
||||
|
||||
#include "reg_assert_mgr.h"
|
||||
#if (PLF_PROFILING || PLF_MEM_PROTECTION)
|
||||
#include "reg_sw_profiling.h"
|
||||
#endif // (PLF_PROFILING || PLF_MEM_PROTECTION)
|
||||
#include "platform.h"
|
||||
|
||||
#include "xc6xxx.h"
|
||||
|
||||
// CPU early wake-up time (unit:us)
|
||||
#define SLEEP_TIME_EARLY (3000)
|
||||
|
||||
#define HS_TO_US(frame) (((frame) * SLOT_SIZE) >> 1)
|
||||
|
||||
/**
|
||||
* @brief clock_init
|
||||
* @details
|
||||
* @param void
|
||||
* @retval void
|
||||
*/
|
||||
void clock_init(void)
|
||||
{
|
||||
CLOCK_InitCfg_t clock_cfg;
|
||||
|
||||
clock_cfg.hfclk_src = CLOCK_HFCLK_SRC_XTAL;
|
||||
clock_cfg.hfclk_in = CLOCK_HFCLK_IN_32M;
|
||||
#if (RC_32K)
|
||||
clock_cfg.lfclk_src = CLOCK_LFCLK_SRC_RC;
|
||||
#endif //(RC_32K)
|
||||
|
||||
#if (XTAL_32K)
|
||||
clock_cfg.lfclk_src = CLOCK_LFCLK_SRC_XTAL;
|
||||
#endif // (XTAL_32K)
|
||||
|
||||
#if (XTAL_32768K)
|
||||
clock_cfg.lfclk_src = CLOCK_LFCLK_SRC_XTAL;
|
||||
#endif // (XTAL_32768K)
|
||||
|
||||
if (clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_XTAL) {
|
||||
clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32768;
|
||||
} else if (clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_RC) {
|
||||
clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32K;
|
||||
}
|
||||
|
||||
xc_clock_init_cfg(&clock_cfg);
|
||||
|
||||
SysTick_Config(xc_clock_hfclk_in_get() / 100);
|
||||
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
|
||||
}
|
||||
|
||||
#if (SLEEP_ENABLE)
|
||||
void wakeup_timer_init(void)
|
||||
{
|
||||
TIMER_BaseInitTypeDef Timer_Init;
|
||||
Timer_Init.src_clk = TIMER_CLK_SRC_32K;
|
||||
Timer_Init.mode = TIMER_MODE_SINGLE_COUNT;
|
||||
Timer_Init.div_clk = TIMER_DIV_CLK_32000Hz;
|
||||
// Timer0 Config & Start
|
||||
TIMER_Base_Init(XC_TIMER0, &Timer_Init);
|
||||
|
||||
PWR_InitTypeDef PWR_InitStruct = {0};
|
||||
PWR_InitStruct.PWR_WakeITSrc = GPIO_IRQn_WAKE | TIMER0_IRQn_WAKE;
|
||||
PWR_InitStruct.PWR_SleepMode = LIGHT_SLEEP_MODE;
|
||||
PWR_SleepInit(&PWR_InitStruct);
|
||||
|
||||
PWR_GPIO_SleepConfig(PWR_InitStruct.PWR_SleepMode);
|
||||
|
||||
PWR_GPIO_LightSleepWakeConfig(GPIO_2, RIS_EDGE_INT);
|
||||
PWR_GPIO_LightSleepWakeConfig(GPIO_3, RIS_EDGE_INT);
|
||||
}
|
||||
|
||||
void sleep_wkup()
|
||||
{
|
||||
PWR_InitTypeDef PWR_InitStruct = {0};
|
||||
|
||||
#if (USE_XIP != 1)
|
||||
SPI_InitCfg_t spi_cfg = {0};
|
||||
spi_cfg.Mode = SPI_MODE_MASTER;
|
||||
spi_cfg.DataSize = SSI_CTRL0_DFS_LEN_8BIT;
|
||||
spi_cfg.Direction = SSI_CTRL0_TMOD_WR;
|
||||
spi_cfg.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
|
||||
spi_cfg.CLKPolarity = SSI_CTRL0_SCPOL_LOW;
|
||||
spi_cfg.CLKPhase = SPI_CPHA_LEAD;
|
||||
spi_cfg.FirstBit = SPI_FirstBit_MSB;
|
||||
|
||||
xc_spi_init(XC_SPI0, &spi_cfg);
|
||||
SPI_Flash_PowerDown(XC_SPI0);
|
||||
#endif //(USE_XIP!=1)
|
||||
|
||||
// PWR_InitStruct.PWR_WakeITSrc = GPIO_IRQn_WAKE | TIMER0_IRQn_WAKE ;
|
||||
// PWR_InitStruct.PWR_SleepMode = LIGHT_SLEEP_MODE;
|
||||
// PWR_SleepInit(&PWR_InitStruct);
|
||||
// PWR_GPIO_SleepConfig(PWR_InitStruct.PWR_SleepMode);
|
||||
sleep_init();
|
||||
PWR_BLE_SleepEnter();
|
||||
}
|
||||
|
||||
void Turn_Off_PeripheralClk()
|
||||
{
|
||||
XC_CPR->SSI0_MCLK_CTL = (((0UL << CPR_SSI_MCLK_CTL_SSI_MCLK_DIV_Pos) |
|
||||
CPR_SSI_MCLK_CTL_SSI_MCLK_DIV_WE) |
|
||||
((CPR_SSI_MCLK_CTL_SSI_MCLK_EN_DISABLE) |
|
||||
CPR_SSI_MCLK_CTL_SSI_MCLK_EN_WE));
|
||||
|
||||
XC_CPR->CTLAPBCLKEN_GRCTL = ((CPR_CTLAPBCLKEN_GRCTL_SSI0_PCLK_EN_DISABLE) |
|
||||
(CPR_CTLAPBCLKEN_GRCTL_SSI0_PCLK_EN_Msk
|
||||
<< CPR_CTLAPBCLKEN_GRCTL_MASK_OFFSET))
|
||||
<< 0;
|
||||
|
||||
XC_CPR->CTLAPBCLKEN_GRCTL = ((CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_DISABLE) |
|
||||
(CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_Msk
|
||||
<< CPR_CTLAPBCLKEN_GRCTL_MASK_OFFSET));
|
||||
|
||||
XC_CPR->UART0_CLK_GRCTL = (((8UL << CPR_UART_CLK_GRCTL_UART0_CLK_GR_Pos) |
|
||||
CPR_UART_CLK_GRCTL_UART0_CLK_GR_WE) |
|
||||
((CPR_UART_CLK_GRCTL_UART0_CLK_GR_UPD_DISABLE) |
|
||||
(CPR_UART_CLK_GRCTL_UART1_CLK_GR_UPD_WE)));
|
||||
|
||||
XC_CPR->CTLAPBCLKEN_GRCTL = ((CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_DISABLE) |
|
||||
(CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_Msk
|
||||
<< CPR_CTLAPBCLKEN_GRCTL_MASK_OFFSET))
|
||||
<< 1;
|
||||
//
|
||||
// XC_CPR->UART1_CLK_GRCTL = (((8UL <<
|
||||
// CPR_UART_CLK_GRCTL_UART1_CLK_GR_Pos) |
|
||||
// CPR_UART_CLK_GRCTL_UART1_CLK_GR_WE) |
|
||||
// ((CPR_UART_CLK_GRCTL_UART1_CLK_GR_UPD_DISABLE)
|
||||
// |
|
||||
// (CPR_UART_CLK_GRCTL_UART1_CLK_GR_UPD_WE)));
|
||||
|
||||
// XC_CPR->AHBCLKEN_GRCTL =0x1e001e;
|
||||
}
|
||||
|
||||
void sleep_schedule()
|
||||
{
|
||||
// Checks for sleep have to be done with interrupt disabled
|
||||
GLOBAL_INT_DISABLE();
|
||||
|
||||
// Check if the processor clock can be gated
|
||||
uint32_t duration = 0;
|
||||
uint32_t duration_timer = 0;
|
||||
// switch(rwip_sleep(&duration, 2, \
|
||||
// 0x7D00, RWIP_MINIMUM_SLEEP_TIME)){
|
||||
switch (rwip_sleep(&duration, 1, 0x7D00, 20)) {
|
||||
case RWIP_DEEP_SLEEP: {
|
||||
duration_timer = (HS_TO_US(duration) - SLEEP_TIME_EARLY);
|
||||
TIMER_SetUs(XC_TIMER0, duration_timer);
|
||||
TIMER_Start_IT(XC_TIMER0);
|
||||
sleep_wkup();
|
||||
__TIMER_Disable(XC_TIMER0);
|
||||
}
|
||||
// no break
|
||||
case RWIP_CPU_SLEEP: {
|
||||
// Wait for interrupt
|
||||
// Turn_Off_PeripheralClk();
|
||||
|
||||
// __PWR_SleepSrcMask_Set(0x1e000e);
|
||||
// __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
||||
// __WFI();
|
||||
// __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
||||
// __PWR_SleepSrcMask_Set(0x1e001e);
|
||||
} break;
|
||||
case RWIP_ACTIVE:
|
||||
default: {
|
||||
// nothing to do.
|
||||
} break;
|
||||
}
|
||||
// Checks for sleep have to be done with interrupt disabled
|
||||
GLOBAL_INT_RESTORE();
|
||||
}
|
||||
#endif // (SLEEP_ENABLE)
|
||||
@@ -0,0 +1,245 @@
|
||||
|
||||
;/*****************************************************************************
|
||||
; * @file: startup_xinc.s
|
||||
; * @purpose: CMSIS Cortex-M0 Core Device Startup File for the
|
||||
; * Device xinc.
|
||||
; *****************************************************************************/
|
||||
|
||||
Stack_Size EQU 0x000006f0
|
||||
|
||||
AREA STACK, NOINIT, READWRITE, ALIGN=3
|
||||
Stack_Mem SPACE Stack_Size
|
||||
__initial_sp
|
||||
|
||||
Heap_Size EQU 0x00000000
|
||||
|
||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||
__heap_base
|
||||
Heap_Mem SPACE Heap_Size
|
||||
__heap_limit
|
||||
|
||||
|
||||
PRESERVE8
|
||||
THUMB
|
||||
|
||||
; Vector Table Mapped to Address 0 at Reset
|
||||
|
||||
AREA RESET, DATA, READONLY
|
||||
EXPORT __Vectors
|
||||
EXPORT __Vectors_End
|
||||
EXPORT __Vectors_Size
|
||||
|
||||
__Vectors DCD __initial_sp ; Top of Stack
|
||||
DCD Reset_Handler ; Reset Handler
|
||||
DCD NMI_Handler ; NMI Handler
|
||||
DCD HardFault_Handler ; Hard Fault Handler
|
||||
DCD MemManage_Handler ; MPU Fault Handler
|
||||
DCD BusFault_Handler ; Bus Fault Handler
|
||||
DCD UsageFault_Handler ; Usage Fault Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD SVC_Handler ; SVCall Handler
|
||||
DCD DebugMon_Handler ; Debug Monitor Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD PendSV_Handler ; PendSV Handler
|
||||
DCD SysTick_Handler ; SysTick Handler
|
||||
|
||||
; External Interrupts
|
||||
; ToDo: Add here the vectors for the device specific external interrupts handler
|
||||
DCD BLE_Handler ; 0
|
||||
DCD DMA_Handler ; 1
|
||||
DCD CPR_Handler ; 2
|
||||
DCD GPIO_Handler ; 3
|
||||
DCD RTC_Handler ; 4
|
||||
DCD TIMER0_Handler ; 5
|
||||
DCD TIMER1_Handler ; 6
|
||||
DCD TIMER2_Handler ; 7
|
||||
DCD TIMER3_Handler ; 8
|
||||
DCD WDT_Handler ; 9
|
||||
DCD I2C_Handler ; 10
|
||||
DCD UART0_Handler ; 11
|
||||
DCD UART1_Handler ; 12
|
||||
DCD SPI0_Handler ; 13
|
||||
DCD SPI1_Handler ; 14
|
||||
DCD 0 ; 15
|
||||
DCD 0 ; 16
|
||||
DCD GADC_Handler ; 17
|
||||
DCD PWM_Handler ; 18
|
||||
DCD AES_Handler ; 19
|
||||
DCD USB_Handler ; 20
|
||||
DCD AUDIO_Handler ; 21
|
||||
DCD RF24G_Handler ; 22
|
||||
DCD SPI2_Handler ; 23
|
||||
DCD MPU_Handler ; 24
|
||||
DCD UART2_Handler ; 25
|
||||
DCD I2S_Handler ; 26
|
||||
DCD AOTIMER0_Handler ; 27
|
||||
DCD AOTIMER1_Handler ; 28
|
||||
DCD CMP_Handler ; 29
|
||||
DCD FMC_Handler ; 30
|
||||
DCD CAN_Handler ; 31
|
||||
|
||||
__Vectors_End
|
||||
|
||||
__Vectors_Size EQU __Vectors_End - __Vectors
|
||||
|
||||
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
; Reset Handler
|
||||
|
||||
Reset_Handler PROC
|
||||
|
||||
EXPORT Reset_Handler [WEAK]
|
||||
|
||||
IMPORT SystemInit
|
||||
IMPORT __main
|
||||
|
||||
LDR r0, =0x4000013C ; remap
|
||||
LDR r1, =0x10000001
|
||||
STR r1, [r0]
|
||||
|
||||
|
||||
|
||||
LDR R0, =SystemInit
|
||||
BLX R0
|
||||
|
||||
LDR R0, =__main
|
||||
BX R0
|
||||
|
||||
ENDP
|
||||
|
||||
; Dummy Exception Handlers (infinite loops which can be modified)
|
||||
NMI_Handler PROC
|
||||
EXPORT NMI_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
|
||||
|
||||
HardFault_Handler\
|
||||
PROC
|
||||
EXPORT HardFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
MemManage_Handler\
|
||||
PROC
|
||||
EXPORT MemManage_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
BusFault_Handler\
|
||||
PROC
|
||||
EXPORT BusFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
UsageFault_Handler\
|
||||
PROC
|
||||
EXPORT UsageFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
SVC_Handler PROC
|
||||
EXPORT SVC_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
DebugMon_Handler\
|
||||
PROC
|
||||
EXPORT DebugMon_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
|
||||
Default_Handler PROC
|
||||
EXPORT BLE_Handler [WEAK]
|
||||
EXPORT DMA_Handler [WEAK]
|
||||
EXPORT CPR_Handler [WEAK]
|
||||
EXPORT GPIO_Handler [WEAK]
|
||||
EXPORT RTC_Handler [WEAK]
|
||||
EXPORT TIMER0_Handler [WEAK]
|
||||
EXPORT TIMER1_Handler [WEAK]
|
||||
EXPORT TIMER2_Handler [WEAK]
|
||||
EXPORT TIMER3_Handler [WEAK]
|
||||
EXPORT WDT_Handler [WEAK]
|
||||
EXPORT I2C_Handler [WEAK]
|
||||
EXPORT UART0_Handler [WEAK]
|
||||
EXPORT UART1_Handler [WEAK]
|
||||
EXPORT SPI0_Handler [WEAK]
|
||||
EXPORT SPI1_Handler [WEAK]
|
||||
;EXPORT KBS_Handler [WEAK]
|
||||
;EXPORT QDEC_Handler [WEAK]
|
||||
EXPORT GADC_Handler [WEAK]
|
||||
EXPORT PWM_Handler [WEAK]
|
||||
EXPORT AES_Handler [WEAK]
|
||||
|
||||
EXPORT PendSV_Handler [WEAK]
|
||||
EXPORT SysTick_Handler [WEAK]
|
||||
|
||||
EXPORT USB_Handler [WEAK];20
|
||||
EXPORT AUDIO_Handler [WEAK];21
|
||||
EXPORT RF24G_Handler [WEAK];22
|
||||
EXPORT SPI2_Handler [WEAK];23
|
||||
EXPORT MPU_Handler [WEAK];24
|
||||
EXPORT UART2_Handler [WEAK];25
|
||||
EXPORT I2S_Handler [WEAK];26
|
||||
EXPORT AOTIMER0_Handler [WEAK];27
|
||||
EXPORT AOTIMER1_Handler [WEAK];28
|
||||
EXPORT CMP_Handler [WEAK];29
|
||||
EXPORT FMC_Handler [WEAK];30
|
||||
EXPORT CAN_Handler [WEAK];31
|
||||
|
||||
PendSV_Handler
|
||||
SysTick_Handler
|
||||
BLE_Handler
|
||||
RF24G_Handler
|
||||
DMA_Handler
|
||||
CPR_Handler
|
||||
GPIO_Handler
|
||||
RTC_Handler
|
||||
TIMER0_Handler
|
||||
TIMER1_Handler
|
||||
TIMER2_Handler
|
||||
TIMER3_Handler
|
||||
WDT_Handler
|
||||
I2C_Handler
|
||||
I2S_Handler
|
||||
UART0_Handler
|
||||
UART1_Handler
|
||||
UART2_Handler
|
||||
SPI0_Handler
|
||||
SPI1_Handler
|
||||
SPI2_Handler
|
||||
MPU_Handler
|
||||
;KBS_Handler
|
||||
;QDEC_Handler
|
||||
GADC_Handler
|
||||
PWM_Handler
|
||||
AUDIO_Handler
|
||||
;SIM_Handler
|
||||
AES_Handler
|
||||
AOTIMER0_Handler
|
||||
AOTIMER1_Handler
|
||||
CMP_Handler
|
||||
FMC_Handler
|
||||
CAN_Handler
|
||||
USB_Handler
|
||||
|
||||
B .
|
||||
ENDP
|
||||
|
||||
|
||||
ALIGN
|
||||
|
||||
; User Initial Stack & Heap
|
||||
|
||||
IMPORT __use_two_region_memory
|
||||
EXPORT __user_initial_stackheap
|
||||
__user_initial_stackheap
|
||||
|
||||
LDR R0, = Heap_Mem
|
||||
LDR R1, = (Stack_Mem + Stack_Size)
|
||||
LDR R2, = (Heap_Mem + Heap_Size)
|
||||
LDR R3, = Stack_Mem
|
||||
BX LR
|
||||
|
||||
ALIGN
|
||||
|
||||
END
|
||||
@@ -0,0 +1,117 @@
|
||||
/**
|
||||
* Initialize the system
|
||||
*
|
||||
* @param none
|
||||
* @return none
|
||||
*
|
||||
* @brief Setup the microcontroller system
|
||||
*
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------------------------------------------
|
||||
INCLUDE HEADE FILES
|
||||
------------------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
|
||||
#include "rwip.h"
|
||||
#include "xc6xxx.h"
|
||||
/*------------------------------------------------------------------------------------
|
||||
Macros
|
||||
-------------------------------------------------------------------------------------*/
|
||||
#define __DEBUG_OUT_PORT 0
|
||||
|
||||
/*------------------------------------------------------------------------------------
|
||||
Functions
|
||||
-------------------------------------------------------------------------------------*/
|
||||
#define VECTOR_NUM 48
|
||||
|
||||
void set_vector(void)
|
||||
{
|
||||
#if (USE_XIP == 1)
|
||||
GLOBAL_INT_DISABLE();
|
||||
for (uint32_t i = 0, *Pvector = (uint32_t *)(0x11016000 + 0),
|
||||
*_vector_table = (uint32_t *)(0x10000000);
|
||||
i < VECTOR_NUM; i++) // copy vertor table
|
||||
{
|
||||
_vector_table[i] = *Pvector++;
|
||||
}
|
||||
|
||||
*((volatile unsigned int *)(0x4000013C)) =
|
||||
0x10000001; // inter vertor table remap
|
||||
GLOBAL_INT_RESTORE();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void WDT_ResetInit(void)
|
||||
{
|
||||
cpr_ctlapbclken_grctl__wdt_pclk_en__setf(ENABLE);
|
||||
|
||||
cpr_rstctl_ctlapb_sw__wdt_rstn__setf(RSTCTL_ENABLE);
|
||||
cpr_rstctl_ctlapb_sw__wdt_rstn__setf(RSTCTL_DISABLE);
|
||||
|
||||
cpr_rstctl_wdtrst_mask_set(
|
||||
(WDT_SYS_RSTN_MASK_DISABLE | WDT_M0_RSTN_MASK_ENABLE));
|
||||
|
||||
cpr_lp_ctl__wdt_tclk_en__setf(DISABLE);
|
||||
wdt_cr__wdt_en__setf(DISABLE);
|
||||
}
|
||||
|
||||
void SystemInit(void)
|
||||
{
|
||||
|
||||
WDT_ResetInit();
|
||||
|
||||
#if (USE_XIP == 1)
|
||||
|
||||
set_vector();
|
||||
#endif
|
||||
|
||||
// enable BT CLK
|
||||
writel(0x40000040, readl(0x40000040) | (0x01 << 4) | 0xFFFF0000);
|
||||
}
|
||||
|
||||
__RAM_CODE int sendchar(int c)
|
||||
{
|
||||
unsigned int status;
|
||||
#if (__DEBUG_OUT_PORT == 1)
|
||||
for (;;) {
|
||||
status = (*((volatile unsigned *)(0x40011000 + 0x14)));
|
||||
status &= 0x20;
|
||||
if (status == 0x20)
|
||||
break;
|
||||
}
|
||||
(*((volatile unsigned *)(0x40011000 + 0x00))) = c;
|
||||
return (1);
|
||||
#else
|
||||
for (;;) {
|
||||
status = (*((volatile unsigned *)(0x40010000 + 0x14)));
|
||||
status &= 0x20;
|
||||
if (status == 0x20)
|
||||
break;
|
||||
}
|
||||
(*((volatile unsigned *)(0x40010000 + 0x00))) = c;
|
||||
return (1);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct __FILE
|
||||
{
|
||||
int handle; /* Add whatever you need here */
|
||||
};
|
||||
|
||||
FILE __stdout;
|
||||
__RAM_CODE int fputc(int ch, FILE *f) { return (sendchar(ch)); }
|
||||
|
||||
int ferror(FILE *f)
|
||||
{
|
||||
/* Your implementation of ferror */
|
||||
return EOF;
|
||||
}
|
||||
|
||||
void _ttywrch(int ch) { sendchar(ch); }
|
||||
|
||||
void _sys_exit(int return_code)
|
||||
{
|
||||
label:
|
||||
goto label; /* endless loop */
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
#include "usr_client.h"
|
||||
|
||||
uint8_t cli_user_lid = GATT_INVALID_USER_LID;
|
||||
/* Handle for sending data from the centre to the slave. */
|
||||
uint16_t cli_tx_hdl = GATT_INVALID_HDL;
|
||||
uint16_t cli_chg_ccc_hdl = GATT_INVALID_HDL;
|
||||
|
||||
#define CUSTOM_SVC_UUID_CLI 0xFFF0
|
||||
#define CUSTOM_SVC_RX_CHAR_UUID_CLI 0xFFF3
|
||||
#define CUSTOM_SVC_TX_CHAR_UUID_CLI 0xFFF4
|
||||
|
||||
uint8_t get_cli_user_ild(void) { return cli_user_lid; }
|
||||
extern bool connect_idle;
|
||||
void cli_discover_cmp_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t status)
|
||||
{
|
||||
LOGI(
|
||||
"[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, status = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, dummy, status);
|
||||
|
||||
uint16_t cli_cfg = GATT_CCC_START_NTF;
|
||||
status = xc_ble_gatt_cli_write(conidx, get_cli_user_ild(), 0, GATT_WRITE,
|
||||
cli_chg_ccc_hdl, 2, (uint8_t *)&cli_cfg);
|
||||
connect_idle=true;
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("xc_ble_gatt_cli_write error 0x%x", status);
|
||||
}
|
||||
|
||||
// send_data(conidx);
|
||||
}
|
||||
|
||||
void cli_read_cmp_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t status)
|
||||
{
|
||||
LOGI(
|
||||
"[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, status = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, dummy, status);
|
||||
}
|
||||
|
||||
void cli_write_cmp_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t status)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, status = 0x%x\r\n",
|
||||
__func__, conidx, user_lid, dummy, status);
|
||||
}
|
||||
|
||||
void cli_svc_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy, uint16_t hdl,
|
||||
uint8_t disc_info, uint8_t nb_att, const gatt_svc_att_t *p_atts)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, hdl = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, dummy, hdl);
|
||||
|
||||
uint8_t cursor;
|
||||
uint16_t att_handle = GATT_INVALID_HDL;
|
||||
|
||||
// check all attributes
|
||||
for (cursor = 0; cursor < nb_att; cursor++) {
|
||||
const gatt_svc_att_t *p_att = &(p_atts[cursor]);
|
||||
|
||||
switch (p_att->att_type) {
|
||||
case GATT_ATT_PRIMARY_SVC: {
|
||||
} break;
|
||||
case GATT_ATT_CHAR: {
|
||||
att_handle = p_att->info.charac.val_hdl;
|
||||
} break;
|
||||
case GATT_ATT_VAL: {
|
||||
if (gatt_uuid16_comp(p_att->uuid, p_att->uuid_type,
|
||||
CUSTOM_SVC_RX_CHAR_UUID_CLI)) {
|
||||
cli_tx_hdl = att_handle;
|
||||
LOGI("cli_tx_hdl=0x%x\n", cli_tx_hdl);
|
||||
}
|
||||
} break;
|
||||
case GATT_ATT_DESC: {
|
||||
// Client Char Configuration of service changed value
|
||||
if (gatt_uuid16_comp(p_att->uuid, p_att->uuid_type,
|
||||
GATT_DESC_CLIENT_CHAR_CFG)) {
|
||||
cli_chg_ccc_hdl = hdl + cursor;
|
||||
LOGI("cli_chg_ccc_hdl=0x%x\n", cli_chg_ccc_hdl);
|
||||
}
|
||||
} break;
|
||||
default: { /* Nothing to do */
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cli_svc_info_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t start_hdl, uint16_t end_hdl, uint8_t uuid_type,
|
||||
const uint8_t *p_uuid)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, start_hdl = 0x%x, end_hdl = "
|
||||
"0x%x, uuid[0] = 0x%x, uuid[1] = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, start_hdl, end_hdl, p_uuid[0], p_uuid[1]);
|
||||
}
|
||||
|
||||
void cli_read_val_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t hdl, uint16_t offset, co_buf_t *p_data)
|
||||
{
|
||||
uint16_t length = co_buf_data_len(p_data);
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, handler = 0x%x, length = "
|
||||
"0x%x data: \r\n",
|
||||
__func__, conidx, user_lid, hdl, length);
|
||||
// DUMP_DATA_PRINTF(&(co_buf_data(p_data)[0]), length);
|
||||
}
|
||||
|
||||
void cli_val_evt_cb(uint8_t conidx, uint8_t user_lid, uint16_t token,
|
||||
uint8_t evt_type, bool complete, uint16_t hdl,
|
||||
co_buf_t *p_data)
|
||||
{
|
||||
uint16_t status;
|
||||
uint16_t length = co_buf_data_len(p_data);
|
||||
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, token = 0x%x evt_type = \
|
||||
0x%x complete = 0x%x handler = 0x%x, length = %d data: \r\n",
|
||||
__func__, conidx, user_lid, token, evt_type, complete, hdl, length);
|
||||
status = xc_ble_gatt_cli_indicate_cfm(conidx, user_lid, token);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_cli_indicate_cfm error 0x%x", status);
|
||||
}
|
||||
|
||||
|
||||
for(uint8_t i = 0;i<length;i++)
|
||||
{
|
||||
LOGI(" %02x ",co_buf_data(p_data)[i]);
|
||||
}
|
||||
LOGI("\r\n");
|
||||
//(&(co_buf_data(p_data)[0]), length);
|
||||
}
|
||||
|
||||
void cli_svc_changed_cb(uint8_t conidx, uint8_t user_lid, bool out_of_sync,
|
||||
uint16_t start_hdl, uint16_t end_hdl)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, out_of_sync = 0x%x ,start_hdl = "
|
||||
"0x%x, end_hdl = "
|
||||
"0x%x \r\n",
|
||||
__func__, conidx, user_lid, out_of_sync, start_hdl, end_hdl);
|
||||
}
|
||||
|
||||
static const gatt_cli_cb_t cli_cb = {
|
||||
.cb_discover_cmp = cli_discover_cmp_cb,
|
||||
.cb_read_cmp = cli_read_cmp_cb,
|
||||
.cb_write_cmp = cli_write_cmp_cb,
|
||||
.cb_svc = cli_svc_cb,
|
||||
.cb_svc_info = cli_svc_info_cb,
|
||||
.cb_att_val = cli_read_val_cb,
|
||||
.cb_att_val_evt = cli_val_evt_cb,
|
||||
.cb_svc_changed = cli_svc_changed_cb,
|
||||
};
|
||||
|
||||
uint8_t app_cli_register(void)
|
||||
{
|
||||
uint16_t status = 0;
|
||||
status = xc_ble_gatt_user_cli_register(GAP_LE_MTU_MAX, 0, &cli_cb,
|
||||
&cli_user_lid);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_user_cli_register error 0x%x", status);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
__RAM_EM uint8_t data_test[THROUGHTPUT_SEND_DATA_LEN] = {0x00, 0x01, 0x02,
|
||||
0x03};
|
||||
void send_data(uint8_t conidx)
|
||||
{
|
||||
uint16_t status;
|
||||
|
||||
status = xc_ble_gatt_cli_write(conidx, get_cli_user_ild(), 0, GATT_WRITE,
|
||||
cli_tx_hdl, sizeof(data_test), data_test);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("write error 0x%x", status);
|
||||
}
|
||||
}
|
||||
|
||||
void usr_cli_feat_enable(uint8_t conidx)
|
||||
{
|
||||
uint16_t svc_uuid = CUSTOM_SVC_UUID_CLI;
|
||||
uint8_t status = gatt_cli_discover_svc(
|
||||
conidx, get_cli_user_ild(), 0, GATT_DISCOVER_SVC_PRIMARY_BY_UUID, true,
|
||||
GATT_MIN_HDL, GATT_MAX_HDL, GATT_UUID_16, (uint8_t *)&svc_uuid);
|
||||
|
||||
if (status == GATT_NO_ERROR) {
|
||||
status = xc_ble_gatt_cli_event_register(conidx, get_cli_user_ild(),
|
||||
GATT_MIN_HDL, GATT_MAX_HDL);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("xc_ble_gatt_cli_event_register error 0x%x", status);
|
||||
}
|
||||
} else {
|
||||
LOGI_ERR("gatt_cli_discover_svc error 0x%x", status);
|
||||
connect_idle=false;
|
||||
}
|
||||
|
||||
// uint16_t xc_ble_gatt_cli_mtu_exch( conidx, get_cli_user_ild());
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file usr_client.h
|
||||
*
|
||||
* @brief Custom client
|
||||
*
|
||||
* Copyright (c) 2022 - 2025, XinChip
|
||||
* All rights reserved.
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _USR_CLIENT_H_
|
||||
#define _USE_CLIENT_H_
|
||||
|
||||
#include "app_task.h"
|
||||
#include "dbg.h"
|
||||
#include "gatt_msg.h"
|
||||
#include "usr_server.h"
|
||||
#include "xc_gatt_client_api.h"
|
||||
|
||||
#define THROUGHTPUT_SEND_DATA_LEN 20
|
||||
|
||||
uint8_t get_cli_user_ild(void);
|
||||
uint8_t app_cli_register(void);
|
||||
void usr_cli_feat_enable(uint8_t conidx);
|
||||
#endif // _USE_CLIENT_H_
|
||||
@@ -0,0 +1,170 @@
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file usr_server.c
|
||||
*
|
||||
* @brief Custom Server profile database definitions.
|
||||
*
|
||||
* Copyright (c) 2022 - 2025, XinChip
|
||||
* All rights reserved.p
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
#include "usr_server.h"
|
||||
#include "xc6xxx.h"
|
||||
uint8_t srv_user_lid = GATT_INVALID_USER_LID;
|
||||
uint16_t custom_svc_start_hdl = GATT_INVALID_HDL;
|
||||
uint8_t custom_svc_tx_char_notify = DISABLE;
|
||||
|
||||
static const gatt_att_desc_t custom_server_atts[] = {
|
||||
[CUSTOM_SVC_DECL] =
|
||||
{
|
||||
.uuid = 0x00,
|
||||
0x28,
|
||||
.info = GATT_ATT_RD_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
[CUSTOM_SVC_RX_CHAR_DECL_CHAR] =
|
||||
{
|
||||
.uuid = 0x03,
|
||||
0x28,
|
||||
.info = GATT_ATT_RD_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
[CUSTOM_SVC_RX_CHAR_VAL] =
|
||||
{
|
||||
.uuid = CUSTOM_SVC_RX_CHAR_UUID,
|
||||
.info = GATT_ATT_WC_BIT | GATT_ATT_RD_BIT | ATT_UUID(128),
|
||||
.ext_info =
|
||||
GATT_ATT_NO_OFFSET_BIT | CUSTOM_SVC_RX_CHAR_VAL_MAX_LENGTH,
|
||||
},
|
||||
[CUSTOM_SVC_TX_CHAR_DECL_CHAR] =
|
||||
{
|
||||
.uuid = 0x03,
|
||||
0x28,
|
||||
.info = GATT_ATT_RD_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
[CUSTOM_SVC_TX_CHAR_VAL] =
|
||||
{
|
||||
.uuid = CUSTOM_SVC_TX_CHAR_UUID,
|
||||
.info = GATT_ATT_N_BIT | ATT_UUID(128),
|
||||
.ext_info =
|
||||
GATT_ATT_NO_OFFSET_BIT | CUSTOM_SVC_TX_CHAR_VAL_MAX_LENGTH,
|
||||
},
|
||||
[CUSTOM_SVC_TX_CHAR_CFG] =
|
||||
{
|
||||
.uuid = 0x02,
|
||||
0x29,
|
||||
.info = GATT_ATT_RD_BIT | GATT_ATT_WR_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
};
|
||||
|
||||
uint8_t slave_send_data(uint8_t *data, uint8_t len, uint8_t att_idx);
|
||||
|
||||
uint16_t srv_get_hdl_from_att_idx(uint8_t idx)
|
||||
{
|
||||
return custom_svc_start_hdl + idx;
|
||||
}
|
||||
|
||||
// This function is called when GATT server user has initiated event send to
|
||||
// peer device or if an error occurs.
|
||||
__STATIC void custom_svc_cb_event_sent(uint8_t conidx, uint8_t user_lid,
|
||||
uint16_t dummy, uint16_t status)
|
||||
{
|
||||
LOGI("[%s] conidx:%d, usr_lid:%d, dummy:%d, status:%d \r\n", __func__,
|
||||
conidx, user_lid, dummy, status);
|
||||
}
|
||||
|
||||
// This function is called when peer want to read local attribute database
|
||||
// value.
|
||||
__STATIC void custom_svc_cb_att_read_get(uint8_t conidx, uint8_t user_lid,
|
||||
uint16_t token, uint16_t hdl,
|
||||
uint16_t offset, uint16_t max_length)
|
||||
{
|
||||
uint16_t status;
|
||||
uint8_t data[] = {0x12, 0x15, 0x46, 0x62};
|
||||
LOGI("[%s] conidx:%d, usr_lid:%d, token:%d, hdl:%d, offset:%d, "
|
||||
"max_length:%d \r\n",
|
||||
__func__, conidx, user_lid, token, hdl, offset, max_length);
|
||||
// Send result to peer device
|
||||
status = xc_ble_gatt_srv_read_cfm(conidx, user_lid, token, GAP_ERR_NO_ERROR,
|
||||
sizeof(data), sizeof(data), data);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_srv_read_cfm error 0x%x", status);
|
||||
}
|
||||
}
|
||||
|
||||
// This function is called during a write procedure to modify attribute handle.
|
||||
__STATIC void custom_svc_cb_att_val_set(uint8_t conidx, uint8_t user_lid,
|
||||
uint16_t token, uint16_t hdl,
|
||||
uint16_t offset, co_buf_t *p_data)
|
||||
{
|
||||
uint16_t length = co_buf_data_len(p_data);
|
||||
uint16_t status;
|
||||
LOGI("[%s] conidx:%d, usr_lid:%d, token:%d, hdl:%d, offset:%d \r\n",
|
||||
__func__, conidx, user_lid, token, hdl, offset);
|
||||
status =
|
||||
xc_ble_gatt_srv_write_cfm(conidx, user_lid, token, GAP_ERR_NO_ERROR);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_srv_write_cfm error 0x%x", status);
|
||||
}
|
||||
LOGI("length:%d data:\r\n", length);
|
||||
// DUMP_DATA_PRINTF(co_buf_data(p_data), length);
|
||||
// xc_fota_server_write_ind(co_buf_data(p_data), length);
|
||||
// LOGI("hdl=%x %x\r\n", hdl,
|
||||
// srv_get_hdl_from_att_idx(CUSTOM_SVC_TX_CHAR_CFG));
|
||||
if (hdl == srv_get_hdl_from_att_idx(CUSTOM_SVC_TX_CHAR_CFG)) {
|
||||
if ((co_buf_data(p_data)[1] == 0) && (co_buf_data(p_data)[0] == 0)) {
|
||||
custom_svc_tx_char_notify = DISABLE;
|
||||
} else {
|
||||
custom_svc_tx_char_notify = ENABLE;
|
||||
LOGI("custom_svc_tx_char_notify ENABLE\r\n");
|
||||
uint8_t data[254] = {0x12, 0x13, 0x14};
|
||||
slave_send_data(data, sizeof(data), CUSTOM_SVC_TX_CHAR_VAL);
|
||||
LOGI("notify test\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const gatt_srv_cb_t custom_src_cb = {
|
||||
.cb_event_sent = custom_svc_cb_event_sent,
|
||||
.cb_att_read_get = custom_svc_cb_att_read_get,
|
||||
.cb_att_val_set = custom_svc_cb_att_val_set,
|
||||
};
|
||||
|
||||
uint8_t custom_svc_add(void)
|
||||
{
|
||||
int nb_att = sizeof(custom_server_atts) / sizeof(custom_server_atts[0]);
|
||||
uint16_t status;
|
||||
uint8_t custom_svc_uuid[GATT_UUID_128_LEN] = CUSTOM_SVC_UUID;
|
||||
status = xc_ble_gatt_user_srv_register(GAP_LE_MTU_MAX, 0, &custom_src_cb,
|
||||
&srv_user_lid);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_user_srv_register error 0x%x", status);
|
||||
}
|
||||
status = xc_ble_gatt_service_add(
|
||||
srv_user_lid, GATT_UUID_128 << GATT_SVC_UUID_TYPE_LSB, custom_svc_uuid,
|
||||
nb_att, NULL, &(custom_server_atts[0]), nb_att, &custom_svc_start_hdl);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("xc_ble_gatt_service_add error 0x%x", status);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
uint8_t slave_send_data(uint8_t *data, uint8_t len, uint8_t att_idx)
|
||||
{
|
||||
uint16_t status = INVALID_DATA;
|
||||
struct app_env_tag *app_env = get_app_env();
|
||||
if (app_env->slave_connected && custom_svc_tx_char_notify) {
|
||||
status = xc_ble_gatt_srv_notify(app_env->slave_conidx, srv_user_lid, 0,
|
||||
srv_get_hdl_from_att_idx(att_idx), len,
|
||||
data);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_srv_notify error 0x%x", status);
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file usr_server.h
|
||||
*
|
||||
* @brief Custom Server profile database definitions.
|
||||
*
|
||||
* Copyright (c) 2022 - 2025, XinChip
|
||||
* All rights reserved.
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
#ifndef _USR_SERVER_H_
|
||||
#define _USR_SERVER_H_
|
||||
|
||||
#include "app_task.h"
|
||||
#include "dbg.h"
|
||||
#include "gatt.h"
|
||||
#include "gatt_msg.h"
|
||||
#include "rwble_hl_config.h"
|
||||
#include "xc_gatt_server_api.h"
|
||||
|
||||
// #define CUSTOM_SVC_UUID
|
||||
// {0x00,0x00,0xFF,0x10,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFA}
|
||||
// #define CUSTOM_SVC_RX_CHAR_UUID
|
||||
// 0x00,0x00,0xFF,0x11,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB
|
||||
// #define CUSTOM_SVC_TX_CHAR_UUID
|
||||
// 0x00,0x00,0xFF,0x12,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB
|
||||
|
||||
#define CUSTOM_SVC_UUID \
|
||||
{ \
|
||||
0xFA, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, \
|
||||
0x00, 0x10, 0xFF, 0x00, 0x00 \
|
||||
}
|
||||
#define CUSTOM_SVC_TX_CHAR_UUID \
|
||||
0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, \
|
||||
0x11, 0xFF, 0x00, 0x00
|
||||
#define CUSTOM_SVC_RX_CHAR_UUID \
|
||||
0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, \
|
||||
0x12, 0xFF, 0x00, 0x00
|
||||
|
||||
#define CUSTOM_SVC_RX_CHAR_VAL_MAX_LENGTH (512)
|
||||
#define CUSTOM_SVC_TX_CHAR_VAL_MAX_LENGTH (512)
|
||||
|
||||
#ifndef DISABLE
|
||||
#define DISABLE 0
|
||||
#endif // DISABLE
|
||||
|
||||
#ifndef ENABLE
|
||||
#define ENABLE 1
|
||||
#endif // ENABLE
|
||||
|
||||
enum cust_svc
|
||||
{
|
||||
CUSTOM_SVC_DECL = 0,
|
||||
CUSTOM_SVC_RX_CHAR_DECL_CHAR,
|
||||
CUSTOM_SVC_RX_CHAR_VAL,
|
||||
CUSTOM_SVC_TX_CHAR_DECL_CHAR,
|
||||
CUSTOM_SVC_TX_CHAR_VAL,
|
||||
CUSTOM_SVC_TX_CHAR_CFG,
|
||||
};
|
||||
uint8_t custom_svc_add(void);
|
||||
uint8_t slave_send_data(uint8_t *data, uint8_t len, uint8_t att_idx);
|
||||
#endif // _USR_SERVER_H_
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
FUNC void Initialization(void)
|
||||
{
|
||||
SP = _RDWORD(0x10000000);
|
||||
PC = _RDWORD(0x10000004);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
LOAD %L INCREMENTAL
|
||||
Initialization();
|
||||
@@ -0,0 +1,39 @@
|
||||
[BREAKPOINTS]
|
||||
ForceImpTypeAny = 0
|
||||
ShowInfoWin = 1
|
||||
EnableFlashBP = 2
|
||||
BPDuringExecution = 0
|
||||
[CFI]
|
||||
CFISize = 0x00
|
||||
CFIAddr = 0x00
|
||||
[CPU]
|
||||
MonModeVTableAddr = 0xFFFFFFFF
|
||||
MonModeDebug = 0
|
||||
MaxNumAPs = 0
|
||||
LowPowerHandlingMode = 0
|
||||
OverrideMemMap = 0
|
||||
AllowSimulation = 1
|
||||
ScriptFile=""
|
||||
[FLASH]
|
||||
CacheExcludeSize = 0x00
|
||||
CacheExcludeAddr = 0x00
|
||||
MinNumBytesFlashDL = 0
|
||||
SkipProgOnCRCMatch = 1
|
||||
VerifyDownload = 1
|
||||
AllowCaching = 1
|
||||
EnableFlashDL = 2
|
||||
Override = 0
|
||||
Device="ARM7"
|
||||
[GENERAL]
|
||||
WorkRAMSize = 0x00
|
||||
WorkRAMAddr = 0x00
|
||||
RAMUsageLimit = 0x00
|
||||
[SWO]
|
||||
SWOLogFile=""
|
||||
[MEM]
|
||||
RdOverrideOrMask = 0x00
|
||||
RdOverrideAndMask = 0xFFFFFFFF
|
||||
RdOverrideAddr = 0xFFFFFFFF
|
||||
WrOverrideOrMask = 0x00
|
||||
WrOverrideAndMask = 0xFFFFFFFF
|
||||
WrOverrideAddr = 0xFFFFFFFF
|
||||
@@ -0,0 +1,16 @@
|
||||
LOAD 0x10000000
|
||||
{
|
||||
EXE 0x10000000
|
||||
{
|
||||
startup_xinc.o (RESET, +FIRST)
|
||||
* (+RO)
|
||||
|
||||
}
|
||||
|
||||
RW +0000
|
||||
{
|
||||
* (+RW,+ZI)
|
||||
}
|
||||
|
||||
ScatterAssert(ImageLength(RW) < 1024 * 28)
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
LOAD 0x11016000
|
||||
{
|
||||
EXE 0x11016000
|
||||
{
|
||||
startup_xinc.o (RESET, +FIRST)
|
||||
* (+RO)
|
||||
|
||||
}
|
||||
;This area is vector
|
||||
RW1 0x10000100
|
||||
{
|
||||
startup_xinc.o(STACK)
|
||||
}
|
||||
ScatterAssert(ImageLength(RW1) < (0x800 - 0x100))
|
||||
RW 0x100031b0
|
||||
{
|
||||
; startup_xinc.o(STACK)
|
||||
* (+RW,+ZI)
|
||||
*(ram_code)
|
||||
aeabi_sdiv.o(.text)
|
||||
uread4.o(.text)
|
||||
rt_memclr.o(.text)
|
||||
}
|
||||
ScatterAssert((0x31b0+ImageLength(RW)) < 1024 * 32 )
|
||||
|
||||
|
||||
; RW2 (0x53004000+12*1024)
|
||||
; {
|
||||
; *(ram_em)
|
||||
; }
|
||||
; ScatterAssert((0x53004000+12*1024)+ImageLength(RW2) < (0x53004000+16*1024))
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,673 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
|
||||
|
||||
<SchemaVersion>1.0</SchemaVersion>
|
||||
|
||||
<Header>### uVision Project, (C) Keil Software</Header>
|
||||
|
||||
<Extensions>
|
||||
<cExt>*.c</cExt>
|
||||
<aExt>*.s*; *.src; *.a*</aExt>
|
||||
<oExt>*.obj; *.o</oExt>
|
||||
<lExt>*.lib</lExt>
|
||||
<tExt>*.txt; *.h; *.inc; *.md</tExt>
|
||||
<pExt>*.plm</pExt>
|
||||
<CppX>*.cpp</CppX>
|
||||
<nMigrate>0</nMigrate>
|
||||
</Extensions>
|
||||
|
||||
<DaveTm>
|
||||
<dwLowDateTime>0</dwLowDateTime>
|
||||
<dwHighDateTime>0</dwHighDateTime>
|
||||
</DaveTm>
|
||||
|
||||
<Target>
|
||||
<TargetName>ble-sdk-xip</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
<CLKADS>12000000</CLKADS>
|
||||
<OPTTT>
|
||||
<gFlags>1</gFlags>
|
||||
<BeepAtEnd>1</BeepAtEnd>
|
||||
<RunSim>0</RunSim>
|
||||
<RunTarget>1</RunTarget>
|
||||
<RunAbUc>0</RunAbUc>
|
||||
</OPTTT>
|
||||
<OPTHX>
|
||||
<HexSelection>1</HexSelection>
|
||||
<FlashByte>65535</FlashByte>
|
||||
<HexRangeLowAddress>0</HexRangeLowAddress>
|
||||
<HexRangeHighAddress>0</HexRangeHighAddress>
|
||||
<HexOffset>0</HexOffset>
|
||||
</OPTHX>
|
||||
<OPTLEX>
|
||||
<PageWidth>79</PageWidth>
|
||||
<PageLength>66</PageLength>
|
||||
<TabStop>8</TabStop>
|
||||
<ListingPath>.\Listings\</ListingPath>
|
||||
</OPTLEX>
|
||||
<ListingPage>
|
||||
<CreateCListing>1</CreateCListing>
|
||||
<CreateAListing>1</CreateAListing>
|
||||
<CreateLListing>1</CreateLListing>
|
||||
<CreateIListing>0</CreateIListing>
|
||||
<AsmCond>1</AsmCond>
|
||||
<AsmSymb>1</AsmSymb>
|
||||
<AsmXref>0</AsmXref>
|
||||
<CCond>1</CCond>
|
||||
<CCode>0</CCode>
|
||||
<CListInc>0</CListInc>
|
||||
<CSymb>0</CSymb>
|
||||
<LinkerCodeListing>0</LinkerCodeListing>
|
||||
</ListingPage>
|
||||
<OPTXL>
|
||||
<LMap>1</LMap>
|
||||
<LComments>1</LComments>
|
||||
<LGenerateSymbols>1</LGenerateSymbols>
|
||||
<LLibSym>1</LLibSym>
|
||||
<LLines>1</LLines>
|
||||
<LLocSym>1</LLocSym>
|
||||
<LPubSym>1</LPubSym>
|
||||
<LXref>0</LXref>
|
||||
<LExpSel>0</LExpSel>
|
||||
</OPTXL>
|
||||
<OPTFL>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<IsCurrentTarget>1</IsCurrentTarget>
|
||||
</OPTFL>
|
||||
<CpuCode>7</CpuCode>
|
||||
<DebugOpt>
|
||||
<uSim>0</uSim>
|
||||
<uTrg>1</uTrg>
|
||||
<sLdApp>1</sLdApp>
|
||||
<sGomain>1</sGomain>
|
||||
<sRbreak>1</sRbreak>
|
||||
<sRwatch>1</sRwatch>
|
||||
<sRmem>1</sRmem>
|
||||
<sRfunc>1</sRfunc>
|
||||
<sRbox>1</sRbox>
|
||||
<tLdApp>1</tLdApp>
|
||||
<tGomain>1</tGomain>
|
||||
<tRbreak>1</tRbreak>
|
||||
<tRwatch>1</tRwatch>
|
||||
<tRmem>1</tRmem>
|
||||
<tRfunc>0</tRfunc>
|
||||
<tRbox>1</tRbox>
|
||||
<tRtrace>1</tRtrace>
|
||||
<sRSysVw>1</sRSysVw>
|
||||
<tRSysVw>1</tRSysVw>
|
||||
<sRunDeb>0</sRunDeb>
|
||||
<sLrtime>0</sLrtime>
|
||||
<bEvRecOn>1</bEvRecOn>
|
||||
<bSchkAxf>0</bSchkAxf>
|
||||
<bTchkAxf>0</bTchkAxf>
|
||||
<nTsel>4</nTsel>
|
||||
<sDll></sDll>
|
||||
<sDllPa></sDllPa>
|
||||
<sDlgDll></sDlgDll>
|
||||
<sDlgPa></sDlgPa>
|
||||
<sIfile></sIfile>
|
||||
<tDll></tDll>
|
||||
<tDllPa></tDllPa>
|
||||
<tDlgDll></tDlgDll>
|
||||
<tDlgPa></tDlgPa>
|
||||
<tIfile>..\..\..\driver\adc\mdk\Linker\XIPInitialization.ini</tIfile>
|
||||
<pMon>Segger\JL2CM3.dll</pMon>
|
||||
</DebugOpt>
|
||||
<TargetDriverDllRegistry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>JL2CM3</Key>
|
||||
<Name>-U4294967295 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD10000000 -FC1000 -FN1 -FF0XIP_SPI_FLASH_M0 -FS011001000 -FL020000</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>UL2CM3</Key>
|
||||
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
</Tracepoint>
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>0</periodic>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
<aPa>0</aPa>
|
||||
<viewmode>0</viewmode>
|
||||
<vrSel>0</vrSel>
|
||||
<aSym>0</aSym>
|
||||
<aTbox>0</aTbox>
|
||||
<AscS1>0</AscS1>
|
||||
<AscS2>0</AscS2>
|
||||
<AscS3>0</AscS3>
|
||||
<aSer3>0</aSer3>
|
||||
<eProf>0</eProf>
|
||||
<aLa>0</aLa>
|
||||
<aPa1>0</aPa1>
|
||||
<AscS4>0</AscS4>
|
||||
<aSer4>0</aSer4>
|
||||
<StkLoc>0</StkLoc>
|
||||
<TrcWin>0</TrcWin>
|
||||
<newCpu>0</newCpu>
|
||||
<uProt>0</uProt>
|
||||
</DebugFlag>
|
||||
<LintExecutable></LintExecutable>
|
||||
<LintConfigFile></LintConfigFile>
|
||||
<bLintAuto>0</bLintAuto>
|
||||
<bAutoGenD>0</bAutoGenD>
|
||||
<LntExFlags>0</LntExFlags>
|
||||
<pMisraName></pMisraName>
|
||||
<pszMrule></pszMrule>
|
||||
<pSingCmds></pSingCmds>
|
||||
<pMultCmds></pMultCmds>
|
||||
<pMisraNamep></pMisraNamep>
|
||||
<pszMrulep></pszMrulep>
|
||||
<pSingCmdsp></pSingCmdsp>
|
||||
<pMultCmdsp></pMultCmdsp>
|
||||
</TargetOption>
|
||||
</Target>
|
||||
|
||||
<Group>
|
||||
<GroupName>startup</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>1</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\core_cm0.h</PathWithFileName>
|
||||
<FilenameWithoutPath>core_cm0.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>2</FileNumber>
|
||||
<FileType>2</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\startup_xinc.s</PathWithFileName>
|
||||
<FilenameWithoutPath>startup_xinc.s</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>3</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\system_xinc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>system_xinc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>application</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>4</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\app_task.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_task.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>5</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\usr_client.c</PathWithFileName>
|
||||
<FilenameWithoutPath>usr_client.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>6</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\sleep.c</PathWithFileName>
|
||||
<FilenameWithoutPath>sleep.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>7</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\arch_main.c</PathWithFileName>
|
||||
<FilenameWithoutPath>arch_main.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>8</FileNumber>
|
||||
<FileType>3</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\rom_symdefs.o</PathWithFileName>
|
||||
<FilenameWithoutPath>rom_symdefs.o</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>9</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\app_sec.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_sec.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>10</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\usr_server.c</PathWithFileName>
|
||||
<FilenameWithoutPath>usr_server.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>11</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\api\sdk_config.h</PathWithFileName>
|
||||
<FilenameWithoutPath>sdk_config.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>hal</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_adc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_adc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_aotimer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_aotimer.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_bor.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_bor.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_calib.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_calib.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_clock.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_clock.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_fmc_spi.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_fmc_spi_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_gpio.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_gpio.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_i2c.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_i2c.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pga.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_pga.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwm.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_pwm.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwr.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_pwr.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_qdec.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_qdec.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_rtc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_rtc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_spi.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_spi_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_sw_i2c.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_sw_i2c.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_systick.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_systick.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_timer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_timer.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_uart.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_uart_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_wdt.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_wdt.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>ble_api</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\ip\ble\api\xc_gap_api.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_gap_api.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_client_api.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_gatt_client_api.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_server_api.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_gatt_server_api.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>modules_nvds</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\modules\nvds\src\nvds.c</PathWithFileName>
|
||||
<FilenameWithoutPath>nvds.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
</ProjectOpt>
|
||||
@@ -0,0 +1,642 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
|
||||
|
||||
<SchemaVersion>2.1</SchemaVersion>
|
||||
|
||||
<Header>### uVision Project, (C) Keil Software</Header>
|
||||
|
||||
<Targets>
|
||||
<Target>
|
||||
<TargetName>ble-sdk-xip</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pCCUsed>5060750::V5.06 update 6 (build 750)::.\ARMCC</pCCUsed>
|
||||
<uAC6>0</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>ARMCM0</Device>
|
||||
<Vendor>ARM</Vendor>
|
||||
<PackID>ARM.CMSIS.5.7.0</PackID>
|
||||
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
<StartupFile></StartupFile>
|
||||
<FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</FlashDriverDll>
|
||||
<DeviceId>0</DeviceId>
|
||||
<RegisterFile>$$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h</RegisterFile>
|
||||
<MemoryEnv></MemoryEnv>
|
||||
<Cmp></Cmp>
|
||||
<Asm></Asm>
|
||||
<Linker></Linker>
|
||||
<OHString></OHString>
|
||||
<InfinionOptionDll></InfinionOptionDll>
|
||||
<SLE66CMisc></SLE66CMisc>
|
||||
<SLE66AMisc></SLE66AMisc>
|
||||
<SLE66LinkerMisc></SLE66LinkerMisc>
|
||||
<SFDFile>$$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd</SFDFile>
|
||||
<bCustSvd>0</bCustSvd>
|
||||
<UseEnv>0</UseEnv>
|
||||
<BinPath></BinPath>
|
||||
<IncludePath></IncludePath>
|
||||
<LibPath></LibPath>
|
||||
<RegisterFilePath></RegisterFilePath>
|
||||
<DBRegisterFilePath></DBRegisterFilePath>
|
||||
<TargetStatus>
|
||||
<Error>0</Error>
|
||||
<ExitCodeStop>0</ExitCodeStop>
|
||||
<ButtonStop>0</ButtonStop>
|
||||
<NotGenerated>0</NotGenerated>
|
||||
<InvalidFlash>1</InvalidFlash>
|
||||
</TargetStatus>
|
||||
<OutputDirectory>.\Objects\</OutputDirectory>
|
||||
<OutputName>Xinc_ble_sdk</OutputName>
|
||||
<CreateExecutable>1</CreateExecutable>
|
||||
<CreateLib>0</CreateLib>
|
||||
<CreateHexFile>0</CreateHexFile>
|
||||
<DebugInformation>1</DebugInformation>
|
||||
<BrowseInformation>1</BrowseInformation>
|
||||
<ListingPath>.\Listings\</ListingPath>
|
||||
<HexFormatSelection>1</HexFormatSelection>
|
||||
<Merge32K>0</Merge32K>
|
||||
<CreateBatchFile>0</CreateBatchFile>
|
||||
<BeforeCompile>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopU1X>0</nStopU1X>
|
||||
<nStopU2X>0</nStopU2X>
|
||||
</BeforeCompile>
|
||||
<BeforeMake>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopB1X>0</nStopB1X>
|
||||
<nStopB2X>0</nStopB2X>
|
||||
</BeforeMake>
|
||||
<AfterMake>
|
||||
<RunUserProg1>1</RunUserProg1>
|
||||
<RunUserProg2>1</RunUserProg2>
|
||||
<UserProg1Name>fromelf --bin --output=app.bin !L</UserProg1Name>
|
||||
<UserProg2Name>.\output_tool\BAT\ge_ota.bat</UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopA1X>0</nStopA1X>
|
||||
<nStopA2X>0</nStopA2X>
|
||||
</AfterMake>
|
||||
<SelectedForBatchBuild>0</SelectedForBatchBuild>
|
||||
<SVCSIdString></SVCSIdString>
|
||||
</TargetCommonOption>
|
||||
<CommonProperty>
|
||||
<UseCPPCompiler>0</UseCPPCompiler>
|
||||
<RVCTCodeConst>0</RVCTCodeConst>
|
||||
<RVCTZI>0</RVCTZI>
|
||||
<RVCTOtherData>0</RVCTOtherData>
|
||||
<ModuleSelection>0</ModuleSelection>
|
||||
<IncludeInBuild>1</IncludeInBuild>
|
||||
<AlwaysBuild>0</AlwaysBuild>
|
||||
<GenerateAssemblyFile>0</GenerateAssemblyFile>
|
||||
<AssembleAssemblyFile>0</AssembleAssemblyFile>
|
||||
<PublicsOnly>0</PublicsOnly>
|
||||
<StopOnExitCode>3</StopOnExitCode>
|
||||
<CustomArgument></CustomArgument>
|
||||
<IncludeLibraryModules></IncludeLibraryModules>
|
||||
<ComprImg>1</ComprImg>
|
||||
</CommonProperty>
|
||||
<DllOption>
|
||||
<SimDllName>SARMCM3.DLL</SimDllName>
|
||||
<SimDllArguments> </SimDllArguments>
|
||||
<SimDlgDll>DARMCM1.DLL</SimDlgDll>
|
||||
<SimDlgDllArguments>-pCM0</SimDlgDllArguments>
|
||||
<TargetDllName>SARMCM3.DLL</TargetDllName>
|
||||
<TargetDllArguments> </TargetDllArguments>
|
||||
<TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
|
||||
<TargetDlgDllArguments>-pCM0</TargetDlgDllArguments>
|
||||
</DllOption>
|
||||
<DebugOption>
|
||||
<OPTHX>
|
||||
<HexSelection>1</HexSelection>
|
||||
<HexRangeLowAddress>0</HexRangeLowAddress>
|
||||
<HexRangeHighAddress>0</HexRangeHighAddress>
|
||||
<HexOffset>0</HexOffset>
|
||||
<Oh166RecLen>16</Oh166RecLen>
|
||||
</OPTHX>
|
||||
</DebugOption>
|
||||
<Utilities>
|
||||
<Flash1>
|
||||
<UseTargetDll>1</UseTargetDll>
|
||||
<UseExternalTool>0</UseExternalTool>
|
||||
<RunIndependent>0</RunIndependent>
|
||||
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
|
||||
<Capability>1</Capability>
|
||||
<DriverSelection>4096</DriverSelection>
|
||||
</Flash1>
|
||||
<bUseTDR>1</bUseTDR>
|
||||
<Flash2>BIN\UL2CM3.DLL</Flash2>
|
||||
<Flash3>"" ()</Flash3>
|
||||
<Flash4></Flash4>
|
||||
<pFcarmOut></pFcarmOut>
|
||||
<pFcarmGrp></pFcarmGrp>
|
||||
<pFcArmRoot></pFcArmRoot>
|
||||
<FcArmLst>0</FcArmLst>
|
||||
</Utilities>
|
||||
<TargetArmAds>
|
||||
<ArmAdsMisc>
|
||||
<GenerateListings>0</GenerateListings>
|
||||
<asHll>1</asHll>
|
||||
<asAsm>1</asAsm>
|
||||
<asMacX>1</asMacX>
|
||||
<asSyms>1</asSyms>
|
||||
<asFals>1</asFals>
|
||||
<asDbgD>1</asDbgD>
|
||||
<asForm>1</asForm>
|
||||
<ldLst>0</ldLst>
|
||||
<ldmm>1</ldmm>
|
||||
<ldXref>1</ldXref>
|
||||
<BigEnd>0</BigEnd>
|
||||
<AdsALst>1</AdsALst>
|
||||
<AdsACrf>1</AdsACrf>
|
||||
<AdsANop>0</AdsANop>
|
||||
<AdsANot>0</AdsANot>
|
||||
<AdsLLst>1</AdsLLst>
|
||||
<AdsLmap>1</AdsLmap>
|
||||
<AdsLcgr>1</AdsLcgr>
|
||||
<AdsLsym>1</AdsLsym>
|
||||
<AdsLszi>1</AdsLszi>
|
||||
<AdsLtoi>1</AdsLtoi>
|
||||
<AdsLsun>1</AdsLsun>
|
||||
<AdsLven>1</AdsLven>
|
||||
<AdsLsxf>1</AdsLsxf>
|
||||
<RvctClst>0</RvctClst>
|
||||
<GenPPlst>0</GenPPlst>
|
||||
<AdsCpuType>"Cortex-M0"</AdsCpuType>
|
||||
<RvctDeviceName></RvctDeviceName>
|
||||
<mOS>0</mOS>
|
||||
<uocRom>0</uocRom>
|
||||
<uocRam>0</uocRam>
|
||||
<hadIROM>1</hadIROM>
|
||||
<hadIRAM>1</hadIRAM>
|
||||
<hadXRAM>0</hadXRAM>
|
||||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>0</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<hadIRAM2>0</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
<useUlib>0</useUlib>
|
||||
<EndSel>1</EndSel>
|
||||
<uLtcg>0</uLtcg>
|
||||
<nSecure>0</nSecure>
|
||||
<RoSelD>3</RoSelD>
|
||||
<RwSelD>3</RwSelD>
|
||||
<CodeSel>0</CodeSel>
|
||||
<OptFeed>0</OptFeed>
|
||||
<NoZi1>0</NoZi1>
|
||||
<NoZi2>0</NoZi2>
|
||||
<NoZi3>0</NoZi3>
|
||||
<NoZi4>0</NoZi4>
|
||||
<NoZi5>0</NoZi5>
|
||||
<Ro1Chk>0</Ro1Chk>
|
||||
<Ro2Chk>0</Ro2Chk>
|
||||
<Ro3Chk>0</Ro3Chk>
|
||||
<Ir1Chk>0</Ir1Chk>
|
||||
<Ir2Chk>0</Ir2Chk>
|
||||
<Ra1Chk>0</Ra1Chk>
|
||||
<Ra2Chk>0</Ra2Chk>
|
||||
<Ra3Chk>0</Ra3Chk>
|
||||
<Im1Chk>0</Im1Chk>
|
||||
<Im2Chk>0</Im2Chk>
|
||||
<OnChipMemories>
|
||||
<Ocm1>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm1>
|
||||
<Ocm2>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm2>
|
||||
<Ocm3>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm3>
|
||||
<Ocm4>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm4>
|
||||
<Ocm5>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm5>
|
||||
<Ocm6>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm6>
|
||||
<IRAM>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0x20000</Size>
|
||||
</IRAM>
|
||||
<IROM>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x40000</Size>
|
||||
</IROM>
|
||||
<XRAM>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</XRAM>
|
||||
<OCR_RVCT1>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT1>
|
||||
<OCR_RVCT2>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT2>
|
||||
<OCR_RVCT3>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT3>
|
||||
<OCR_RVCT4>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x40000</Size>
|
||||
</OCR_RVCT4>
|
||||
<OCR_RVCT5>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT5>
|
||||
<OCR_RVCT6>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT6>
|
||||
<OCR_RVCT7>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT7>
|
||||
<OCR_RVCT8>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT8>
|
||||
<OCR_RVCT9>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0x20000</Size>
|
||||
</OCR_RVCT9>
|
||||
<OCR_RVCT10>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT10>
|
||||
</OnChipMemories>
|
||||
<RvctStartVector></RvctStartVector>
|
||||
</ArmAdsMisc>
|
||||
<Cads>
|
||||
<interw>1</interw>
|
||||
<Optim>4</Optim>
|
||||
<oTime>0</oTime>
|
||||
<SplitLS>0</SplitLS>
|
||||
<OneElfS>1</OneElfS>
|
||||
<Strict>0</Strict>
|
||||
<EnumInt>0</EnumInt>
|
||||
<PlainCh>0</PlainCh>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<wLevel>2</wLevel>
|
||||
<uThumb>0</uThumb>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<uC99>1</uC99>
|
||||
<uGnu>1</uGnu>
|
||||
<useXO>0</useXO>
|
||||
<v6Lang>3</v6Lang>
|
||||
<v6LangP>3</v6LangP>
|
||||
<vShortEn>1</vShortEn>
|
||||
<vShortWch>1</vShortWch>
|
||||
<v6Lto>0</v6Lto>
|
||||
<v6WtE>0</v6WtE>
|
||||
<v6Rtti>0</v6Rtti>
|
||||
<VariousControls>
|
||||
<MiscControls>--gnu --diag_suppress=66 --feedback fb.txt</MiscControls>
|
||||
<Define>SDK_VERSION="2058f68c" RC_32K=1 XC65XX CFG_BLE CFG_EMB CFG_STATIC USE_XIP=0 HCI_TEST_NO_IP=0 CFG_ACT=8 CFG_CON=6 CFG_RAL=1 CFG_HOST CFG_APP CFG_APP_PRF CFG_RF_EXTRC CFG_AES_RPA CFG_ALLROLES CFG_GATT_CLI USE_XIP=1 DEBUG_ENABLE ROM_ENV_ENABLE=0 CODE_USE_XIP CFG_PRF_BASS USE_ROM_FLASH=1 CFG_SCAN_PERFORMANCE CFG_MIN_STACK CONFIG_BT_WAKEUP_VIA_GPIO=1 CONFIG_HFCLK_IS_OSC32M_PLL_32M=1 SCATTER_LOAD_RAM_EM=1</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..\..\..\..\component\ble\Include;..\app\api;..\..\..\..\..\component\ble\modules\aes\api;..\..\..\..\..\component\ble\modules\aes\src;..\..\..\..\..\component\ble\modules\common\api;..\..\..\..\..\component\ble\modules\common\src;..\..\..\..\..\component\ble\modules\ecc_p256\api;..\..\..\..\..\component\ble\modules\ecc_p256\src;..\..\..\..\..\component\ble\modules\h4tl\api;..\..\..\..\..\component\ble\modules\h4tl\src;..\..\..\..\..\component\ble\modules\ke\api;..\..\..\..\..\component\ble\modules\ke\src;..\..\..\..\..\component\ble\modules\nvds\api;..\..\..\..\..\component\ble\modules\nvds\src;..\..\..\..\..\component\ble\modules\rf\api;..\..\..\..\..\component\ble\modules\rf\src;..\..\..\..\..\component\ble\modules\rwip\api;..\..\..\..\..\component\ble\modules\rwip\src;..\..\..\..\..\component\ble\ip\ahi\api;..\..\..\..\..\component\ble\ip\ahi\src;..\..\..\..\..\component\ble\ip\ble\gaf\api;..\..\..\..\..\component\ble\ip\ble\gaf\inc;..\..\..\..\..\component\ble\ip\ble\gaf\src;..\..\..\..\..\component\ble\ip\ble\gaf\src\acc;..\..\..\..\..\component\ble\ip\ble\gaf\src\al;..\..\..\..\..\component\ble\ip\ble\gaf\src\arc;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\bc;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\capa;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\codec;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\uc;..\..\..\..\..\component\ble\ip\ble\gaf\src\iap;..\..\..\..\..\component\ble\ip\ble\hl\api;..\..\..\..\..\component\ble\ip\ble\hl\inc;..\..\..\..\..\component\ble\ip\ble\hl\src;..\..\..\..\..\component\ble\ip\ble\hl\src\gap;..\..\..\..\..\component\ble\ip\ble\hl\src\gap\gapc;..\..\..\..\..\component\ble\ip\ble\hl\src\gap\gapm;..\..\..\..\..\component\ble\ip\ble\hl\src\gatt;..\..\..\..\..\component\ble\ip\ble\hl\src\inc;..\..\..\..\..\component\ble\ip\ble\hl\src\l2cap;..\..\..\..\..\component\ble\ip\ble\ll\api;..\..\..\..\..\component\ble\ip\ble\ll\src;..\..\..\..\..\component\ble\ip\ble\ll\src\co;..\..\..\..\..\component\ble\ip\ble\ll\src\llc;..\..\..\..\..\component\ble\ip\ble\ll\src\lld;..\..\..\..\..\component\ble\ip\ble\ll\src\lli;..\..\..\..\..\component\ble\ip\ble\ll\src\llm;..\..\..\..\..\component\ble\ip\ble\profiles\bas\bass\api;..\..\..\..\..\component\ble\ip\ble\profiles\bas\bass\src;..\..\..\..\..\component\ble\ip\em\api;..\..\..\..\..\component\ble\ip\em\src;..\..\..\..\..\component\ble\ip\hci\api;..\..\..\..\..\component\ble\ip\hci\src;..\..\..\..\..\component\ble\ip\sch\api;..\..\..\..\..\component\ble\ip\sch\src;..\..\..\..\..\component\ble\plf\refip\src\build\ble-full\reg\fw;..\app\api;..\app\src;..\..\..\..\..\component\ble\plf\refip\src\arch;..\..\..\..\..\component\ble\plf\refip\src\arch\compiler\gnuarm;..\..\..\..\..\component\ble\plf\refip\src\arch\ll\gnuarm;..\..\..\..\..\component\ble\plf\refip\src\driver\reg;..\..\..\..\..\component\ble\plf\refip\src\arch\boot\rvds;..\..\..\..\..\component\ble\plf\refip\src\driver\syscntl;..\..\..\..\..\component\ble\plf\refip\src\driver\emi;..\..\..\..\..\component\ble\plf\refip\src\driver\intc;..\..\..\..\..\component\ble\plf\refip\src\driver\uart;..\..\..\..\..\component\ble\plf\refip\src\driver\flash;..\..\..\..\..\component\ble\plf\refip\src\driver\led;..\..\..\..\..\component\ble\modules\dbg\api;..\..\..\..\..\component\ble\plf\refip\src\driver\uart;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device;..\..\..\..\..\component\xc6xx_drivers\Drivers\Startup;..\..\..\..\..\component\xc6xx_drivers\Drivers\Startup\xc65xx;..\..\..\..\..\component\xc6xx_drivers\Drivers\Periph_HAL_Driver;..\..\..\..\..\component\xc6xx_drivers\Drivers\Periph_HAL_Driver\Bitfields;..\..\..\..\..\component\xc6xx_drivers\Drivers\Periph_HAL_Driver\Ringbuffer;..\..\..\..\..\component\xc6xx_drivers\Drivers\test_case\PWR;..\..\..\..\..\component\xc6xx_drivers\Drivers\test_case\TIMER;..\..\..\..\..\component\ble\ip\ble\api;..\..\..\..\..\component\xc6xx_drivers\Drivers\test_case\TIMER;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS;..\..\..\..\..\component\xc6xx_drivers\Drivers;..\..\..\..\..\component\ble\ip\ble\ll_rom_port;..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device\xc_m0_register;..\..\..\..\..\component\ble\modules\flash</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
<interw>1</interw>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<thumb>0</thumb>
|
||||
<SplitLS>0</SplitLS>
|
||||
<SwStkChk>0</SwStkChk>
|
||||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<ClangAsOpt>1</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath></IncludePath>
|
||||
</VariousControls>
|
||||
</Aads>
|
||||
<LDads>
|
||||
<umfTarg>0</umfTarg>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<noStLib>0</noStLib>
|
||||
<RepFail>1</RepFail>
|
||||
<useFile>0</useFile>
|
||||
<TextAddressRange>0x00000000</TextAddressRange>
|
||||
<DataAddressRange>0x20000000</DataAddressRange>
|
||||
<pXoBase></pXoBase>
|
||||
<ScatterFile>.\Linker\cpu_xip.scat</ScatterFile>
|
||||
<IncludeLibs></IncludeLibs>
|
||||
<IncludeLibsPath></IncludeLibsPath>
|
||||
<Misc>--feedback fb.txt --info=stack --callgraph</Misc>
|
||||
<LinkerInputFile></LinkerInputFile>
|
||||
<DisabledWarnings></DisabledWarnings>
|
||||
</LDads>
|
||||
</TargetArmAds>
|
||||
</TargetOption>
|
||||
<Groups>
|
||||
<Group>
|
||||
<GroupName>startup</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>core_cm0.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\core_cm0.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>startup_xinc.s</FileName>
|
||||
<FileType>2</FileType>
|
||||
<FilePath>..\app\src\startup_xinc.s</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>system_xinc.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\system_xinc.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>application</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>app_task.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\app_task.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>usr_client.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\usr_client.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>sleep.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\sleep.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>arch_main.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\arch_main.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>rom_symdefs.o</FileName>
|
||||
<FileType>3</FileType>
|
||||
<FilePath>..\app\src\rom_symdefs.o</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_sec.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\app_sec.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>usr_server.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\usr_server.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>sdk_config.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\app\api\sdk_config.h</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>hal</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>xc_drv_adc.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_adc.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_aotimer.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_aotimer.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_bor.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_bor.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_calib.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_calib.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_clock.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_clock.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_fmc_spi.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_fmc_spi_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_gpio.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_gpio.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_i2c.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_i2c.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_pga.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pga.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_pwm.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwm.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_pwr.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwr.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_qdec.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_qdec.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_rtc.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_rtc.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_spi.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_spi_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_sw_i2c.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_sw_i2c.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_systick.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_systick.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_timer.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_timer.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_uart.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_uart_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_wdt.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_wdt.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>ble_api</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>xc_gap_api.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\ip\ble\api\xc_gap_api.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_gatt_client_api.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_client_api.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_gatt_server_api.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_server_api.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>modules_nvds</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>nvds.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\modules\nvds\src\nvds.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
</Groups>
|
||||
</Target>
|
||||
</Targets>
|
||||
|
||||
<RTE>
|
||||
<apis/>
|
||||
<components/>
|
||||
<files>
|
||||
<file attr="config" category="linkerScript" condition="ARMCC5" name="Device\ARM\ARMCM0\Source\ARM\ARMCM0_ac5.sct" version="1.0.0">
|
||||
<instance index="0" removed="1">RTE\Device\ARMCM0\ARMCM0_ac5.sct</instance>
|
||||
<component Cclass="Device" Cgroup="Startup" Cvariant="C Startup" Cvendor="ARM" Cversion="2.0.3" condition="ARMCM0 CMSIS" isDefaultVariant="1"/>
|
||||
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.8.0"/>
|
||||
<targetInfos/>
|
||||
</file>
|
||||
<file attr="config" category="sourceC" name="Device\ARM\ARMCM0\Source\startup_ARMCM0.c" version="2.0.3">
|
||||
<instance index="0" removed="1">RTE\Device\ARMCM0\startup_ARMCM0.c</instance>
|
||||
<component Cclass="Device" Cgroup="Startup" Cvariant="C Startup" Cvendor="ARM" Cversion="2.0.3" condition="ARMCM0 CMSIS" isDefaultVariant="1"/>
|
||||
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.8.0"/>
|
||||
<targetInfos/>
|
||||
</file>
|
||||
<file attr="config" category="sourceC" name="Device\ARM\ARMCM0\Source\system_ARMCM0.c" version="1.0.0">
|
||||
<instance index="0" removed="1">RTE\Device\ARMCM0\system_ARMCM0.c</instance>
|
||||
<component Cclass="Device" Cgroup="Startup" Cvariant="C Startup" Cvendor="ARM" Cversion="2.0.3" condition="ARMCM0 CMSIS" isDefaultVariant="1"/>
|
||||
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.8.0"/>
|
||||
<targetInfos/>
|
||||
</file>
|
||||
</files>
|
||||
</RTE>
|
||||
|
||||
<LayerInfo>
|
||||
<Layers>
|
||||
<Layer>
|
||||
<LayName><Project Info></LayName>
|
||||
<LayDesc></LayDesc>
|
||||
<LayUrl></LayUrl>
|
||||
<LayKeys></LayKeys>
|
||||
<LayCat></LayCat>
|
||||
<LayLic></LayLic>
|
||||
<LayTarg>0</LayTarg>
|
||||
<LayPrjMark>1</LayPrjMark>
|
||||
</Layer>
|
||||
</Layers>
|
||||
</LayerInfo>
|
||||
|
||||
</Project>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,73 @@
|
||||
@echo off
|
||||
mkdir output_bin
|
||||
set Download_bin=.\output_bin\ble_Central.bin
|
||||
set Ota_use_bin=.\output_bin\ota_data_single.bin
|
||||
set AES_OUTPUT_BIN= .\output_bin\ota_data_aes.bin
|
||||
|
||||
set Host_bin=.\output_tool\stack.bin
|
||||
set Host_addr=0x11002000
|
||||
|
||||
set App_bin=app.bin
|
||||
set App_loading_addr=0x11016000
|
||||
set App_save_addr=0x16000
|
||||
|
||||
|
||||
set Ota_app_bin=app.bin
|
||||
set ota_Loading_Save_addr=0x11016000
|
||||
|
||||
set soft_ver=0x10
|
||||
set hard_ver=0x20
|
||||
|
||||
set Is_xip_mode=1
|
||||
REM If If_add_app is set to 1, then Download_bin = Host_bin + Ota_app_bin + App_bin; else Download_bin = Host_bin + Ota_app_bin.
|
||||
set Is_add_app=1
|
||||
set Is_add_app2=0
|
||||
REM Set boot2 start app,Only 1 can set 1.
|
||||
set RUN1=0
|
||||
set RUN2=1
|
||||
set RUN3=0
|
||||
|
||||
REM AES Config
|
||||
set AES_START=1
|
||||
set KEY=0b0c0d0405060708090a0b0c0d0e0f10
|
||||
set MODE=ECB
|
||||
set PADDING=NONE
|
||||
set BLOCK_SIZE=128Bits
|
||||
@REM A area
|
||||
.\output_tool\BAT\ge.exe %App_bin% ^
|
||||
%soft_ver% %hard_ver% ^
|
||||
%App_save_addr% %App_loading_addr% ^
|
||||
%Ota_app_bin% %ota_Loading_Save_addr% ^
|
||||
%Is_xip_mode% ^
|
||||
%Ota_use_bin%
|
||||
|
||||
.\output_tool\aes.exe ^
|
||||
%AES_START% %Ota_use_bin% %AES_OUTPUT_BIN% ^
|
||||
%KEY% %MODE% %PADDING% %BLOCK_SIZE%
|
||||
|
||||
copy %Download_bin% .\
|
||||
|
||||
@REM B area
|
||||
set App_save_addr=0x1e000
|
||||
set Ota_use_bin=.\output_bin\ota_data_double.bin
|
||||
.\output_tool\BAT\ge.exe %App_bin% ^
|
||||
%soft_ver% %hard_ver% ^
|
||||
%App_save_addr% %App_loading_addr% ^
|
||||
%Ota_app_bin% %ota_Loading_Save_addr% ^
|
||||
%Is_xip_mode% ^
|
||||
%Ota_use_bin%
|
||||
|
||||
.\output_tool\BAT\xinchip_bootloader2_tool.exe .\output_tool\boot2 ^
|
||||
%Host_bin% %Host_addr% %RUN1% ^
|
||||
%App_bin% %App_loading_addr% %RUN2% ^
|
||||
%Ota_app_bin% %ota_Loading_Save_addr% %RUN3% ^
|
||||
%Download_bin% %Is_add_app% %Is_add_app2%
|
||||
|
||||
.\output_tool\aes.exe ^
|
||||
%AES_START% %Ota_use_bin% %AES_OUTPUT_BIN% ^
|
||||
%KEY% %MODE% %PADDING% %BLOCK_SIZE%
|
||||
|
||||
copy %Download_bin% .\
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,440 @@
|
||||
#!/usr/bin/env python
|
||||
#-*- coding:UTF-8 -*-
|
||||
import socket
|
||||
from select import select
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
import json
|
||||
import struct
|
||||
import binascii
|
||||
import time
|
||||
import re
|
||||
import fileinput
|
||||
import io
|
||||
import logging
|
||||
|
||||
replace = {
|
||||
"co_default_bdaddr":"0x0",
|
||||
"ke_msg_alloc":"0x0",
|
||||
"ke_msg_send":"0x0",
|
||||
"ke_msg_send_basic":"0x0",
|
||||
"ke_state_set":"0x0",
|
||||
"ke_task_create":"0x0",
|
||||
"ke_state_get":"0x0",
|
||||
"ke_msg_discard":"0x0",
|
||||
"ke_msg_forward":"0x0",
|
||||
"ke_msg_in_queue":"0x0",
|
||||
"ke_msg_src_id_get":"0x0",
|
||||
"ke_free":"0x0",
|
||||
"ke_msg_free":"0x0",
|
||||
"ke_check_malloc":"0x0",
|
||||
"rwip_init":"0x0",
|
||||
"rwip_schedule":"0x0",
|
||||
"rwip_rf":"0x0",
|
||||
"BLE_Handler":"0x0",
|
||||
"co_buf_alloc":"0x0",
|
||||
"co_buf_copy_data_from_mem":"0x0",
|
||||
"co_buf_release":"0x0",
|
||||
"co_djob_prepare":"0x0",
|
||||
"co_djob_reg":"0x0",
|
||||
"co_djob_unreg":"0x0",
|
||||
"co_list_extract":"0x0",
|
||||
"co_list_extract_after":"0x0",
|
||||
"co_list_pop_front":"0x0",
|
||||
"co_list_push_back":"0x0",
|
||||
"co_list_push_front":"0x0",
|
||||
"co_time_get":"0x0",
|
||||
"co_time_timer_init":"0x0",
|
||||
"co_time_timer_set":"0x0",
|
||||
"co_time_timer_stop":"0x0",
|
||||
"aes_c1":"0x0",
|
||||
"aes_decrypt":"0x0",
|
||||
"aes_encrypt":"0x0",
|
||||
"aes_f4":"0x0",
|
||||
"aes_f5":"0x0",
|
||||
"aes_f6":"0x0",
|
||||
"aes_g2":"0x0",
|
||||
"aes_rand":"0x0",
|
||||
"aes_cmac":"0x0",
|
||||
"co_buf_head_release":"0x0",
|
||||
"co_buf_head_reserve":"0x0",
|
||||
"co_util_pack":"0x0",
|
||||
"co_util_unpack":"0x0",
|
||||
"rwip_reset":"0x0",
|
||||
"aes_rpa_resolve":"0x0",
|
||||
"co_buf_reuse":"0x0",
|
||||
"co_buf_size":"0x0",
|
||||
"co_buf_copy":"0x0",
|
||||
"co_buf_duplicate":"0x0",
|
||||
"co_buf_tail_release":"0x0",
|
||||
"co_list_init":"0x0",
|
||||
"ble_util_buf_rx_free":"0x0",
|
||||
"ble_util_buf_acl_tx_alloc":"0x0",
|
||||
"co_buf_cb_free_set":"0x0",
|
||||
"ke_malloc":"0x0",
|
||||
"co_list_insert_after":"0x0",
|
||||
"ke_timer_active":"0x0",
|
||||
"ke_timer_clear":"0x0",
|
||||
"ke_timer_set":"0x0",
|
||||
"co_buf_acquire":"0x0",
|
||||
"co_buf_tail_reserve":"0x0",
|
||||
"co_buf_copy_data_to_mem":"0x0",
|
||||
"co_list_insert_before":"0x0",
|
||||
"rom_env":"0x0",
|
||||
"rwip_param":"0x0",
|
||||
"one_bits":"0x0",
|
||||
"hci_rd_rem_ver_info_cmd_handler":"0x0",
|
||||
"hci_le_con_upd_cmd_handler":"0x0",
|
||||
"hci_le_rd_chnl_map_cmd_handler":"0x0",
|
||||
"hci_le_rd_rem_feats_cmd_handler":"0x0",
|
||||
"hci_le_en_enc_cmd_handler":"0x0",
|
||||
"hci_le_ltk_req_reply_cmd_handler":"0x0",
|
||||
"hci_le_ltk_req_neg_reply_cmd_handler":"0x0",
|
||||
"hci_le_rem_con_param_req_reply_cmd_handler":"0x0",
|
||||
"hci_le_rem_con_param_req_neg_reply_cmd_handler":"0x0",
|
||||
"hci_le_set_data_len_cmd_handler":"0x0",
|
||||
"hci_vs_set_pref_slave_latency_cmd_handler":"0x0",
|
||||
"hci_vs_set_pref_slave_evt_dur_cmd_handler":"0x0",
|
||||
"hci_vs_set_max_rx_size_and_time_cmd_handler":"0x0",
|
||||
"hci_rd_rssi_cmd_handler":"0x0",
|
||||
"llm_ch_map_update_ind_handler":"0x0",
|
||||
"llc_loc_llcp_rsp_to_handler":"0x0",
|
||||
"llc_rem_llcp_rsp_to_handler":"0x0",
|
||||
"llc_encrypt_ind_handler":"0x0",
|
||||
"llc_op_ver_exch_ind_handler":"0x0",
|
||||
"llc_op_feats_exch_ind_handler":"0x0",
|
||||
"llc_op_encrypt_ind_handler":"0x0",
|
||||
"llc_op_dl_upd_ind_handler":"0x0",
|
||||
"llc_op_con_upd_ind_handler":"0x0",
|
||||
"llc_op_ch_map_upd_ind_handler":"0x0",
|
||||
"lld_llcp_rx_ind_handler":"0x0",
|
||||
"lld_llcp_tx_cfm_handler":"0x0",
|
||||
"lld_acl_rx_ind_handler":"0x0",
|
||||
"lld_acl_tx_cfm_handler":"0x0",
|
||||
"lld_con_param_upd_cfm_handler":"0x0",
|
||||
"lld_ch_map_upd_cfm_handler":"0x0",
|
||||
"lld_con_offset_upd_ind_handler":"0x0",
|
||||
"hci_command_llc_handler":"0x0",
|
||||
"hci_acl_data_handler":"0x0",
|
||||
"ke_event_callback_set":"0x0",
|
||||
"ke_event_clear":"0x0",
|
||||
"ke_event_set":"0x0",
|
||||
"ble_util_nb_good_channels":"0x0",
|
||||
"ble_util_pkt_dur_in_us":"0x0",
|
||||
"co_bdaddr_compare":"0x0",
|
||||
"lld_ch_assess_data_get":"0x0",
|
||||
"lld_ch_map_set":"0x0",
|
||||
"lld_read_clock":"0x0",
|
||||
"lld_res_list_peer_update":"0x0",
|
||||
"lld_white_list_add":"0x0",
|
||||
"rwip_prevent_sleep_clear":"0x0",
|
||||
"rwip_prevent_sleep_set":"0x0",
|
||||
"sch_plan_rem":"0x0",
|
||||
"aes_rpa_gen":"0x0",
|
||||
"ble_util_buf_adv_tx_alloc":"0x0",
|
||||
"ble_util_buf_adv_tx_free":"0x0",
|
||||
"co_null_bdaddr":"0x0",
|
||||
"co_null_key":"0x0",
|
||||
"llc_con_move_cbk":"0x0",
|
||||
"llc_start":"0x0",
|
||||
"lld_adv_adv_data_update":"0x0",
|
||||
"lld_adv_rand_addr_update":"0x0",
|
||||
"lld_adv_restart":"0x0",
|
||||
"lld_adv_scan_rsp_data_update":"0x0",
|
||||
"lld_adv_start":"0x0",
|
||||
"lld_adv_stop":"0x0",
|
||||
"lld_white_list_rem":"0x0",
|
||||
"lld_init_rand_addr_update":"0x0",
|
||||
"lld_res_list_add":"0x0",
|
||||
"lld_res_list_clear":"0x0",
|
||||
"lld_res_list_local_rpa_get":"0x0",
|
||||
"lld_res_list_peer_rpa_get":"0x0",
|
||||
"lld_res_list_priv_mode_update":"0x0",
|
||||
"lld_res_list_rem":"0x0",
|
||||
"lld_scan_rand_addr_update":"0x0",
|
||||
"lld_init_start":"0x0",
|
||||
"lld_init_stop":"0x0",
|
||||
"sch_plan_req":"0x0",
|
||||
"sch_plan_set":"0x0",
|
||||
"co_rate_to_phy":"0x0",
|
||||
"lld_scan_params_update":"0x0",
|
||||
"lld_scan_start":"0x0",
|
||||
"lld_scan_stop":"0x0",
|
||||
"lld_rpa_renew":"0x0",
|
||||
"ke_mem_init":"0x0",
|
||||
"co_buf_init":"0x0",
|
||||
"rwip_sleep":"0x0",
|
||||
"em_ble_base_address_table_0":"0x0",
|
||||
"em_ble_base_address_table_1":"0x0",
|
||||
"em_ble_base_address_table_2":"0x0",
|
||||
"em_ble_base_address_table_3":"0x0",
|
||||
"em_ble_base_address_table_4":"0x0",
|
||||
"em_ble_base_address_table_5":"0x0",
|
||||
"em_ble_base_address_table_6":"0x0",
|
||||
"em_ble_base_address_table_7":"0x0",
|
||||
"em_ble_base_address_table_8":"0x0",
|
||||
"em_ble_base_address_table_9":"0x0",
|
||||
"em_ble_base_address_table_10":"0x0",
|
||||
"ble_util_buf_init_env":"0x0",
|
||||
"PATCH_FUN":"0x0",
|
||||
"lld_adv_env":"0x0",
|
||||
"sch_arb_remove":"0x0",
|
||||
"sch_slice_fg_remove":"0x0",
|
||||
"llc_env":"0x0",
|
||||
"llc_proc_err_ind":"0x0",
|
||||
"llc_stop":"0x0",
|
||||
"ll_channel_map_ind_handler":"0x0",
|
||||
"ll_connection_param_req_handler":"0x0",
|
||||
"ll_connection_param_rsp_handler":"0x0",
|
||||
"ll_connection_update_ind_handler":"0x0",
|
||||
"ll_enc_req_handler":"0x0",
|
||||
"ll_enc_rsp_handler":"0x0",
|
||||
"ll_feature_req_handler":"0x0",
|
||||
"ll_feature_rsp_handler":"0x0",
|
||||
"ll_length_req_handler":"0x0",
|
||||
"ll_length_rsp_handler":"0x0",
|
||||
"ll_min_used_channels_ind_handler":"0x0",
|
||||
"ll_pause_enc_req_handler":"0x0",
|
||||
"ll_pause_enc_rsp_handler":"0x0",
|
||||
"ll_reject_ext_ind_handler":"0x0",
|
||||
"ll_reject_ind_handler":"0x0",
|
||||
"ll_slave_feature_req_handler":"0x0",
|
||||
"ll_start_enc_req_handler":"0x0",
|
||||
"ll_start_enc_rsp_handler":"0x0",
|
||||
"ll_unknown_rsp_handler":"0x0",
|
||||
"ll_version_ind_handler":"0x0",
|
||||
"ble_util_buf_acl_tx_free":"0x0",
|
||||
"lld_rxdesc_check":"0x0",
|
||||
"lld_rxdesc_free":"0x0",
|
||||
"rwip_priority":"0x0",
|
||||
"sch_arb_insert":"0x0",
|
||||
"sch_prog_push":"0x0",
|
||||
"FMC_SPI_Flash_RDID":"0x0",
|
||||
"FMC_SPI_Flash_RUID":"0x0",
|
||||
"FMC_SPI_Flash_WakeUp":"0x0",
|
||||
"FMC_SPI_Init_Oprt":"0x0",
|
||||
"FMC_SPI_Flash_PowerDown":"0x0",
|
||||
"FMC_SPI_FlashRead":"0x0",
|
||||
"FMC_SPI_FlashWrite":"0x0",
|
||||
"FMC_SPI_Flash_Erase_Sector":"0x0",
|
||||
"FMC_SPI_Flash_PowerDown":"0x0",
|
||||
"FMC_SPI_Flash_WakeUp":"0x0",
|
||||
"llc_cleanup":"0x0",
|
||||
"llc_cmd_stat_send":"0x0",
|
||||
"llc_llcp_send":"0x0",
|
||||
"llc_llcp_state_set":"0x0",
|
||||
"llc_proc_get":"0x0",
|
||||
"llc_proc_id_get":"0x0",
|
||||
"llc_proc_init":"0x0",
|
||||
"llc_proc_reg":"0x0",
|
||||
"llc_proc_state_get":"0x0",
|
||||
"llc_proc_state_set":"0x0",
|
||||
"llc_proc_timer_pause_set":"0x0",
|
||||
"llc_proc_timer_set":"0x0",
|
||||
"llc_proc_unreg":"0x0",
|
||||
"lld_con_stop":"0x0",
|
||||
"lld_adv_evt_start_cbk":"0x0",
|
||||
"rwip_env":"0x0",
|
||||
"rwip_prog_delay":"0x0",
|
||||
"rwip_time_get":"0x0",
|
||||
"rwip_wakeup_end":"0x0",
|
||||
"sch_arb_env":"0x0",
|
||||
"lld_adv_frm_cbk":"0x0",
|
||||
"rwip_timer_alarm_handler":"0x0",
|
||||
"rwip_timer_arb_handler":"0x0",
|
||||
"rwip_timer_co_handler":"0x0",
|
||||
"lld_env":"0x0",
|
||||
"aa_gen":"0x0",
|
||||
"lld_adv_init":"0x0",
|
||||
"lld_con_init":"0x0",
|
||||
"lld_core_init":"0x0",
|
||||
"lld_rpa_renew_env":"0x0",
|
||||
"lld_channel_assess":"0x0",
|
||||
"lld_con_env":"0x0",
|
||||
"lld_con_tx_len_update":"0x0",
|
||||
"lld_exp_sync_pos_tab":"0x0",
|
||||
"lld_instant_proc_end":"0x0",
|
||||
"prf_dst_task_get":"0x0",
|
||||
"rom_env_init":"0x0",
|
||||
"gapc_get_bdaddr":"0x0",
|
||||
"gatt_db_svc16_add":"0x0",
|
||||
"gatt_db_svc_add":"0x0",
|
||||
"gatt_db_svc_remove":"0x0",
|
||||
"gatt_srv_att_read_get_cfm":"0x0",
|
||||
"gatt_srv_att_val_set_cfm":"0x0",
|
||||
"gatt_srv_event_send":"0x0",
|
||||
"gatt_user_srv_register":"0x0",
|
||||
"llc_msg_handler_tab":"0x0",
|
||||
"rom_llc_state":"0x0",
|
||||
"lld_con_evt_start_cbk":"0x0",
|
||||
"lld_con_evt_canceled_cbk":"0x0",
|
||||
"co_sca2ppm":"0x0",
|
||||
"lld_con_evt_time_update":"0x0",
|
||||
"lld_con_max_lat_calc":"0x0",
|
||||
"lld_con_sched":"0x0",
|
||||
"sch_slice_per_add":"0x0",
|
||||
"rwble_isr":"0x0",
|
||||
"rwip_isr":"0x0",
|
||||
"lld_con_frm_isr":"0x0",
|
||||
"ke_task_schedule":"0x0",
|
||||
"lld_adv_frm_isr":"0x0",
|
||||
"sv_lock":"0x0",
|
||||
"sv_txlen":"0x0",
|
||||
"rom_lld_con_rx":"0x0",
|
||||
"rom_lld_con_evt_start_cbk":"0x0",
|
||||
"rom_lld_con_frm_isr":"0x0",
|
||||
"gatt_cli_mtu_exch":"0x0",
|
||||
"rom_lld_disable_latency":"0x0",
|
||||
"rom_lld_enable_latency":"0x0",
|
||||
"evt_start":"0x0",
|
||||
"gatt_cli_discover_svc":"0x0",
|
||||
"gatt_uuid16_comp":"0x0",
|
||||
"gatt_cli_att_event_cfm":"0x0",
|
||||
"gatt_cli_discover_cancel":"0x0",
|
||||
"gatt_cli_discover_char":"0x0",
|
||||
"gatt_cli_discover_desc":"0x0",
|
||||
"gatt_cli_event_register":"0x0",
|
||||
"gatt_cli_read":"0x0",
|
||||
"gatt_cli_read_by_uuid":"0x0",
|
||||
"gatt_cli_write":"0x0",
|
||||
"gatt_user_cli_register":"0x0",
|
||||
"gatt_cli_discover_inc_svc":"0x0",
|
||||
"gatt_cli_event_unregister":"0x0",
|
||||
"co_rand_word":"0x0",
|
||||
"co_random_init":"0x0",
|
||||
"adv_evt_start":"0x0",
|
||||
"gatt_srv_read_api_tbl":"0x0",
|
||||
"gatt_srv_write_api_tbl":"0x0",
|
||||
"modem_init":"0x0",
|
||||
"rf_init":"0x0",
|
||||
"xc_ble_set_dev_info_cfm":"0x0",
|
||||
"xc_ble_get_dev_info_cfm":"0x0",
|
||||
"xc_ble_gatt_cli_mtu_exch":"0x0",
|
||||
"xc_ble_update_param":"0x0",
|
||||
"xc_ble_gatt_user_srv_register":"0x0",
|
||||
"xc_ble_gatt_srv_write_cfm":"0x0",
|
||||
"xc_ble_gatt_srv_read_cfm":"0x0",
|
||||
"xc_ble_gatt_srv_notify":"0x0",
|
||||
"xc_ble_gatt_service16_add":"0x0",
|
||||
"xc_ble_param_update_cfm":"0x0",
|
||||
"xc_ble_set_dev_config":"0x0",
|
||||
"xc_ble_gapm_reset":"0x0",
|
||||
"xc_ble_conn_cfm":"0x0",
|
||||
"xc_ble_advertise_start":"0x0",
|
||||
"xc_ble_set_adv_data":"0x0",
|
||||
"xc_ble_advertise_create":"0x0",
|
||||
"rom_xc_fmc_spi_flash_erase_page":"0x0",
|
||||
"rom_xc_fmc_spi_flash_read_page":"0x0",
|
||||
"rom_xc_fmc_spi_flash_write_page":"0x0",
|
||||
"rf_xtal_cal_set":"0x0",
|
||||
"rf_tx_power_set":"0x0",
|
||||
}
|
||||
|
||||
def traverse(f):
|
||||
fs = os.listdir(f)
|
||||
for f1 in fs:
|
||||
tmp_path = os.path.join(f, f1)
|
||||
if not os.path.isdir(tmp_path):
|
||||
if os.path.isfile(tmp_path):
|
||||
if isinstance(tmp_path, str):
|
||||
# if tmp_path.endswith('2023_11_22.o'):
|
||||
if tmp_path.endswith('addr_0x800.o'):
|
||||
#print("ssss", tmp_path)
|
||||
logger.info(tmp_path)
|
||||
find_str(tmp_path)
|
||||
else:
|
||||
traverse(tmp_path)
|
||||
|
||||
def traverse_host(f):
|
||||
fs = os.listdir(f)
|
||||
for f1 in fs:
|
||||
tmp_path = os.path.join(f, f1)
|
||||
if not os.path.isdir(tmp_path):
|
||||
if os.path.isfile(tmp_path):
|
||||
if isinstance(tmp_path, str):
|
||||
if tmp_path.endswith('rom_symdefs.o'):
|
||||
#print("ssss", tmp_path)
|
||||
logger.info(tmp_path)
|
||||
find_str(tmp_path)
|
||||
else:
|
||||
traverse_host(tmp_path)
|
||||
|
||||
def traverse_for_replace(f):
|
||||
fs = os.listdir(f)
|
||||
for f1 in fs:
|
||||
tmp_path = os.path.join(f, f1)
|
||||
if not os.path.isdir(tmp_path):
|
||||
if os.path.isfile(tmp_path):
|
||||
if isinstance(tmp_path, str):
|
||||
if tmp_path.endswith('rom_symdefs.o'):
|
||||
|
||||
logger.info(tmp_path)
|
||||
replace_str(tmp_path)
|
||||
|
||||
|
||||
def find_str(file):
|
||||
text_lines = set()
|
||||
with io.open(file, 'r', encoding='utf-8') as fd:
|
||||
for line in fd:
|
||||
for key, value in replace.items():
|
||||
if re.search(key, line.strip()) != None and len(key)+13== len(line.strip()):
|
||||
#print(line)
|
||||
logger.info(line)
|
||||
replace[key] = line
|
||||
text_lines.add(line.strip())
|
||||
text_functions = {line.split()[-1] for line in text_lines}
|
||||
replace_keys = set(replace.keys())
|
||||
print("del record key start")
|
||||
for func in list(replace.keys()):
|
||||
if func not in text_functions:
|
||||
print(func)
|
||||
del replace[func]
|
||||
print("del record key end")
|
||||
fd.close()
|
||||
logger.info(str(replace))
|
||||
|
||||
def replace_str(file):
|
||||
header = "#<SYMDEFS># ARM Linker, 5060750: Last Updated: Tue Sep 05 15:30:26 2023\n"
|
||||
with io.open(r'tmp.c', 'w', encoding='utf-8') as fw:
|
||||
fw.write(header)
|
||||
for key, value in replace.items():
|
||||
#print(len(key)+13, len(line.strip()), key, line.strip())
|
||||
replace_flag = False
|
||||
fw.write(value)
|
||||
logger.info(value)
|
||||
#print("line2", value, key)
|
||||
# print("line2", value)
|
||||
fw.close()
|
||||
|
||||
with io.open(file, 'w', encoding='utf-8') as fw:
|
||||
with io.open(r'tmp.c', 'r', encoding='utf-8') as file:
|
||||
for line in file:
|
||||
fw.write(line)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if(os.path.exists("log.txt")):
|
||||
os.remove("log.txt")
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(level = logging.INFO)
|
||||
handler = logging.FileHandler("log.txt")
|
||||
handler.setLevel(logging.INFO)
|
||||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
handler.setFormatter(formatter)
|
||||
logger.addHandler(handler)
|
||||
|
||||
#traverse("./Project/example/ble/rom_stack/mdk/")
|
||||
traverse_host("./Project/example/ble/ble_peripheral_lib/mdk/")
|
||||
#print(replace)
|
||||
traverse_for_replace("./Project/example/ble/ble_central/app/src")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,348 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_task.h
|
||||
*
|
||||
* @brief Header file - APPTASK.
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef APP_TASK_H_
|
||||
#define APP_TASK_H_
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APPTASK Task
|
||||
* @ingroup APP
|
||||
* @brief Routes ALL messages to/from APP block.
|
||||
*
|
||||
* The APPTASK is the block responsible for bridging the final application with
|
||||
*the RWBLE software host stack. It communicates with the different modules of
|
||||
*the BLE host, i.e. @ref SMP, @ref GAP and @ref GATT.
|
||||
*
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "app_sec.h"
|
||||
#include "co_bt_defines.h"
|
||||
#include "dbg.h"
|
||||
#include "gapm_int.h"
|
||||
#include "gatt_msg_int.h" // GATTC Definitions
|
||||
#include "ke_task.h" // Kernel Task
|
||||
#include "rwip_task.h" // Task definitions
|
||||
#include "usr_client.h"
|
||||
#include "xc_gap_api.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h> // Standard Integer Definition
|
||||
#include <stdio.h>
|
||||
|
||||
#define BOND_TEST 0
|
||||
#define MULTI_ROLE_TEST 1
|
||||
#define WHITE_LIST_TEST 0
|
||||
|
||||
#define CONNECT_DEV_NUM 5
|
||||
extern struct app_env_tag app_env;
|
||||
#if (NVDS_SUPPORT)
|
||||
#include "nvds.h"
|
||||
#endif // (NVDS_SUPPORT)
|
||||
|
||||
#define APP_HANDLERS(subtask) \
|
||||
{ \
|
||||
&subtask##_msg_handler_list[0], ARRAY_LEN(subtask##_msg_handler_list) \
|
||||
}
|
||||
|
||||
#define APP_DEVICE_NAME_MAX_LEN (18)
|
||||
#if !(defined(CONFIG_XINCHIP) && CONFIG_XINCHIP)
|
||||
#define APP_DFLT_DEVICE_NAME ("XinChipTest")
|
||||
#define APP_DFLT_DEVICE_NAME_LEN (sizeof(APP_DFLT_DEVICE_NAME))//must not be greater than APP_DEVICE_NAME_MAX_LEN
|
||||
#else
|
||||
#define APP_DFLT_DEVICE_NAME ((char *)g_config_file.ble_name)
|
||||
#define APP_DFLT_DEVICE_NAME_LEN (strlen((char *)g_config_file.ble_name))
|
||||
#endif
|
||||
/// Maximal length of the Device Name value
|
||||
#define APP_DEVICE_NAME_MAX_LEN (18)
|
||||
#define APP_MAX_TX_POWER (0)
|
||||
// Advertising channel map - 37, 38, 39
|
||||
#define APP_ADV_CHMAP (0x07)
|
||||
// Advertising minimum interval - 40ms (64*0.625ms)
|
||||
#define APP_ADV_INT_MIN (64)
|
||||
// Advertising maximum interval - 40ms (64*0.625ms)
|
||||
#define APP_ADV_INT_MAX (64)
|
||||
|
||||
#define ADV_DATA_MAX_LENGTH 28
|
||||
|
||||
#define MANUFACTURER_DATA "\x09\xFF\x00\x60\x52\x57\x2D\x42\x4C\x45"
|
||||
#define MANUFACTURER_DATA_LEN 10
|
||||
/// Advertising duration (in unit of 10ms). 0 means that advertising continues
|
||||
/// until the host disable it
|
||||
#define ADV_DURATION 0
|
||||
|
||||
#define APP_SCAN_INTERVAL (0xa0)
|
||||
#define APP_SCAN_WINDOW (0x50)
|
||||
|
||||
#define APP_CONN_EST_TIME_OUT (0)
|
||||
#define APP_CONN_SCNA_INTV (32)
|
||||
#define APP_CONN_SCAN_WD (20)
|
||||
#define APP_CONN_INTV_MIN (80)
|
||||
#define APP_CONN_INV_MAX (80)
|
||||
#define APP_CONN_LATENCY (0)
|
||||
#define APP_CONN_TIME_OUT (500)
|
||||
|
||||
/// Number of APP Task Instances
|
||||
#define APP_IDX_MAX 1
|
||||
#define DEV_APPEARANCE 0
|
||||
|
||||
#define BLE_UAPDATA_MIN_INTVALUE 8
|
||||
#define BLE_UAPDATA_MAX_INTVALUE 10
|
||||
#define BLE_UAPDATA_LATENCY 0
|
||||
#define BLE_UAPDATA_TIMEOUT 200
|
||||
|
||||
#define INVALID_DATA 0xFF
|
||||
// #define TAGET_DEVICE_ADDR ("\x02\x6e\x00\x05\x21\x41")
|
||||
#define TAGET_DEVICE_ADDR ("\x41\x21\x05\x00\x6e\x02")
|
||||
|
||||
/// Application environment structure
|
||||
struct app_env_tag
|
||||
{
|
||||
/// Connection handle
|
||||
uint16_t conhdl;
|
||||
/// Connection Index
|
||||
uint8_t conidx;
|
||||
/// Current advertising state (@see enum app_adv_state)
|
||||
uint8_t adv_state;
|
||||
/// Current advertising state (@see enum app_adv_state)
|
||||
uint8_t scan_state;
|
||||
/// Current advertising state (@see enum app_adv_state)
|
||||
uint8_t init_state;
|
||||
/// Next expected operation completed event
|
||||
uint8_t adv_op;
|
||||
|
||||
/// Last initialized profile
|
||||
uint8_t next_svc;
|
||||
|
||||
/// Bonding status
|
||||
bool bonded;
|
||||
|
||||
/// Device Name length
|
||||
uint8_t dev_name_len;
|
||||
/// Device Name
|
||||
uint8_t dev_name[APP_DEVICE_NAME_MAX_LEN];
|
||||
|
||||
/// Local device IRK
|
||||
uint8_t loc_irk[KEY_LEN];
|
||||
|
||||
/// Secure Connections on current link
|
||||
bool sec_con_enabled;
|
||||
|
||||
/// Counter used to generate IRK
|
||||
uint8_t rand_cnt;
|
||||
|
||||
/// Demonstration type length
|
||||
uint8_t demo_type_len;
|
||||
/// Demonstration type
|
||||
uint8_t demo_type;
|
||||
/// GATT user local identifier
|
||||
uint8_t user_lid;
|
||||
uint8_t adv_actv_idx;
|
||||
uint8_t scan_actv_idx;
|
||||
uint8_t init_actv_idx;
|
||||
uint8_t slave_conidx;
|
||||
uint8_t master_conidx;
|
||||
bool slave_connected;
|
||||
bool master_connected;
|
||||
};
|
||||
|
||||
struct conn_dev_info
|
||||
{
|
||||
uint8_t conidx;
|
||||
uint8_t addr[6];
|
||||
bool connnectd;
|
||||
bool role;
|
||||
};
|
||||
struct ADV_INFO{
|
||||
uint8_t addr[6];
|
||||
uint8_t name_length;
|
||||
uint8_t name[21];
|
||||
};
|
||||
#if (NVDS_SUPPORT)
|
||||
/// List of Application NVDS TAG identifiers
|
||||
enum app_nvds_tag
|
||||
{
|
||||
/// Device Name
|
||||
NVDS_TAG_DEVICE_NAME = 0x02,
|
||||
NVDS_LEN_DEVICE_NAME = 62,
|
||||
|
||||
/// BD Address
|
||||
NVDS_TAG_BD_ADDRESS = 0x01,
|
||||
NVDS_LEN_BD_ADDRESS = 6,
|
||||
|
||||
/// Local device Identity resolving key
|
||||
NVDS_TAG_LOC_IRK = 0xA0,
|
||||
NVDS_LEN_LOC_IRK = KEY_LEN,
|
||||
|
||||
#if (BLE_APP_PRF)
|
||||
/// BLE Application Advertising data
|
||||
NVDS_TAG_APP_BLE_ADV_DATA = 0x0B,
|
||||
NVDS_LEN_APP_BLE_ADV_DATA = 32,
|
||||
|
||||
/// BLE Application Scan response data
|
||||
NVDS_TAG_APP_BLE_SCAN_RESP_DATA = 0x0C,
|
||||
NVDS_LEN_APP_BLE_SCAN_RESP_DATA = 32,
|
||||
|
||||
/// Mouse Sample Rate
|
||||
NVDS_TAG_MOUSE_SAMPLE_RATE = 0x38,
|
||||
NVDS_LEN_MOUSE_SAMPLE_RATE = 1,
|
||||
|
||||
/// Peripheral Bonded
|
||||
NVDS_TAG_PERIPH_BONDED = 0x39,
|
||||
NVDS_LEN_PERIPH_BONDED = 1,
|
||||
|
||||
/// Mouse NTF Cfg
|
||||
NVDS_TAG_MOUSE_NTF_CFG = 0x3A,
|
||||
NVDS_LEN_MOUSE_NTF_CFG = 2,
|
||||
|
||||
/// Mouse Timeout value
|
||||
NVDS_TAG_MOUSE_TIMEOUT = 0x3B,
|
||||
NVDS_LEN_MOUSE_TIMEOUT = 2,
|
||||
|
||||
/// Peer Device BD Address
|
||||
NVDS_TAG_PEER_BD_ADDRESS = 0x3C,
|
||||
NVDS_LEN_PEER_BD_ADDRESS = 7,
|
||||
|
||||
/// Mouse Energy Safe
|
||||
NVDS_TAG_MOUSE_ENERGY_SAFE = 0x3D,
|
||||
NVDS_LEN_MOUSE_SAFE_ENERGY = 2,
|
||||
|
||||
/// EDIV (2bytes), RAND NB (8bytes), LTK (16 bytes), Key Size (1 byte)
|
||||
NVDS_TAG_LTK = 0x3E,
|
||||
NVDS_LEN_LTK = 28,
|
||||
|
||||
/// PAIRING
|
||||
NVDS_TAG_PAIRING = 0x3F,
|
||||
NVDS_LEN_PAIRING = 54,
|
||||
|
||||
/// Audio mode 0 task
|
||||
NVDS_TAG_AM0_FIRST = 0x90,
|
||||
NVDS_TAG_AM0_LAST = 0x9F,
|
||||
|
||||
/// Peer device Resolving identity key (+identity address)
|
||||
NVDS_TAG_PEER_IRK = 0xA1,
|
||||
NVDS_LEN_PEER_IRK = sizeof(struct gapc_irk),
|
||||
|
||||
#endif //(BLE_APP_PRF)
|
||||
};
|
||||
#endif // (NVDS_SUPPORT)
|
||||
|
||||
/// Advertising state machine
|
||||
enum app_adv_state
|
||||
{
|
||||
/// Advertising activity does not exists
|
||||
APP_ADV_STATE_IDLE = 0,
|
||||
#if BLE_APP_PRF
|
||||
/// Creating advertising activity
|
||||
APP_ADV_STATE_CREATING,
|
||||
/// Setting advertising data
|
||||
APP_ADV_STATE_SETTING_ADV_DATA,
|
||||
/// Setting scan response data
|
||||
APP_ADV_STATE_SETTING_SCAN_RSP_DATA,
|
||||
|
||||
/// Advertising activity created
|
||||
APP_ADV_STATE_CREATED,
|
||||
/// Starting advertising activity
|
||||
APP_ADV_STATE_STARTING,
|
||||
/// Advertising activity started
|
||||
APP_ADV_STATE_STARTED,
|
||||
/// Stopping advertising activity
|
||||
APP_ADV_STATE_STOPPING,
|
||||
APP_ADV_STATE_STOPPED,
|
||||
#endif //(BLE_APP_PRF)
|
||||
};
|
||||
|
||||
/// Scanning state machine
|
||||
enum app_scan_state
|
||||
{
|
||||
APP_SCAN_STATE_IDLE = 0,
|
||||
APP_SCAN_STATE_CREATING,
|
||||
APP_SCAN_STATE_CREATED,
|
||||
APP_SCAN_STATE_STARTING,
|
||||
APP_SCAN_STATE_STARTED,
|
||||
APP_SCAN_STATE_STOPPING,
|
||||
APP_SCAN_STATE_STOPPED,
|
||||
};
|
||||
|
||||
/// initting state machine
|
||||
enum app_init_state
|
||||
{
|
||||
APP_INIT_STATE_IDLE = 0,
|
||||
APP_INIT_STATE_CREATING,
|
||||
APP_INIT_STATE_CREATED,
|
||||
APP_INIT_STATE_STARTING,
|
||||
APP_INIT_STATE_STARTED,
|
||||
APP_INIT_STATE_STOPPING,
|
||||
APP_INIT_STATE_STOPPED,
|
||||
};
|
||||
|
||||
/// States of APP task
|
||||
enum app_state
|
||||
{
|
||||
/// Initialization state
|
||||
APP_INIT,
|
||||
/// Database create state
|
||||
APP_CREATE_DB,
|
||||
/// Ready State
|
||||
APP_READY,
|
||||
/// Connected state
|
||||
APP_CONNECTED,
|
||||
|
||||
/// Number of defined states.
|
||||
APP_STATE_MAX
|
||||
};
|
||||
|
||||
/// APP Task messages
|
||||
/*@TRACE*/
|
||||
enum app_msg_id
|
||||
{
|
||||
APP_DUMMY_MSG = TASK_FIRST_MSG(TASK_ID_APP),
|
||||
|
||||
#if (BLE_APP_PRF)
|
||||
#if (BLE_APP_HT)
|
||||
/// Timer used to refresh the temperature measurement value
|
||||
APP_HT_MEAS_INTV_TIMER,
|
||||
#endif //(BLE_APP_HT)
|
||||
|
||||
#if (BLE_APP_HID)
|
||||
/// Timer used to disconnect the moue if no activity is detecter
|
||||
APP_HID_MOUSE_TIMEOUT_TIMER,
|
||||
#endif //(BLE_APP_HID)
|
||||
#endif //(BLE_APP_PRF)
|
||||
#if (FLASH_TEST_IN_TASK || FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
ONE_SEC_TIMER_MSG,
|
||||
#endif // (FLASH_TEST_IN_TASK || FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
#if (CENTRAL_SEND_TEST_DATA)
|
||||
CENTRAL_SEND_DATA_TIMER,
|
||||
#endif // (CENTRAL_SEND_TEST_DATA)
|
||||
};
|
||||
|
||||
struct app_subtask_handlers
|
||||
{
|
||||
/// Pointer to the message handler table
|
||||
const struct ke_msg_handler *p_msg_handler_tab;
|
||||
/// Number of messages handled
|
||||
uint16_t msg_cnt;
|
||||
};
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Initialize the BLE demo application.
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_init(void);
|
||||
struct app_env_tag *get_app_env(void);
|
||||
/// @} APPTASK
|
||||
|
||||
#endif // APP_TASK_H_
|
||||
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file rwapp_config.h
|
||||
*
|
||||
* @brief Application configuration definition
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2016
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _RWAPP_CONFIG_H_
|
||||
#define _RWAPP_CONFIG_H_
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup app
|
||||
* @brief Application configuration definition
|
||||
*
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#define CFG_APP_BATT
|
||||
/******************************************************************************************/
|
||||
/* ------------------------- BLE APPLICATION SETTINGS
|
||||
* -----------------------------*/
|
||||
/******************************************************************************************/
|
||||
|
||||
/// Application Profile
|
||||
#if defined(CFG_APP_PRF)
|
||||
#define BLE_APP_PRF 1
|
||||
#else // defined(CFG_APP_PRF)
|
||||
#define BLE_APP_PRF 0
|
||||
#endif // defined(CFG_APP_PRF)
|
||||
|
||||
/// Health Thermometer Application
|
||||
#if defined(CFG_APP_HT)
|
||||
#define BLE_APP_HT 1
|
||||
#else // defined(CFG_APP_HT)
|
||||
#define BLE_APP_HT 0
|
||||
#endif // defined(CFG_APP_HT)
|
||||
|
||||
/// HID Application
|
||||
#if defined(CFG_APP_HID)
|
||||
#define BLE_APP_HID 1
|
||||
#else // defined(CFG_APP_HID)
|
||||
#define BLE_APP_HID 0
|
||||
#endif // defined(CFG_APP_HID)
|
||||
|
||||
/// DIS Application
|
||||
#if defined(CFG_APP_DIS)
|
||||
#define BLE_APP_DIS 1
|
||||
#else // defined(CFG_APP_DIS)
|
||||
#define BLE_APP_DIS 0
|
||||
#endif // defined(CFG_APP_DIS)
|
||||
|
||||
/// Battery Service Application
|
||||
#if defined(CFG_APP_BATT)
|
||||
#define BLE_APP_BATT 1
|
||||
#else
|
||||
#define BLE_APP_BATT 0
|
||||
#endif //(BLE_APP_BATT)
|
||||
|
||||
// There are 3 modes of flash operation, turn on one of them according to your needs.
|
||||
// This method can be operated at any time without affecting the Bluetooth send and receive packets.
|
||||
#define FLASH_TEST_IN_INTERRUPT (0)
|
||||
// This method can be operated at any time, and will affect the Bluetooth send and receive packets.
|
||||
#define FLASH_TEST_IN_TASK (0)
|
||||
// This way operates in the gap of Bluetooth and will not affect the Bluetooth sending and receiving packets,
|
||||
// but the flash operation may not be successful immediately.
|
||||
#define FLASH_TEST_IN_BLUETOOTH_GAP (0)
|
||||
|
||||
// The master sends test data to the slave once per second.
|
||||
#define CENTRAL_SEND_TEST_DATA (0)
|
||||
|
||||
|
||||
/// @} rwapp_config
|
||||
|
||||
#endif /* _RWAPP_CONFIG_H_ */
|
||||
@@ -0,0 +1,152 @@
|
||||
|
||||
#ifndef SDK_DRIVER_CONFIG_H
|
||||
#define SDK_DRIVER_CONFIG_H
|
||||
// <<< Use Configuration Wizard in Context Menu >>>\n
|
||||
#ifdef USE_APP_CONFIG
|
||||
#include "app_config.h"
|
||||
#endif
|
||||
// <h> XC_Drivers
|
||||
|
||||
// <e> XC_CLOCK_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_CLOCK_ENABLED
|
||||
#define XC_CLOCK_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_PWR_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_PWR_ENABLED
|
||||
#define XC_PWR_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_WDT_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_WDT_ENABLED
|
||||
#define XC_WDT_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_BOR_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_BOR_ENABLED
|
||||
#define XC_BOR_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_SYSTICK_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_SYSTICK_ENABLED
|
||||
#define XC_SYSTICK_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_TIMER_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_TIMER_ENABLED
|
||||
#define XC_TIMER_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_AOTIMER_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_AOTIMER_ENABLED
|
||||
#define XC_AOTIMER_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_GPIO_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_GPIO_ENABLED
|
||||
#define XC_GPIO_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_ADC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_ADC_ENABLED
|
||||
#define XC_ADC_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_UART_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_UART_ENABLED
|
||||
#define XC_UART_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_PWM_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_PWM_ENABLED
|
||||
#define XC_PWM_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_FMC_SPI_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_FMC_SPI_ENABLED
|
||||
#define XC_FMC_SPI_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_SPI_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_SPI_ENABLED
|
||||
#define XC_SPI_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_IIC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_IIC_ENABLED
|
||||
#define XC_IIC_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_RTC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_RTC_ENABLED
|
||||
#define XC_RTC_ENABLED 1
|
||||
#endif
|
||||
|
||||
//==========================================================
|
||||
// <q> XC_RTC_DATE_INT_ENABLED
|
||||
|
||||
#ifndef XC_RTC_DATE_INT_ENABLED
|
||||
#define XC_RTC_DATE_INT_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_DMA_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_DMA_ENABLED
|
||||
#define XC_DMA_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_PGA_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_PGA_ENABLED
|
||||
#define XC_PGA_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_QDEC_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_QDEC_ENABLED
|
||||
#define XC_QDEC_ENABLED 0
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <e> XC_CALIB_ENABLED
|
||||
//==========================================================
|
||||
#ifndef XC_CALIB_ENABLED
|
||||
#define XC_CALIB_ENABLED 1
|
||||
#endif
|
||||
// </e>
|
||||
|
||||
// <<< end of configuration section >>>
|
||||
#endif //SDK_DRIVER_CONFIG_H
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* COPYRIGHT(c) 2021 Shanghai XinMiaoLink Technology Co.,Ltd.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _XM_DEBUG_H_
|
||||
#define _XM_DEBUG_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @brief Print debug information through debug uart.
|
||||
*/
|
||||
#define xm_debug printf
|
||||
|
||||
/**
|
||||
* @brief Print hexadecimal data through debug uart.
|
||||
*
|
||||
* @param data - hexadecimal data.
|
||||
* @param len - the length of hexadecimal data.
|
||||
*/
|
||||
void xm_debug_hex(void *data, int len);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif/* _XM_DEBUG_H_ */
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
#ifndef _XC_ATCMD_H_
|
||||
#define _XC_ATCMD_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @brief AT command result.
|
||||
*/
|
||||
#define AT_RESULT_ERROR (-1)
|
||||
#define AT_RESULT_WRONG (-2)
|
||||
#define AT_RESULT_DENY (-3)
|
||||
#define AT_RESULT_OK (0)
|
||||
#define AT_RESULT_NONE (1)
|
||||
|
||||
/**
|
||||
* @brief AT command response.
|
||||
*/
|
||||
#define AT_RESPONSE_OK "+ok"
|
||||
#define AT_RESPONSE_ERROR "+ok=error"
|
||||
#define AT_RESPONSE_WRONG "+ok=wrong"
|
||||
#define AT_RESPONSE_DENY "+ok=unsupport"
|
||||
#define AT_RESPONSE_EOF "\r\n\r\n"
|
||||
|
||||
|
||||
/**
|
||||
* @brief AT command structure.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
const char * name;
|
||||
int (*func)(char *, int, char *, int);
|
||||
const char * doc;
|
||||
} at_cmd_t;
|
||||
|
||||
/**
|
||||
* @brief AT command response function definition.
|
||||
*
|
||||
* @param data - AT command response data.
|
||||
* @param len - the length of AT command response data.
|
||||
*
|
||||
* @return None.
|
||||
*/
|
||||
typedef int (*at_rsp_func_t)(uint8_t *data, int len);
|
||||
|
||||
|
||||
/**
|
||||
* @brief AT command process.
|
||||
*
|
||||
* @param data - AT command data.
|
||||
* @param len - the length of AT command data.
|
||||
* @param rsp - buffer to store AT command response.
|
||||
* @param rsp_buf_len - the size of buffer to store AT command response.
|
||||
*
|
||||
* @return AT command result.
|
||||
*/
|
||||
int xc_at_process_cmd(uint8_t *data, int len, char *rsp, int rsp_buf_len);
|
||||
|
||||
/**
|
||||
* @brief AT command execute.
|
||||
*
|
||||
* @param data - AT command data.
|
||||
* @param len - the length of AT command data.
|
||||
* @param rsp_func - response function.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_at_data_handle(uint8_t *data, int len, at_rsp_func_t rsp_func);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif/* _XC_ATCMD_H_ */
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
#ifndef _XC_BLE_H_
|
||||
#define _XC_BLE_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @brief BLE event types.
|
||||
*/
|
||||
enum BLE_EVENT_E
|
||||
{
|
||||
BLE_EVENT_INIT = 0x20,
|
||||
BLE_EVENT_ADV_START,
|
||||
BLE_EVENT_ADV_STOP,
|
||||
BLE_EVENT_CONNECTED,
|
||||
BLE_EVENT_DISCONNECTED,
|
||||
BLE_EVENT_NTF_ENABLE,
|
||||
BLE_EVENT_NTF_DISABLE,
|
||||
BLE_EVENT_NTF_DATA
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief BLE event handler definition.
|
||||
*
|
||||
* @param event - BLE event id.
|
||||
* @param data - BLE event data.
|
||||
* @param len - the length of BLE event data.
|
||||
*
|
||||
* @return None.
|
||||
*/
|
||||
typedef int (*ble_event_callback_t)(uint32_t event, void *data, uint32_t len);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Register BLE callback.
|
||||
*
|
||||
* @param p_callback - callback function.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_ble_register_callback(ble_event_callback_t p_callback);
|
||||
|
||||
/**
|
||||
* @brief Check if BLE is started.
|
||||
*
|
||||
* @return TRUE if started.
|
||||
*/
|
||||
int xc_ble_is_start(void);
|
||||
|
||||
/**
|
||||
* @brief Check if BLE is connected.
|
||||
*
|
||||
* @return TRUE if connected.
|
||||
*/
|
||||
int xc_ble_is_connected(void);
|
||||
|
||||
/**
|
||||
* @brief Send data through BLE.
|
||||
*
|
||||
* @param data - data to be sent.
|
||||
* @param bytes - the length of data.
|
||||
*
|
||||
* @return the length of data sent.
|
||||
*/
|
||||
int xc_ble_data_send(void *data, uint32_t bytes);
|
||||
|
||||
/**
|
||||
* @brief Get the MTU size of the BLE connection.
|
||||
*
|
||||
* @return the MTU size.
|
||||
*/
|
||||
int xc_ble_get_mtu_size(void);
|
||||
|
||||
/**
|
||||
* @brief Get BLE mac address.
|
||||
*
|
||||
* @param mac - buffer to store mac address.
|
||||
*
|
||||
* @return the mac address.
|
||||
*/
|
||||
uint8_t *xc_ble_get_mac(uint8_t *mac);
|
||||
|
||||
/**
|
||||
* @brief Get Slave mac address.
|
||||
*
|
||||
* @param mac - buffer to store mac address.
|
||||
*
|
||||
* @return the mac address.
|
||||
*/
|
||||
uint8_t *xc_ble_slave_mac(uint8_t *mac);
|
||||
|
||||
/**
|
||||
* @brief Get Scan mac address.
|
||||
*
|
||||
* @param mac - buffer to store mac address.
|
||||
*
|
||||
* @return the mac address.
|
||||
*/
|
||||
uint8_t *xc_ble_scan_mac(uint8_t *mac);
|
||||
/**
|
||||
* @brief Disconnect BLE connection.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_disconnect(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif/* _XC_BLE_H_ */
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
#ifndef _XC_CONFIG_H_
|
||||
#define _XC_CONFIG_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* @brief Configuration magic flag.
|
||||
*/
|
||||
#define CONFIG_MAGIC_FLAG 0x55
|
||||
|
||||
/**
|
||||
* @brief Configuration erase and write flag.
|
||||
*/
|
||||
#define CONFIG_ERASE_FLAG (0x01)
|
||||
#define CONFIG_WRITE_FLAG (0x02)
|
||||
|
||||
/**
|
||||
* @brief Configuration structure.
|
||||
*/
|
||||
#pragma pack(push) // 1-byte alignment
|
||||
#pragma pack(1)
|
||||
typedef struct
|
||||
{
|
||||
uint8_t magicflag;
|
||||
uint8_t debug_level;
|
||||
|
||||
// BLE, 33 bytes
|
||||
uint8_t mac[6];
|
||||
uint8_t ble_name[27];
|
||||
|
||||
// ADV PARAM, 33 bytes
|
||||
uint8_t adver_type;
|
||||
uint8_t adver_channel;
|
||||
uint8_t adver_data_len;
|
||||
uint8_t adver_data[26];
|
||||
uint16_t adver_min;
|
||||
uint16_t adver_max;
|
||||
|
||||
// CONN PARAM, 8 bytes
|
||||
uint16_t conn_min;
|
||||
uint16_t conn_max;
|
||||
uint16_t conn_latency;
|
||||
uint16_t supervisionTO;
|
||||
|
||||
// 8 bytes
|
||||
uint8_t uuid_server[2];
|
||||
uint8_t uuid_read[2];
|
||||
uint8_t uuid_write[2];
|
||||
uint8_t sleep_info; // enable & pin & lev
|
||||
int8_t txpower;
|
||||
|
||||
// slave addr
|
||||
uint8_t slave_mac[6];
|
||||
uint8_t scan_mac[6];
|
||||
uint8_t con_sta;
|
||||
|
||||
// UART
|
||||
uint32_t baudrate;
|
||||
uint8_t uart_send_delay;
|
||||
uint8_t reserved[6];
|
||||
uint8_t crc8;
|
||||
|
||||
} XC_CONFIG_DATA;
|
||||
#pragma pack(pop)
|
||||
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
extern XC_CONFIG_DATA g_config_file;
|
||||
#else
|
||||
extern const XC_CONFIG_DATA g_config_file;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Initialize configuration.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_config_init(void);
|
||||
|
||||
/**
|
||||
* @brief Erase or write configuration.
|
||||
*
|
||||
* @param flag - Erase or write flag.
|
||||
*/
|
||||
void xc_config_save(int flag);
|
||||
|
||||
/**
|
||||
* @brief Clean configuration.
|
||||
*/
|
||||
void xc_config_clean(void);
|
||||
|
||||
/**
|
||||
* @brief Save configuration.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_config_direct_save(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XC_CONFIG_H_ */
|
||||
@@ -0,0 +1,28 @@
|
||||
#ifndef _XC_DEBUG_H_
|
||||
#define _XC_DEBUG_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @brief Print debug information through debug uart.
|
||||
*/
|
||||
#define xc_debug printf
|
||||
|
||||
/**
|
||||
* @brief Print hexadecimal data through debug uart.
|
||||
*
|
||||
* @param data - hexadecimal data.
|
||||
* @param len - the length of hexadecimal data.
|
||||
*/
|
||||
void xc_debug_hex(void *data, int len);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif/* _XC_DEBUG_H_ */
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
#ifndef _XC_FLASH_H_
|
||||
#define _XC_FLASH_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @brief Flash address definition.
|
||||
*/
|
||||
#define FLASH_ADDR_AUTH 0x1E000
|
||||
#define FLASH_ADDR_CONFIG 0x1F000
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initialize flash.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_flash_init(void);
|
||||
|
||||
/**
|
||||
* @brief Read data from flash.
|
||||
*
|
||||
* @param addr - the address of flash, start from 0.
|
||||
* @param data - a pointer to data.
|
||||
* @param len - the length of data.
|
||||
*
|
||||
* @return the length of read success.
|
||||
*/
|
||||
int xc_flash_read(uint32_t addr, void *data, int len);
|
||||
|
||||
/**
|
||||
* @brief Write data to flash.
|
||||
*
|
||||
* @param addr - the address of flash, start from 0.
|
||||
* @param data - a pointer to data.
|
||||
* @param len - the length of data.
|
||||
*
|
||||
* @return the length of write success.
|
||||
*/
|
||||
int xc_flash_write(uint32_t addr, void *data, int len);
|
||||
|
||||
/**
|
||||
* @brief Erase 4K flash.
|
||||
*
|
||||
* @param addr - the address of flash, start from 0.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_flash_erase_page(uint32_t addr);
|
||||
|
||||
/**
|
||||
* @brief Check if flash operation finished.
|
||||
*
|
||||
* @return TRUE if finished.
|
||||
*/
|
||||
int xc_flash_operation_is_finish(void);
|
||||
|
||||
/**
|
||||
* @brief Get flash ruid.
|
||||
*
|
||||
* @param ruid - the ruid of flash.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_flash_get_ruid(uint8_t *ruid);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif/* _XC_FLASH_H_ */
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
#ifndef _XC_HEAD_H_
|
||||
#define _XC_HEAD_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void *)0)
|
||||
#endif
|
||||
|
||||
#define XC_SUCCESS 0
|
||||
|
||||
#define WEAK __attribute__ ((weak))
|
||||
#define FUNC_IN_RAM __attribute__((section("ram_code")))
|
||||
|
||||
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned int uint32_t;
|
||||
|
||||
typedef signed char int8_t;
|
||||
typedef signed short int16_t;
|
||||
typedef signed int int32_t;
|
||||
|
||||
#include "xc_debug.h"
|
||||
#include "xc_sys.h"
|
||||
#include "xc_task.h"
|
||||
#include "xc_flash.h"
|
||||
#include "xc_config.h"
|
||||
#include "xc_uart.h"
|
||||
#include "xc_atcmd.h"
|
||||
#include "xc_ble.h"
|
||||
#include "xc_timer.h"
|
||||
|
||||
|
||||
#define SDK_VER "0.1.0"
|
||||
#define SDK_LVER "(2025-12-29 13:00 2M)"
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif/* _XC_HEAD_H_ */
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef _XC_MAIN_H_
|
||||
#define _XC_MAIN_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief SDK feature definition.
|
||||
*/
|
||||
#define CONFIG_SUPPORT_FLASH 1
|
||||
#define CONFIG_SUPPORT_CONFIG_FILE 1
|
||||
#define CONFIG_SUPPORT_SECUKEY 1
|
||||
#define CONFIG_SUPPORT_GPIO 1
|
||||
#define CONFIG_SUPPORT_POWERSAVE 1
|
||||
#define CONFIG_SUPPORT_DEEPSLEEP 1
|
||||
|
||||
/**
|
||||
* @brief SDK Initialize.
|
||||
*/
|
||||
void xc_main_init(void);
|
||||
|
||||
/**
|
||||
* @brief SDK entrance.
|
||||
*/
|
||||
void xc_main_start(void);
|
||||
|
||||
/**
|
||||
* @brief SDK main task, need call continuously.
|
||||
*/
|
||||
void xc_main_run(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XC_MAIN_H_ */
|
||||
@@ -0,0 +1,87 @@
|
||||
#ifndef _XC_SYS_H_
|
||||
#define _XC_SYS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief System deep-sleep GPIO wake-up level.
|
||||
*/
|
||||
#define SYS_DEEPSLEEP_GPIO_WAKE_LOW_LEVEL 0
|
||||
#define SYS_DEEPSLEEP_GPIO_WAKE_HIGH_LEVEL 1
|
||||
|
||||
/**
|
||||
* @brief System event types.
|
||||
*/
|
||||
enum SYS_EVENT_E
|
||||
{
|
||||
SYS_EVENT_REBOOT = 0
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief System event handler definition.
|
||||
*
|
||||
* @param event_id - system event id.
|
||||
* @param param - system event data.
|
||||
*
|
||||
* @return None.
|
||||
*/
|
||||
typedef int (*sys_event_callback_t)(uint32_t event_id, void *param);
|
||||
|
||||
/**
|
||||
* @brief Initialize system.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_sys_init(void);
|
||||
|
||||
/**
|
||||
* @brief Register system callback.
|
||||
*
|
||||
* @param p_callback - callback function.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_sys_register_event(sys_event_callback_t p_callback);
|
||||
|
||||
/**
|
||||
* @brief Get SDK version.
|
||||
*
|
||||
* @return SDK version.
|
||||
*/
|
||||
const char *xc_sys_get_sdk_version(void);
|
||||
|
||||
/**
|
||||
* @brief Get system time.
|
||||
*
|
||||
* @return the time from system startup, in milliseconds.
|
||||
*/
|
||||
uint32_t xc_sys_get_time(void);
|
||||
|
||||
/**
|
||||
* @brief System reset.
|
||||
*/
|
||||
void xc_sys_reset(void);
|
||||
|
||||
/**
|
||||
* @brief Block for a while.
|
||||
*
|
||||
* @param us - wait time, in microseconds.
|
||||
*/
|
||||
void xc_sys_wait_us(uint32_t us);
|
||||
|
||||
/**
|
||||
* @brief Enter deep-sleep and configure wake-up GPIO.
|
||||
*
|
||||
* @param wake_gpio - wake-up gpio id.
|
||||
* @param wake_level - wake-up level.
|
||||
*/
|
||||
void xc_sys_enter_deepsleep(int wake_gpio, int wake_level);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XC_SYS_H_ */
|
||||
@@ -0,0 +1,45 @@
|
||||
#ifndef _XC_TASK_H_
|
||||
#define _XC_TASK_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Task handle.
|
||||
*/
|
||||
typedef void (*task_func_t)(void);
|
||||
|
||||
/**
|
||||
* @brief Task data structure.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
void *next;
|
||||
task_func_t func;
|
||||
uint8_t run_flag;
|
||||
} task_handle_t;
|
||||
|
||||
/**
|
||||
* @brief Create a task.
|
||||
*
|
||||
* @param task - a variable pointing to the task handle.
|
||||
* @param func - a pointer to the application-defined function to be executed by the task.
|
||||
*
|
||||
* @return the task handle.
|
||||
*/
|
||||
task_handle_t *xc_task_create(task_handle_t *task, task_func_t func);
|
||||
|
||||
/**
|
||||
* @brief Stop task.
|
||||
*
|
||||
* @param task - the task handle.
|
||||
*/
|
||||
void xc_task_delete(task_handle_t *task);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XC_TASK_H_ */
|
||||
@@ -0,0 +1,43 @@
|
||||
#ifndef _XC_TIMER_H_
|
||||
#define _XC_TIMER_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Timer definition.
|
||||
*/
|
||||
#define TIMER_ID_0 0
|
||||
#define TIMER_ID_1 1
|
||||
#define TIMER_ID_2 2
|
||||
|
||||
/**
|
||||
* @brief Timer callback function definition.
|
||||
*/
|
||||
typedef void (*timer_callback_t)(void);
|
||||
|
||||
/**
|
||||
* @brief Create a hardware timer.
|
||||
*
|
||||
* @param timer_id - timer is, such as: TIMER_ID_xx.
|
||||
* @param period_us - the period of timer, in microseconds.
|
||||
* @param p_callback - timer callback function pointer.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_timer_create(uint32_t timer_id, uint32_t period_us, timer_callback_t p_callback);
|
||||
|
||||
/**
|
||||
* @brief Delete timer.
|
||||
*
|
||||
* @param timer_id - timer is, such as: TIMER_ID_xx.
|
||||
*/
|
||||
void xc_timer_delete(uint32_t timer_id);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XC_TIMER_H_ */
|
||||
@@ -0,0 +1,93 @@
|
||||
#ifndef _XC_UART_H_
|
||||
#define _XC_UART_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Uart handle.
|
||||
*/
|
||||
typedef void *uart_handle_t;
|
||||
|
||||
/**
|
||||
* @brief Uart handle definition.
|
||||
*/
|
||||
#define XC_UART0 (uart_handle_t)(1)
|
||||
#define XC_UART1 (uart_handle_t)(2)
|
||||
|
||||
/**
|
||||
* @brief Uart event types.
|
||||
*/
|
||||
enum UART_EVENT_E
|
||||
{
|
||||
UART0_EVENT_DATA = 0
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Uart event handler definition.
|
||||
*
|
||||
* @param event - uart event id.
|
||||
* @param data - uart event data.
|
||||
* @param len - the length of uart event data.
|
||||
*
|
||||
* @return None.
|
||||
*/
|
||||
typedef int (*uart_event_callback_t)(uint32_t event, void *data, uint32_t len);
|
||||
|
||||
/**uart_task
|
||||
* @brief Open uart.
|
||||
*
|
||||
* @param uart_id - uart id (0~1).
|
||||
* @param baudrate - uart baudrate.
|
||||
*
|
||||
* @return the handle of uart, NULL is failure.
|
||||
*/
|
||||
uart_handle_t xc_uart_open(int uart_id, int baudrate);
|
||||
|
||||
/**
|
||||
* @brief Recv data from uart.
|
||||
*
|
||||
* @param uart_handle - the handle of uart.
|
||||
* @param data - buffer to store received data.
|
||||
* @param bytes - the length of the data you want to receive.
|
||||
*
|
||||
* @return the length of data received.
|
||||
*/
|
||||
int xc_uart_recv(uart_handle_t uart_handle, void *data, uint32_t bytes);
|
||||
|
||||
/**
|
||||
* @brief Send data through uart.
|
||||
*
|
||||
* @param uart_handle - the handle of uart.
|
||||
* @param data - data to be sent.
|
||||
* @param bytes - the length of data.
|
||||
*
|
||||
* @return the length of data sent.
|
||||
*/
|
||||
int xc_uart_send(uart_handle_t uart_handle, void *data, uint32_t bytes);
|
||||
|
||||
/**
|
||||
* @brief Close uart.
|
||||
*
|
||||
* @param uart_handle - the handle of uart.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_uart_close(uart_handle_t uart_handle);
|
||||
|
||||
/**
|
||||
* @brief Register uart callback.
|
||||
*
|
||||
* @param p_callback - callback function.
|
||||
*
|
||||
* @return XC_SUCCESS if successful.
|
||||
*/
|
||||
int xc_uart_register_callback(uart_event_callback_t p_callback);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XC_UART_H_ */
|
||||
@@ -0,0 +1,88 @@
|
||||
/**
|
||||
* \file
|
||||
* Ring buffer library implementation
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "ringbuf.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
ringbuf_init(struct ringbuf *r, uint8_t *dataptr, uint16_t size)
|
||||
{
|
||||
r->data = dataptr;
|
||||
r->mask = size;
|
||||
r->put_ptr = 0;
|
||||
r->get_ptr = 0;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
ringbuf_put(struct ringbuf *r, uint8_t c)
|
||||
{
|
||||
/* Check if buffer is full. If it is full, return 0 to indicate that
|
||||
the element was not inserted into the buffer.
|
||||
|
||||
XXX: there is a potential risk for a race condition here, because
|
||||
the ->get_ptr field may be written concurrently by the
|
||||
ringbuf_get() function. To avoid this, access to ->get_ptr must
|
||||
be atomic. We use an uint8_t type, which makes access atomic on
|
||||
most platforms, but C does not guarantee this.
|
||||
*/
|
||||
if(((r->put_ptr+1)%r->mask)== r->get_ptr ) {
|
||||
return 0;
|
||||
}
|
||||
r->data[r->put_ptr] = c;
|
||||
r->put_ptr = (r->put_ptr + 1) % r->mask;
|
||||
|
||||
if(((r->put_ptr+1)%r->mask)== r->get_ptr )
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
ringbuf_get(struct ringbuf *r)
|
||||
{
|
||||
uint8_t c;
|
||||
|
||||
/* Check if there are bytes in the buffer. If so, we return the
|
||||
first one and increase the pointer. If there are no bytes left, we
|
||||
return -1.
|
||||
|
||||
XXX: there is a potential risk for a race condition here, because
|
||||
the ->put_ptr field may be written concurrently by the
|
||||
ringbuf_put() function. To avoid this, access to ->get_ptr must
|
||||
be atomic. We use an uint8_t type, which makes access atomic on
|
||||
most platforms, but C does not guarantee this.
|
||||
*/
|
||||
if(r->put_ptr != r->get_ptr) {
|
||||
c = r->data[r->get_ptr];
|
||||
//r->get_ptr = (r->get_ptr + 1)%r->mask;
|
||||
r->get_ptr +=1;
|
||||
if(r->get_ptr>=r->mask)
|
||||
r->get_ptr = r->get_ptr-r->mask;
|
||||
return c;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
ringbuf_size(struct ringbuf *r)
|
||||
{
|
||||
return r->mask;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
ringbuf_elements(struct ringbuf *r)
|
||||
{
|
||||
if(r->put_ptr>=r->get_ptr)
|
||||
return r->put_ptr-r->get_ptr;
|
||||
else
|
||||
return r->put_ptr+r->mask-r->get_ptr;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
/**
|
||||
* \file
|
||||
* Header file for the ring buffer library
|
||||
*/
|
||||
|
||||
#ifndef __RINGBUF_H__
|
||||
#define __RINGBUF_H__
|
||||
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Structure that holds the state of a ring buffer.
|
||||
*
|
||||
* This structure holds the state of a ring buffer. The
|
||||
* actual buffer needs to be defined separately. This
|
||||
* struct is an opaque structure with no user-visible
|
||||
* elements.
|
||||
*
|
||||
*/
|
||||
struct ringbuf {
|
||||
uint8_t *data;
|
||||
uint16_t mask;
|
||||
|
||||
/* XXX these must be 8-bit quantities to avoid race conditions. */
|
||||
uint16_t put_ptr, get_ptr;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Initialize a ring buffer
|
||||
* \param r A pointer to a struct ringbuf to hold the state of the ring buffer
|
||||
* \param a A pointer to an array to hold the data in the buffer
|
||||
* \param size_power_of_two The size of the ring buffer, which must be a power of two
|
||||
*
|
||||
* This function initiates a ring buffer. The data in the
|
||||
* buffer is stored in an external array, to which a
|
||||
* pointer must be supplied. The size of the ring buffer
|
||||
* must be a power of two and cannot be larger than 128
|
||||
* bytes.
|
||||
*
|
||||
*/
|
||||
void ringbuf_init(struct ringbuf *r, uint8_t *a,
|
||||
uint16_t size_power_of_two);
|
||||
|
||||
/**
|
||||
* \brief Insert a byte into the ring buffer
|
||||
* \param r A pointer to a struct ringbuf to hold the state of the ring buffer
|
||||
* \param c The byte to be written to the buffer
|
||||
* \return Non-zero if there data could be written, or zero if the buffer was full.
|
||||
*
|
||||
* This function inserts a byte into the ring buffer. It
|
||||
* is safe to call this function from an interrupt
|
||||
* handler.
|
||||
*
|
||||
*/
|
||||
int ringbuf_put(struct ringbuf *r, uint8_t c);
|
||||
|
||||
/**
|
||||
* \brief Get a byte from the ring buffer
|
||||
* \param r A pointer to a struct ringbuf to hold the state of the ring buffer
|
||||
* \return The data from the buffer, or -1 if the buffer was empty
|
||||
*
|
||||
* This function removes a byte from the ring buffer. It
|
||||
* is safe to call this function from an interrupt
|
||||
* handler.
|
||||
*
|
||||
*/
|
||||
int ringbuf_get(struct ringbuf *r);
|
||||
|
||||
/**
|
||||
* \brief Get the size of a ring buffer
|
||||
* \param r A pointer to a struct ringbuf to hold the state of the ring buffer
|
||||
* \return The size of the buffer.
|
||||
*/
|
||||
int ringbuf_size(struct ringbuf *r);
|
||||
|
||||
/**
|
||||
* \brief Get the number of elements currently in the ring buffer
|
||||
* \param r A pointer to a struct ringbuf to hold the state of the ring buffer
|
||||
* \return The number of elements in the buffer.
|
||||
*/
|
||||
int ringbuf_elements(struct ringbuf *r);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __RINGBUF_H__ */
|
||||
@@ -0,0 +1,596 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
#include "xc_gap_api.h"
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
#define ATCMD_NAME_MAX_SIZE 32
|
||||
|
||||
/*typedef struct
|
||||
{
|
||||
const char * name;
|
||||
int (*func)(char *, int, char *, int);
|
||||
const char * doc;
|
||||
} at_cmd_t;*/
|
||||
|
||||
static const at_cmd_t g_at_cmds_table[];
|
||||
static at_rsp_func_t g_at_cmd_rsp_func = NULL;
|
||||
static task_handle_t g_at_cmd_rst_task;
|
||||
static uint32_t g_at_cmd_rst_time = 0;
|
||||
extern const at_cmd_t user_define_at_cmds_table[];
|
||||
|
||||
|
||||
static int at_cmd_help(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
at_cmd_t *p_table;
|
||||
|
||||
if (data_len == 0)
|
||||
{
|
||||
g_at_cmd_rsp_func("+ok\r\n", strlen("+ok\r\n"));
|
||||
|
||||
p_table = (at_cmd_t *)&user_define_at_cmds_table[0];
|
||||
while (p_table->name != NULL && p_table->func != NULL)
|
||||
{
|
||||
if (p_table->doc && memcmp(p_table->doc, "\r\n", 2) != 0)
|
||||
{
|
||||
g_at_cmd_rsp_func((uint8_t *)p_table->doc, strlen(p_table->doc));
|
||||
}
|
||||
p_table++;
|
||||
}
|
||||
|
||||
p_table = (at_cmd_t *)&g_at_cmds_table[0];
|
||||
while (p_table->name != NULL && p_table->func != NULL)
|
||||
{
|
||||
if (p_table->doc && memcmp(p_table->doc, "\r\n", 2) != 0)
|
||||
{
|
||||
g_at_cmd_rsp_func((uint8_t *)p_table->doc, strlen(p_table->doc));
|
||||
}
|
||||
p_table++;
|
||||
}
|
||||
g_at_cmd_rsp_func("\r\n", strlen("\r\n"));
|
||||
return AT_RESULT_NONE;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
|
||||
static void at_rst_task(void)
|
||||
{
|
||||
if (xc_flash_operation_is_finish() && xc_sys_get_time() > g_at_cmd_rst_time)
|
||||
{
|
||||
xc_sys_reset();
|
||||
}
|
||||
}
|
||||
|
||||
static int at_cmd_rst(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
g_at_cmd_rst_time = xc_sys_get_time() + 200;
|
||||
xc_task_create(&g_at_cmd_rst_task, at_rst_task);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
|
||||
static int at_cmd_baud(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
int baud = atoi(data);
|
||||
if (baud == 4800 || baud == 9600 || baud == 19200 || baud == 38400 || baud == 57600 || baud == 115200 || baud == 230400 || baud == 921600)
|
||||
{
|
||||
g_config_file.baudrate = baud;
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
#else
|
||||
return AT_RESULT_DENY;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int at_cmd_name(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
sprintf(rsp, "=%s", (char *)g_config_file.ble_name);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
if (data_len < sizeof(g_config_file.ble_name) && data_len + g_config_file.adver_data_len <= 26)
|
||||
{
|
||||
memset(g_config_file.ble_name, 0, sizeof(g_config_file.ble_name));
|
||||
memcpy(g_config_file.ble_name, data, data_len);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
#else
|
||||
return AT_RESULT_DENY;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE || CONFIG_SUPPORT_SECUKEY
|
||||
static int get_number_from_string(char *string, int start_index, int end_index, int base)
|
||||
{
|
||||
int i, num, number = 0;
|
||||
char c;
|
||||
|
||||
for (i = start_index; i <= end_index; i++)
|
||||
{
|
||||
c = string[i];
|
||||
if (base == 10)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
num = c - '0';
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
else if (base == 16)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
num = c - '0';
|
||||
else if (c >= 'a' && c <= 'f')
|
||||
num = c - 'a' + 10;
|
||||
else if (c >= 'A' && c <= 'F')
|
||||
num = c - 'A' + 10;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
number = number*base + num;
|
||||
}
|
||||
|
||||
return number;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int at_cmd_adp(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
sprintf(rsp, "=%04d%04d%d%d", g_config_file.adver_min, g_config_file.adver_max, g_config_file.adver_type, g_config_file.adver_channel);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
if (data_len == 10)
|
||||
{
|
||||
uint16_t adver_min = (uint16_t)get_number_from_string(data, 0, 3, 10);
|
||||
uint16_t adver_max = (uint16_t)get_number_from_string(data, 4, 7, 10);
|
||||
uint8_t adver_type = (uint8_t)get_number_from_string(data, 8, 8, 10);
|
||||
uint8_t adver_channel = (uint8_t)get_number_from_string(data, 9, 9, 10);
|
||||
if (adver_min < 0x0020 || adver_min > adver_max)
|
||||
return AT_RESULT_WRONG;
|
||||
if (adver_max < adver_min || adver_max > 0x6400)
|
||||
return AT_RESULT_WRONG;
|
||||
if (adver_type != 0 && adver_type != 1)
|
||||
return AT_RESULT_WRONG;
|
||||
if (adver_channel <= 0 || adver_channel > 7)
|
||||
return AT_RESULT_WRONG;
|
||||
|
||||
g_config_file.adver_min = adver_min;
|
||||
g_config_file.adver_max = adver_max;
|
||||
g_config_file.adver_type = adver_type;
|
||||
g_config_file.adver_channel = adver_channel;
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
#else
|
||||
return AT_RESULT_DENY;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int at_cmd_adv(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
int i;
|
||||
if (data_len == 0)
|
||||
{
|
||||
strcpy(rsp, "=");
|
||||
for (i = 0; i < g_config_file.adver_data_len; i++)
|
||||
sprintf(rsp+strlen(rsp), "%02X", g_config_file.adver_data[i]);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
uint8_t adver_data[26];
|
||||
int tmp;
|
||||
|
||||
if ((data_len%2 != 0) || (data_len > sizeof(adver_data)*2))
|
||||
return AT_RESULT_WRONG;
|
||||
for (i = 0; i < data_len/2; i++)
|
||||
{
|
||||
tmp = get_number_from_string(data, i*2, i*2+1, 16);
|
||||
if (tmp < 0)
|
||||
return AT_RESULT_WRONG;
|
||||
adver_data[i] = (uint8_t)(tmp&0xFF);
|
||||
}
|
||||
|
||||
if (i + strlen((char *)g_config_file.ble_name) <= 26)
|
||||
{
|
||||
memset(g_config_file.adver_data, 0, sizeof(g_config_file.adver_data));
|
||||
memcpy(g_config_file.adver_data, adver_data, i);
|
||||
g_config_file.adver_data_len = i;
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
#else
|
||||
return AT_RESULT_DENY;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int at_cmd_adval(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
sprintf(rsp, "=%d", 1);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int at_cmd_disc(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
xc_disconnect();
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
|
||||
static int at_cmd_power(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
sprintf(rsp, "=%d", g_config_file.txpower);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
int power = atoi(data);
|
||||
if (power >= -10 && power <= 13)
|
||||
{
|
||||
g_config_file.txpower = (int8_t)power;
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
#else
|
||||
return AT_RESULT_DENY;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int at_cmd_mac(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
uint8_t *mac = xc_ble_get_mac(NULL);
|
||||
sprintf(rsp, "=%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
uint8_t mac[6];
|
||||
int i, tmp;
|
||||
|
||||
if (data_len == 12)
|
||||
{
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
tmp = get_number_from_string(data, i*2, i*2+1, 16);
|
||||
if (tmp < 0)
|
||||
return AT_RESULT_WRONG;
|
||||
mac[i] = (uint8_t)(tmp&0xFF);
|
||||
}
|
||||
memcpy(g_config_file.mac, mac, 6);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else if (data_len == 5 && memcmp(data, "erase", 5) == 0)
|
||||
{
|
||||
memset(g_config_file.mac, 0, 6);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
#else
|
||||
return AT_RESULT_DENY;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int at_cmd_ver(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
sprintf(rsp, "=V%s", xc_sys_get_sdk_version());
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
|
||||
|
||||
static int at_cmd_save(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
extern uint8_t g_uart_do_save;
|
||||
extern uint8_t g_uart_after_save;
|
||||
extern uint32_t g_uart_save_time;
|
||||
if (g_uart_do_save != 0)
|
||||
return AT_RESULT_WRONG;
|
||||
else
|
||||
{
|
||||
xc_config_save(CONFIG_ERASE_FLAG);
|
||||
g_uart_do_save = 1;
|
||||
g_uart_after_save = 1;
|
||||
g_uart_save_time = xc_sys_get_time();
|
||||
return AT_RESULT_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
|
||||
static int at_cmd_restore(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
extern uint8_t g_uart_do_save;
|
||||
extern uint8_t g_uart_after_save;
|
||||
extern uint32_t g_uart_save_time;
|
||||
if (g_uart_do_save != 0)
|
||||
return AT_RESULT_WRONG;
|
||||
else
|
||||
{
|
||||
xc_config_clean();
|
||||
xc_config_save(CONFIG_ERASE_FLAG);
|
||||
g_uart_do_save = 1;
|
||||
g_uart_after_save = 1;
|
||||
g_uart_save_time = xc_sys_get_time();
|
||||
return AT_RESULT_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
|
||||
static int at_cmd_conn(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 0)
|
||||
{
|
||||
uint8_t *slave_mac = xc_ble_slave_mac(NULL);
|
||||
sprintf(rsp, "=%02X%02X%02X%02X%02X%02X", slave_mac[0], slave_mac[1], slave_mac[2], slave_mac[3], slave_mac[4], slave_mac[5]);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint8_t slave_mac[6];
|
||||
int i, tmp;
|
||||
|
||||
if (data_len == 12)
|
||||
{
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
tmp = get_number_from_string(data, i*2, i*2+1, 16);
|
||||
if (tmp < 0)
|
||||
return AT_RESULT_WRONG;
|
||||
slave_mac[i] = (uint8_t)(tmp&0xFF);
|
||||
printf("%x ", slave_mac[i]);
|
||||
}
|
||||
|
||||
if(memcmp(g_config_file.slave_mac,slave_mac,6) != 0)
|
||||
{
|
||||
xc_ble_disconnect(0x0, 0x16);
|
||||
}
|
||||
|
||||
memcpy(g_config_file.slave_mac, slave_mac, 6);
|
||||
g_config_file.con_sta = 1;
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else if (data_len == 5 && memcmp(data, "erase", 5) == 0)
|
||||
{
|
||||
memset(g_config_file.slave_mac, 0, 6);
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
}
|
||||
|
||||
static int at_cmd_scan(char *data, int data_len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
if (data_len == 12)
|
||||
{
|
||||
uint8_t scan_mac[6];
|
||||
int i, tmp;
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
tmp = get_number_from_string(data, i*2, i*2+1, 16);
|
||||
if (tmp < 0)
|
||||
return AT_RESULT_WRONG;
|
||||
scan_mac[i] = (uint8_t)(tmp&0xFF);
|
||||
}
|
||||
|
||||
memcpy(g_config_file.scan_mac, scan_mac, 6);
|
||||
|
||||
extern uint8_t find_suc;
|
||||
if(find_suc)
|
||||
{
|
||||
uint8_t *slave_scan_mac = xc_ble_scan_mac(NULL);
|
||||
sprintf(rsp, "FInd idx success =%02X%02X%02X%02X%02X%02X", slave_scan_mac[0], slave_scan_mac[1], slave_scan_mac[2], slave_scan_mac[3], slave_scan_mac[4], slave_scan_mac[5]);
|
||||
}
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else if(data_len == 0)
|
||||
{
|
||||
{
|
||||
uint8_t *slave_scan_mac = xc_ble_scan_mac(NULL);
|
||||
sprintf(rsp, "FInd idx success =%02X%02X%02X%02X%02X%02X", slave_scan_mac[0], slave_scan_mac[1], slave_scan_mac[2], slave_scan_mac[3], slave_scan_mac[4], slave_scan_mac[5]);
|
||||
}
|
||||
return AT_RESULT_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
return AT_RESULT_WRONG;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static const at_cmd_t g_at_cmds_table[] = {
|
||||
{"HELP", at_cmd_help, "AT+HELP: Show all command.\r\n"},
|
||||
{"SCAN", at_cmd_scan, "AT+SCAN: Scan and Query/Get the Corresponding BLE Device.\r\n"},
|
||||
{"CON", at_cmd_conn, "AT+CONN: Retrieve / connect to the corresponding device\r\n"},
|
||||
{"RST", at_cmd_rst, "AT+RST: Reset the module.\r\n"},
|
||||
{"BAUD", at_cmd_baud, "AT+BAUD: Set/Get the uart baud rate.\r\n"},
|
||||
{"NAME", at_cmd_name, "AT+NAME: Set/Get ble name.\r\n"},
|
||||
{"ADP", at_cmd_adp, "AT+ADP: Set/Get ble advertise parameters.\r\n"},
|
||||
{"ADV", at_cmd_adv, "AT+ADV: Set/Get ble advertise data.\r\n"},
|
||||
{"ADVAL", at_cmd_adval, "AT+ADVAL: Start/Stop ble advertise.\r\n"},
|
||||
//{"CIT", at_cmd_cit, "AT+CIT: Set/Get ble connection data.\r\n"},
|
||||
{"DISC", at_cmd_disc, "AT+DISC: Disconnect ble.\r\n"},
|
||||
{"POWER", at_cmd_power, "AT+POWER: Set/Get tx power.\r\n"},
|
||||
{"MAC", at_cmd_mac, "AT+MAC: Set/Get mac address.\r\n"},
|
||||
{"VER", at_cmd_ver, "AT+VER: Get the version.\r\n"},
|
||||
//{"PID", at_cmd_pid, "AT+PID: Set/Ge PID.\r\n"},
|
||||
#if (SLEEP_ENABLE)
|
||||
#if CONFIG_SUPPORT_DEEPSLEEP
|
||||
{"SLEEP", at_cmd_sleep, "AT+SLEEP: Enter deep-sleep mode.\r\n"},
|
||||
#endif
|
||||
#endif
|
||||
{"SAVE", at_cmd_save, "AT+SAVE: Save setting.\r\n"},
|
||||
{"RESTORE", at_cmd_restore, "AT+RESTORE: Reload the default setting and reboot.\r\n"},
|
||||
//{"OTA", at_cmd_ota, "AT+OTA: Firmware update.\r\n"},
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
static at_cmd_t *at_find_cmd(char *cmd_name)
|
||||
{
|
||||
at_cmd_t *p_table = (at_cmd_t *)&user_define_at_cmds_table[0];
|
||||
while (p_table->name != NULL && p_table->func != NULL)
|
||||
{
|
||||
if (strcmp(cmd_name, p_table->name) == 0)
|
||||
{
|
||||
return p_table;
|
||||
}
|
||||
p_table++;
|
||||
}
|
||||
|
||||
p_table = (at_cmd_t *)&g_at_cmds_table[0];
|
||||
while (p_table->name != NULL && p_table->func != NULL)
|
||||
{
|
||||
if (strcmp(cmd_name, p_table->name) == 0)
|
||||
{
|
||||
return p_table;
|
||||
}
|
||||
p_table++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int xc_at_process_cmd(uint8_t *data, int len, char *rsp, int rsp_buf_len)
|
||||
{
|
||||
char cmd_name[ATCMD_NAME_MAX_SIZE];
|
||||
uint8_t bpara = 0;
|
||||
char *p_data = NULL;
|
||||
int p_data_len = 0;
|
||||
at_cmd_t *p_cmd = NULL;
|
||||
int i, j = 0;
|
||||
|
||||
memset(cmd_name, 0, sizeof(cmd_name));
|
||||
for (i = 3; i < len; i++)
|
||||
{
|
||||
if (data[i] == '=')
|
||||
bpara = 1;
|
||||
else if (data[i] == '\r' || data[i] == '\n')
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (bpara == 0)
|
||||
cmd_name[j++] = toupper(data[i]);
|
||||
else
|
||||
{
|
||||
if (p_data == NULL)
|
||||
p_data = (char *)(data+i);
|
||||
p_data_len++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (j <= 0 || j >= ATCMD_NAME_MAX_SIZE)
|
||||
{
|
||||
xc_debug("[ATCMD] cmd_name parse failed\r\n");
|
||||
return AT_RESULT_ERROR;
|
||||
}
|
||||
|
||||
p_cmd = at_find_cmd(cmd_name);
|
||||
if (p_cmd == NULL)
|
||||
{
|
||||
xc_debug("[ATCMD] not found cmd: %s (len=%d)\r\n", cmd_name, j);
|
||||
return AT_RESULT_ERROR;
|
||||
}
|
||||
|
||||
//xc_debug("[ATCMD] cmd: %s, data: %s, data_len: %d\r\n", cmd_name, p_data, p_data_len);
|
||||
return p_cmd->func(p_data, p_data_len, rsp, rsp_buf_len);
|
||||
}
|
||||
|
||||
int xc_at_data_handle(uint8_t *data, int len, at_rsp_func_t rsp_func)
|
||||
{
|
||||
char rsp[256];
|
||||
int ret;
|
||||
|
||||
if (rsp_func == NULL)
|
||||
return -1;
|
||||
g_at_cmd_rsp_func = rsp_func;
|
||||
|
||||
memset(rsp, 0, sizeof(rsp));
|
||||
ret = xc_at_process_cmd(data, len, rsp+3, sizeof(rsp)-3);
|
||||
if (ret == AT_RESULT_OK)
|
||||
memcpy(rsp, AT_RESPONSE_OK, 3);
|
||||
else if (ret == AT_RESULT_ERROR)
|
||||
strcpy(rsp, AT_RESPONSE_ERROR);
|
||||
else if (ret == AT_RESULT_WRONG)
|
||||
strcpy(rsp, AT_RESPONSE_WRONG);
|
||||
else if (ret == AT_RESULT_DENY)
|
||||
strcpy(rsp, AT_RESPONSE_DENY);
|
||||
else if (ret == AT_RESULT_NONE)
|
||||
strcpy(rsp, "");
|
||||
|
||||
if (strlen(rsp) > 0)
|
||||
{
|
||||
strcat(rsp, AT_RESPONSE_EOF);
|
||||
g_at_cmd_rsp_func((uint8_t *)rsp, strlen(rsp));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,233 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
#include "ringbuf.h"
|
||||
#include "xc_gap_api.h"
|
||||
|
||||
#define BLE_SEND_USE_LIST
|
||||
|
||||
static uint8_t g_ble_is_start = 0;
|
||||
static uint8_t g_ble_is_connected = 0;
|
||||
static uint8_t g_ble_ntf_is_enable = 0;
|
||||
static ble_event_callback_t g_ble_event_callback = NULL;
|
||||
|
||||
|
||||
|
||||
#define MIN_NUM(a, b) ((a < b) ? (a) : (b))
|
||||
|
||||
#define BLE_SEND_RINGBUF_SIZE 512
|
||||
#define BLE_SEND_BUF_SIZE 256
|
||||
|
||||
static struct ringbuf g_ble_send_ringbuf;
|
||||
static uint8_t g_ble_send_ringbuf_buf[BLE_SEND_RINGBUF_SIZE];
|
||||
static uint8_t g_ble_is_in_sending = 0;
|
||||
static uint32_t g_ble_send_ringbuf_overflow = 0;
|
||||
|
||||
WEAK int ble_send_notify_data(uint8_t *buffer, int length)
|
||||
{
|
||||
(void)buffer;
|
||||
(void)length;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ble_data_send_callback(void)
|
||||
{
|
||||
uint8_t buf[BLE_SEND_BUF_SIZE];
|
||||
int len = 0;
|
||||
int ch;
|
||||
int bytes;
|
||||
|
||||
g_ble_is_in_sending = 0;
|
||||
bytes = ringbuf_elements(&g_ble_send_ringbuf);
|
||||
bytes = MIN_NUM(bytes, xc_ble_get_mtu_size() - 3);
|
||||
bytes = MIN_NUM(bytes, BLE_SEND_BUF_SIZE);
|
||||
if (bytes > 0)
|
||||
{
|
||||
while (len < bytes)
|
||||
{
|
||||
if ((ch = ringbuf_get(&g_ble_send_ringbuf)) == -1)
|
||||
break;
|
||||
buf[len++] = (uint8_t)(ch & 0xFF);
|
||||
}
|
||||
|
||||
g_ble_is_in_sending = 1;
|
||||
ble_send_notify_data(buf, len);
|
||||
}
|
||||
}
|
||||
|
||||
static int ble_data_send(uint8_t *data, int len)
|
||||
{
|
||||
int send_len = 0;
|
||||
|
||||
while (send_len < len)
|
||||
{
|
||||
if (ringbuf_put(&g_ble_send_ringbuf, data[send_len]) == 0)
|
||||
{
|
||||
g_ble_send_ringbuf_overflow += (len - send_len);
|
||||
xc_debug("ble send overflow %d bytes\r\n", g_ble_send_ringbuf_overflow);
|
||||
break;
|
||||
}
|
||||
send_len++;
|
||||
}
|
||||
|
||||
if (g_ble_is_in_sending == 0)
|
||||
{
|
||||
ble_data_send_callback();
|
||||
}
|
||||
return send_len;
|
||||
}
|
||||
|
||||
int xc_ble_status_callback(int status)
|
||||
{
|
||||
if (status == BLE_EVENT_INIT)
|
||||
{
|
||||
g_ble_is_start = 1;
|
||||
}
|
||||
else if (status == BLE_EVENT_ADV_START)
|
||||
{
|
||||
}
|
||||
else if (status == BLE_EVENT_ADV_STOP)
|
||||
{
|
||||
}
|
||||
else if (status == BLE_EVENT_CONNECTED)
|
||||
{
|
||||
g_ble_is_connected = 1;
|
||||
#ifdef BLE_SEND_USE_LIST
|
||||
ringbuf_init(&g_ble_send_ringbuf, (uint8_t *)g_ble_send_ringbuf_buf, BLE_SEND_RINGBUF_SIZE);
|
||||
g_ble_is_in_sending = 0;
|
||||
#endif
|
||||
}
|
||||
else if (status == BLE_EVENT_DISCONNECTED)
|
||||
{
|
||||
g_ble_is_connected = 0;
|
||||
}
|
||||
else if (status == BLE_EVENT_NTF_ENABLE)
|
||||
{
|
||||
g_ble_ntf_is_enable = 1;
|
||||
}
|
||||
else if (status == BLE_EVENT_NTF_DISABLE)
|
||||
{
|
||||
g_ble_ntf_is_enable = 0;
|
||||
}
|
||||
|
||||
if (g_ble_event_callback)
|
||||
g_ble_event_callback(status, NULL, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_ble_data_recv_callback(void *data, uint32_t bytes)
|
||||
{
|
||||
if (g_ble_event_callback)
|
||||
g_ble_event_callback(BLE_EVENT_NTF_DATA, data, bytes);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*int xc_ble_set_mtu_size_callback(uint16_t mtu)
|
||||
{
|
||||
g_ble_mtu_size = mtu;
|
||||
return 0;
|
||||
}*/
|
||||
|
||||
int xc_ble_is_start(void)
|
||||
{
|
||||
if (g_ble_is_start)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_ble_is_connected(void)
|
||||
{
|
||||
if (g_ble_is_connected)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_ble_data_send(void *data, uint32_t bytes)
|
||||
{
|
||||
printf("%s g_ble_is_connected = %d g_ble_ntf_is_enable = %d \n", __func__, g_ble_is_connected, g_ble_ntf_is_enable);
|
||||
if (!g_ble_is_connected || !g_ble_ntf_is_enable)
|
||||
return 0;
|
||||
|
||||
return ble_data_send(data, bytes);
|
||||
}
|
||||
|
||||
WEAK uint16_t get_mtu_size(void)
|
||||
{
|
||||
return 23; // Default MTU size
|
||||
}
|
||||
|
||||
int xc_ble_get_mtu_size(void)
|
||||
{
|
||||
extern uint16_t get_mtu_size();
|
||||
return (int)get_mtu_size();
|
||||
}
|
||||
|
||||
uint8_t *xc_ble_get_mac(uint8_t *mac)
|
||||
{
|
||||
uint8_t *ble_mac;
|
||||
|
||||
if (g_config_file.mac[0] != 0 || g_config_file.mac[1] != 0 || g_config_file.mac[2] != 0 || g_config_file.mac[3] != 0 || g_config_file.mac[4] != 0 || g_config_file.mac[5] != 0)
|
||||
ble_mac = (uint8_t *)g_config_file.mac;
|
||||
else
|
||||
{
|
||||
extern const uint8_t DEFAULT_BLE_MAC[6];
|
||||
ble_mac = (uint8_t *)DEFAULT_BLE_MAC;
|
||||
}
|
||||
|
||||
if (mac)
|
||||
memcpy(mac, ble_mac, 6);
|
||||
return ble_mac;
|
||||
}
|
||||
|
||||
uint8_t *xc_ble_slave_mac(uint8_t *mac)
|
||||
{
|
||||
uint8_t *ble_slave_mac;
|
||||
|
||||
if (g_config_file.slave_mac[0] != 0 || g_config_file.slave_mac[1] != 0 || g_config_file.slave_mac[2] != 0 || g_config_file.slave_mac[3] != 0 || g_config_file.slave_mac[4] != 0 || g_config_file.slave_mac[5] != 0)
|
||||
ble_slave_mac = (uint8_t *)g_config_file.slave_mac;
|
||||
else
|
||||
{
|
||||
extern const uint8_t DEFAULT_SLAVE_MAC[6];
|
||||
ble_slave_mac = (uint8_t *)DEFAULT_SLAVE_MAC;
|
||||
}
|
||||
|
||||
if (mac)
|
||||
memcpy(mac, ble_slave_mac, 6);
|
||||
return ble_slave_mac;
|
||||
}
|
||||
|
||||
uint8_t *xc_ble_scan_mac(uint8_t *mac)
|
||||
{
|
||||
uint8_t *ble_scan_mac;
|
||||
|
||||
if (g_config_file.scan_mac[0] != 0 || g_config_file.scan_mac[1] != 0 || g_config_file.scan_mac[2] != 0 || g_config_file.scan_mac[3] != 0 || g_config_file.scan_mac[4] != 0 || g_config_file.scan_mac[5] != 0)
|
||||
ble_scan_mac = (uint8_t *)g_config_file.scan_mac;
|
||||
else
|
||||
{
|
||||
extern const uint8_t DEFAULT_SLAVE_MAC[6];
|
||||
ble_scan_mac = (uint8_t *)DEFAULT_SLAVE_MAC;
|
||||
}
|
||||
if (mac)
|
||||
memcpy(mac, ble_scan_mac, 6);
|
||||
return ble_scan_mac;
|
||||
}
|
||||
|
||||
int xc_disconnect(void)
|
||||
{
|
||||
if (g_ble_is_connected)
|
||||
{
|
||||
xc_ble_disconnect(0x0, 0x16);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_ble_register_callback(ble_event_callback_t p_callback)
|
||||
{
|
||||
g_ble_event_callback = p_callback;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
|
||||
#include "rf.h"
|
||||
|
||||
const uint8_t DEFAULT_BLE_MAC[6] = {0x90, 0xEB, 0x48, 0x00, 0x00, 0x01};
|
||||
const uint8_t DEFAULT_SLAVE_MAC[6] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
|
||||
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
XC_CONFIG_DATA g_config_file __attribute__ ((aligned(4)));
|
||||
const XC_CONFIG_DATA g_config_file_default __attribute__ ((aligned(4))) = {
|
||||
#else
|
||||
const XC_CONFIG_DATA g_config_file __attribute__ ((aligned(4))) = {
|
||||
#endif
|
||||
.magicflag = CONFIG_MAGIC_FLAG,
|
||||
.debug_level = 0,
|
||||
.mac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
.ble_name = "XinChip_AT",
|
||||
.adver_type = 0,
|
||||
.adver_channel = 0x07,
|
||||
.adver_data = {0x05, 0xFE, 0x01, 0x02, 0x03, 0x04},
|
||||
.adver_data_len = 0,
|
||||
.adver_min = 800,
|
||||
.adver_max = 800,
|
||||
.conn_min = 16,
|
||||
.conn_max = 32,
|
||||
.conn_latency = 0,
|
||||
.supervisionTO = 200,
|
||||
.uuid_server = {0xFF, 0xF0},
|
||||
.uuid_read = {0xFF, 0xF1},
|
||||
.uuid_write = {0xFF, 0xF2},
|
||||
.sleep_info = 0,
|
||||
.txpower = 7,
|
||||
.baudrate = 115200,
|
||||
.uart_send_delay = 0,
|
||||
.reserved = {0, 0, 0, 0, 0, 0},
|
||||
.slave_mac = {0,0,0,0,0,0},
|
||||
.con_sta = 0,
|
||||
.scan_mac = {0,0,0,0,0,0},
|
||||
.crc8 = 0,
|
||||
};
|
||||
|
||||
uint32_t xc_config_get_tx_power(void)
|
||||
{
|
||||
int8_t power = g_config_file.txpower;
|
||||
|
||||
if (power <= -10)
|
||||
return TRANS_POWER_NEGTIVE_8_9_DBM;
|
||||
else if (power <= -3)
|
||||
return TRANS_POWER_NEGTIVE_2_7_DBM;
|
||||
else if (power <= -1)
|
||||
return TRANS_POWER_0_5DBM;
|
||||
else if (power <= 0)
|
||||
return TRANS_POWER_0_6DBM;
|
||||
else if (power <= 1)
|
||||
return TRANS_POWER_2_85DBM;
|
||||
else if (power <= 2)
|
||||
return TRANS_POWER_2_9DBM;
|
||||
else if (power <= 4)
|
||||
return TRANS_POWER_4_68DBM;
|
||||
/*else if (power <= -1)
|
||||
return TRANS_POWER_4_6DBM;*/
|
||||
else if (power <= 6)
|
||||
return TRANS_POWER_6_1DBM;
|
||||
else if (power <= 7)
|
||||
return TRANS_POWER_7_3DBM;
|
||||
else if (power <= 8)
|
||||
return TRANS_POWER_8_3DBM;
|
||||
else if (power <= 9)
|
||||
return TRANS_POWER_9_2DBM;
|
||||
else if (power <= 12)
|
||||
return TRANS_POWER_13_06DBM;
|
||||
/*else if (power <= 12)
|
||||
return TRANS_POWER_13_05DBM;*/
|
||||
else
|
||||
return TRANS_POWER_13_35DBM;
|
||||
}
|
||||
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
static uint8_t crc8(uint8_t *ptr, int len)
|
||||
{
|
||||
uint8_t crc = 0;
|
||||
uint8_t i, data;
|
||||
|
||||
while(len--)
|
||||
{
|
||||
data = (*ptr)&0xFF;
|
||||
crc ^= data;
|
||||
for(i = 0;i < 8;i++)
|
||||
{
|
||||
if(crc & 0x01)
|
||||
{
|
||||
crc = (crc >> 1) ^ 0x8C;
|
||||
}
|
||||
else
|
||||
crc >>= 1;
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
#endif
|
||||
|
||||
int xc_config_direct_save(void)
|
||||
{
|
||||
extern uint8_t g_uart_do_save;
|
||||
extern uint8_t g_uart_after_save;
|
||||
extern uint32_t g_uart_save_time;
|
||||
if (g_uart_do_save != 0)
|
||||
return -1;
|
||||
else
|
||||
{
|
||||
xc_config_save(CONFIG_ERASE_FLAG);
|
||||
g_uart_do_save = 1;
|
||||
g_uart_after_save = 1;
|
||||
g_uart_save_time = xc_sys_get_time();
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
void xc_config_save(int flag)
|
||||
{
|
||||
(void)flag;
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
g_config_file.crc8 = crc8((uint8_t *)&g_config_file, sizeof(XC_CONFIG_DATA) - 1);
|
||||
#if CONFIG_SUPPORT_FLASH
|
||||
if (flag&CONFIG_ERASE_FLAG)
|
||||
xc_flash_erase_page(FLASH_ADDR_CONFIG);
|
||||
if (flag&CONFIG_WRITE_FLAG)
|
||||
xc_flash_write(FLASH_ADDR_CONFIG, (void *)&g_config_file, sizeof(XC_CONFIG_DATA));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void xc_config_clean(void)
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
uint8_t mac[6] = {0, 0, 0, 0, 0, 0};
|
||||
uint8_t crc = 0;
|
||||
|
||||
crc = crc8((uint8_t *)&g_config_file, sizeof(XC_CONFIG_DATA) - 1);
|
||||
if (g_config_file.magicflag == CONFIG_MAGIC_FLAG && crc == g_config_file.crc8)
|
||||
memcpy(mac, g_config_file.mac, 6);
|
||||
memcpy(&g_config_file, &g_config_file_default, sizeof(XC_CONFIG_DATA));
|
||||
memcpy(g_config_file.mac, mac, 6);
|
||||
#endif
|
||||
}
|
||||
|
||||
int xc_config_init(void)
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
uint8_t crc = 0;
|
||||
|
||||
#if CONFIG_SUPPORT_FLASH
|
||||
xc_flash_read(FLASH_ADDR_CONFIG, (void *)&g_config_file, sizeof(XC_CONFIG_DATA));
|
||||
#endif
|
||||
|
||||
|
||||
crc = crc8((uint8_t *)&g_config_file, sizeof(XC_CONFIG_DATA) - 1);
|
||||
|
||||
|
||||
if (g_config_file.magicflag != CONFIG_MAGIC_FLAG || crc != g_config_file.crc8)
|
||||
{
|
||||
#if CONFIG_SUPPORT_CONFIG_FILE
|
||||
memcpy(&g_config_file, &g_config_file_default, sizeof(XC_CONFIG_DATA));
|
||||
#endif
|
||||
xc_debug("config is invalid!\r\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
|
||||
#include "xc6xxx.h"
|
||||
#include "xc_drv_fmc_spi.h"
|
||||
|
||||
#define FLASH_AT_SECTOR_SIZE (4 * 1024)
|
||||
#define FLASH_PROTECT_START (0 * 1024)
|
||||
#define FLASH_PROTECT_SIZE (32 * 1024)
|
||||
|
||||
#define FLASH_OPER_UNIT (256)
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FLASH_OP_IDLE = 0,
|
||||
FLASH_OP_WAIT_WRITE,
|
||||
FLASH_OP_WAIT_ERASE
|
||||
} flash_op;
|
||||
|
||||
static flash_op g_flash_operation_state = FLASH_OP_IDLE;
|
||||
static uint32_t g_flash_operation_addr = 0;
|
||||
static uint8_t *g_flash_operation_buffer = NULL;
|
||||
static int g_flash_operation_len = 0;
|
||||
|
||||
static int flash_check(uint32_t addr, int len)
|
||||
{
|
||||
if (addr < FLASH_PROTECT_START + FLASH_PROTECT_SIZE)
|
||||
return 1;
|
||||
if (addr + len > FLASH_PROTECT_START && addr + len < FLASH_PROTECT_START + FLASH_PROTECT_SIZE)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_flash_read(uint32_t addr, void *data, int len)
|
||||
{
|
||||
#if CONFIG_SUPPORT_FLASH
|
||||
xc_fmc_spi_flash_read(addr, data, len);
|
||||
return len;
|
||||
#else
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
int xc_flash_write(uint32_t addr, void *data, int len)
|
||||
{
|
||||
#if CONFIG_SUPPORT_FLASH
|
||||
if (flash_check(addr, FLASH_AT_SECTOR_SIZE))
|
||||
return -1;
|
||||
|
||||
if (g_flash_operation_state != FLASH_OP_IDLE)
|
||||
return -1;
|
||||
|
||||
if (xc_ble_is_start())
|
||||
{
|
||||
g_flash_operation_addr = addr;
|
||||
g_flash_operation_buffer = data;
|
||||
g_flash_operation_len = len;
|
||||
g_flash_operation_state = FLASH_OP_WAIT_WRITE;
|
||||
}
|
||||
else
|
||||
{
|
||||
GLOBAL_INT_DISABLE();
|
||||
// xc_fmc_spi_flash_write(addr, data, len);
|
||||
FMC_SPI_FlashWrite(addr, data, len);
|
||||
GLOBAL_INT_RESTORE();
|
||||
}
|
||||
|
||||
return 0;
|
||||
#else
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
int xc_flash_erase_page(uint32_t addr)
|
||||
{
|
||||
#if CONFIG_SUPPORT_FLASH
|
||||
if ((addr & 0xFFFFF000) != addr)
|
||||
return -1;
|
||||
if (flash_check(addr, FLASH_AT_SECTOR_SIZE))
|
||||
return -1;
|
||||
|
||||
if (g_flash_operation_state != FLASH_OP_IDLE)
|
||||
return -1;
|
||||
|
||||
if (xc_ble_is_start())
|
||||
{
|
||||
g_flash_operation_addr = addr;
|
||||
g_flash_operation_state = FLASH_OP_WAIT_ERASE;
|
||||
}
|
||||
else
|
||||
{
|
||||
GLOBAL_INT_DISABLE();
|
||||
xc_fmc_spi_flash_erase_sector(addr);
|
||||
GLOBAL_INT_RESTORE();
|
||||
}
|
||||
|
||||
return 0;
|
||||
#else
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
int xc_flash_operation_is_finish(void)
|
||||
{
|
||||
if (g_flash_operation_state == FLASH_OP_IDLE)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_flash_handle(void)
|
||||
{
|
||||
if (g_flash_operation_state == FLASH_OP_WAIT_WRITE)
|
||||
{
|
||||
GLOBAL_INT_DISABLE();
|
||||
// xc_fmc_spi_flash_write(g_flash_operation_addr, g_flash_operation_buffer, g_flash_operation_len);
|
||||
FMC_SPI_FlashWrite(g_flash_operation_addr, g_flash_operation_buffer, g_flash_operation_len);
|
||||
GLOBAL_INT_RESTORE();
|
||||
g_flash_operation_state = FLASH_OP_IDLE;
|
||||
}
|
||||
else if (g_flash_operation_state == FLASH_OP_WAIT_ERASE)
|
||||
{
|
||||
GLOBAL_INT_DISABLE();
|
||||
xc_fmc_spi_flash_erase_sector(g_flash_operation_addr);
|
||||
GLOBAL_INT_RESTORE();
|
||||
g_flash_operation_state = FLASH_OP_IDLE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_flash_init(void)
|
||||
{
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
|
||||
int xc_flash_get_ruid(uint8_t *ruid)
|
||||
{
|
||||
if (ruid)
|
||||
{
|
||||
xc_fmc_spi_flash_ruid(ruid);
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
//#include "xc_secukey.h"
|
||||
#include "../uart_task.h"
|
||||
|
||||
#include "xc6xxx.h"
|
||||
|
||||
static void hardware_time_init(void)
|
||||
{
|
||||
RTC_InitCfg_t rtc_cfg = {0};
|
||||
|
||||
rtc_cfg.Date.Sec = 0;
|
||||
rtc_cfg.Date.Min = 0;
|
||||
rtc_cfg.Date.Hour = 0;
|
||||
rtc_cfg.Date.Day = 0;
|
||||
rtc_cfg.Date.Week = 0;
|
||||
|
||||
rtc_cfg.DateLimit.SecLimit = 60;
|
||||
rtc_cfg.DateLimit.MinLimit = 60;
|
||||
rtc_cfg.DateLimit.HourLimit = 24;
|
||||
|
||||
rtc_cfg.MatchTime.ch = RTC_MATCH_T1;
|
||||
rtc_cfg.MatchTime.Sec = 0;
|
||||
rtc_cfg.MatchTime.Min = 0;
|
||||
rtc_cfg.MatchTime.Hour = 0;
|
||||
rtc_cfg.MatchTime.Week = RTC_MATCH_SATURDAY;
|
||||
rtc_cfg.MatchTimeEnable = false;
|
||||
|
||||
rtc_cfg.SecIT_Enable = false;
|
||||
rtc_cfg.MinIT_Enable = false;
|
||||
rtc_cfg.HourIT_Enable = false;
|
||||
rtc_cfg.DayIT_Enable = false;
|
||||
|
||||
xc_rtc_init(&rtc_cfg);
|
||||
xc_rtc_start();
|
||||
}
|
||||
|
||||
__RAM_CODE uint32_t hardware_time_get(void)
|
||||
{
|
||||
return rtc_ccvr_get() * 1000 + (rtc_rvr_get() * 1000) / 32768;
|
||||
}
|
||||
|
||||
void xc_main_init(void)
|
||||
{
|
||||
static uint8_t init_flag = 0;
|
||||
if (init_flag == 0)
|
||||
{
|
||||
init_flag = 1;
|
||||
|
||||
xc_sys_init();
|
||||
xc_flash_init();
|
||||
xc_config_init();
|
||||
}
|
||||
}
|
||||
|
||||
void xc_main_start(void)
|
||||
{
|
||||
xc_debug("sdk version: %s, build time: %s %s\r\n", xc_sys_get_sdk_version(), __DATE__, __TIME__);
|
||||
|
||||
// 1. system init
|
||||
xc_main_init();
|
||||
|
||||
// 2. start hardware time
|
||||
hardware_time_init();
|
||||
|
||||
// 3. start application
|
||||
uart_task_start();
|
||||
|
||||
// 5. start user_main
|
||||
extern int user_main(void);
|
||||
user_main();
|
||||
}
|
||||
|
||||
void xc_main_run(void)
|
||||
{
|
||||
extern void xc_task_run(void);
|
||||
xc_task_run();
|
||||
|
||||
extern int xc_flash_handle(void);
|
||||
xc_flash_handle();
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
|
||||
#include "xc6xxx.h"
|
||||
|
||||
static sys_event_callback_t g_sys_event_callback = NULL;
|
||||
|
||||
static void hardware_reset(void)
|
||||
{
|
||||
WDT_InitCfg_t wdt_cfg;
|
||||
|
||||
NVIC_EnableIRQ(WDT_IRQn);
|
||||
wdt_cfg.WorkMode = WDT_WORK_MODE0;
|
||||
wdt_cfg.ReloadValue = WDT_CLK_32M_RESET_MODE1_65536US;
|
||||
wdt_cfg.PclkSel = WDT_WORK_32M;
|
||||
xc_wdt_init(&wdt_cfg);
|
||||
xc_wdt_start();
|
||||
}
|
||||
|
||||
const char *xc_sys_get_sdk_version(void)
|
||||
{
|
||||
return SDK_VER;
|
||||
}
|
||||
|
||||
uint32_t xc_sys_get_time(void)
|
||||
{
|
||||
extern uint32_t hardware_time_get(void);
|
||||
return hardware_time_get();
|
||||
}
|
||||
|
||||
void xc_sys_reset(void)
|
||||
{
|
||||
if (g_sys_event_callback)
|
||||
g_sys_event_callback(SYS_EVENT_REBOOT, NULL);
|
||||
|
||||
hardware_reset();
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
void xc_sys_wait_us(uint32_t us)
|
||||
{
|
||||
delay_us(us);
|
||||
}
|
||||
|
||||
#if (SLEEP_ENABLE)
|
||||
#if CONFIG_SUPPORT_DEEPSLEEP
|
||||
void xc_sys_enter_deepsleep(int wake_gpio, int wake_level)
|
||||
{
|
||||
uint8_t wake_pin = ((wake_gpio & 0xFF) + GPIO_0);
|
||||
|
||||
system_sleep_init();
|
||||
// PWRKEY Initialization is required after deep sleep wakeup
|
||||
xc_pwr_pwrkey_init();
|
||||
if (wake_gpio != NOPIN)
|
||||
xc_pwr_pwrkey_deepsleep_wake_config(wake_pin, !wake_level);
|
||||
system_deepsleep_cfg();
|
||||
|
||||
int xc_gpio_configure_sleep_check(void);
|
||||
xc_gpio_configure_sleep_check();
|
||||
|
||||
while (1)
|
||||
{
|
||||
xc_deep_sleep();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int xc_sys_register_event(sys_event_callback_t p_callback)
|
||||
{
|
||||
g_sys_event_callback = p_callback;
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
|
||||
int xc_sys_init(void)
|
||||
{
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
|
||||
static task_handle_t *g_task_head = NULL;
|
||||
static task_handle_t *g_task_run = NULL;
|
||||
|
||||
task_handle_t *xc_task_create(task_handle_t *task, task_func_t func)
|
||||
{
|
||||
task_handle_t *tmp;
|
||||
|
||||
if (task == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (task)
|
||||
{
|
||||
task->func = func;
|
||||
task->run_flag = 1;
|
||||
if (g_task_head == NULL)
|
||||
{
|
||||
g_task_head = task;
|
||||
g_task_run = g_task_head;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = g_task_head;
|
||||
while (tmp->next)
|
||||
tmp = tmp->next;
|
||||
tmp->next = task;
|
||||
}
|
||||
|
||||
func();
|
||||
return task;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void xc_task_delete(task_handle_t *task)
|
||||
{
|
||||
if (task)
|
||||
{
|
||||
task->run_flag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void xc_task_run(void)
|
||||
{
|
||||
task_handle_t *tmp = g_task_run;
|
||||
|
||||
if (tmp && tmp->func)
|
||||
{
|
||||
tmp->func();
|
||||
tmp = tmp->next;
|
||||
if (tmp)
|
||||
g_task_run = tmp;
|
||||
else
|
||||
g_task_run = g_task_head;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
#include "ringbuf.h"
|
||||
|
||||
#include "xc6xxx.h"
|
||||
|
||||
#define UART0_IRQ_SIZE 256
|
||||
|
||||
static uint8_t g_uart_init[2] = {0, 0};
|
||||
static struct ringbuf g_uart0_ringbuf;
|
||||
static uint8_t g_uart0_ringbuf_buf[UART0_IRQ_SIZE];
|
||||
uart_event_callback_t g_uart_event_callback = NULL;
|
||||
static uint32_t g_uart0_ringbuf_buf_overflow = 0;
|
||||
|
||||
static FUNC_IN_RAM void UART0_handler_callback(uint8_t *buff, uint16_t len)
|
||||
{
|
||||
if (g_uart_init[0] == 0)
|
||||
return;
|
||||
|
||||
int i;
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
if (ringbuf_put(&g_uart0_ringbuf, buff[i]) == 0)
|
||||
{
|
||||
g_uart0_ringbuf_buf_overflow += (len - i);
|
||||
xc_debug("uart0 irq overflow %d bytes\r\n", g_uart0_ringbuf_buf_overflow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static FUNC_IN_RAM void UART_handler_callback(uint8_t *buff, uint16_t len)
|
||||
{
|
||||
UART0_handler_callback(buff, len);
|
||||
}
|
||||
|
||||
static uint32_t conv_baudrate(int baudrate)
|
||||
{
|
||||
if (baudrate == 4800)
|
||||
return UART_BAUDRATE_4800;
|
||||
else if (baudrate == 9600)
|
||||
return UART_BAUDRATE_9600;
|
||||
else if (baudrate == 19200)
|
||||
return UART_BAUDRATE_19200;
|
||||
else if (baudrate == 38400)
|
||||
return UART_BAUDRATE_38400;
|
||||
else if (baudrate == 57600)
|
||||
return UART_BAUDRATE_57600;
|
||||
else if (baudrate == 115200)
|
||||
return UART_BAUDRATE_115200;
|
||||
else if (baudrate == 230400)
|
||||
return UART_BAUDRATE_230400;
|
||||
else if (baudrate == 921600)
|
||||
return UART_BAUDRATE_921600;
|
||||
else if (baudrate == 1000000)
|
||||
return UART_BAUDRATE_1M;
|
||||
else
|
||||
return UART_BAUDRATE_115200;
|
||||
}
|
||||
|
||||
uart_handle_t xc_uart_open(int uart_id, int baudrate)
|
||||
{
|
||||
if (uart_id != 0 && uart_id != 1)
|
||||
return NULL;
|
||||
|
||||
if (g_uart_init[uart_id] != 0)
|
||||
return NULL;
|
||||
|
||||
if (uart_id == 0)
|
||||
{
|
||||
printf("%s\n", __func__);
|
||||
ringbuf_init(&g_uart0_ringbuf, (uint8_t *)g_uart0_ringbuf_buf, UART0_IRQ_SIZE);
|
||||
|
||||
// because modeify retarget UART, need config UART pin
|
||||
GPIO_InitCfg_t gpio_cfg = {0};
|
||||
gpio_cfg.Mux = GPIO_Mux0;
|
||||
gpio_cfg.Pull = GPIO_PULLUP;
|
||||
gpio_cfg.Int = NOT_INT;
|
||||
|
||||
gpio_cfg.Pin = GPIO_18;
|
||||
gpio_cfg.Dir = GPIO_DIR_OUTPUT;
|
||||
gpio_cfg.FunSel = UART1_TX;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
|
||||
gpio_cfg.Pin = GPIO_19;
|
||||
gpio_cfg.Dir = GPIO_DIR_INPUT;
|
||||
gpio_cfg.FunSel = UART1_RX;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
|
||||
UART_InitCfg_t uart_cfg = {0};
|
||||
uart_cfg.Parity = UART_PARITY_DISABLE;
|
||||
uart_cfg.StopBits = UART_TCR_STOP_1BITS;
|
||||
uart_cfg.WordLength = UART_DATA_8_BITS;
|
||||
uart_cfg.BaudRate = conv_baudrate(baudrate);
|
||||
uart_cfg.HardwareFlowControl = UART_HWFC_DISABLE;
|
||||
|
||||
xc_uart_init(UART1_IDX, &uart_cfg);
|
||||
xc_uart_register_receive_cb(UART1_IDX, UART_handler_callback);
|
||||
xc_uart_enable_rx_it(UART1_IDX);
|
||||
NVIC_EnableIRQ(UART1_IRQn);
|
||||
|
||||
g_uart_init[0] = 1;
|
||||
return (uart_handle_t)XC_UART0;
|
||||
}
|
||||
else if (uart_id == 1)
|
||||
{
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int xc_uart_recv(uart_handle_t uart_handle, void *data, uint32_t bytes)
|
||||
{
|
||||
int len = 0;
|
||||
int ch;
|
||||
int uart_id = (int)uart_handle - (int)XC_UART0;
|
||||
uint8_t *p_data = (uint8_t *)data;
|
||||
|
||||
if (g_uart_init[uart_id] == 0)
|
||||
return -1;
|
||||
|
||||
if (uart_id == 0)
|
||||
{
|
||||
while (len < bytes)
|
||||
{
|
||||
if ((ch = ringbuf_get(&g_uart0_ringbuf)) == -1)
|
||||
break;
|
||||
|
||||
p_data[len++] = (uint8_t)(ch & 0xFF);
|
||||
}
|
||||
}
|
||||
else if (uart_id == 1)
|
||||
{
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int xc_uart_send(uart_handle_t uart_handle, void *data, uint32_t bytes)
|
||||
{
|
||||
int uart_id = (int)uart_handle - (int)XC_UART0;
|
||||
|
||||
if (g_uart_init[uart_id] == 0)
|
||||
return -1;
|
||||
|
||||
if (uart_id == 0)
|
||||
{
|
||||
xc_uart_send_data(UART1_IDX, data, bytes);
|
||||
}
|
||||
else if (uart_id == 1)
|
||||
{
|
||||
}
|
||||
|
||||
return bytes;
|
||||
}
|
||||
|
||||
int xc_uart_close(uart_handle_t uart_handle)
|
||||
{
|
||||
int uart_id = (int)uart_handle - (int)XC_UART0;
|
||||
|
||||
if (g_uart_init[uart_id] == 0)
|
||||
return -1;
|
||||
|
||||
if (uart_id == 0)
|
||||
{
|
||||
}
|
||||
else if (uart_id == 1)
|
||||
{
|
||||
}
|
||||
|
||||
g_uart_init[uart_id] = 0;
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
|
||||
int xc_uart_register_callback(uart_event_callback_t p_callback)
|
||||
{
|
||||
g_uart_event_callback = p_callback;
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
|
||||
#include "uart_task.h"
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
#define UART_TASK_BUF_SIZE 256
|
||||
#define UART_DATA_WAIT_TIME 50
|
||||
|
||||
static task_handle_t g_uart_task;
|
||||
static uart_handle_t g_uart_handle = NULL;
|
||||
static uint8_t g_uart_buf[UART_TASK_BUF_SIZE];
|
||||
|
||||
uint8_t g_uart_do_save = 0;
|
||||
uint8_t g_uart_after_save = 0;
|
||||
uint32_t g_uart_save_time = 0;
|
||||
|
||||
|
||||
#define AT_CMD_HDR ("AT+")
|
||||
|
||||
static int uart_data_is_atcmd(uint8_t *data, int len)
|
||||
{
|
||||
char cmd_hdr[4];
|
||||
int i;
|
||||
|
||||
if (len <= 3)
|
||||
return 0;
|
||||
|
||||
cmd_hdr[0]=(char)toupper((int)data[0]);
|
||||
cmd_hdr[1]=(char)toupper((int)data[1]);
|
||||
cmd_hdr[2]=(char)toupper((int)data[2]);
|
||||
cmd_hdr[3]='\0';
|
||||
|
||||
if (memcmp(cmd_hdr, AT_CMD_HDR, strlen(AT_CMD_HDR)) != 0)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
if (data[i] == '\r' || data[i] == '\n')
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int uart_data_send(uint8_t *data, int len)
|
||||
{
|
||||
return xc_uart_send(g_uart_handle, data, len);
|
||||
}
|
||||
|
||||
static void uart_data_handle(uint8_t *data, int len)
|
||||
{
|
||||
//xc_debug("uart recv %d bytes\r\n", len);
|
||||
//xc_debug_hex(data, len);
|
||||
|
||||
if (uart_data_is_atcmd(data, len))
|
||||
{
|
||||
xc_at_data_handle(data, len, uart_data_send);
|
||||
}
|
||||
else
|
||||
{
|
||||
extern uart_event_callback_t g_uart_event_callback;
|
||||
if (g_uart_event_callback)
|
||||
len = g_uart_event_callback(UART0_EVENT_DATA, data, len);
|
||||
}
|
||||
}
|
||||
|
||||
static void uart_do_save_check(void)
|
||||
{
|
||||
if (!(g_uart_do_save != 0 && xc_sys_get_time() - g_uart_save_time > 100))
|
||||
return;
|
||||
g_uart_save_time = xc_sys_get_time();
|
||||
|
||||
if (g_uart_do_save == 1 && xc_flash_operation_is_finish())
|
||||
{
|
||||
xc_config_save(CONFIG_WRITE_FLAG);
|
||||
g_uart_do_save = 2;
|
||||
}
|
||||
if (g_uart_do_save == 2 && xc_flash_operation_is_finish())
|
||||
{
|
||||
if (g_uart_after_save == 1)
|
||||
uart_data_send(AT_RESPONSE_OK AT_RESPONSE_EOF, strlen(AT_RESPONSE_OK AT_RESPONSE_EOF));
|
||||
else if (g_uart_after_save == 2)
|
||||
xc_sys_reset();
|
||||
g_uart_do_save = 0;
|
||||
g_uart_after_save =0;
|
||||
}
|
||||
}
|
||||
|
||||
static int uart_recv_timeout(int baudrate)
|
||||
{
|
||||
#if 0
|
||||
if (baudrate == 4800)
|
||||
return 200;
|
||||
else if (baudrate == 9600)
|
||||
return 100;
|
||||
else if (baudrate == 19200)
|
||||
return 100;
|
||||
else if (baudrate == 38400)
|
||||
return 100;
|
||||
else if (baudrate == 57600)
|
||||
return 100;
|
||||
else //>=115200
|
||||
return UART_DATA_WAIT_TIME;
|
||||
#else
|
||||
return UART_DATA_WAIT_TIME;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void uart_task(void)
|
||||
{
|
||||
static int recv_num = 0;
|
||||
static uint32_t recv_time = 0;
|
||||
int len;
|
||||
|
||||
if (g_uart_handle == NULL)
|
||||
g_uart_handle = xc_uart_open(0, g_config_file.baudrate);
|
||||
|
||||
len = xc_uart_recv(g_uart_handle, g_uart_buf + recv_num, UART_TASK_BUF_SIZE - recv_num);
|
||||
if (len > 0)
|
||||
{
|
||||
recv_num += len;
|
||||
recv_time = xc_sys_get_time();
|
||||
}
|
||||
|
||||
if (recv_num >= UART_TASK_BUF_SIZE || (recv_num > 0 && xc_sys_get_time() - recv_time > uart_recv_timeout(115200)))
|
||||
{
|
||||
uart_data_handle(g_uart_buf, recv_num);
|
||||
recv_num = 0;
|
||||
recv_time = 0;
|
||||
}
|
||||
|
||||
uart_do_save_check();
|
||||
}
|
||||
|
||||
void uart_task_start(void)
|
||||
{
|
||||
xc_task_create(&g_uart_task, uart_task);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef _UART_TASK_H_
|
||||
#define _UART_TASK_H_
|
||||
|
||||
|
||||
void uart_task_start(void);
|
||||
|
||||
int uart_data_send(uint8_t *data, int len);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif/* _UART_TASK_H_ */
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
#include "xc_head.h"
|
||||
|
||||
|
||||
const at_cmd_t user_define_at_cmds_table[] = {
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
static int sys_event_callback(uint32_t event_id, void * param)
|
||||
{
|
||||
switch (event_id)
|
||||
{
|
||||
case SYS_EVENT_REBOOT:
|
||||
xc_debug("system reboot\r\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int uart_recv_callback(uint32_t event_id, void *data, uint32_t len)
|
||||
{
|
||||
if (event_id == UART0_EVENT_DATA)
|
||||
{
|
||||
xc_debug("uart recv %d bytes data\r\n", len);
|
||||
xc_ble_data_send(data, len);
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static int ble_recv_callback(uint32_t event_id, void *data, uint32_t len)
|
||||
{
|
||||
switch (event_id)
|
||||
{
|
||||
case BLE_EVENT_INIT:
|
||||
xc_debug("ble init\r\n");
|
||||
break;
|
||||
case BLE_EVENT_ADV_START:
|
||||
xc_debug("ble adv start\r\n");
|
||||
xc_uart_send(XC_UART0, "CONN=0\r\n", strlen("CONN=0\r\n"));
|
||||
break;
|
||||
case BLE_EVENT_ADV_STOP:
|
||||
xc_debug("ble adv stop\r\n");
|
||||
xc_uart_send(XC_UART0, "CONN=1\r\n", strlen("CONN=1\r\n"));
|
||||
break;
|
||||
case BLE_EVENT_CONNECTED:
|
||||
xc_debug("ble connected\r\n");
|
||||
xc_uart_send(XC_UART0, "CONN=2\r\n", strlen("CONN=2\r\n"));
|
||||
break;
|
||||
case BLE_EVENT_DISCONNECTED:
|
||||
xc_debug("ble disconnected\r\n");
|
||||
xc_uart_send(XC_UART0, "CONN=3\r\n", strlen("CONN=3\r\n"));
|
||||
break;
|
||||
case BLE_EVENT_NTF_ENABLE:
|
||||
xc_debug("ble enable\r\n");
|
||||
break;
|
||||
case BLE_EVENT_NTF_DISABLE:
|
||||
xc_debug("ble disable\r\n");
|
||||
break;
|
||||
case BLE_EVENT_NTF_DATA:
|
||||
xc_debug("ble recv %d bytes data\r\n", len);
|
||||
xc_uart_send(XC_UART0, data, len);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int user_main(void)
|
||||
{
|
||||
xc_debug("start user_main %s %s\r\n", __DATE__, __TIME__);
|
||||
|
||||
if (xc_sys_register_event((sys_event_callback_t)sys_event_callback) != XC_SUCCESS)
|
||||
{
|
||||
xc_debug("register uart callback fail!\r\n");
|
||||
}
|
||||
|
||||
if (xc_uart_register_callback((uart_event_callback_t)uart_recv_callback) != XC_SUCCESS)
|
||||
{
|
||||
xc_debug("register uart callback fail!\r\n");
|
||||
}
|
||||
|
||||
if (xc_ble_register_callback((ble_event_callback_t)ble_recv_callback) != XC_SUCCESS)
|
||||
{
|
||||
xc_debug("register ble callback fail!\r\n");
|
||||
}
|
||||
|
||||
return XC_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_batt.c
|
||||
*
|
||||
* @brief Battery Application Module entry point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // SW configuration
|
||||
|
||||
#if (BLE_APP_BATT)
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "app_batt.h" // Battery Application Module Definitions
|
||||
#include "app_task.h" // application task definitions
|
||||
#include "bass_msg.h" // health thermometer functions
|
||||
#include "co_bt.h"
|
||||
#include "co_utils.h"
|
||||
#include "prf_types.h" // Profile common types definition
|
||||
#include "arch.h" // Platform Definitions
|
||||
#include "prf.h"
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Battery Application Module Environment Structure
|
||||
struct app_batt_env_tag app_batt_env;
|
||||
|
||||
/*
|
||||
* GLOBAL FUNCTION DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
void app_batt_init(void)
|
||||
{
|
||||
// Reset the environment
|
||||
memset(&app_batt_env, 0, sizeof(struct app_batt_env_tag));
|
||||
|
||||
// Initial battery level: 100
|
||||
app_batt_env.batt_lvl = 100;
|
||||
}
|
||||
|
||||
void app_batt_add_bas(void)
|
||||
{
|
||||
struct bass_db_cfg* db_cfg;
|
||||
// Allocate the BASS_CREATE_DB_REQ
|
||||
struct gapm_profile_task_add_cmd *req = KE_MSG_ALLOC_DYN(GAPM_PROFILE_TASK_ADD_CMD,
|
||||
TASK_GAPM, TASK_APP,
|
||||
gapm_profile_task_add_cmd, sizeof(struct bass_db_cfg));
|
||||
// Fill message
|
||||
req->operation = GAPM_PROFILE_TASK_ADD;
|
||||
req->sec_lvl = 0;//PERM(SVC_AUTH, AUTH);
|
||||
req->prf_api_id = TASK_ID_BASS;
|
||||
req->app_task = TASK_APP;
|
||||
req->start_hdl = 0;
|
||||
|
||||
// Set parameters
|
||||
db_cfg = (struct bass_db_cfg* ) req->param;
|
||||
|
||||
// Add a BAS instance
|
||||
db_cfg->bas_nb = 1;
|
||||
// Sending of notifications is supported
|
||||
db_cfg->features[0] = BAS_BATT_LVL_NTF_SUP;
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(req);
|
||||
}
|
||||
|
||||
void app_batt_enable_prf(uint8_t conidx)
|
||||
{
|
||||
app_batt_env.conidx = conidx;
|
||||
|
||||
// Allocate the message
|
||||
struct bass_enable_req * req = KE_MSG_ALLOC(BASS_ENABLE_REQ,
|
||||
prf_dst_task_get(TASK_ID_BASS),
|
||||
TASK_APP,
|
||||
bass_enable_req);
|
||||
|
||||
// Fill in the parameter structure
|
||||
req->conidx = conidx;
|
||||
|
||||
// NTF initial status - Disabled
|
||||
req->ntf_cfg = PRF_CLI_STOP_NTFIND;
|
||||
req->old_batt_lvl[0] = 50;
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(req);
|
||||
}
|
||||
|
||||
void app_batt_send_lvl(uint8_t batt_lvl)
|
||||
{
|
||||
ASSERT_ERR(batt_lvl <= BAS_BATTERY_LVL_MAX);
|
||||
|
||||
// Allocate the message
|
||||
struct bass_batt_level_upd_req * req = KE_MSG_ALLOC(BASS_BATT_LEVEL_UPD_REQ,
|
||||
prf_dst_task_get(TASK_ID_BASS),
|
||||
TASK_APP,
|
||||
bass_batt_level_upd_req);
|
||||
|
||||
// Fill in the parameter structure
|
||||
req->bas_instance = 0;
|
||||
req->batt_level = batt_lvl;
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(req);
|
||||
}
|
||||
|
||||
static int bass_batt_level_ntf_cfg_ind_handler(ke_msg_id_t const msgid,
|
||||
struct bass_batt_level_ntf_cfg_ind const *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
static int batt_level_upd_handler(ke_msg_id_t const msgid,
|
||||
struct bass_batt_level_upd_rsp const *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief
|
||||
*
|
||||
* @param[in] msgid Id of the message received.
|
||||
* @param[in] param Pointer to the parameters of the message.
|
||||
* @param[in] dest_id ID of the receiving task instance (TASK_GAP).
|
||||
* @param[in] src_id ID of the sending task instance.
|
||||
*
|
||||
* @return If the message was consumed or not.
|
||||
****************************************************************************************
|
||||
*/
|
||||
static int app_batt_msg_dflt_handler(ke_msg_id_t const msgid,
|
||||
void const *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
// Drop the message
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
/*
|
||||
* LOCAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Default State handlers definition
|
||||
const struct ke_msg_handler app_batt_msg_handler_list[] =
|
||||
{
|
||||
// Note: first message is latest message checked by kernel so default is put on top.
|
||||
{KE_MSG_DEFAULT_HANDLER, (ke_msg_func_t)app_batt_msg_dflt_handler},
|
||||
|
||||
{BASS_BATT_LEVEL_NTF_CFG_IND, (ke_msg_func_t)bass_batt_level_ntf_cfg_ind_handler},
|
||||
{BASS_BATT_LEVEL_UPD_RSP, (ke_msg_func_t)batt_level_upd_handler},
|
||||
};
|
||||
|
||||
const struct app_subtask_handlers app_batt_handlers = APP_HANDLERS(app_batt);
|
||||
|
||||
#endif //BLE_APP_BATT
|
||||
|
||||
/// @} APP
|
||||
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_batt.h
|
||||
*
|
||||
* @brief Battery Application Module entry point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef APP_BATT_H_
|
||||
#define APP_BATT_H_
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP
|
||||
* @ingroup RICOW
|
||||
*
|
||||
* @brief Battery Application Module entry point
|
||||
*
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // SW configuration
|
||||
|
||||
#if (BLE_APP_BATT)
|
||||
|
||||
#include <stdint.h> // Standard Integer Definition
|
||||
#include "ke_task.h" // Kernel Task Definition
|
||||
|
||||
/*
|
||||
* STRUCTURES DEFINITION
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Battery Application Module Environment Structure
|
||||
struct app_batt_env_tag
|
||||
{
|
||||
/// Connection handle
|
||||
uint8_t conidx;
|
||||
/// Current Battery Level
|
||||
uint8_t batt_lvl;
|
||||
};
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLES DECLARATIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Battery Application environment
|
||||
extern struct app_batt_env_tag app_batt_env;
|
||||
|
||||
/// Table of message handlers
|
||||
extern const struct app_subtask_handlers app_batt_handlers;
|
||||
|
||||
/*
|
||||
* FUNCTIONS DECLARATION
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* Health Thermometer Application Functions
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Initialize Battery Application Module
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_init(void);
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Add a Battery Service instance in the DB
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_add_bas(void);
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Enable the Battery Service
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_enable_prf(uint8_t conidx);
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Send a Battery level value
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_batt_send_lvl(uint8_t batt_lvl);
|
||||
|
||||
#endif //(BLE_APP_BATT)
|
||||
|
||||
/// @} APP
|
||||
|
||||
#endif // APP_BATT_H_
|
||||
@@ -0,0 +1,56 @@
|
||||
#if 0
|
||||
/*@TRACE*/
|
||||
enum basc_msg_id
|
||||
{
|
||||
/// Start the Battery Service Client Role - at connection
|
||||
// BASC_ENABLE_REQ = MSG_ID(BASC, 0x00),
|
||||
///Confirm that cfg connection has finished with discovery results, or that normal cnx started
|
||||
BASC_ENABLE_RSP = MSG_ID(BASC, 0x01),
|
||||
|
||||
/// Read Characteristic Value Request
|
||||
// BASC_READ_INFO_REQ = MSG_ID(BASC, 0x02),
|
||||
/// Read Characteristic Value Request
|
||||
BASC_READ_INFO_RSP = MSG_ID(BASC, 0x03),
|
||||
|
||||
/// Write Battery Level Notification Configuration Value request
|
||||
// BASC_BATT_LEVEL_NTF_CFG_REQ = MSG_ID(BASC, 0x04),
|
||||
/// Write Battery Level Notification Configuration Value response
|
||||
BASC_BATT_LEVEL_NTF_CFG_RSP = MSG_ID(BASC, 0x05),
|
||||
|
||||
/// Indicate to APP that the Battery Level value has been received
|
||||
BASC_BATT_LEVEL_IND = MSG_ID(BASC, 0x06),
|
||||
};
|
||||
#endif
|
||||
|
||||
void xc_basc_enbale_req()
|
||||
{
|
||||
//send msg
|
||||
BASC_ENABLE_REQ
|
||||
}
|
||||
|
||||
void xc_basc_read_info_req()
|
||||
{
|
||||
//send msg
|
||||
BASC_READ_INFO_REQ
|
||||
}
|
||||
|
||||
void xc_basc_batt_leval_ntf_cfg_req()
|
||||
{
|
||||
//send msg
|
||||
BASC_BATT_LEVEL_NTF_CFG_REQ
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Default State handlers definition
|
||||
KE_MSG_HANDLER_TAB(basc)
|
||||
{
|
||||
// Note: all messages must be sorted in ID ascending order
|
||||
|
||||
{BASC_ENABLE_RSP, (ke_msg_func_t) xxx_handler },
|
||||
{BASC_READ_INFO_RSP, (ke_msg_func_t) xxx_handler },
|
||||
{BASC_BATT_LEVEL_NTF_CFG_RSP, (ke_msg_func_t) xxx_handler },
|
||||
{BASC_BATT_LEVEL_IND, (ke_msg_func_t) xxx_handler },
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,546 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_sec.c
|
||||
*
|
||||
* @brief Application Security Entry Point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
#include "rwip_config.h"
|
||||
#if (BLE_APP_PRESENT)
|
||||
#if (BLE_HOST_SUPPORT_SMP)
|
||||
#include "rwip_config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include "co_utils.h"
|
||||
#include "co_math.h"
|
||||
//#include "gapc_task.h" // GAP Controller Task API Definition
|
||||
#include "gap.h" // GAP Definition
|
||||
#include "gapc.h" // GAPC Definition
|
||||
#include "gapc_int.h"
|
||||
#include "prf_types.h"
|
||||
|
||||
#include "app_sec.h" // Application Security API Definition
|
||||
#include "app_task.h" // Application Manager API Definition
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
#include "nvds.h" // NVDS API Definitions
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
#include "app_task.h"
|
||||
uint8_t bond_flag = 0;
|
||||
struct gapc_ltk g_ltk = {0};
|
||||
/*
|
||||
* GLOBAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Application Security Environment Structure
|
||||
struct app_sec_env_tag app_sec_env;
|
||||
|
||||
/*
|
||||
* GLOBAL FUNCTION DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
void app_sec_init()
|
||||
{
|
||||
/*------------------------------------------------------
|
||||
* RETRIEVE BOND STATUS
|
||||
*------------------------------------------------------*/
|
||||
#if (NVDS_SUPPORT)
|
||||
uint8_t length = NVDS_LEN_PERIPH_BONDED;
|
||||
|
||||
// Get bond status from NVDS
|
||||
if (nvds_get(NVDS_TAG_PERIPH_BONDED, &length, (uint8_t *)&app_sec_env.bonded) != NVDS_OK)
|
||||
{
|
||||
// If read value is invalid, set status to not bonded
|
||||
app_sec_env.bonded = false;
|
||||
}
|
||||
|
||||
if ((app_sec_env.bonded != true) && (app_sec_env.bonded != false))
|
||||
{
|
||||
app_sec_env.bonded = false;
|
||||
}
|
||||
LOGI("===bond_state:%d\r\n",app_sec_env.bonded);
|
||||
#endif //(NVDS_SUPPORT)
|
||||
}
|
||||
|
||||
bool app_sec_get_bond_status(void)
|
||||
{
|
||||
return app_sec_env.bonded;
|
||||
}
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
void app_sec_remove_bond(void)
|
||||
{
|
||||
#if (BLE_APP_HID)
|
||||
uint16_t ntf_cfg = PRF_CLI_STOP_NTFIND;
|
||||
#endif //(BLE_APP_HID)
|
||||
|
||||
// Check if we are well bonded
|
||||
if (app_sec_env.bonded == true)
|
||||
{
|
||||
// Update the environment variable
|
||||
app_sec_env.bonded = false;
|
||||
|
||||
if (nvds_put(NVDS_TAG_PERIPH_BONDED, NVDS_LEN_PERIPH_BONDED,
|
||||
(uint8_t *)&app_sec_env.bonded) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
if (nvds_del(NVDS_TAG_LTK) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
if (nvds_del(NVDS_TAG_PEER_BD_ADDRESS) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
#if (BLE_APP_HID)
|
||||
if (nvds_put(NVDS_TAG_MOUSE_NTF_CFG, NVDS_LEN_MOUSE_NTF_CFG,
|
||||
(uint8_t *)&ntf_cfg) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
#endif //(BLE_APP_HID)
|
||||
}
|
||||
}
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
|
||||
/*
|
||||
* MESSAGE HANDLERS
|
||||
****************************************************************************************
|
||||
*/
|
||||
static int app_sec_msg_dflt_handler(ke_msg_id_t const msgid,
|
||||
void *param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
// Drop the message
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static int gapc_bond_req_ind_handler(ke_msg_id_t const msgid,
|
||||
void const * p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
struct gapc_bond_req_ind *param = (struct gapc_bond_req_ind *)p_param;
|
||||
LOGI(" [debug] gapc_bond_req_ind_handler,request:0x%x \r\n",param->request);
|
||||
// Prepare the GAPC_BOND_CFM message
|
||||
struct gapc_bond_cfm *cfm = KE_MSG_ALLOC(GAPC_BOND_CFM,
|
||||
src_id, TASK_APP,
|
||||
gapc_bond_cfm);
|
||||
switch (param->request)
|
||||
{
|
||||
case (GAPC_PAIRING_REQ):
|
||||
{
|
||||
cfm->request = GAPC_PAIRING_RSP;
|
||||
{
|
||||
cfm->accept = true;
|
||||
#if (BLE_SEC_CON)
|
||||
cfm->data.pairing_feat.auth = GAP_AUTH_REQ_SEC_CON_BOND;
|
||||
#else // (BLE_SEC_CON)
|
||||
cfm->data.pairing_feat.auth = GAP_AUTH_REQ_NO_MITM_BOND;
|
||||
#endif // (BLE_SEC_CON)
|
||||
|
||||
app_env.sec_con_enabled = true;
|
||||
cfm->data.pairing_feat.iocap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT;//GAP_IO_CAP_KB_ONLY;//GAP_IO_CAP_DISPLAY_ONLY;//GAP_IO_CAP_NO_INPUT_NO_OUTPUT;
|
||||
cfm->data.pairing_feat.key_size = 16;
|
||||
cfm->data.pairing_feat.oob = GAP_OOB_AUTH_DATA_NOT_PRESENT;
|
||||
cfm->data.pairing_feat.sec_req = GAP_SEC1_NOAUTH_PAIR_ENC;//GAP_SEC1_AUTH_PAIR_ENC;//GAP_NO_SEC;
|
||||
cfm->data.pairing_feat.rkey_dist = GAP_KDIST_ENCKEY | GAP_KDIST_IDKEY;
|
||||
cfm->data.pairing_feat.ikey_dist = GAP_KDIST_ENCKEY | GAP_KDIST_IDKEY;
|
||||
}
|
||||
} break;
|
||||
|
||||
case (GAPC_LTK_EXCH):
|
||||
{
|
||||
// Counter
|
||||
uint8_t counter;
|
||||
cfm->accept = true;
|
||||
cfm->request = GAPC_LTK_EXCH;
|
||||
// Generate all the values
|
||||
cfm->data.ltk.ediv = (uint16_t)co_rand_word();
|
||||
|
||||
for (counter = 0; counter < RAND_NB_LEN; counter++)
|
||||
{
|
||||
cfm->data.ltk.ltk.key[counter] = (uint8_t)co_rand_word();
|
||||
cfm->data.ltk.randnb.nb[counter] = (uint8_t)co_rand_word();
|
||||
}
|
||||
|
||||
for (counter = RAND_NB_LEN; counter < KEY_LEN; counter++)
|
||||
{
|
||||
cfm->data.ltk.ltk.key[counter] = (uint8_t)co_rand_word();
|
||||
}
|
||||
#if (1)
|
||||
LOGI( "nvds_put cfm->ediv=0x%x\r\nparam_randnb:",cfm->data.ltk.ediv);
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",cfm->data.ltk.randnb.nb[i]);
|
||||
LOGI("\r\nltk:");
|
||||
for(uint8_t i=0;i<GAP_KEY_LEN;i++)
|
||||
LOGI( "%x",cfm->data.ltk.ltk.key[i]);
|
||||
LOGI("\r\n");
|
||||
#endif
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
uint8_t err = nvds_del(NVDS_TAG_LTK);
|
||||
LOGI("err2 =%d \n", err);
|
||||
// Store the generated value in NVDS
|
||||
if (nvds_put(NVDS_TAG_LTK, NVDS_LEN_LTK, (uint8_t *)&cfm->data.ltk) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
|
||||
// uint8_t buff5[10] = {1,2,3,4,5,6,9,8,9,11};
|
||||
// // LOGI("nvds del:%d \r\n",nvds_del(16));
|
||||
// if (nvds_put(18, 10, buff5) != NVDS_OK)
|
||||
// {
|
||||
// LOGI("77111\r\n");
|
||||
// ASSERT_ERR(0);
|
||||
// }
|
||||
// LOGI("77222\r\n");
|
||||
|
||||
#endif // #if (NVDS_SUPPORT)
|
||||
} break;
|
||||
|
||||
|
||||
case (GAPC_IRK_EXCH):
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
uint8_t addr_len = BD_ADDR_LEN;
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
cfm->accept = true;
|
||||
cfm->request = GAPC_IRK_EXCH;
|
||||
|
||||
// Load IRK
|
||||
memcpy(cfm->data.irk.irk.key, app_env.loc_irk, KEY_LEN);
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
if (nvds_get(NVDS_TAG_BD_ADDRESS, &addr_len, cfm->data.irk.addr.addr) != NVDS_OK)
|
||||
#endif //(NVDS_SUPPORT)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
// load device address
|
||||
cfm->data.irk.addr.addr_type = (cfm->data.irk.addr.addr[5] & 0xC0) ? ADDR_RAND : ADDR_PUBLIC;
|
||||
} break;
|
||||
|
||||
|
||||
//#if (BLE_APP_HT)
|
||||
case (GAPC_TK_EXCH):
|
||||
{
|
||||
// Generate a PIN Code- (Between 100000 and 999999)
|
||||
uint32_t pin_code = (100000 + (co_rand_word()%900000));
|
||||
|
||||
LOGI("app_sec GAPC_TK_EXCH: tk_type=%d\r\n",param->data.tk_type);
|
||||
cfm->accept = true;
|
||||
cfm->request = GAPC_TK_EXCH;
|
||||
|
||||
// Set the TK value
|
||||
memset(cfm->data.tk.key, 0, KEY_LEN);
|
||||
|
||||
cfm->data.tk.key[0] = (uint8_t)((pin_code & 0x000000FF) >> 0);
|
||||
cfm->data.tk.key[1] = (uint8_t)((pin_code & 0x0000FF00) >> 8);
|
||||
cfm->data.tk.key[2] = (uint8_t)((pin_code & 0x00FF0000) >> 16);
|
||||
cfm->data.tk.key[3] = (uint8_t)((pin_code & 0xFF000000) >> 24);
|
||||
|
||||
LOGI("###GAPC_TK_EXCH pincode=%d\r\n", pin_code);
|
||||
|
||||
} break;
|
||||
//#endif //(BLE_APP_HT)
|
||||
|
||||
default:
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
} break;
|
||||
}
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(cfm);
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
static int gapc_bond_ind_handler(ke_msg_id_t const msgid,
|
||||
void const *p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
struct gapc_bond_ind const *param = (struct gapc_bond_ind const *)p_param;
|
||||
|
||||
LOGI(" [debug] gapc_bond_ind_handler : info=%d\r\n", param->info);
|
||||
switch (param->info)
|
||||
{
|
||||
case (GAPC_PAIRING_SUCCEED):
|
||||
{
|
||||
// Update the bonding status in the environment
|
||||
app_sec_env.bonded = true;
|
||||
bond_flag = 1;
|
||||
LOGI("GAPC_PAIRING_SUCCEED auth=%d,ltk_present=%d\r\n",
|
||||
param->data.pairing.level,param->data.pairing.ltk_present);
|
||||
|
||||
// Update the bonding status in the environment
|
||||
#if (PLF_NVDS)
|
||||
uint8_t err = nvds_del(NVDS_TAG_PERIPH_BONDED);
|
||||
LOGI("err1 =%d \n", err);
|
||||
if (nvds_put(NVDS_TAG_PERIPH_BONDED, NVDS_LEN_PERIPH_BONDED,
|
||||
(uint8_t *)&app_sec_env.bonded) != NVDS_OK)
|
||||
{
|
||||
// An error has occurred during access to the NVDS
|
||||
ASSERT_ERR(0);
|
||||
LOGI("3\n");
|
||||
}
|
||||
LOGI("4\n");
|
||||
// Set the BD Address of the peer device in NVDS
|
||||
uint8_t err2 = nvds_del(NVDS_TAG_PEER_BD_ADDRESS);
|
||||
LOGI("err2 =%d \n", err);
|
||||
struct app_env_tag *app_env = get_app_env();
|
||||
if (nvds_put(NVDS_TAG_PEER_BD_ADDRESS, NVDS_LEN_PEER_BD_ADDRESS,
|
||||
(uint8_t *)gapc_get_bdaddr(app_env->slave_conidx, GAPC_SMP_INFO_PEER)) != NVDS_OK)
|
||||
{
|
||||
// An error has occurred during access to the NVDS
|
||||
ASSERT_ERR(0);
|
||||
LOGI("5\n");
|
||||
}
|
||||
LOGI("6\n");
|
||||
#endif //(PLF_NVDS)
|
||||
|
||||
|
||||
|
||||
} break;
|
||||
|
||||
case (GAPC_REPEATED_ATTEMPT):
|
||||
{
|
||||
// app_disconnect();
|
||||
} break;
|
||||
|
||||
case (GAPC_IRK_EXCH):
|
||||
{
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
// Store peer identity in NVDS
|
||||
LOGI("GAPC_IRK_EXCH\r\n");
|
||||
uint8_t err = nvds_del(NVDS_TAG_PEER_IRK);
|
||||
LOGI("err2 =%d \n", err);
|
||||
if (nvds_put(NVDS_TAG_PEER_IRK, NVDS_LEN_PEER_IRK, (uint8_t *)¶m->data.irk.irk.key[0]) != NVDS_OK)
|
||||
|
||||
{
|
||||
LOGI("1\r\n");
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
LOGI("2\r\n");
|
||||
|
||||
#endif // (NVDS_SUPPORT)
|
||||
} break;
|
||||
|
||||
case (GAPC_PAIRING_FAILED):
|
||||
{
|
||||
// app_sec_send_security_req(0);
|
||||
} break;
|
||||
|
||||
// In Secure Connections we get BOND_IND with SMPC calculated LTK
|
||||
case (GAPC_LTK_EXCH) :
|
||||
{
|
||||
LOGI( "GAPC_LTK_EXCH sec_con_enabled=%d\r\n",app_env.sec_con_enabled);
|
||||
|
||||
LOGI( " param->ediv=0x%x\r\nparam_randnb:",param->data.ltk.ediv);
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",param->data.ltk.randnb.nb[i]);
|
||||
LOGI("\r\nltk:");
|
||||
for(uint8_t i=0;i<GAP_KEY_LEN;i++)
|
||||
LOGI( "%x",param->data.ltk.ltk.key[i]);
|
||||
LOGI("\r\n");
|
||||
|
||||
#if (0)
|
||||
if (app_env.sec_con_enabled == true)
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
// Store LTK in NVDS
|
||||
if (nvds_put(NVDS_TAG_LTK, NVDS_LEN_LTK,(uint8_t *)¶m->data.ltk.ltk.key[0]) != NVDS_OK)
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
#endif // (NVDS_SUPPORT)
|
||||
}
|
||||
#endif // (BLE_APP_SEC_CON)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
} break;
|
||||
}
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
static int gapc_encrypt_req_ind_handler(ke_msg_id_t const msgid,
|
||||
void const *p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
struct gapc_encrypt_req_ind const *param = (struct gapc_encrypt_req_ind const *)p_param;
|
||||
#endif // (NVDS_SUPPORT)
|
||||
LOGI(" [debug] gapc_encrypt_req_ind_handler \r\n");
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
// LTK value
|
||||
struct gapc_ltk ltk;
|
||||
// Length
|
||||
uint8_t length = NVDS_LEN_LTK;
|
||||
#endif // #if (NVDS_SUPPORT)
|
||||
|
||||
// Prepare the GAPC_ENCRYPT_CFM message
|
||||
struct gapc_encrypt_cfm *cfm = KE_MSG_ALLOC(GAPC_ENCRYPT_CFM,
|
||||
src_id, TASK_APP,
|
||||
gapc_encrypt_cfm);
|
||||
|
||||
cfm->found = false;
|
||||
|
||||
|
||||
LOGI("app_sec gapc_encrypt_req_ind_handler: bonded=%d\r\n", app_sec_env.bonded);
|
||||
|
||||
|
||||
// if (app_sec_env.bonded)
|
||||
{
|
||||
#if (NVDS_SUPPORT)
|
||||
// Retrieve the required informations from NVDS
|
||||
if (nvds_get(NVDS_TAG_LTK, &length, (uint8_t *)<k) == NVDS_OK)
|
||||
{
|
||||
|
||||
|
||||
LOGI( "nvds_get param->ediv=0x%x,ltk.ediv=0x%x\r\nparam_randnb:",param->ediv,ltk.ediv);
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",param->rand_nb.nb[i]);
|
||||
LOGI("\r\nltk.randnb.nb:");
|
||||
for(uint8_t i=0;i<GAP_RAND_NB_LEN;i++)
|
||||
LOGI( "%x",ltk.randnb.nb[i]);
|
||||
LOGI("\r\n");
|
||||
|
||||
|
||||
// Check if the provided EDIV and Rand Nb values match with the stored values
|
||||
if ((param->ediv == ltk.ediv) &&
|
||||
!memcmp(¶m->rand_nb.nb[0], <k.randnb.nb[0], sizeof(struct rand_nb)))
|
||||
{
|
||||
LOGI("EDIV and randnb are same!!!\r\n");
|
||||
cfm->found = true;
|
||||
cfm->key_size = 16;
|
||||
memcpy(&cfm->ltk, <k.ltk, sizeof(struct gap_sec_key));
|
||||
bond_flag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGI("EDIV and randnb not same!!!\r\n");
|
||||
}
|
||||
/*
|
||||
* else we are bonded with another device, disconnect the link
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT_ERR(0);
|
||||
}
|
||||
#endif // (NVDS_SUPPORT)
|
||||
}
|
||||
/*
|
||||
* else the peer device is not known, an error should trigger a new pairing procedure.
|
||||
*/
|
||||
|
||||
// Send the message
|
||||
ke_msg_send(cfm);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
|
||||
static int gapc_encrypt_ind_handler(ke_msg_id_t const msgid,
|
||||
void const *p_param,
|
||||
ke_task_id_t const dest_id,
|
||||
ke_task_id_t const src_id)
|
||||
{
|
||||
struct gapc_encrypt_ind const *param = (struct gapc_encrypt_ind const *)p_param;
|
||||
LOGI(" [debug] gapc_encrypt_ind_handler \r\n");
|
||||
|
||||
// encryption/ re-encryption succeeded
|
||||
|
||||
LOGI("app_sec gapc_encrypt_ind_handler: auth=%d\r\n", param->pairing_lvl);
|
||||
|
||||
|
||||
// struct gapc_set_le_pkt_size_cmd *req = KE_MSG_ALLOC(GAPC_SET_LE_PKT_SIZE_CMD,
|
||||
// KE_BUILD_ID(TASK_GAPC, KE_IDX_GET(src_id)), TASK_APP,
|
||||
// gapc_set_le_pkt_size_cmd);
|
||||
|
||||
// req->operation = GAPC_SET_LE_PKT_SIZE;
|
||||
// req->tx_octets = 0xFB;
|
||||
// req->tx_time = 2120;
|
||||
|
||||
// // Send the message
|
||||
// ke_msg_send(req);
|
||||
|
||||
|
||||
|
||||
|
||||
return (KE_MSG_CONSUMED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* LOCAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Default State handlers definition
|
||||
const struct ke_msg_handler app_sec_msg_handler_list[] =
|
||||
{
|
||||
// Note: first message is latest message checked by kernel so default is put on top.
|
||||
{KE_MSG_DEFAULT_HANDLER, (ke_msg_func_t)app_sec_msg_dflt_handler},
|
||||
|
||||
{GAPC_BOND_REQ_IND, (ke_msg_func_t)gapc_bond_req_ind_handler},
|
||||
{GAPC_BOND_IND, (ke_msg_func_t)gapc_bond_ind_handler},
|
||||
|
||||
{GAPC_ENCRYPT_REQ_IND, (ke_msg_func_t)gapc_encrypt_req_ind_handler},
|
||||
{GAPC_ENCRYPT_IND, (ke_msg_func_t)gapc_encrypt_ind_handler},
|
||||
};
|
||||
|
||||
const struct app_subtask_handlers app_sec_handlers = {&app_sec_msg_handler_list[0], ARRAY_LEN(app_sec_msg_handler_list)};
|
||||
#endif
|
||||
#endif // (BLE_APP_PRESENT)
|
||||
|
||||
/// @} APP
|
||||
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file app_sec.h
|
||||
*
|
||||
* @brief Application Security Entry Point
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup APP_SEC
|
||||
* @{
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef APP_SEC_H_
|
||||
#define APP_SEC_H_
|
||||
|
||||
/*
|
||||
* INCLUDE FILES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h> // Standard Integer Definition
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* STRUCTURES DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
struct app_sec_env_tag
|
||||
{
|
||||
// Bond status
|
||||
bool bonded;
|
||||
};
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLE DECLARATIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/// Application Security Environment
|
||||
extern struct app_sec_env_tag app_sec_env;
|
||||
|
||||
/// Table of message handlers
|
||||
extern const struct app_subtask_handlers app_sec_handlers;
|
||||
|
||||
/*
|
||||
* GLOBAL FUNCTIONS DECLARATIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Initialize the Application Security Module
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_sec_init(void);
|
||||
|
||||
#if (NVDS_SUPPORT)
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Remove all bond data stored in NVDS
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_sec_remove_bond(void);
|
||||
#endif //(NVDS_SUPPORT)
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Send a security request to the peer device. This function is used to
|
||||
*require the central to start the encryption with a LTK that would have shared
|
||||
*during a previous bond procedure.
|
||||
*
|
||||
* @param[in] - conidx: Connection Index
|
||||
****************************************************************************************
|
||||
*/
|
||||
void app_sec_send_security_req(uint8_t conidx);
|
||||
|
||||
#endif // APP_SEC_H_
|
||||
|
||||
/// @} APP_SEC
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,519 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file arch_main.c
|
||||
*
|
||||
* @brief Main loop of the application.
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // RW SW configuration
|
||||
#include "xc_drv_pwr.h"
|
||||
#if (USE_ROM_FLASH)
|
||||
#include "xc6xxx_fmc_spi.h"
|
||||
#endif // (USE_ROM_FLASH)
|
||||
#include "app_task.h"
|
||||
#include "rom_port.h"
|
||||
#include "xc_drv_bor.h"
|
||||
#if (BLE_TEST_MODE_SUPPORT)
|
||||
#include "uart.h" // UART initialization
|
||||
#endif // (BLE_TEST_MODE_SUPPORT)
|
||||
|
||||
#if (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||||
#include "rf.h" // RF initialization
|
||||
#endif // BLE_EMB_PRESENT || BT_EMB_PRESENT
|
||||
|
||||
#if (PLF_NVDS)
|
||||
#include "nvds.h" // NVDS definitions
|
||||
#endif // PLF_NVDS
|
||||
|
||||
#include "xc6xxx.h"
|
||||
#include "xc_drv_fmc_spi.h"
|
||||
#include "xc_main.h"
|
||||
#include "xc_head.h"
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @addtogroup DRIVERS
|
||||
* @{
|
||||
*
|
||||
*
|
||||
* ****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
/// NVDS location in FLASH : 0x000E0000 (896KB (1Mo - 128KB))
|
||||
#define NVDS_FLASH_ADDRESS (0x0003E000)
|
||||
|
||||
/// NVDS size in RAM : 0x00010000 (128KB)
|
||||
#define NVDS_FLASH_SIZE (0x00000200)
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLE DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* MAIN FUNCTION
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief RW main function.
|
||||
*
|
||||
* This function is called right after the booting process has completed.
|
||||
*
|
||||
* @return status exit status
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
void flash_init()
|
||||
{
|
||||
// uint32_t mid = 0;
|
||||
// uint32_t flash_size;
|
||||
// uint16_t flash_type;
|
||||
// xc_fmc_spi_init_oprt();
|
||||
// xc_fmc_spi_flash_wake_up();
|
||||
|
||||
// xc_fmc_spi_flash_rdid((uint8_t *)&mid);
|
||||
// LOGI("Flash RDID: 0x%08x\n", mid);
|
||||
|
||||
|
||||
#if (PLF_NVDS)
|
||||
if (false == flash_size_and_type_get(&flash_size, &flash_type)) {
|
||||
LOGI("Flash Memory size Get ERROR ! ");
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
nvds_space_init(flash_size);
|
||||
#endif
|
||||
// if chip unique get failed,then use flash RUID
|
||||
if (false == xc_unique_identification_read(co_default_bdaddr.addr)) {
|
||||
uint8_t ruid[16];
|
||||
xc_fmc_spi_flash_ruid(ruid);
|
||||
LOGI("Flash RUID11: ");
|
||||
for (int i = 0; i < 16; i++) {
|
||||
LOGI("%02x ", ruid[i]);
|
||||
}
|
||||
LOGI("\n");
|
||||
LOGI("The chip does not have unique , then use flash RUID\n");
|
||||
memset(co_default_bdaddr.addr, 0, 6);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
co_default_bdaddr.addr[i % 6] += ruid[i];
|
||||
}
|
||||
}
|
||||
xc_main_init();
|
||||
uint8_t ble_addr[6];
|
||||
xc_ble_get_mac(ble_addr);
|
||||
co_default_bdaddr.addr[0] = ble_addr[5];
|
||||
co_default_bdaddr.addr[1] = ble_addr[4];
|
||||
co_default_bdaddr.addr[2] = ble_addr[3];
|
||||
co_default_bdaddr.addr[3] = ble_addr[2];
|
||||
co_default_bdaddr.addr[4] = ble_addr[1];
|
||||
co_default_bdaddr.addr[5] = ble_addr[0];
|
||||
}
|
||||
|
||||
#define clrbit(x, y) ((x) &= ~(1 << (y)))
|
||||
#define AHB_CTL clrbit(*(uint32_t volatile *)(0x40000000 + 0x130), 0)
|
||||
#define _TOSTRING(s) #s
|
||||
#define TOSTRING(s) _TOSTRING(s)
|
||||
|
||||
extern void clock_init(void);
|
||||
void app_uart_init(void)
|
||||
{
|
||||
GPIO_InitCfg_t gpio_cfg = {0};
|
||||
|
||||
gpio_cfg.Mux = GPIO_Mux1;
|
||||
gpio_cfg.Pull = GPIO_PULLUP;
|
||||
gpio_cfg.Int = NOT_INT;
|
||||
gpio_cfg.FunSel = UART0_TX;
|
||||
|
||||
gpio_cfg.Pin = GPIO_12;
|
||||
gpio_cfg.Dir = GPIO_DIR_OUTPUT;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
|
||||
gpio_cfg.FunSel = UART0_RX;
|
||||
gpio_cfg.Pin = GPIO_13;
|
||||
gpio_cfg.Dir = GPIO_DIR_INPUT;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
|
||||
UART_InitCfg_t uart_cfg = {0};
|
||||
|
||||
uart_cfg.Parity = UART_PARITY_DISABLE;
|
||||
uart_cfg.StopBits = UART_STOP_1_BITS;
|
||||
uart_cfg.WordLength = UART_DATA_8_BITS;
|
||||
uart_cfg.BaudRate = UART_BAUDRATE_115200;
|
||||
uart_cfg.HardwareFlowControl = UART_HWFC_DISABLE;
|
||||
|
||||
xc_uart_init(UART0_IDX, &uart_cfg);
|
||||
gpio_cfg.FunSel = GPIO_Dx;
|
||||
gpio_cfg.Pin = GPIO_18;
|
||||
gpio_cfg.Dir = GPIO_DIR_INPUT;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
gpio_cfg.FunSel = GPIO_Dx;
|
||||
gpio_cfg.Pin = GPIO_19;
|
||||
gpio_cfg.Dir = GPIO_DIR_INPUT;
|
||||
xc_gpio_init(&gpio_cfg);
|
||||
}
|
||||
void wdt_init(void)
|
||||
{
|
||||
WDT_InitCfg_t wdt_cfg ;
|
||||
|
||||
wdt_cfg.WorkMode = WDT_WORK_MODE0;
|
||||
wdt_cfg.ReloadValue = WDT_CLK_32K_RESET_MODE0_2048MS;
|
||||
wdt_cfg.PclkSel = WDT_WORK_32K;
|
||||
xc_wdt_init(&wdt_cfg);
|
||||
xc_wdt_start();
|
||||
}
|
||||
|
||||
void system_lightsleep_cfg()
|
||||
{
|
||||
#if (USE_XIP != 1)
|
||||
cprao_aon_puctrl1_set(0x4); /* puctrl1= 0x4 , SSI0RX must pulldown*/
|
||||
#endif
|
||||
cprao_aon_sys_time_set((RST_READY_TIME << 12) | (OSC32_STABLE_TIME));
|
||||
|
||||
xc_pwr_pd_lightsleep_set();
|
||||
xc_pwr_sleepsrc_mask_set(0x1e001e);
|
||||
xc_pwr_osc_off();
|
||||
}
|
||||
|
||||
struct ADV_INFO adv_info;
|
||||
void set_single_addr_name(uint8_t conidx, uint8_t reason)
|
||||
{
|
||||
uint32_t flash_type=0;
|
||||
uint32_t flash_size=0;
|
||||
uint8_t spi_idx=0;
|
||||
int32_t mid = 0;
|
||||
xc_fmc_spi_flash_rdid((uint8_t *)&mid);
|
||||
flash_type = (mid & 0xffff);
|
||||
flash_size = (mid >> 16) & 0xff;
|
||||
|
||||
flash_type = (mid & 0xffff);
|
||||
uint32_t write_addr=0;
|
||||
switch(flash_size)
|
||||
{
|
||||
case FLASH_128K_FLAG:
|
||||
write_addr = (1024 * 128)-256;
|
||||
if(flash_type==PURAN_128K_FLASH)
|
||||
{
|
||||
write_addr = (1024 * 124)-256;
|
||||
}
|
||||
break;
|
||||
case FLASH_256K_FLAG:
|
||||
write_addr = (1024 * 256)-256;
|
||||
break;
|
||||
case FLASH_512K_FLAG:
|
||||
write_addr = (1024 * 512)-256;
|
||||
break;
|
||||
case FLASH_1M_FLAG:
|
||||
write_addr = (1024 * 1024)-256;
|
||||
break;
|
||||
case FLASH_2M_FLAG:
|
||||
write_addr = (1024 * 2048)-256;
|
||||
break;
|
||||
}
|
||||
uint8_t para_buf[256];
|
||||
memset(¶_buf,0xFF,256);
|
||||
memcpy(&adv_info.addr,&co_default_bdaddr.addr,6);
|
||||
memcpy(¶_buf,&adv_info,28);
|
||||
xc_fmc_spi_flash_erase_page(write_addr);
|
||||
xc_fmc_spi_flash_write_page(write_addr, para_buf,FLASH_PAGE_SIZE);
|
||||
}
|
||||
/* Zero the host global variable. */
|
||||
void rom_env_host_init()
|
||||
{
|
||||
uint32_t *ptr = (uint32_t *)(0x10000800);
|
||||
memset(ptr, 0, 0x10001300 - 0x10000800);
|
||||
rom_env.prf_cleanup = set_single_addr_name;
|
||||
rom_env.stack_printf = printf;
|
||||
}
|
||||
|
||||
void board_init()
|
||||
{
|
||||
clock_init();
|
||||
|
||||
app_uart_init();
|
||||
|
||||
LOGI("sdk version: %s build time: %s %s\n", TOSTRING(SDK_VERSION), __DATE__,
|
||||
__TIME__);
|
||||
// xc_fmc_spi_init_oprt();
|
||||
#if (SLEEP_ENABLE)
|
||||
// xc_rc32k_calib_by_hw();
|
||||
// xc_rc32k_calib_by_soft();
|
||||
#endif // (SLEEP_ENABLE)
|
||||
rom_env_host_init();
|
||||
rom_env_init();
|
||||
AHB_CTL;
|
||||
|
||||
// Initialize random process
|
||||
// srand(1);
|
||||
}
|
||||
|
||||
__RAM_CODE __STATIC int8_t rf_rssi_convert(uint8_t rssi_reg)
|
||||
{
|
||||
int8_t rssi_dbm;
|
||||
// uint16_t power_modem;
|
||||
|
||||
if (rssi_reg < 128) {
|
||||
rssi_dbm = rssi_reg - 50;
|
||||
} else {
|
||||
rssi_dbm = rssi_reg - 256 - 50;
|
||||
}
|
||||
#if (CONN_RSSI_DEBUG)
|
||||
if(evt_start){
|
||||
printf("con rssi %d\n", rssi_dbm);
|
||||
}
|
||||
#endif
|
||||
return (rssi_dbm);
|
||||
}
|
||||
|
||||
void bluetooth_init()
|
||||
{
|
||||
|
||||
uint32_t error = RESET_NO_ERROR;
|
||||
flash_init();
|
||||
#if (PLF_NVDS)
|
||||
|
||||
// Initialize NVDS module
|
||||
nvds_init(NVDS_FLASH_SIZE);
|
||||
#endif // PLF_NVDS
|
||||
/*
|
||||
************************************************************************************
|
||||
* RW SW stack initialization
|
||||
************************************************************************************
|
||||
*/
|
||||
NVIC_SetPriority((IRQn_Type)BLE_IRQn, 0);
|
||||
NVIC_EnableIRQ((IRQn_Type)BLE_IRQn);
|
||||
#if defined(CFG_RSSI_ENABLE)
|
||||
// Initialize modem
|
||||
modem_init(1);
|
||||
#else
|
||||
modem_init(0);
|
||||
#endif // defined(CFG_RSSI_ENABLE)
|
||||
// Measure the single carrier and configure the correct frequency offset.
|
||||
// rf_xtal_cal_set(uint8_t set_value);
|
||||
rf_tx_power_set(TRANS_POWER_0_5DBM);
|
||||
// Initialize RF
|
||||
#if (BT_EMB_PRESENT || BLE_EMB_PRESENT)
|
||||
rf_init(&rwip_rf);
|
||||
rwip_rf.rssi_convert = rf_rssi_convert;
|
||||
#endif // BT_EMB_PRESENT || BLE_EMB_PRESENT
|
||||
// Initialize RW SW stack
|
||||
rwip_init(error);
|
||||
|
||||
uint32_t seed;
|
||||
rwip_time_t current_time = rwip_time_get();
|
||||
seed = current_time.hs;
|
||||
seed += current_time.hus;
|
||||
//Init the random seed
|
||||
co_random_init(seed);
|
||||
|
||||
#if (BLE_TEST_MODE_SUPPORT)
|
||||
enter_test_mode();
|
||||
#else // (BLE_TEST_MODE_SUPPORT)
|
||||
// Initialize APP
|
||||
app_init();
|
||||
#endif // (BLE_TEST_MODE_SUPPORT)
|
||||
// finally start interrupt handling
|
||||
GLOBAL_INT_START();
|
||||
}
|
||||
|
||||
#if ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
extern uint8_t adv_evt_start ; // adv event
|
||||
extern uint8_t evt_start ; // conn event
|
||||
extern volatile uint8_t sv_lock;
|
||||
extern volatile uint8_t sv_txlen;
|
||||
__RAM_CODE void PendSV_Handler(void)
|
||||
{
|
||||
if(adv_evt_start){ // adv event
|
||||
#if (ADV_EVENT_NOT_RUN_XIP ==1)
|
||||
while (!sv_lock)
|
||||
;
|
||||
#endif // (ADV_EVENT_NOT_RUN_XIP ==1)
|
||||
}else if(evt_start){ // conn event
|
||||
#if (CONN_EVENT_NOT_RUN_XIP == 0)
|
||||
uint32_t nus = sv_txlen * 8 + 148;
|
||||
uint32_t unit = 32;
|
||||
uint32_t temp;
|
||||
|
||||
SysTick->CTRL = 0x00;
|
||||
SysTick->LOAD = unit * nus - unit + 1;
|
||||
|
||||
SysTick->VAL = 0;
|
||||
SysTick->CTRL = 0x05;
|
||||
|
||||
do {
|
||||
temp = SysTick->CTRL;
|
||||
if (sv_lock) {
|
||||
break;
|
||||
}
|
||||
} while ((temp & 0x01) && (!(temp & (1 << 16))));
|
||||
#endif // (CONN_EVENT_NOT_RUN_XIP == 0)
|
||||
|
||||
#if (CONN_EVENT_NOT_RUN_XIP == 1)
|
||||
while (!sv_lock)
|
||||
;
|
||||
#endif // (CONN_EVENT_NOT_RUN_XIP == 1)
|
||||
}
|
||||
|
||||
}
|
||||
#endif // ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
|
||||
#if (FLASH_TEST_IN_INTERRUPT)
|
||||
void flash_test_in_interrupt(void)
|
||||
{
|
||||
uint8_t wr_data[10] = {0x63,0x89,0x63,0x89,0x63,0x89};
|
||||
uint8_t rd_data[10] ={0};
|
||||
// Timer 1 can be used for flash, interrupt priority is lower than bluetooth, then higher than other interrupts.
|
||||
// Operate flash in timer 1 interrupt context, no need to lock interrupt, won't affect bluetooth send/receive packets.
|
||||
// xc_fmc_spi_flash_write(0x32000 , wr_data, sizeof(wr_data));
|
||||
xc_fmc_spi_flash_write_page(0x32000, wr_data,
|
||||
sizeof(wr_data));
|
||||
xc_fmc_spi_flash_read(0x32000 , rd_data, sizeof(rd_data));
|
||||
for(uint8_t i = 0;i<sizeof(rd_data);i++)
|
||||
{
|
||||
printf(" %02x ",rd_data[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
|
||||
|
||||
void timer_init(uint8_t timer_idx,uint32_t us)
|
||||
{
|
||||
Timer_InitCfg_t timer_cfg;
|
||||
|
||||
timer_cfg.timer_src_clk = TIMER_CLK_SRC_32K;
|
||||
timer_cfg.timer_div_clk = TIMER_DIV_CLK_16MHzOr16K;
|
||||
timer_cfg.timer_mode = TIMER_MODE_CYCLE;
|
||||
|
||||
xc_timer_init(timer_idx, &timer_cfg);
|
||||
xc_timer_set_value(timer_idx, us);
|
||||
xc_timer_start(timer_idx);
|
||||
NVIC_SetPriority((IRQn_Type)TIMER0_IRQn + timer_idx, 1);
|
||||
}
|
||||
|
||||
void timer1_callback(void *context) {
|
||||
flash_test_in_interrupt();
|
||||
}
|
||||
#endif // (FLASH_TEST_IN_INTERRUPT)
|
||||
|
||||
|
||||
#if (FLASH_TEST_IN_TASK)
|
||||
void flash_test_in_task(void)
|
||||
{
|
||||
uint8_t wr_data[10] = {0x63,0x89,0x63,0x89,0x63,0x89};
|
||||
static uint8_t wr_cnt= 0;
|
||||
uint8_t rd_data[10] ={0};
|
||||
wr_cnt++;
|
||||
if(wr_cnt >= 252)
|
||||
{
|
||||
wr_cnt = 0;
|
||||
}
|
||||
wr_data[9] = wr_cnt;
|
||||
GLOBAL_INT_DISABLE();
|
||||
xc_fmc_spi_flash_write_page(0x32000, wr_data,
|
||||
sizeof(wr_data));
|
||||
xc_fmc_spi_flash_read(0x32000 , rd_data, sizeof(rd_data));
|
||||
|
||||
GLOBAL_INT_RESTORE();
|
||||
for(uint8_t i = 0;i<sizeof(rd_data);i++)
|
||||
{
|
||||
printf(" %02x ",rd_data[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
#endif // (FLASH_TEST_IN_TASK)
|
||||
|
||||
#if (FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
#include "rwip_int.h"
|
||||
extern struct rwip_env_tag rwip_env;
|
||||
void flash_test_in_bluetooth_gap(void)
|
||||
{
|
||||
uint8_t wr_data[10] = {0x63,0x89,0x63,0x89,0x63,0x89};
|
||||
static uint8_t wr_cnt= 0;
|
||||
uint8_t rd_data[10] ={0};
|
||||
wr_cnt++;
|
||||
if(wr_cnt >= 252)
|
||||
{
|
||||
wr_cnt = 0;
|
||||
}
|
||||
wr_data[9] = wr_cnt;
|
||||
|
||||
if (rwip_env.prevent_sleep != 0)
|
||||
return;
|
||||
|
||||
rwip_time_t current_time;
|
||||
current_time = rwip_time_get();
|
||||
// Get the most recent Bluetooth event interval.
|
||||
int32_t duration = CLK_DIFF(current_time.hs, rwip_env.timer_arb_target); //312.5us
|
||||
if(duration < 64){ // 20ms = 64*312.5
|
||||
return;
|
||||
}
|
||||
|
||||
GLOBAL_INT_DISABLE();
|
||||
xc_fmc_spi_flash_write_page(0x32000, wr_data,
|
||||
sizeof(wr_data));
|
||||
xc_fmc_spi_flash_read(0x32000 , rd_data, sizeof(rd_data));
|
||||
|
||||
GLOBAL_INT_RESTORE();
|
||||
for(uint8_t i = 0;i<sizeof(rd_data);i++)
|
||||
{
|
||||
printf(" %02x ",rd_data[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
#endif // (FLASH_TEST_IN_BLUETOOTH_GAP)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
wdt_init();
|
||||
board_init();
|
||||
bluetooth_init();
|
||||
|
||||
//lvr bor_intr
|
||||
Bor_InitCfg_t bor_cfg = {
|
||||
.mode = BOR_MODE_INTRST,
|
||||
.rst_volt = BOR_RST_VOLT_1_76V,
|
||||
};
|
||||
xc_bor_init(&bor_cfg);
|
||||
|
||||
#if ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
NVIC_SetPriority(PendSV_IRQn, 0xff);
|
||||
NVIC_EnableIRQ(PendSV_IRQn);
|
||||
#endif // ((ADV_EVENT_NOT_RUN_XIP ==1) || (CONN_EVENT_NOT_RUN_XIP == 0) || (CONN_EVENT_NOT_RUN_XIP == 1))
|
||||
#if (FLASH_TEST_IN_INTERRUPT)
|
||||
timer_init(TIMER1_IDX,1000*1000);
|
||||
#endif //(FLASH_TEST_IN_INTERRUPT)
|
||||
xc_system_param_check();
|
||||
// rf_test_pin_init();
|
||||
xc_main_start();
|
||||
extern int xc_ble_status_callback(int status);
|
||||
xc_ble_status_callback(BLE_EVENT_INIT);
|
||||
#if (BLE_APP_PRESENT)
|
||||
while (1) {
|
||||
// schedule all pending events
|
||||
rwip_schedule();
|
||||
xc_main_run();
|
||||
#if (SLEEP_ENABLE)
|
||||
sleep_schedule();
|
||||
#endif // (SLEEP_ENABLE)
|
||||
xc_wdt_reload();
|
||||
}
|
||||
#endif // (BLE_APP_PRESENT)
|
||||
}
|
||||
|
||||
/// @} DRIVERS
|
||||
@@ -0,0 +1,305 @@
|
||||
#<SYMDEFS># ARM Linker, 5060750: Last Updated: Tue Sep 05 15:30:26 2023
|
||||
0x10000808 D co_default_bdaddr
|
||||
0x00004169 T ke_msg_alloc
|
||||
0x000041ed T ke_msg_send
|
||||
0x00004225 T ke_msg_send_basic
|
||||
0x000042e9 T ke_state_set
|
||||
0x00004359 T ke_task_create
|
||||
0x000042b9 T ke_state_get
|
||||
0x000041af T ke_msg_discard
|
||||
0x000041b3 T ke_msg_forward
|
||||
0x000041dd T ke_msg_in_queue
|
||||
0x00004233 T ke_msg_src_id_get
|
||||
0x00003e05 T ke_free
|
||||
0x000041d5 T ke_msg_free
|
||||
0x00003c21 T ke_check_malloc
|
||||
0x0000dbf5 T rwip_init
|
||||
0x0000de79 T rwip_schedule
|
||||
0x10000938 D rwip_rf
|
||||
0x00000df9 T BLE_Handler
|
||||
0x0000238d T co_buf_alloc
|
||||
0x000024fd T co_buf_copy_data_from_mem
|
||||
0x00002721 T co_buf_release
|
||||
0x000028c9 T co_djob_prepare
|
||||
0x000028d5 T co_djob_reg
|
||||
0x0000291d T co_djob_unreg
|
||||
0x00002969 T co_list_extract
|
||||
0x000029ad T co_list_extract_after
|
||||
0x00002ac5 T co_list_pop_front
|
||||
0x00002ae9 T co_list_push_back
|
||||
0x00002b39 T co_list_push_front
|
||||
0x00002b55 T co_time_get
|
||||
0x00002ce5 T co_time_timer_init
|
||||
0x00002dcd T co_time_timer_set
|
||||
0x00002df9 T co_time_timer_stop
|
||||
0x00000e95 T aes_c1
|
||||
0x00001465 T aes_encrypt
|
||||
0x000014cd T aes_f4
|
||||
0x00001521 T aes_f5
|
||||
0x00001641 T aes_f6
|
||||
0x000016bd T aes_g2
|
||||
0x00001c35 T aes_rand
|
||||
0x000012a1 T aes_cmac
|
||||
0x000025b1 T co_buf_head_release
|
||||
0x000025dd T co_buf_head_reserve
|
||||
0x00002ec5 T co_util_pack
|
||||
0x000030d5 T co_util_unpack
|
||||
0x0000ddd9 T rwip_reset
|
||||
0x00001da5 T aes_rpa_resolve
|
||||
0x00002799 T co_buf_reuse
|
||||
0x000027dd T co_buf_size
|
||||
0x00002489 T co_buf_copy
|
||||
0x00002569 T co_buf_duplicate
|
||||
0x000027ed T co_buf_tail_release
|
||||
0x00002a0d T co_list_init
|
||||
0x00002285 T ble_util_buf_rx_free
|
||||
0x00001f69 T ble_util_buf_acl_tx_alloc
|
||||
0x00002439 T co_buf_cb_free_set
|
||||
0x00003fad T ke_malloc
|
||||
0x00002a25 T co_list_insert_after
|
||||
0x0000459d T ke_timer_active
|
||||
0x000045ad T ke_timer_clear
|
||||
0x00004641 T ke_timer_set
|
||||
0x00002369 T co_buf_acquire
|
||||
0x00002819 T co_buf_tail_reserve
|
||||
0x00002531 T co_buf_copy_data_to_mem
|
||||
0x00002a55 T co_list_insert_before
|
||||
0x10000e90 D rom_env
|
||||
0x1000096c D rwip_param
|
||||
0x0000fe8d D one_bits
|
||||
0x000039bd T hci_rd_rem_ver_info_cmd_handler
|
||||
0x00003445 T hci_le_con_upd_cmd_handler
|
||||
0x00003705 T hci_le_rd_chnl_map_cmd_handler
|
||||
0x00003761 T hci_le_rd_rem_feats_cmd_handler
|
||||
0x0000354d T hci_le_en_enc_cmd_handler
|
||||
0x0000369d T hci_le_ltk_req_reply_cmd_handler
|
||||
0x0000360d T hci_le_ltk_req_neg_reply_cmd_handler
|
||||
0x00003851 T hci_le_rem_con_param_req_reply_cmd_handler
|
||||
0x000037f9 T hci_le_rem_con_param_req_neg_reply_cmd_handler
|
||||
0x000038d9 T hci_le_set_data_len_cmd_handler
|
||||
0x00003be5 T hci_vs_set_pref_slave_latency_cmd_handler
|
||||
0x00003b9d T hci_vs_set_pref_slave_evt_dur_cmd_handler
|
||||
0x00003ab9 T hci_vs_set_max_rx_size_and_time_cmd_handler
|
||||
0x00003a39 T hci_rd_rssi_cmd_handler
|
||||
0x0000d749 T llm_ch_map_update_ind_handler
|
||||
0x0000650d T llc_loc_llcp_rsp_to_handler
|
||||
0x00007161 T llc_rem_llcp_rsp_to_handler
|
||||
0x00005255 T llc_encrypt_ind_handler
|
||||
0x00006739 T llc_op_ver_exch_ind_handler
|
||||
0x000066d5 T llc_op_feats_exch_ind_handler
|
||||
0x00006675 T llc_op_encrypt_ind_handler
|
||||
0x00006609 T llc_op_dl_upd_ind_handler
|
||||
0x0000657d T llc_op_con_upd_ind_handler
|
||||
0x00006525 T llc_op_ch_map_upd_ind_handler
|
||||
0x0000bda9 T lld_llcp_rx_ind_handler
|
||||
0x0000bf1d T lld_llcp_tx_cfm_handler
|
||||
0x00007551 T lld_acl_rx_ind_handler
|
||||
0x000075dd T lld_acl_tx_cfm_handler
|
||||
0x00009509 T lld_con_param_upd_cfm_handler
|
||||
0x00008921 T lld_ch_map_upd_cfm_handler
|
||||
0x000094cd T lld_con_offset_upd_ind_handler
|
||||
0x00003435 T hci_command_llc_handler
|
||||
0x00003385 T hci_acl_data_handler
|
||||
0x00003cc1 T ke_event_callback_set
|
||||
0x00003cd9 T ke_event_clear
|
||||
0x00003db1 T ke_event_set
|
||||
0x000022e5 T ble_util_nb_good_channels
|
||||
0x0000230d T ble_util_pkt_dur_in_us
|
||||
0x0000234d T co_bdaddr_compare
|
||||
0x000088bd T lld_ch_assess_data_get
|
||||
0x000088c5 T lld_ch_map_set
|
||||
0x0000c16d T lld_read_clock
|
||||
0x0000c30d T lld_res_list_peer_update
|
||||
0x0000d60d T lld_white_list_add
|
||||
0x0000dd99 T rwip_prevent_sleep_clear
|
||||
0x0000ddb9 T rwip_prevent_sleep_set
|
||||
0x0000f071 T sch_plan_rem
|
||||
0x00001ce5 T aes_rpa_gen
|
||||
0x00002029 T ble_util_buf_adv_tx_alloc
|
||||
0x00002061 T ble_util_buf_adv_tx_free
|
||||
0x0000feae D co_null_bdaddr
|
||||
0x0000feb4 D co_null_key
|
||||
0x000050c9 T llc_con_move_cbk
|
||||
0x000071d9 T llc_start
|
||||
0x00007669 T lld_adv_adv_data_update
|
||||
0x00007ff5 T lld_adv_rand_addr_update
|
||||
0x00008071 T lld_adv_restart
|
||||
0x0000817d T lld_adv_scan_rsp_data_update
|
||||
0x000081c5 T lld_adv_start
|
||||
0x00008831 T lld_adv_stop
|
||||
0x0000d6c1 T lld_white_list_rem
|
||||
0x0000b401 T lld_init_rand_addr_update
|
||||
0x0000c179 T lld_res_list_add
|
||||
0x0000c251 T lld_res_list_clear
|
||||
0x0000c27d T lld_res_list_local_rpa_get
|
||||
0x0000c2c5 T lld_res_list_peer_rpa_get
|
||||
0x0000c341 T lld_res_list_priv_mode_update
|
||||
0x0000c37d T lld_res_list_rem
|
||||
0x0000cedd T lld_scan_rand_addr_update
|
||||
0x0000b699 T lld_init_start
|
||||
0x0000bc9d T lld_init_stop
|
||||
0x0000f081 T sch_plan_req
|
||||
0x0000f0d5 T sch_plan_set
|
||||
0x0000fec4 D co_rate_to_phy
|
||||
0x0000cb81 T lld_scan_params_update
|
||||
0x0000d115 T lld_scan_start
|
||||
0x0000d5c5 T lld_scan_stop
|
||||
0x0000c3ad T lld_rpa_renew
|
||||
0x0000408d T ke_mem_init
|
||||
0x00002609 T co_buf_init
|
||||
0x0000de9d T rwip_sleep
|
||||
0x10000810 D em_ble_base_address_table_0
|
||||
0x10000812 D em_ble_base_address_table_1
|
||||
0x10000814 D em_ble_base_address_table_2
|
||||
0x10000816 D em_ble_base_address_table_3
|
||||
0x10000818 D em_ble_base_address_table_4
|
||||
0x1000081a D em_ble_base_address_table_5
|
||||
0x10000822 D em_ble_base_address_table_6
|
||||
0x1000081c D em_ble_base_address_table_7
|
||||
0x10000824 D em_ble_base_address_table_8
|
||||
0x1000081e D em_ble_base_address_table_9
|
||||
0x10000820 D em_ble_base_address_table_10
|
||||
0x000021d9 T ble_util_buf_init_env
|
||||
0x10000978 D PATCH_FUN
|
||||
0x1000108c D lld_adv_env
|
||||
0x0000ebe5 T sch_arb_remove
|
||||
0x0000f739 T sch_slice_fg_remove
|
||||
0x10000f44 D llc_env
|
||||
0x0000693d T llc_proc_err_ind
|
||||
0x000073c1 T llc_stop
|
||||
0x00004695 T ll_channel_map_ind_handler
|
||||
0x0000471d T ll_connection_param_req_handler
|
||||
0x00004809 T ll_connection_param_rsp_handler
|
||||
0x0000489d T ll_connection_update_ind_handler
|
||||
0x000049c1 T ll_enc_req_handler
|
||||
0x00004a85 T ll_enc_rsp_handler
|
||||
0x00004af9 T ll_feature_req_handler
|
||||
0x00004b4d T ll_feature_rsp_handler
|
||||
0x00004ba1 T ll_length_req_handler
|
||||
0x00004bf9 T ll_length_rsp_handler
|
||||
0x00004c75 T ll_min_used_channels_ind_handler
|
||||
0x00004cf1 T ll_pause_enc_req_handler
|
||||
0x00004d5d T ll_pause_enc_rsp_handler
|
||||
0x00004db5 T ll_reject_ext_ind_handler
|
||||
0x00004dd5 T ll_reject_ind_handler
|
||||
0x00004df5 T ll_slave_feature_req_handler
|
||||
0x00004e49 T ll_start_enc_req_handler
|
||||
0x00004e99 T ll_start_enc_rsp_handler
|
||||
0x00004ee9 T ll_unknown_rsp_handler
|
||||
0x00004ef9 T ll_version_ind_handler
|
||||
0x00001fd9 T ble_util_buf_acl_tx_free
|
||||
0x0000c5c1 T lld_rxdesc_check
|
||||
0x0000c609 T lld_rxdesc_free
|
||||
0x0000fee4 D rwip_priority
|
||||
0x0000e8b1 T sch_arb_insert
|
||||
0x0000f355 T sch_prog_push
|
||||
0x0000fde5 T FMC_SPI_Flash_RDID
|
||||
0x0000fd8d T FMC_SPI_Flash_RUID
|
||||
0x0000fa71 T FMC_SPI_Flash_WakeUp
|
||||
0x0000f9f1 T FMC_SPI_Init_Oprt
|
||||
0x0000fa49 T FMC_SPI_Flash_PowerDown
|
||||
0x0000fceb T FMC_SPI_FlashRead
|
||||
0x0000fc1f T FMC_SPI_FlashWrite
|
||||
0x0000fb09 T FMC_SPI_Flash_Erase_Sector
|
||||
0x00004fc9 T llc_cleanup
|
||||
0x00005091 T llc_cmd_stat_send
|
||||
0x00005a39 T llc_llcp_send
|
||||
0x00005ac9 T llc_llcp_state_set
|
||||
0x00006981 T llc_proc_get
|
||||
0x00006999 T llc_proc_id_get
|
||||
0x000069b5 T llc_proc_init
|
||||
0x000069c1 T llc_proc_reg
|
||||
0x00006a05 T llc_proc_state_get
|
||||
0x00006a09 T llc_proc_state_set
|
||||
0x00006a0d T llc_proc_timer_pause_set
|
||||
0x00006a7d T llc_proc_timer_set
|
||||
0x00006ae5 T llc_proc_unreg
|
||||
0x0000a1c1 T lld_con_stop
|
||||
0x00007869 T lld_adv_evt_start_cbk
|
||||
0x10000e68 D rwip_env
|
||||
0x1000080e D rwip_prog_delay
|
||||
0x0000e041 T rwip_time_get
|
||||
0x0000e2cd T rwip_wakeup_end
|
||||
0x1000112c D sch_arb_env
|
||||
0x00007905 T lld_adv_frm_cbk
|
||||
0x0000e0b1 T rwip_timer_alarm_handler
|
||||
0x0000e11d T rwip_timer_arb_handler
|
||||
0x0000e189 T rwip_timer_co_handler
|
||||
0x10000f94 D lld_env
|
||||
0x10000828 D aa_gen
|
||||
0x00007c25 T lld_adv_init
|
||||
0x00009301 T lld_con_init
|
||||
0x0000a7f1 T lld_core_init
|
||||
0x1000082c D lld_rpa_renew_env
|
||||
0x00008959 T lld_channel_assess
|
||||
0x100010dc D lld_con_env
|
||||
0x0000a4ad T lld_con_tx_len_update
|
||||
0x10000830 D lld_exp_sync_pos_tab
|
||||
0x0000bce5 T lld_instant_proc_end
|
||||
0x110134fd T prf_dst_task_get
|
||||
0x11013abd T rom_env_init
|
||||
0x11005201 T gapc_get_bdaddr
|
||||
0x1100c77d T gatt_db_svc16_add
|
||||
0x1100c901 T gatt_db_svc_add
|
||||
0x1100df41 T gatt_srv_event_send
|
||||
0x1100e349 T gatt_user_srv_register
|
||||
0x11014afc D llc_msg_handler_tab
|
||||
0x1000217c D rom_llc_state
|
||||
0x00008e4d T lld_con_evt_start_cbk
|
||||
0x00008ddd T lld_con_evt_canceled_cbk
|
||||
0x0000fe9e D co_sca2ppm
|
||||
0x00009051 T lld_con_evt_time_update
|
||||
0x00009415 T lld_con_max_lat_calc
|
||||
0x00009a69 T lld_con_sched
|
||||
0x0000f7e1 T sch_slice_per_add
|
||||
0x0000d801 T rwble_isr
|
||||
0x0000dc75 T rwip_isr
|
||||
0x00009189 T lld_con_frm_isr
|
||||
0x000044f9 T ke_task_schedule
|
||||
0x00007949 T lld_adv_frm_isr
|
||||
0x1000219d D sv_lock
|
||||
0x1000219e D sv_txlen
|
||||
0x100017e5 T rom_lld_con_rx
|
||||
0x10001a55 T rom_lld_con_evt_start_cbk
|
||||
0x10001aad T rom_lld_con_frm_isr
|
||||
0x1100b661 T gatt_cli_mtu_exch
|
||||
0x1000219c D evt_start
|
||||
0x1100a791 T gatt_cli_discover_svc
|
||||
0x1100e3e9 T gatt_uuid16_comp
|
||||
0x11009eb9 T gatt_cli_att_event_cfm
|
||||
0x1100a1cd T gatt_cli_discover_cancel
|
||||
0x1100a221 T gatt_cli_discover_char
|
||||
0x1100a287 T gatt_cli_discover_desc
|
||||
0x1100ac5d T gatt_cli_event_register
|
||||
0x1100b741 T gatt_cli_read
|
||||
0x1100b775 T gatt_cli_read_by_uuid
|
||||
0x1100be0d T gatt_cli_write
|
||||
0x1100e251 T gatt_user_cli_register
|
||||
0x110041e9 T co_rand_word
|
||||
0x110041f1 T co_random_init
|
||||
0x10002194 D adv_evt_start
|
||||
0x1000213c D gatt_srv_read_api_tbl
|
||||
0x10002150 D gatt_srv_write_api_tbl
|
||||
0x110132a9 T modem_init
|
||||
0x1101381d T rf_init
|
||||
0x11014095 T xc_ble_set_dev_info_cfm
|
||||
0x11013fe5 T xc_ble_get_dev_info_cfm
|
||||
0x11013f0d T xc_ble_gatt_cli_mtu_exch
|
||||
0x110140bd T xc_ble_update_param
|
||||
0x11013fdd T xc_ble_gatt_user_srv_register
|
||||
0x11013fcd T xc_ble_gatt_srv_write_cfm
|
||||
0x11013f75 T xc_ble_gatt_srv_read_cfm
|
||||
0x11013f2b T xc_ble_gatt_srv_notify
|
||||
0x11013f15 T xc_ble_gatt_service16_add
|
||||
0x11013ffd T xc_ble_param_update_cfm
|
||||
0x11014069 T xc_ble_set_dev_config
|
||||
0x11013ef1 T xc_ble_gapm_reset
|
||||
0x11013ec5 T xc_ble_conn_cfm
|
||||
0x11013e99 T xc_ble_advertise_start
|
||||
0x11014031 T xc_ble_set_adv_data
|
||||
0x11013e71 T xc_ble_advertise_create
|
||||
0x10001f83 T rom_xc_fmc_spi_flash_erase_page
|
||||
0x1000203b T rom_xc_fmc_spi_flash_read_page
|
||||
0x10001fd3 T rom_xc_fmc_spi_flash_write_page
|
||||
0x11013a85 T rf_xtal_cal_set
|
||||
0x11013a71 T rf_tx_power_set
|
||||
@@ -0,0 +1,219 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file arch_main.c
|
||||
*
|
||||
* @brief Main loop of the application.
|
||||
*
|
||||
* Copyright (C) RivieraWaves 2009-2015
|
||||
*
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* INCLUDES
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#include "rwip_config.h" // RW SW configuration
|
||||
|
||||
#include "arch.h" // architectural platform definitions
|
||||
#include "boot.h" // boot definition
|
||||
#include "rwip.h" // RW SW initialization
|
||||
#include "xc_drv_pwr.h"
|
||||
#include <stdbool.h> // boolean definition
|
||||
#include <stddef.h> // standard definitions
|
||||
#include <stdint.h> // standard integer definition
|
||||
#include <stdlib.h> // standard lib functions
|
||||
|
||||
#if (BLE_TEST_MODE_SUPPORT)
|
||||
#include "uart.h" // UART initialization
|
||||
#endif // (BLE_TEST_MODE_SUPPORT)
|
||||
|
||||
#if (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||||
#include "rf.h" // RF initialization
|
||||
#endif // BLE_EMB_PRESENT || BT_EMB_PRESENT
|
||||
|
||||
#if (BLE_APP_PRESENT)
|
||||
// #include "app.h" // application functions
|
||||
#endif // BLE_APP_PRESENT
|
||||
|
||||
#if PLF_DMA
|
||||
#include "dma.h" // DMA initialization
|
||||
#endif // PLF_DMA
|
||||
|
||||
#if (PLF_NVDS)
|
||||
#include "nvds.h" // NVDS definitions
|
||||
#endif // PLF_NVDS
|
||||
|
||||
#include "reg_assert_mgr.h"
|
||||
#if (PLF_PROFILING || PLF_MEM_PROTECTION)
|
||||
#include "reg_sw_profiling.h"
|
||||
#endif // (PLF_PROFILING || PLF_MEM_PROTECTION)
|
||||
#include "platform.h"
|
||||
|
||||
#include "xc6xxx.h"
|
||||
|
||||
// CPU early wake-up time (unit:us)
|
||||
#define SLEEP_TIME_EARLY (3000)
|
||||
|
||||
#define HS_TO_US(frame) (((frame) * SLOT_SIZE) >> 1)
|
||||
|
||||
/**
|
||||
* @brief clock_init
|
||||
* @details
|
||||
* @param void
|
||||
* @retval void
|
||||
*/
|
||||
void clock_init(void)
|
||||
{
|
||||
CLOCK_InitCfg_t clock_cfg;
|
||||
|
||||
clock_cfg.hfclk_src = CLOCK_HFCLK_SRC_XTAL;
|
||||
clock_cfg.hfclk_in = CLOCK_HFCLK_IN_32M;
|
||||
#if (RC_32K)
|
||||
clock_cfg.lfclk_src = CLOCK_LFCLK_SRC_RC;
|
||||
#endif //(RC_32K)
|
||||
|
||||
#if (XTAL_32K)
|
||||
clock_cfg.lfclk_src = CLOCK_LFCLK_SRC_XTAL;
|
||||
#endif // (XTAL_32K)
|
||||
|
||||
#if (XTAL_32768K)
|
||||
clock_cfg.lfclk_src = CLOCK_LFCLK_SRC_XTAL;
|
||||
#endif // (XTAL_32768K)
|
||||
|
||||
if (clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_XTAL) {
|
||||
clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32768;
|
||||
} else if (clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_RC) {
|
||||
clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32K;
|
||||
}
|
||||
|
||||
xc_clock_init_cfg(&clock_cfg);
|
||||
|
||||
SysTick_Config(xc_clock_hfclk_in_get() / 100);
|
||||
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
|
||||
}
|
||||
|
||||
#if (SLEEP_ENABLE)
|
||||
void wakeup_timer_init(void)
|
||||
{
|
||||
TIMER_BaseInitTypeDef Timer_Init;
|
||||
Timer_Init.src_clk = TIMER_CLK_SRC_32K;
|
||||
Timer_Init.mode = TIMER_MODE_SINGLE_COUNT;
|
||||
Timer_Init.div_clk = TIMER_DIV_CLK_32000Hz;
|
||||
// Timer0 Config & Start
|
||||
TIMER_Base_Init(XC_TIMER0, &Timer_Init);
|
||||
|
||||
PWR_InitTypeDef PWR_InitStruct = {0};
|
||||
PWR_InitStruct.PWR_WakeITSrc = GPIO_IRQn_WAKE | TIMER0_IRQn_WAKE;
|
||||
PWR_InitStruct.PWR_SleepMode = LIGHT_SLEEP_MODE;
|
||||
PWR_SleepInit(&PWR_InitStruct);
|
||||
|
||||
PWR_GPIO_SleepConfig(PWR_InitStruct.PWR_SleepMode);
|
||||
|
||||
PWR_GPIO_LightSleepWakeConfig(GPIO_2, RIS_EDGE_INT);
|
||||
PWR_GPIO_LightSleepWakeConfig(GPIO_3, RIS_EDGE_INT);
|
||||
}
|
||||
|
||||
void sleep_wkup()
|
||||
{
|
||||
PWR_InitTypeDef PWR_InitStruct = {0};
|
||||
|
||||
#if (USE_XIP != 1)
|
||||
SPI_InitCfg_t spi_cfg = {0};
|
||||
spi_cfg.Mode = SPI_MODE_MASTER;
|
||||
spi_cfg.DataSize = SSI_CTRL0_DFS_LEN_8BIT;
|
||||
spi_cfg.Direction = SSI_CTRL0_TMOD_WR;
|
||||
spi_cfg.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
|
||||
spi_cfg.CLKPolarity = SSI_CTRL0_SCPOL_LOW;
|
||||
spi_cfg.CLKPhase = SPI_CPHA_LEAD;
|
||||
spi_cfg.FirstBit = SPI_FirstBit_MSB;
|
||||
|
||||
xc_spi_init(XC_SPI0, &spi_cfg);
|
||||
SPI_Flash_PowerDown(XC_SPI0);
|
||||
#endif //(USE_XIP!=1)
|
||||
|
||||
// PWR_InitStruct.PWR_WakeITSrc = GPIO_IRQn_WAKE | TIMER0_IRQn_WAKE ;
|
||||
// PWR_InitStruct.PWR_SleepMode = LIGHT_SLEEP_MODE;
|
||||
// PWR_SleepInit(&PWR_InitStruct);
|
||||
// PWR_GPIO_SleepConfig(PWR_InitStruct.PWR_SleepMode);
|
||||
sleep_init();
|
||||
PWR_BLE_SleepEnter();
|
||||
}
|
||||
|
||||
void Turn_Off_PeripheralClk()
|
||||
{
|
||||
XC_CPR->SSI0_MCLK_CTL = (((0UL << CPR_SSI_MCLK_CTL_SSI_MCLK_DIV_Pos) |
|
||||
CPR_SSI_MCLK_CTL_SSI_MCLK_DIV_WE) |
|
||||
((CPR_SSI_MCLK_CTL_SSI_MCLK_EN_DISABLE) |
|
||||
CPR_SSI_MCLK_CTL_SSI_MCLK_EN_WE));
|
||||
|
||||
XC_CPR->CTLAPBCLKEN_GRCTL = ((CPR_CTLAPBCLKEN_GRCTL_SSI0_PCLK_EN_DISABLE) |
|
||||
(CPR_CTLAPBCLKEN_GRCTL_SSI0_PCLK_EN_Msk
|
||||
<< CPR_CTLAPBCLKEN_GRCTL_MASK_OFFSET))
|
||||
<< 0;
|
||||
|
||||
XC_CPR->CTLAPBCLKEN_GRCTL = ((CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_DISABLE) |
|
||||
(CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_Msk
|
||||
<< CPR_CTLAPBCLKEN_GRCTL_MASK_OFFSET));
|
||||
|
||||
XC_CPR->UART0_CLK_GRCTL = (((8UL << CPR_UART_CLK_GRCTL_UART0_CLK_GR_Pos) |
|
||||
CPR_UART_CLK_GRCTL_UART0_CLK_GR_WE) |
|
||||
((CPR_UART_CLK_GRCTL_UART0_CLK_GR_UPD_DISABLE) |
|
||||
(CPR_UART_CLK_GRCTL_UART1_CLK_GR_UPD_WE)));
|
||||
|
||||
XC_CPR->CTLAPBCLKEN_GRCTL = ((CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_DISABLE) |
|
||||
(CPR_CTLAPBCLKEN_GRCTL_UART0_PCLK_EN_Msk
|
||||
<< CPR_CTLAPBCLKEN_GRCTL_MASK_OFFSET))
|
||||
<< 1;
|
||||
//
|
||||
// XC_CPR->UART1_CLK_GRCTL = (((8UL <<
|
||||
// CPR_UART_CLK_GRCTL_UART1_CLK_GR_Pos) |
|
||||
// CPR_UART_CLK_GRCTL_UART1_CLK_GR_WE) |
|
||||
// ((CPR_UART_CLK_GRCTL_UART1_CLK_GR_UPD_DISABLE)
|
||||
// |
|
||||
// (CPR_UART_CLK_GRCTL_UART1_CLK_GR_UPD_WE)));
|
||||
|
||||
// XC_CPR->AHBCLKEN_GRCTL =0x1e001e;
|
||||
}
|
||||
|
||||
void sleep_schedule()
|
||||
{
|
||||
// Checks for sleep have to be done with interrupt disabled
|
||||
GLOBAL_INT_DISABLE();
|
||||
|
||||
// Check if the processor clock can be gated
|
||||
uint32_t duration = 0;
|
||||
uint32_t duration_timer = 0;
|
||||
// switch(rwip_sleep(&duration, 2, \
|
||||
// 0x7D00, RWIP_MINIMUM_SLEEP_TIME)){
|
||||
switch (rwip_sleep(&duration, 1, 0x7D00, 20)) {
|
||||
case RWIP_DEEP_SLEEP: {
|
||||
duration_timer = (HS_TO_US(duration) - SLEEP_TIME_EARLY);
|
||||
TIMER_SetUs(XC_TIMER0, duration_timer);
|
||||
TIMER_Start_IT(XC_TIMER0);
|
||||
sleep_wkup();
|
||||
__TIMER_Disable(XC_TIMER0);
|
||||
}
|
||||
// no break
|
||||
case RWIP_CPU_SLEEP: {
|
||||
// Wait for interrupt
|
||||
// Turn_Off_PeripheralClk();
|
||||
|
||||
// __PWR_SleepSrcMask_Set(0x1e000e);
|
||||
// __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
||||
// __WFI();
|
||||
// __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
||||
// __PWR_SleepSrcMask_Set(0x1e001e);
|
||||
} break;
|
||||
case RWIP_ACTIVE:
|
||||
default: {
|
||||
// nothing to do.
|
||||
} break;
|
||||
}
|
||||
// Checks for sleep have to be done with interrupt disabled
|
||||
GLOBAL_INT_RESTORE();
|
||||
}
|
||||
#endif // (SLEEP_ENABLE)
|
||||
@@ -0,0 +1,245 @@
|
||||
|
||||
;/*****************************************************************************
|
||||
; * @file: startup_xinc.s
|
||||
; * @purpose: CMSIS Cortex-M0 Core Device Startup File for the
|
||||
; * Device xinc.
|
||||
; *****************************************************************************/
|
||||
|
||||
Stack_Size EQU 0x000006f0
|
||||
|
||||
AREA STACK, NOINIT, READWRITE, ALIGN=3
|
||||
Stack_Mem SPACE Stack_Size
|
||||
__initial_sp
|
||||
|
||||
Heap_Size EQU 0x00000000
|
||||
|
||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||
__heap_base
|
||||
Heap_Mem SPACE Heap_Size
|
||||
__heap_limit
|
||||
|
||||
|
||||
PRESERVE8
|
||||
THUMB
|
||||
|
||||
; Vector Table Mapped to Address 0 at Reset
|
||||
|
||||
AREA RESET, DATA, READONLY
|
||||
EXPORT __Vectors
|
||||
EXPORT __Vectors_End
|
||||
EXPORT __Vectors_Size
|
||||
|
||||
__Vectors DCD __initial_sp ; Top of Stack
|
||||
DCD Reset_Handler ; Reset Handler
|
||||
DCD NMI_Handler ; NMI Handler
|
||||
DCD HardFault_Handler ; Hard Fault Handler
|
||||
DCD MemManage_Handler ; MPU Fault Handler
|
||||
DCD BusFault_Handler ; Bus Fault Handler
|
||||
DCD UsageFault_Handler ; Usage Fault Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD SVC_Handler ; SVCall Handler
|
||||
DCD DebugMon_Handler ; Debug Monitor Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD PendSV_Handler ; PendSV Handler
|
||||
DCD SysTick_Handler ; SysTick Handler
|
||||
|
||||
; External Interrupts
|
||||
; ToDo: Add here the vectors for the device specific external interrupts handler
|
||||
DCD BLE_Handler ; 0
|
||||
DCD DMA_Handler ; 1
|
||||
DCD CPR_Handler ; 2
|
||||
DCD GPIO_Handler ; 3
|
||||
DCD RTC_Handler ; 4
|
||||
DCD TIMER0_Handler ; 5
|
||||
DCD TIMER1_Handler ; 6
|
||||
DCD TIMER2_Handler ; 7
|
||||
DCD TIMER3_Handler ; 8
|
||||
DCD WDT_Handler ; 9
|
||||
DCD I2C_Handler ; 10
|
||||
DCD UART0_Handler ; 11
|
||||
DCD UART1_Handler ; 12
|
||||
DCD SPI0_Handler ; 13
|
||||
DCD SPI1_Handler ; 14
|
||||
DCD 0 ; 15
|
||||
DCD 0 ; 16
|
||||
DCD GADC_Handler ; 17
|
||||
DCD PWM_Handler ; 18
|
||||
DCD AES_Handler ; 19
|
||||
DCD USB_Handler ; 20
|
||||
DCD AUDIO_Handler ; 21
|
||||
DCD RF24G_Handler ; 22
|
||||
DCD SPI2_Handler ; 23
|
||||
DCD MPU_Handler ; 24
|
||||
DCD UART2_Handler ; 25
|
||||
DCD I2S_Handler ; 26
|
||||
DCD AOTIMER0_Handler ; 27
|
||||
DCD AOTIMER1_Handler ; 28
|
||||
DCD CMP_Handler ; 29
|
||||
DCD FMC_Handler ; 30
|
||||
DCD CAN_Handler ; 31
|
||||
|
||||
__Vectors_End
|
||||
|
||||
__Vectors_Size EQU __Vectors_End - __Vectors
|
||||
|
||||
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
; Reset Handler
|
||||
|
||||
Reset_Handler PROC
|
||||
|
||||
EXPORT Reset_Handler [WEAK]
|
||||
|
||||
IMPORT SystemInit
|
||||
IMPORT __main
|
||||
|
||||
LDR r0, =0x4000013C ; remap
|
||||
LDR r1, =0x10000001
|
||||
STR r1, [r0]
|
||||
|
||||
|
||||
|
||||
LDR R0, =SystemInit
|
||||
BLX R0
|
||||
|
||||
LDR R0, =__main
|
||||
BX R0
|
||||
|
||||
ENDP
|
||||
|
||||
; Dummy Exception Handlers (infinite loops which can be modified)
|
||||
NMI_Handler PROC
|
||||
EXPORT NMI_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
|
||||
|
||||
HardFault_Handler\
|
||||
PROC
|
||||
EXPORT HardFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
MemManage_Handler\
|
||||
PROC
|
||||
EXPORT MemManage_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
BusFault_Handler\
|
||||
PROC
|
||||
EXPORT BusFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
UsageFault_Handler\
|
||||
PROC
|
||||
EXPORT UsageFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
SVC_Handler PROC
|
||||
EXPORT SVC_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
DebugMon_Handler\
|
||||
PROC
|
||||
EXPORT DebugMon_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
|
||||
Default_Handler PROC
|
||||
EXPORT BLE_Handler [WEAK]
|
||||
EXPORT DMA_Handler [WEAK]
|
||||
EXPORT CPR_Handler [WEAK]
|
||||
EXPORT GPIO_Handler [WEAK]
|
||||
EXPORT RTC_Handler [WEAK]
|
||||
EXPORT TIMER0_Handler [WEAK]
|
||||
EXPORT TIMER1_Handler [WEAK]
|
||||
EXPORT TIMER2_Handler [WEAK]
|
||||
EXPORT TIMER3_Handler [WEAK]
|
||||
EXPORT WDT_Handler [WEAK]
|
||||
EXPORT I2C_Handler [WEAK]
|
||||
EXPORT UART0_Handler [WEAK]
|
||||
EXPORT UART1_Handler [WEAK]
|
||||
EXPORT SPI0_Handler [WEAK]
|
||||
EXPORT SPI1_Handler [WEAK]
|
||||
;EXPORT KBS_Handler [WEAK]
|
||||
;EXPORT QDEC_Handler [WEAK]
|
||||
EXPORT GADC_Handler [WEAK]
|
||||
EXPORT PWM_Handler [WEAK]
|
||||
EXPORT AES_Handler [WEAK]
|
||||
|
||||
EXPORT PendSV_Handler [WEAK]
|
||||
EXPORT SysTick_Handler [WEAK]
|
||||
|
||||
EXPORT USB_Handler [WEAK];20
|
||||
EXPORT AUDIO_Handler [WEAK];21
|
||||
EXPORT RF24G_Handler [WEAK];22
|
||||
EXPORT SPI2_Handler [WEAK];23
|
||||
EXPORT MPU_Handler [WEAK];24
|
||||
EXPORT UART2_Handler [WEAK];25
|
||||
EXPORT I2S_Handler [WEAK];26
|
||||
EXPORT AOTIMER0_Handler [WEAK];27
|
||||
EXPORT AOTIMER1_Handler [WEAK];28
|
||||
EXPORT CMP_Handler [WEAK];29
|
||||
EXPORT FMC_Handler [WEAK];30
|
||||
EXPORT CAN_Handler [WEAK];31
|
||||
|
||||
PendSV_Handler
|
||||
SysTick_Handler
|
||||
BLE_Handler
|
||||
RF24G_Handler
|
||||
DMA_Handler
|
||||
CPR_Handler
|
||||
GPIO_Handler
|
||||
RTC_Handler
|
||||
TIMER0_Handler
|
||||
TIMER1_Handler
|
||||
TIMER2_Handler
|
||||
TIMER3_Handler
|
||||
WDT_Handler
|
||||
I2C_Handler
|
||||
I2S_Handler
|
||||
UART0_Handler
|
||||
UART1_Handler
|
||||
UART2_Handler
|
||||
SPI0_Handler
|
||||
SPI1_Handler
|
||||
SPI2_Handler
|
||||
MPU_Handler
|
||||
;KBS_Handler
|
||||
;QDEC_Handler
|
||||
GADC_Handler
|
||||
PWM_Handler
|
||||
AUDIO_Handler
|
||||
;SIM_Handler
|
||||
AES_Handler
|
||||
AOTIMER0_Handler
|
||||
AOTIMER1_Handler
|
||||
CMP_Handler
|
||||
FMC_Handler
|
||||
CAN_Handler
|
||||
USB_Handler
|
||||
|
||||
B .
|
||||
ENDP
|
||||
|
||||
|
||||
ALIGN
|
||||
|
||||
; User Initial Stack & Heap
|
||||
|
||||
IMPORT __use_two_region_memory
|
||||
EXPORT __user_initial_stackheap
|
||||
__user_initial_stackheap
|
||||
|
||||
LDR R0, = Heap_Mem
|
||||
LDR R1, = (Stack_Mem + Stack_Size)
|
||||
LDR R2, = (Heap_Mem + Heap_Size)
|
||||
LDR R3, = Stack_Mem
|
||||
BX LR
|
||||
|
||||
ALIGN
|
||||
|
||||
END
|
||||
@@ -0,0 +1,117 @@
|
||||
/**
|
||||
* Initialize the system
|
||||
*
|
||||
* @param none
|
||||
* @return none
|
||||
*
|
||||
* @brief Setup the microcontroller system
|
||||
*
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------------------------------------------
|
||||
INCLUDE HEADE FILES
|
||||
------------------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
|
||||
#include "rwip.h"
|
||||
#include "xc6xxx.h"
|
||||
/*------------------------------------------------------------------------------------
|
||||
Macros
|
||||
-------------------------------------------------------------------------------------*/
|
||||
#define __DEBUG_OUT_PORT 0
|
||||
|
||||
/*------------------------------------------------------------------------------------
|
||||
Functions
|
||||
-------------------------------------------------------------------------------------*/
|
||||
#define VECTOR_NUM 48
|
||||
|
||||
void set_vector(void)
|
||||
{
|
||||
#if (USE_XIP == 1)
|
||||
GLOBAL_INT_DISABLE();
|
||||
for (uint32_t i = 0, *Pvector = (uint32_t *)(0x11016000 + 0),
|
||||
*_vector_table = (uint32_t *)(0x10000000);
|
||||
i < VECTOR_NUM; i++) // copy vertor table
|
||||
{
|
||||
_vector_table[i] = *Pvector++;
|
||||
}
|
||||
|
||||
*((volatile unsigned int *)(0x4000013C)) =
|
||||
0x10000001; // inter vertor table remap
|
||||
GLOBAL_INT_RESTORE();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void WDT_ResetInit(void)
|
||||
{
|
||||
cpr_ctlapbclken_grctl__wdt_pclk_en__setf(ENABLE);
|
||||
|
||||
cpr_rstctl_ctlapb_sw__wdt_rstn__setf(RSTCTL_ENABLE);
|
||||
cpr_rstctl_ctlapb_sw__wdt_rstn__setf(RSTCTL_DISABLE);
|
||||
|
||||
cpr_rstctl_wdtrst_mask_set(
|
||||
(WDT_SYS_RSTN_MASK_DISABLE | WDT_M0_RSTN_MASK_ENABLE));
|
||||
|
||||
cpr_lp_ctl__wdt_tclk_en__setf(DISABLE);
|
||||
wdt_cr__wdt_en__setf(DISABLE);
|
||||
}
|
||||
|
||||
void SystemInit(void)
|
||||
{
|
||||
|
||||
WDT_ResetInit();
|
||||
|
||||
#if (USE_XIP == 1)
|
||||
|
||||
set_vector();
|
||||
#endif
|
||||
|
||||
// enable BT CLK
|
||||
writel(0x40000040, readl(0x40000040) | (0x01 << 4) | 0xFFFF0000);
|
||||
}
|
||||
|
||||
__RAM_CODE int sendchar(int c)
|
||||
{
|
||||
unsigned int status;
|
||||
#if (__DEBUG_OUT_PORT == 1)
|
||||
for (;;) {
|
||||
status = (*((volatile unsigned *)(0x40011000 + 0x14)));
|
||||
status &= 0x20;
|
||||
if (status == 0x20)
|
||||
break;
|
||||
}
|
||||
(*((volatile unsigned *)(0x40011000 + 0x00))) = c;
|
||||
return (1);
|
||||
#else
|
||||
for (;;) {
|
||||
status = (*((volatile unsigned *)(0x40010000 + 0x14)));
|
||||
status &= 0x20;
|
||||
if (status == 0x20)
|
||||
break;
|
||||
}
|
||||
(*((volatile unsigned *)(0x40010000 + 0x00))) = c;
|
||||
return (1);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct __FILE
|
||||
{
|
||||
int handle; /* Add whatever you need here */
|
||||
};
|
||||
|
||||
FILE __stdout;
|
||||
__RAM_CODE int fputc(int ch, FILE *f) { return (sendchar(ch)); }
|
||||
|
||||
int ferror(FILE *f)
|
||||
{
|
||||
/* Your implementation of ferror */
|
||||
return EOF;
|
||||
}
|
||||
|
||||
void _ttywrch(int ch) { sendchar(ch); }
|
||||
|
||||
void _sys_exit(int return_code)
|
||||
{
|
||||
label:
|
||||
goto label; /* endless loop */
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
#include "usr_client.h"
|
||||
|
||||
uint8_t cli_user_lid = GATT_INVALID_USER_LID;
|
||||
/* Handle for sending data from the centre to the slave. */
|
||||
uint16_t cli_tx_hdl = GATT_INVALID_HDL;
|
||||
uint16_t cli_chg_ccc_hdl = GATT_INVALID_HDL;
|
||||
|
||||
#define CUSTOM_SVC_UUID_CLI 0xFFF0
|
||||
#define CUSTOM_SVC_RX_CHAR_UUID_CLI 0xFFF3
|
||||
#define CUSTOM_SVC_TX_CHAR_UUID_CLI 0xFFF4
|
||||
|
||||
uint8_t get_cli_user_ild(void) { return cli_user_lid; }
|
||||
|
||||
void cli_discover_cmp_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t status)
|
||||
{
|
||||
LOGI(
|
||||
"[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, status = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, dummy, status);
|
||||
|
||||
uint16_t cli_cfg = GATT_CCC_START_NTF;
|
||||
status = xc_ble_gatt_cli_write(conidx, get_cli_user_ild(), 0, GATT_WRITE,
|
||||
cli_chg_ccc_hdl, 2, (uint8_t *)&cli_cfg);
|
||||
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("xc_ble_gatt_cli_write error 0x%x", status);
|
||||
}
|
||||
|
||||
// send_data(conidx);
|
||||
}
|
||||
|
||||
void cli_read_cmp_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t status)
|
||||
{
|
||||
LOGI(
|
||||
"[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, status = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, dummy, status);
|
||||
}
|
||||
|
||||
void cli_write_cmp_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t status)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, status = 0x%x\r\n",
|
||||
__func__, conidx, user_lid, dummy, status);
|
||||
}
|
||||
|
||||
void cli_svc_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy, uint16_t hdl,
|
||||
uint8_t disc_info, uint8_t nb_att, const gatt_svc_att_t *p_atts)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, dummy = 0x%x, hdl = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, dummy, hdl);
|
||||
|
||||
uint8_t cursor;
|
||||
uint16_t att_handle = GATT_INVALID_HDL;
|
||||
|
||||
// check all attributes
|
||||
for (cursor = 0; cursor < nb_att; cursor++) {
|
||||
const gatt_svc_att_t *p_att = &(p_atts[cursor]);
|
||||
|
||||
switch (p_att->att_type) {
|
||||
case GATT_ATT_PRIMARY_SVC: {
|
||||
} break;
|
||||
case GATT_ATT_CHAR: {
|
||||
att_handle = p_att->info.charac.val_hdl;
|
||||
} break;
|
||||
case GATT_ATT_VAL: {
|
||||
if (gatt_uuid16_comp(p_att->uuid, p_att->uuid_type,
|
||||
CUSTOM_SVC_RX_CHAR_UUID_CLI)) {
|
||||
cli_tx_hdl = att_handle;
|
||||
LOGI("cli_tx_hdl=0x%x\n", cli_tx_hdl);
|
||||
}
|
||||
} break;
|
||||
case GATT_ATT_DESC: {
|
||||
// Client Char Configuration of service changed value
|
||||
if (gatt_uuid16_comp(p_att->uuid, p_att->uuid_type,
|
||||
GATT_DESC_CLIENT_CHAR_CFG)) {
|
||||
cli_chg_ccc_hdl = hdl + cursor;
|
||||
LOGI("cli_chg_ccc_hdl=0x%x\n", cli_chg_ccc_hdl);
|
||||
}
|
||||
} break;
|
||||
default: { /* Nothing to do */
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cli_svc_info_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t start_hdl, uint16_t end_hdl, uint8_t uuid_type,
|
||||
const uint8_t *p_uuid)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, start_hdl = 0x%x, end_hdl = "
|
||||
"0x%x, uuid[0] = 0x%x, uuid[1] = 0x%x \r\n",
|
||||
__func__, conidx, user_lid, start_hdl, end_hdl, p_uuid[0], p_uuid[1]);
|
||||
}
|
||||
|
||||
void cli_read_val_cb(uint8_t conidx, uint8_t user_lid, uint16_t dummy,
|
||||
uint16_t hdl, uint16_t offset, co_buf_t *p_data)
|
||||
{
|
||||
uint16_t length = co_buf_data_len(p_data);
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, handler = 0x%x, length = "
|
||||
"0x%x data: \r\n",
|
||||
__func__, conidx, user_lid, hdl, length);
|
||||
// DUMP_DATA_PRINTF(&(co_buf_data(p_data)[0]), length);
|
||||
}
|
||||
|
||||
void cli_val_evt_cb(uint8_t conidx, uint8_t user_lid, uint16_t token,
|
||||
uint8_t evt_type, bool complete, uint16_t hdl,
|
||||
co_buf_t *p_data)
|
||||
{
|
||||
uint16_t status;
|
||||
uint16_t length = co_buf_data_len(p_data);
|
||||
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, token = 0x%x evt_type = \
|
||||
0x%x complete = 0x%x handler = 0x%x, length = %d data: \r\n",
|
||||
__func__, conidx, user_lid, token, evt_type, complete, hdl, length);
|
||||
status = xc_ble_gatt_cli_indicate_cfm(conidx, user_lid, token);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_cli_indicate_cfm error 0x%x", status);
|
||||
}
|
||||
|
||||
|
||||
for(uint8_t i = 0;i<length;i++)
|
||||
{
|
||||
LOGI(" %02x ",co_buf_data(p_data)[i]);
|
||||
}
|
||||
LOGI("\r\n");
|
||||
//(&(co_buf_data(p_data)[0]), length);
|
||||
}
|
||||
|
||||
void cli_svc_changed_cb(uint8_t conidx, uint8_t user_lid, bool out_of_sync,
|
||||
uint16_t start_hdl, uint16_t end_hdl)
|
||||
{
|
||||
LOGI("[%s] conidx = 0x%x, user_lid = 0x%x, out_of_sync = 0x%x ,start_hdl = "
|
||||
"0x%x, end_hdl = "
|
||||
"0x%x \r\n",
|
||||
__func__, conidx, user_lid, out_of_sync, start_hdl, end_hdl);
|
||||
}
|
||||
|
||||
static const gatt_cli_cb_t cli_cb = {
|
||||
.cb_discover_cmp = cli_discover_cmp_cb,
|
||||
.cb_read_cmp = cli_read_cmp_cb,
|
||||
.cb_write_cmp = cli_write_cmp_cb,
|
||||
.cb_svc = cli_svc_cb,
|
||||
.cb_svc_info = cli_svc_info_cb,
|
||||
.cb_att_val = cli_read_val_cb,
|
||||
.cb_att_val_evt = cli_val_evt_cb,
|
||||
.cb_svc_changed = cli_svc_changed_cb,
|
||||
};
|
||||
|
||||
uint8_t app_cli_register(void)
|
||||
{
|
||||
uint16_t status = 0;
|
||||
status = xc_ble_gatt_user_cli_register(GAP_LE_MTU_MAX, 0, &cli_cb,
|
||||
&cli_user_lid);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_user_cli_register error 0x%x", status);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
__RAM_EM uint8_t data_test[THROUGHTPUT_SEND_DATA_LEN] = {0x00, 0x01, 0x02,
|
||||
0x03};
|
||||
void send_data(uint8_t conidx)
|
||||
{
|
||||
uint16_t status;
|
||||
|
||||
status = xc_ble_gatt_cli_write(conidx, get_cli_user_ild(), 0, GATT_WRITE,
|
||||
cli_tx_hdl, sizeof(data_test), data_test);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("write error 0x%x", status);
|
||||
}
|
||||
}
|
||||
|
||||
void usr_cli_feat_enable(uint8_t conidx)
|
||||
{
|
||||
uint16_t svc_uuid = CUSTOM_SVC_UUID_CLI;
|
||||
uint8_t status = gatt_cli_discover_svc(
|
||||
conidx, get_cli_user_ild(), 0, GATT_DISCOVER_SVC_PRIMARY_BY_UUID, true,
|
||||
GATT_MIN_HDL, GATT_MAX_HDL, GATT_UUID_16, (uint8_t *)&svc_uuid);
|
||||
|
||||
if (status == GATT_NO_ERROR) {
|
||||
status = xc_ble_gatt_cli_event_register(conidx, get_cli_user_ild(),
|
||||
GATT_MIN_HDL, GATT_MAX_HDL);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("xc_ble_gatt_cli_event_register error 0x%x", status);
|
||||
}
|
||||
} else {
|
||||
LOGI_ERR("gatt_cli_discover_svc error 0x%x", status);
|
||||
}
|
||||
|
||||
// uint16_t xc_ble_gatt_cli_mtu_exch( conidx, get_cli_user_ild());
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file usr_client.h
|
||||
*
|
||||
* @brief Custom client
|
||||
*
|
||||
* Copyright (c) 2022 - 2025, XinChip
|
||||
* All rights reserved.
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _USR_CLIENT_H_
|
||||
#define _USE_CLIENT_H_
|
||||
|
||||
#include "app_task.h"
|
||||
#include "dbg.h"
|
||||
#include "gatt_msg.h"
|
||||
#include "usr_server.h"
|
||||
#include "xc_gatt_client_api.h"
|
||||
|
||||
#define THROUGHTPUT_SEND_DATA_LEN 20
|
||||
|
||||
uint8_t get_cli_user_ild(void);
|
||||
uint8_t app_cli_register(void);
|
||||
void usr_cli_feat_enable(uint8_t conidx);
|
||||
#endif // _USE_CLIENT_H_
|
||||
@@ -0,0 +1,190 @@
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file usr_server.c
|
||||
*
|
||||
* @brief Custom Server profile database definitions.
|
||||
*
|
||||
* Copyright (c) 2022 - 2025, XinChip
|
||||
* All rights reserved.p
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
#include "usr_server.h"
|
||||
#include "xc6xxx.h"
|
||||
|
||||
#include "xc_head.h"
|
||||
#include <string.h>
|
||||
|
||||
uint8_t srv_user_lid = GATT_INVALID_USER_LID;
|
||||
uint16_t custom_svc_start_hdl = GATT_INVALID_HDL;
|
||||
uint8_t custom_svc_tx_char_notify = DISABLE;
|
||||
|
||||
static const gatt_att_desc_t custom_server_atts[] = {
|
||||
[CUSTOM_SVC_DECL] =
|
||||
{
|
||||
.uuid = 0x00,
|
||||
0x28,
|
||||
.info = GATT_ATT_RD_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
[CUSTOM_SVC_RX_CHAR_DECL_CHAR] =
|
||||
{
|
||||
.uuid = 0x03,
|
||||
0x28,
|
||||
.info = GATT_ATT_RD_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
[CUSTOM_SVC_RX_CHAR_VAL] =
|
||||
{
|
||||
.uuid = CUSTOM_SVC_RX_CHAR_UUID,
|
||||
.info = GATT_ATT_WC_BIT | GATT_ATT_RD_BIT | ATT_UUID(128),
|
||||
.ext_info =
|
||||
GATT_ATT_NO_OFFSET_BIT | CUSTOM_SVC_RX_CHAR_VAL_MAX_LENGTH,
|
||||
},
|
||||
[CUSTOM_SVC_TX_CHAR_DECL_CHAR] =
|
||||
{
|
||||
.uuid = 0x03,
|
||||
0x28,
|
||||
.info = GATT_ATT_RD_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
[CUSTOM_SVC_TX_CHAR_VAL] =
|
||||
{
|
||||
.uuid = CUSTOM_SVC_TX_CHAR_UUID,
|
||||
.info = GATT_ATT_N_BIT | ATT_UUID(128),
|
||||
.ext_info =
|
||||
GATT_ATT_NO_OFFSET_BIT | CUSTOM_SVC_TX_CHAR_VAL_MAX_LENGTH,
|
||||
},
|
||||
[CUSTOM_SVC_TX_CHAR_CFG] =
|
||||
{
|
||||
.uuid = 0x02,
|
||||
0x29,
|
||||
.info = GATT_ATT_RD_BIT | GATT_ATT_WR_BIT | ATT_UUID(16),
|
||||
.ext_info = 0,
|
||||
},
|
||||
};
|
||||
|
||||
uint8_t slave_send_data(uint8_t *data, uint8_t len, uint8_t att_idx);
|
||||
|
||||
uint16_t srv_get_hdl_from_att_idx(uint8_t idx)
|
||||
{
|
||||
return custom_svc_start_hdl + idx;
|
||||
}
|
||||
|
||||
// This function is called when GATT server user has initiated event send to
|
||||
// peer device or if an error occurs.
|
||||
__STATIC void custom_svc_cb_event_sent(uint8_t conidx, uint8_t user_lid,
|
||||
uint16_t dummy, uint16_t status)
|
||||
{
|
||||
LOGI("[%s] conidx:%d, usr_lid:%d, dummy:%d, status:%d \r\n", __func__,
|
||||
conidx, user_lid, dummy, status);
|
||||
extern void ble_data_send_callback(void);
|
||||
ble_data_send_callback();
|
||||
}
|
||||
|
||||
// This function is called when peer want to read local attribute database
|
||||
// value.
|
||||
__STATIC void custom_svc_cb_att_read_get(uint8_t conidx, uint8_t user_lid,
|
||||
uint16_t token, uint16_t hdl,
|
||||
uint16_t offset, uint16_t max_length)
|
||||
{
|
||||
uint16_t status;
|
||||
uint8_t data[] = {0x12, 0x15, 0x46, 0x62};
|
||||
LOGI("[%s] conidx:%d, usr_lid:%d, token:%d, hdl:%d, offset:%d, "
|
||||
"max_length:%d \r\n",
|
||||
__func__, conidx, user_lid, token, hdl, offset, max_length);
|
||||
// Send result to peer device
|
||||
status = xc_ble_gatt_srv_read_cfm(conidx, user_lid, token, GAP_ERR_NO_ERROR,
|
||||
sizeof(data), sizeof(data), data);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_srv_read_cfm error 0x%x", status);
|
||||
}
|
||||
}
|
||||
|
||||
// This function is called during a write procedure to modify attribute handle.
|
||||
__STATIC void custom_svc_cb_att_val_set(uint8_t conidx, uint8_t user_lid,
|
||||
uint16_t token, uint16_t hdl,
|
||||
uint16_t offset, co_buf_t *p_data)
|
||||
{
|
||||
uint16_t length = co_buf_data_len(p_data);
|
||||
uint16_t status;
|
||||
LOGI("[%s] conidx:%d, usr_lid:%d, token:%d, hdl:%d, offset:%d \r\n",
|
||||
__func__, conidx, user_lid, token, hdl, offset);
|
||||
status =
|
||||
xc_ble_gatt_srv_write_cfm(conidx, user_lid, token, GAP_ERR_NO_ERROR);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_srv_write_cfm error 0x%x", status);
|
||||
}
|
||||
LOGI("length:%d data:\r\n", length);
|
||||
// DUMP_DATA_PRINTF(co_buf_data(p_data), length);
|
||||
// xc_fota_server_write_ind(co_buf_data(p_data), length);
|
||||
// LOGI("hdl=%x %x\r\n", hdl,
|
||||
// srv_get_hdl_from_att_idx(CUSTOM_SVC_TX_CHAR_CFG));
|
||||
if (hdl == srv_get_hdl_from_att_idx(CUSTOM_SVC_TX_CHAR_CFG)) {
|
||||
if ((co_buf_data(p_data)[1] == 0) && (co_buf_data(p_data)[0] == 0)) {
|
||||
custom_svc_tx_char_notify = DISABLE;
|
||||
extern int xc_ble_status_callback(int status);
|
||||
xc_ble_status_callback(BLE_EVENT_NTF_DISABLE);
|
||||
} else {
|
||||
custom_svc_tx_char_notify = ENABLE;
|
||||
LOGI("notify test\r\n");
|
||||
extern int xc_ble_status_callback(int status);
|
||||
xc_ble_status_callback(BLE_EVENT_NTF_ENABLE);
|
||||
}
|
||||
}
|
||||
|
||||
if (hdl == srv_get_hdl_from_att_idx(CUSTOM_SVC_RX_CHAR_VAL))
|
||||
{
|
||||
extern int xc_ble_data_recv_callback(void *data, uint32_t bytes);
|
||||
xc_ble_data_recv_callback(co_buf_data(p_data), length);
|
||||
}
|
||||
}
|
||||
|
||||
int ble_send_notify_data(uint8_t *buffer, int length)
|
||||
{
|
||||
slave_send_data(buffer, length, CUSTOM_SVC_TX_CHAR_VAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static const gatt_srv_cb_t custom_src_cb = {
|
||||
.cb_event_sent = custom_svc_cb_event_sent,
|
||||
.cb_att_read_get = custom_svc_cb_att_read_get,
|
||||
.cb_att_val_set = custom_svc_cb_att_val_set,
|
||||
};
|
||||
|
||||
uint8_t custom_svc_add(void)
|
||||
{
|
||||
int nb_att = sizeof(custom_server_atts) / sizeof(custom_server_atts[0]);
|
||||
uint16_t status;
|
||||
uint8_t custom_svc_uuid[GATT_UUID_128_LEN] = CUSTOM_SVC_UUID;
|
||||
status = xc_ble_gatt_user_srv_register(GAP_LE_MTU_MAX, 0, &custom_src_cb,
|
||||
&srv_user_lid);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_user_srv_register error 0x%x", status);
|
||||
}
|
||||
status = xc_ble_gatt_service_add(
|
||||
srv_user_lid, GATT_UUID_128 << GATT_SVC_UUID_TYPE_LSB, custom_svc_uuid,
|
||||
nb_att, NULL, &(custom_server_atts[0]), nb_att, &custom_svc_start_hdl);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("xc_ble_gatt_service_add error 0x%x", status);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
uint8_t slave_send_data(uint8_t *data, uint8_t len, uint8_t att_idx)
|
||||
{
|
||||
uint16_t status = INVALID_DATA;
|
||||
struct app_env_tag *app_env = get_app_env();
|
||||
if (app_env->slave_connected && custom_svc_tx_char_notify) {
|
||||
status = xc_ble_gatt_srv_notify(app_env->slave_conidx, srv_user_lid, 0,
|
||||
srv_get_hdl_from_att_idx(att_idx), len,
|
||||
data);
|
||||
if (status != GATT_NO_ERROR) {
|
||||
LOGI_ERR("gatt_srv_notify error 0x%x", status);
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file usr_server.h
|
||||
*
|
||||
* @brief Custom Server profile database definitions.
|
||||
*
|
||||
* Copyright (c) 2022 - 2025, XinChip
|
||||
* All rights reserved.
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
#ifndef _USR_SERVER_H_
|
||||
#define _USR_SERVER_H_
|
||||
|
||||
#include "app_task.h"
|
||||
#include "dbg.h"
|
||||
#include "gatt.h"
|
||||
#include "gatt_msg.h"
|
||||
#include "rwble_hl_config.h"
|
||||
#include "xc_gatt_server_api.h"
|
||||
|
||||
// #define CUSTOM_SVC_UUID
|
||||
// {0x00,0x00,0xFF,0x10,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFA}
|
||||
// #define CUSTOM_SVC_RX_CHAR_UUID
|
||||
// 0x00,0x00,0xFF,0x11,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB
|
||||
// #define CUSTOM_SVC_TX_CHAR_UUID
|
||||
// 0x00,0x00,0xFF,0x12,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB
|
||||
|
||||
#define CUSTOM_SVC_UUID \
|
||||
{ \
|
||||
0xFA, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, \
|
||||
0x00, 0x10, 0xFF, 0x00, 0x00 \
|
||||
}
|
||||
#define CUSTOM_SVC_TX_CHAR_UUID \
|
||||
0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, \
|
||||
0x11, 0xFF, 0x00, 0x00
|
||||
#define CUSTOM_SVC_RX_CHAR_UUID \
|
||||
0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, \
|
||||
0x12, 0xFF, 0x00, 0x00
|
||||
|
||||
#define CUSTOM_SVC_RX_CHAR_VAL_MAX_LENGTH (512)
|
||||
#define CUSTOM_SVC_TX_CHAR_VAL_MAX_LENGTH (512)
|
||||
|
||||
#ifndef DISABLE
|
||||
#define DISABLE 0
|
||||
#endif // DISABLE
|
||||
|
||||
#ifndef ENABLE
|
||||
#define ENABLE 1
|
||||
#endif // ENABLE
|
||||
|
||||
enum cust_svc
|
||||
{
|
||||
CUSTOM_SVC_DECL = 0,
|
||||
CUSTOM_SVC_RX_CHAR_DECL_CHAR,
|
||||
CUSTOM_SVC_RX_CHAR_VAL,
|
||||
CUSTOM_SVC_TX_CHAR_DECL_CHAR,
|
||||
CUSTOM_SVC_TX_CHAR_VAL,
|
||||
CUSTOM_SVC_TX_CHAR_CFG,
|
||||
};
|
||||
uint8_t custom_svc_add(void);
|
||||
uint8_t slave_send_data(uint8_t *data, uint8_t len, uint8_t att_idx);
|
||||
#endif // _USR_SERVER_H_
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
FUNC void Initialization(void)
|
||||
{
|
||||
SP = _RDWORD(0x10000000);
|
||||
PC = _RDWORD(0x10000004);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
LOAD %L INCREMENTAL
|
||||
Initialization();
|
||||
@@ -0,0 +1,39 @@
|
||||
[BREAKPOINTS]
|
||||
ForceImpTypeAny = 0
|
||||
ShowInfoWin = 1
|
||||
EnableFlashBP = 2
|
||||
BPDuringExecution = 0
|
||||
[CFI]
|
||||
CFISize = 0x00
|
||||
CFIAddr = 0x00
|
||||
[CPU]
|
||||
MonModeVTableAddr = 0xFFFFFFFF
|
||||
MonModeDebug = 0
|
||||
MaxNumAPs = 0
|
||||
LowPowerHandlingMode = 0
|
||||
OverrideMemMap = 0
|
||||
AllowSimulation = 1
|
||||
ScriptFile=""
|
||||
[FLASH]
|
||||
CacheExcludeSize = 0x00
|
||||
CacheExcludeAddr = 0x00
|
||||
MinNumBytesFlashDL = 0
|
||||
SkipProgOnCRCMatch = 1
|
||||
VerifyDownload = 1
|
||||
AllowCaching = 1
|
||||
EnableFlashDL = 2
|
||||
Override = 0
|
||||
Device="ARM7"
|
||||
[GENERAL]
|
||||
WorkRAMSize = 0x00
|
||||
WorkRAMAddr = 0x00
|
||||
RAMUsageLimit = 0x00
|
||||
[SWO]
|
||||
SWOLogFile=""
|
||||
[MEM]
|
||||
RdOverrideOrMask = 0x00
|
||||
RdOverrideAndMask = 0xFFFFFFFF
|
||||
RdOverrideAddr = 0xFFFFFFFF
|
||||
WrOverrideOrMask = 0x00
|
||||
WrOverrideAndMask = 0xFFFFFFFF
|
||||
WrOverrideAddr = 0xFFFFFFFF
|
||||
@@ -0,0 +1,16 @@
|
||||
LOAD 0x10000000
|
||||
{
|
||||
EXE 0x10000000
|
||||
{
|
||||
startup_xinc.o (RESET, +FIRST)
|
||||
* (+RO)
|
||||
|
||||
}
|
||||
|
||||
RW +0000
|
||||
{
|
||||
* (+RW,+ZI)
|
||||
}
|
||||
|
||||
ScatterAssert(ImageLength(RW) < 1024 * 28)
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
LOAD 0x11016000
|
||||
{
|
||||
EXE 0x11016000
|
||||
{
|
||||
startup_xinc.o (RESET, +FIRST)
|
||||
* (+RO)
|
||||
|
||||
}
|
||||
;This area is vector
|
||||
RW1 0x10000100
|
||||
{
|
||||
startup_xinc.o(STACK)
|
||||
}
|
||||
ScatterAssert(ImageLength(RW1) < (0x800 - 0x100))
|
||||
RW 0x100031b0
|
||||
{
|
||||
; startup_xinc.o(STACK)
|
||||
* (+RW,+ZI)
|
||||
*(ram_code)
|
||||
aeabi_sdiv.o(.text)
|
||||
uread4.o(.text)
|
||||
rt_memclr.o(.text)
|
||||
}
|
||||
ScatterAssert((0x31b0+ImageLength(RW)) < 1024 * 32 )
|
||||
|
||||
|
||||
; RW2 (0x53004000+12*1024)
|
||||
; {
|
||||
; *(ram_em)
|
||||
; }
|
||||
; ScatterAssert((0x53004000+12*1024)+ImageLength(RW2) < (0x53004000+16*1024))
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,808 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
|
||||
|
||||
<SchemaVersion>1.0</SchemaVersion>
|
||||
|
||||
<Header>### uVision Project, (C) Keil Software</Header>
|
||||
|
||||
<Extensions>
|
||||
<cExt>*.c</cExt>
|
||||
<aExt>*.s*; *.src; *.a*</aExt>
|
||||
<oExt>*.obj; *.o</oExt>
|
||||
<lExt>*.lib</lExt>
|
||||
<tExt>*.txt; *.h; *.inc</tExt>
|
||||
<pExt>*.plm</pExt>
|
||||
<CppX>*.cpp</CppX>
|
||||
<nMigrate>0</nMigrate>
|
||||
</Extensions>
|
||||
|
||||
<DaveTm>
|
||||
<dwLowDateTime>0</dwLowDateTime>
|
||||
<dwHighDateTime>0</dwHighDateTime>
|
||||
</DaveTm>
|
||||
|
||||
<Target>
|
||||
<TargetName>ble-sdk-xip</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
<CLKADS>12000000</CLKADS>
|
||||
<OPTTT>
|
||||
<gFlags>0</gFlags>
|
||||
<BeepAtEnd>1</BeepAtEnd>
|
||||
<RunSim>0</RunSim>
|
||||
<RunTarget>1</RunTarget>
|
||||
<RunAbUc>0</RunAbUc>
|
||||
</OPTTT>
|
||||
<OPTHX>
|
||||
<HexSelection>1</HexSelection>
|
||||
<FlashByte>65535</FlashByte>
|
||||
<HexRangeLowAddress>0</HexRangeLowAddress>
|
||||
<HexRangeHighAddress>0</HexRangeHighAddress>
|
||||
<HexOffset>0</HexOffset>
|
||||
</OPTHX>
|
||||
<OPTLEX>
|
||||
<PageWidth>79</PageWidth>
|
||||
<PageLength>66</PageLength>
|
||||
<TabStop>8</TabStop>
|
||||
<ListingPath>.\Listings\</ListingPath>
|
||||
</OPTLEX>
|
||||
<ListingPage>
|
||||
<CreateCListing>1</CreateCListing>
|
||||
<CreateAListing>1</CreateAListing>
|
||||
<CreateLListing>1</CreateLListing>
|
||||
<CreateIListing>0</CreateIListing>
|
||||
<AsmCond>1</AsmCond>
|
||||
<AsmSymb>1</AsmSymb>
|
||||
<AsmXref>0</AsmXref>
|
||||
<CCond>1</CCond>
|
||||
<CCode>0</CCode>
|
||||
<CListInc>0</CListInc>
|
||||
<CSymb>0</CSymb>
|
||||
<LinkerCodeListing>0</LinkerCodeListing>
|
||||
</ListingPage>
|
||||
<OPTXL>
|
||||
<LMap>1</LMap>
|
||||
<LComments>1</LComments>
|
||||
<LGenerateSymbols>1</LGenerateSymbols>
|
||||
<LLibSym>1</LLibSym>
|
||||
<LLines>1</LLines>
|
||||
<LLocSym>1</LLocSym>
|
||||
<LPubSym>1</LPubSym>
|
||||
<LXref>0</LXref>
|
||||
<LExpSel>0</LExpSel>
|
||||
</OPTXL>
|
||||
<OPTFL>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<IsCurrentTarget>1</IsCurrentTarget>
|
||||
</OPTFL>
|
||||
<CpuCode>7</CpuCode>
|
||||
<DebugOpt>
|
||||
<uSim>0</uSim>
|
||||
<uTrg>1</uTrg>
|
||||
<sLdApp>1</sLdApp>
|
||||
<sGomain>1</sGomain>
|
||||
<sRbreak>1</sRbreak>
|
||||
<sRwatch>1</sRwatch>
|
||||
<sRmem>1</sRmem>
|
||||
<sRfunc>1</sRfunc>
|
||||
<sRbox>1</sRbox>
|
||||
<tLdApp>1</tLdApp>
|
||||
<tGomain>1</tGomain>
|
||||
<tRbreak>1</tRbreak>
|
||||
<tRwatch>1</tRwatch>
|
||||
<tRmem>1</tRmem>
|
||||
<tRfunc>0</tRfunc>
|
||||
<tRbox>1</tRbox>
|
||||
<tRtrace>1</tRtrace>
|
||||
<sRSysVw>1</sRSysVw>
|
||||
<tRSysVw>1</tRSysVw>
|
||||
<sRunDeb>0</sRunDeb>
|
||||
<sLrtime>0</sLrtime>
|
||||
<bEvRecOn>1</bEvRecOn>
|
||||
<bSchkAxf>0</bSchkAxf>
|
||||
<bTchkAxf>0</bTchkAxf>
|
||||
<nTsel>0</nTsel>
|
||||
<sDll></sDll>
|
||||
<sDllPa></sDllPa>
|
||||
<sDlgDll></sDlgDll>
|
||||
<sDlgPa></sDlgPa>
|
||||
<sIfile></sIfile>
|
||||
<tDll></tDll>
|
||||
<tDllPa></tDllPa>
|
||||
<tDlgDll></tDlgDll>
|
||||
<tDlgPa></tDlgPa>
|
||||
<tIfile></tIfile>
|
||||
<pMon>BIN\UL2CM3.DLL</pMon>
|
||||
</DebugOpt>
|
||||
<TargetDriverDllRegistry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>UL2CM3</Key>
|
||||
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
</Tracepoint>
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>0</periodic>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
<aPa>0</aPa>
|
||||
<viewmode>0</viewmode>
|
||||
<vrSel>0</vrSel>
|
||||
<aSym>0</aSym>
|
||||
<aTbox>0</aTbox>
|
||||
<AscS1>0</AscS1>
|
||||
<AscS2>0</AscS2>
|
||||
<AscS3>0</AscS3>
|
||||
<aSer3>0</aSer3>
|
||||
<eProf>0</eProf>
|
||||
<aLa>0</aLa>
|
||||
<aPa1>0</aPa1>
|
||||
<AscS4>0</AscS4>
|
||||
<aSer4>0</aSer4>
|
||||
<StkLoc>0</StkLoc>
|
||||
<TrcWin>0</TrcWin>
|
||||
<newCpu>0</newCpu>
|
||||
<uProt>0</uProt>
|
||||
</DebugFlag>
|
||||
<LintExecutable></LintExecutable>
|
||||
<LintConfigFile></LintConfigFile>
|
||||
<bLintAuto>0</bLintAuto>
|
||||
<bAutoGenD>0</bAutoGenD>
|
||||
<LntExFlags>0</LntExFlags>
|
||||
<pMisraName></pMisraName>
|
||||
<pszMrule></pszMrule>
|
||||
<pSingCmds></pSingCmds>
|
||||
<pMultCmds></pMultCmds>
|
||||
<pMisraNamep></pMisraNamep>
|
||||
<pszMrulep></pszMrulep>
|
||||
<pSingCmdsp></pSingCmdsp>
|
||||
<pMultCmdsp></pMultCmdsp>
|
||||
</TargetOption>
|
||||
</Target>
|
||||
|
||||
<Group>
|
||||
<GroupName>startup</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>1</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\core_cm0.h</PathWithFileName>
|
||||
<FilenameWithoutPath>core_cm0.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>2</FileNumber>
|
||||
<FileType>2</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\startup_xinc.s</PathWithFileName>
|
||||
<FilenameWithoutPath>startup_xinc.s</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>3</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\system_xinc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>system_xinc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>application</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>4</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\app_task.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_task.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>5</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\usr_client.c</PathWithFileName>
|
||||
<FilenameWithoutPath>usr_client.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>6</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\sleep.c</PathWithFileName>
|
||||
<FilenameWithoutPath>sleep.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>7</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\arch_main.c</PathWithFileName>
|
||||
<FilenameWithoutPath>arch_main.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>8</FileNumber>
|
||||
<FileType>3</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\rom_symdefs.o</PathWithFileName>
|
||||
<FilenameWithoutPath>rom_symdefs.o</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>9</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\app_sec.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_sec.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>10</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\src\usr_server.c</PathWithFileName>
|
||||
<FilenameWithoutPath>usr_server.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>11</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\api\sdk_config.h</PathWithFileName>
|
||||
<FilenameWithoutPath>sdk_config.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>hal</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_adc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_adc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_aotimer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_aotimer.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_bor.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_bor.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_calib.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_calib.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_clock.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_clock.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_fmc_spi.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_fmc_spi_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_gpio.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_gpio.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_i2c.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_i2c.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pga.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_pga.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwm.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_pwm.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwr.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_pwr.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_qdec.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_qdec.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_rtc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_rtc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_spi.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_spi_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_sw_i2c.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_sw_i2c.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_systick.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_systick.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_timer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_timer.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_uart.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart_dma.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_uart_dma.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_wdt.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_drv_wdt.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>ble_api</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\ip\ble\api\xc_gap_api.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_gap_api.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_client_api.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_gatt_client_api.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_server_api.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_gatt_server_api.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>modules_nvds</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\..\..\component\ble\modules\nvds\src\nvds.c</PathWithFileName>
|
||||
<FilenameWithoutPath>nvds.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>at_cmd</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>39</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\uart_task.c</PathWithFileName>
|
||||
<FilenameWithoutPath>uart_task.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>40</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\user_main.c</PathWithFileName>
|
||||
<FilenameWithoutPath>user_main.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>41</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_atcmd.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_atcmd.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>42</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_ble.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_ble.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>43</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_config.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_config.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>44</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_flash.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_flash.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>45</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_main.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_main.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>46</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_sys.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_sys.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>47</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_task.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_task.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>48</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\xc_uart.c</PathWithFileName>
|
||||
<FilenameWithoutPath>xc_uart.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>49</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\app\at_cmd\xinchip\src\common\ringbuf.c</PathWithFileName>
|
||||
<FilenameWithoutPath>ringbuf.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
</ProjectOpt>
|
||||
@@ -0,0 +1,702 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
|
||||
|
||||
<SchemaVersion>2.1</SchemaVersion>
|
||||
|
||||
<Header>### uVision Project, (C) Keil Software</Header>
|
||||
|
||||
<Targets>
|
||||
<Target>
|
||||
<TargetName>ble-sdk-xip</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
|
||||
<uAC6>0</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>ARMCM0</Device>
|
||||
<Vendor>ARM</Vendor>
|
||||
<PackID>ARM.CMSIS.5.7.0</PackID>
|
||||
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
<StartupFile></StartupFile>
|
||||
<FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</FlashDriverDll>
|
||||
<DeviceId>0</DeviceId>
|
||||
<RegisterFile>$$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h</RegisterFile>
|
||||
<MemoryEnv></MemoryEnv>
|
||||
<Cmp></Cmp>
|
||||
<Asm></Asm>
|
||||
<Linker></Linker>
|
||||
<OHString></OHString>
|
||||
<InfinionOptionDll></InfinionOptionDll>
|
||||
<SLE66CMisc></SLE66CMisc>
|
||||
<SLE66AMisc></SLE66AMisc>
|
||||
<SLE66LinkerMisc></SLE66LinkerMisc>
|
||||
<SFDFile>$$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd</SFDFile>
|
||||
<bCustSvd>0</bCustSvd>
|
||||
<UseEnv>0</UseEnv>
|
||||
<BinPath></BinPath>
|
||||
<IncludePath></IncludePath>
|
||||
<LibPath></LibPath>
|
||||
<RegisterFilePath></RegisterFilePath>
|
||||
<DBRegisterFilePath></DBRegisterFilePath>
|
||||
<TargetStatus>
|
||||
<Error>0</Error>
|
||||
<ExitCodeStop>0</ExitCodeStop>
|
||||
<ButtonStop>0</ButtonStop>
|
||||
<NotGenerated>0</NotGenerated>
|
||||
<InvalidFlash>1</InvalidFlash>
|
||||
</TargetStatus>
|
||||
<OutputDirectory>.\Objects\</OutputDirectory>
|
||||
<OutputName>Xinc_ble_sdk</OutputName>
|
||||
<CreateExecutable>1</CreateExecutable>
|
||||
<CreateLib>0</CreateLib>
|
||||
<CreateHexFile>0</CreateHexFile>
|
||||
<DebugInformation>1</DebugInformation>
|
||||
<BrowseInformation>1</BrowseInformation>
|
||||
<ListingPath>.\Listings\</ListingPath>
|
||||
<HexFormatSelection>1</HexFormatSelection>
|
||||
<Merge32K>0</Merge32K>
|
||||
<CreateBatchFile>0</CreateBatchFile>
|
||||
<BeforeCompile>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopU1X>0</nStopU1X>
|
||||
<nStopU2X>0</nStopU2X>
|
||||
</BeforeCompile>
|
||||
<BeforeMake>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopB1X>0</nStopB1X>
|
||||
<nStopB2X>0</nStopB2X>
|
||||
</BeforeMake>
|
||||
<AfterMake>
|
||||
<RunUserProg1>1</RunUserProg1>
|
||||
<RunUserProg2>1</RunUserProg2>
|
||||
<UserProg1Name>fromelf --bin --output=app.bin !L</UserProg1Name>
|
||||
<UserProg2Name>.\output_tool\BAT\ge_ota.bat</UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopA1X>0</nStopA1X>
|
||||
<nStopA2X>0</nStopA2X>
|
||||
</AfterMake>
|
||||
<SelectedForBatchBuild>0</SelectedForBatchBuild>
|
||||
<SVCSIdString></SVCSIdString>
|
||||
</TargetCommonOption>
|
||||
<CommonProperty>
|
||||
<UseCPPCompiler>0</UseCPPCompiler>
|
||||
<RVCTCodeConst>0</RVCTCodeConst>
|
||||
<RVCTZI>0</RVCTZI>
|
||||
<RVCTOtherData>0</RVCTOtherData>
|
||||
<ModuleSelection>0</ModuleSelection>
|
||||
<IncludeInBuild>1</IncludeInBuild>
|
||||
<AlwaysBuild>0</AlwaysBuild>
|
||||
<GenerateAssemblyFile>0</GenerateAssemblyFile>
|
||||
<AssembleAssemblyFile>0</AssembleAssemblyFile>
|
||||
<PublicsOnly>0</PublicsOnly>
|
||||
<StopOnExitCode>3</StopOnExitCode>
|
||||
<CustomArgument></CustomArgument>
|
||||
<IncludeLibraryModules></IncludeLibraryModules>
|
||||
<ComprImg>1</ComprImg>
|
||||
</CommonProperty>
|
||||
<DllOption>
|
||||
<SimDllName>SARMCM3.DLL</SimDllName>
|
||||
<SimDllArguments> </SimDllArguments>
|
||||
<SimDlgDll>DARMCM1.DLL</SimDlgDll>
|
||||
<SimDlgDllArguments>-pCM0</SimDlgDllArguments>
|
||||
<TargetDllName>SARMCM3.DLL</TargetDllName>
|
||||
<TargetDllArguments> </TargetDllArguments>
|
||||
<TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
|
||||
<TargetDlgDllArguments>-pCM0</TargetDlgDllArguments>
|
||||
</DllOption>
|
||||
<DebugOption>
|
||||
<OPTHX>
|
||||
<HexSelection>1</HexSelection>
|
||||
<HexRangeLowAddress>0</HexRangeLowAddress>
|
||||
<HexRangeHighAddress>0</HexRangeHighAddress>
|
||||
<HexOffset>0</HexOffset>
|
||||
<Oh166RecLen>16</Oh166RecLen>
|
||||
</OPTHX>
|
||||
</DebugOption>
|
||||
<Utilities>
|
||||
<Flash1>
|
||||
<UseTargetDll>1</UseTargetDll>
|
||||
<UseExternalTool>0</UseExternalTool>
|
||||
<RunIndependent>0</RunIndependent>
|
||||
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
|
||||
<Capability>1</Capability>
|
||||
<DriverSelection>4096</DriverSelection>
|
||||
</Flash1>
|
||||
<bUseTDR>1</bUseTDR>
|
||||
<Flash2>BIN\UL2CM3.DLL</Flash2>
|
||||
<Flash3>"" ()</Flash3>
|
||||
<Flash4></Flash4>
|
||||
<pFcarmOut></pFcarmOut>
|
||||
<pFcarmGrp></pFcarmGrp>
|
||||
<pFcArmRoot></pFcArmRoot>
|
||||
<FcArmLst>0</FcArmLst>
|
||||
</Utilities>
|
||||
<TargetArmAds>
|
||||
<ArmAdsMisc>
|
||||
<GenerateListings>0</GenerateListings>
|
||||
<asHll>1</asHll>
|
||||
<asAsm>1</asAsm>
|
||||
<asMacX>1</asMacX>
|
||||
<asSyms>1</asSyms>
|
||||
<asFals>1</asFals>
|
||||
<asDbgD>1</asDbgD>
|
||||
<asForm>1</asForm>
|
||||
<ldLst>0</ldLst>
|
||||
<ldmm>1</ldmm>
|
||||
<ldXref>1</ldXref>
|
||||
<BigEnd>0</BigEnd>
|
||||
<AdsALst>1</AdsALst>
|
||||
<AdsACrf>1</AdsACrf>
|
||||
<AdsANop>0</AdsANop>
|
||||
<AdsANot>0</AdsANot>
|
||||
<AdsLLst>1</AdsLLst>
|
||||
<AdsLmap>1</AdsLmap>
|
||||
<AdsLcgr>1</AdsLcgr>
|
||||
<AdsLsym>1</AdsLsym>
|
||||
<AdsLszi>1</AdsLszi>
|
||||
<AdsLtoi>1</AdsLtoi>
|
||||
<AdsLsun>1</AdsLsun>
|
||||
<AdsLven>1</AdsLven>
|
||||
<AdsLsxf>1</AdsLsxf>
|
||||
<RvctClst>0</RvctClst>
|
||||
<GenPPlst>0</GenPPlst>
|
||||
<AdsCpuType>"Cortex-M0"</AdsCpuType>
|
||||
<RvctDeviceName></RvctDeviceName>
|
||||
<mOS>0</mOS>
|
||||
<uocRom>0</uocRom>
|
||||
<uocRam>0</uocRam>
|
||||
<hadIROM>1</hadIROM>
|
||||
<hadIRAM>1</hadIRAM>
|
||||
<hadXRAM>0</hadXRAM>
|
||||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>0</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<hadIRAM2>0</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
<useUlib>0</useUlib>
|
||||
<EndSel>1</EndSel>
|
||||
<uLtcg>0</uLtcg>
|
||||
<nSecure>0</nSecure>
|
||||
<RoSelD>3</RoSelD>
|
||||
<RwSelD>3</RwSelD>
|
||||
<CodeSel>0</CodeSel>
|
||||
<OptFeed>0</OptFeed>
|
||||
<NoZi1>0</NoZi1>
|
||||
<NoZi2>0</NoZi2>
|
||||
<NoZi3>0</NoZi3>
|
||||
<NoZi4>0</NoZi4>
|
||||
<NoZi5>0</NoZi5>
|
||||
<Ro1Chk>0</Ro1Chk>
|
||||
<Ro2Chk>0</Ro2Chk>
|
||||
<Ro3Chk>0</Ro3Chk>
|
||||
<Ir1Chk>0</Ir1Chk>
|
||||
<Ir2Chk>0</Ir2Chk>
|
||||
<Ra1Chk>0</Ra1Chk>
|
||||
<Ra2Chk>0</Ra2Chk>
|
||||
<Ra3Chk>0</Ra3Chk>
|
||||
<Im1Chk>0</Im1Chk>
|
||||
<Im2Chk>0</Im2Chk>
|
||||
<OnChipMemories>
|
||||
<Ocm1>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm1>
|
||||
<Ocm2>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm2>
|
||||
<Ocm3>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm3>
|
||||
<Ocm4>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm4>
|
||||
<Ocm5>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm5>
|
||||
<Ocm6>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm6>
|
||||
<IRAM>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0x20000</Size>
|
||||
</IRAM>
|
||||
<IROM>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x40000</Size>
|
||||
</IROM>
|
||||
<XRAM>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</XRAM>
|
||||
<OCR_RVCT1>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT1>
|
||||
<OCR_RVCT2>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT2>
|
||||
<OCR_RVCT3>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT3>
|
||||
<OCR_RVCT4>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x40000</Size>
|
||||
</OCR_RVCT4>
|
||||
<OCR_RVCT5>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT5>
|
||||
<OCR_RVCT6>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT6>
|
||||
<OCR_RVCT7>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT7>
|
||||
<OCR_RVCT8>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT8>
|
||||
<OCR_RVCT9>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0x20000</Size>
|
||||
</OCR_RVCT9>
|
||||
<OCR_RVCT10>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT10>
|
||||
</OnChipMemories>
|
||||
<RvctStartVector></RvctStartVector>
|
||||
</ArmAdsMisc>
|
||||
<Cads>
|
||||
<interw>1</interw>
|
||||
<Optim>4</Optim>
|
||||
<oTime>0</oTime>
|
||||
<SplitLS>0</SplitLS>
|
||||
<OneElfS>1</OneElfS>
|
||||
<Strict>0</Strict>
|
||||
<EnumInt>0</EnumInt>
|
||||
<PlainCh>0</PlainCh>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<wLevel>2</wLevel>
|
||||
<uThumb>0</uThumb>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<uC99>1</uC99>
|
||||
<uGnu>1</uGnu>
|
||||
<useXO>0</useXO>
|
||||
<v6Lang>3</v6Lang>
|
||||
<v6LangP>3</v6LangP>
|
||||
<vShortEn>1</vShortEn>
|
||||
<vShortWch>1</vShortWch>
|
||||
<v6Lto>0</v6Lto>
|
||||
<v6WtE>0</v6WtE>
|
||||
<v6Rtti>0</v6Rtti>
|
||||
<VariousControls>
|
||||
<MiscControls>--gnu --diag_suppress=66 --feedback fb.txt</MiscControls>
|
||||
<Define>CONFIG_XINCHIP=1 SDK_VERSION="2058f68c" RC_32K=1 XC65XX CFG_BLE CFG_EMB CFG_STATIC USE_XIP=0 HCI_TEST_NO_IP=0 CFG_ACT=8 CFG_CON=6 CFG_RAL=1 CFG_HOST CFG_APP CFG_APP_PRF CFG_RF_EXTRC CFG_AES_RPA CFG_ALLROLES CFG_GATT_CLI USE_XIP=1 DEBUG_ENABLE ROM_ENV_ENABLE=0 CODE_USE_XIP CFG_PRF_BASS USE_ROM_FLASH=1 CFG_SCAN_PERFORMANCE CFG_MIN_STACK CONFIG_BT_WAKEUP_VIA_GPIO=1 CONFIG_HFCLK_IS_OSC32M_PLL_32M=1 SCATTER_LOAD_RAM_EM=1</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..\..\..\..\component\ble\Include;..\app\api;..\..\..\..\..\component\ble\modules\aes\api;..\..\..\..\..\component\ble\modules\aes\src;..\..\..\..\..\component\ble\modules\common\api;..\..\..\..\..\component\ble\modules\common\src;..\..\..\..\..\component\ble\modules\ecc_p256\api;..\..\..\..\..\component\ble\modules\ecc_p256\src;..\..\..\..\..\component\ble\modules\h4tl\api;..\..\..\..\..\component\ble\modules\h4tl\src;..\..\..\..\..\component\ble\modules\ke\api;..\..\..\..\..\component\ble\modules\ke\src;..\..\..\..\..\component\ble\modules\nvds\api;..\..\..\..\..\component\ble\modules\nvds\src;..\..\..\..\..\component\ble\modules\rf\api;..\..\..\..\..\component\ble\modules\rf\src;..\..\..\..\..\component\ble\modules\rwip\api;..\..\..\..\..\component\ble\modules\rwip\src;..\..\..\..\..\component\ble\ip\ahi\api;..\..\..\..\..\component\ble\ip\ahi\src;..\..\..\..\..\component\ble\ip\ble\gaf\api;..\..\..\..\..\component\ble\ip\ble\gaf\inc;..\..\..\..\..\component\ble\ip\ble\gaf\src;..\..\..\..\..\component\ble\ip\ble\gaf\src\acc;..\..\..\..\..\component\ble\ip\ble\gaf\src\al;..\..\..\..\..\component\ble\ip\ble\gaf\src\arc;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\bc;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\capa;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\codec;..\..\..\..\..\component\ble\ip\ble\gaf\src\bap\uc;..\..\..\..\..\component\ble\ip\ble\gaf\src\iap;..\..\..\..\..\component\ble\ip\ble\hl\api;..\..\..\..\..\component\ble\ip\ble\hl\inc;..\..\..\..\..\component\ble\ip\ble\hl\src;..\..\..\..\..\component\ble\ip\ble\hl\src\gap;..\..\..\..\..\component\ble\ip\ble\hl\src\gap\gapc;..\..\..\..\..\component\ble\ip\ble\hl\src\gap\gapm;..\..\..\..\..\component\ble\ip\ble\hl\src\gatt;..\..\..\..\..\component\ble\ip\ble\hl\src\inc;..\..\..\..\..\component\ble\ip\ble\hl\src\l2cap;..\..\..\..\..\component\ble\ip\ble\ll\api;..\..\..\..\..\component\ble\ip\ble\ll\src;..\..\..\..\..\component\ble\ip\ble\ll\src\co;..\..\..\..\..\component\ble\ip\ble\ll\src\llc;..\..\..\..\..\component\ble\ip\ble\ll\src\lld;..\..\..\..\..\component\ble\ip\ble\ll\src\lli;..\..\..\..\..\component\ble\ip\ble\ll\src\llm;..\..\..\..\..\component\ble\ip\ble\profiles\bas\bass\api;..\..\..\..\..\component\ble\ip\ble\profiles\bas\bass\src;..\..\..\..\..\component\ble\ip\em\api;..\..\..\..\..\component\ble\ip\em\src;..\..\..\..\..\component\ble\ip\hci\api;..\..\..\..\..\component\ble\ip\hci\src;..\..\..\..\..\component\ble\ip\sch\api;..\..\..\..\..\component\ble\ip\sch\src;..\..\..\..\..\component\ble\plf\refip\src\build\ble-full\reg\fw;..\app\api;..\app\src;..\..\..\..\..\component\ble\plf\refip\src\arch;..\..\..\..\..\component\ble\plf\refip\src\arch\compiler\gnuarm;..\..\..\..\..\component\ble\plf\refip\src\arch\ll\gnuarm;..\..\..\..\..\component\ble\plf\refip\src\driver\reg;..\..\..\..\..\component\ble\plf\refip\src\arch\boot\rvds;..\..\..\..\..\component\ble\plf\refip\src\driver\syscntl;..\..\..\..\..\component\ble\plf\refip\src\driver\emi;..\..\..\..\..\component\ble\plf\refip\src\driver\intc;..\..\..\..\..\component\ble\plf\refip\src\driver\uart;..\..\..\..\..\component\ble\plf\refip\src\driver\flash;..\..\..\..\..\component\ble\plf\refip\src\driver\led;..\..\..\..\..\component\ble\modules\dbg\api;..\..\..\..\..\component\ble\plf\refip\src\driver\uart;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device;..\..\..\..\..\component\xc6xx_drivers\Drivers\Startup;..\..\..\..\..\component\xc6xx_drivers\Drivers\Startup\xc65xx;..\..\..\..\..\component\xc6xx_drivers\Drivers\Periph_HAL_Driver;..\..\..\..\..\component\xc6xx_drivers\Drivers\Periph_HAL_Driver\Bitfields;..\..\..\..\..\component\xc6xx_drivers\Drivers\Periph_HAL_Driver\Ringbuffer;..\..\..\..\..\component\xc6xx_drivers\Drivers\test_case\PWR;..\..\..\..\..\component\xc6xx_drivers\Drivers\test_case\TIMER;..\..\..\..\..\component\ble\ip\ble\api;..\..\..\..\..\component\xc6xx_drivers\Drivers\test_case\TIMER;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS;..\..\..\..\..\component\xc6xx_drivers\Drivers;..\..\..\..\..\component\ble\ip\ble\ll_rom_port;..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver;..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device\xc_m0_register;..\..\..\..\..\component\ble\modules\flash;..\app\at_cmd\xinchip\include;..\app\at_cmd\xinchip\src\common</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
<interw>1</interw>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<thumb>0</thumb>
|
||||
<SplitLS>0</SplitLS>
|
||||
<SwStkChk>0</SwStkChk>
|
||||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<ClangAsOpt>1</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath></IncludePath>
|
||||
</VariousControls>
|
||||
</Aads>
|
||||
<LDads>
|
||||
<umfTarg>0</umfTarg>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<noStLib>0</noStLib>
|
||||
<RepFail>1</RepFail>
|
||||
<useFile>0</useFile>
|
||||
<TextAddressRange>0x00000000</TextAddressRange>
|
||||
<DataAddressRange>0x20000000</DataAddressRange>
|
||||
<pXoBase></pXoBase>
|
||||
<ScatterFile>.\Linker\cpu_xip.scat</ScatterFile>
|
||||
<IncludeLibs></IncludeLibs>
|
||||
<IncludeLibsPath></IncludeLibsPath>
|
||||
<Misc>--feedback fb.txt --info=stack --callgraph</Misc>
|
||||
<LinkerInputFile></LinkerInputFile>
|
||||
<DisabledWarnings></DisabledWarnings>
|
||||
</LDads>
|
||||
</TargetArmAds>
|
||||
</TargetOption>
|
||||
<Groups>
|
||||
<Group>
|
||||
<GroupName>startup</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>core_cm0.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\core_cm0.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>startup_xinc.s</FileName>
|
||||
<FileType>2</FileType>
|
||||
<FilePath>..\app\src\startup_xinc.s</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>system_xinc.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\system_xinc.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>application</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>app_task.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\app_task.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>usr_client.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\usr_client.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>sleep.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\sleep.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>arch_main.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\arch_main.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>rom_symdefs.o</FileName>
|
||||
<FileType>3</FileType>
|
||||
<FilePath>..\app\src\rom_symdefs.o</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_sec.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\app_sec.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>usr_server.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\src\usr_server.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>sdk_config.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\app\api\sdk_config.h</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>hal</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>xc_drv_adc.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_adc.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_aotimer.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_aotimer.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_bor.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_bor.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_calib.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_calib.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_clock.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_clock.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_fmc_spi.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_fmc_spi_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_gpio.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_gpio.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_i2c.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_i2c.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_pga.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pga.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_pwm.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwm.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_pwr.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwr.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_qdec.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_qdec.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_rtc.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_rtc.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_spi.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_spi_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_spi_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_sw_i2c.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_sw_i2c.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_systick.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_systick.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_timer.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_timer.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_uart.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_uart_dma.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_uart_dma.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_drv_wdt.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_wdt.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>ble_api</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>xc_gap_api.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\ip\ble\api\xc_gap_api.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_gatt_client_api.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_client_api.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_gatt_server_api.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\ip\ble\api\xc_gatt_server_api.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>modules_nvds</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>nvds.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\..\..\component\ble\modules\nvds\src\nvds.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>at_cmd</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>uart_task.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\uart_task.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>user_main.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\user_main.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_atcmd.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_atcmd.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_ble.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_ble.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_config.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_config.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_flash.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_flash.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_main.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_main.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_sys.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_sys.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_task.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_task.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>xc_uart.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\xc_uart.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ringbuf.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\app\at_cmd\xinchip\src\common\ringbuf.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
</Groups>
|
||||
</Target>
|
||||
</Targets>
|
||||
|
||||
<RTE>
|
||||
<apis/>
|
||||
<components/>
|
||||
<files>
|
||||
<file attr="config" category="linkerScript" condition="ARMCC5" name="Device\ARM\ARMCM0\Source\ARM\ARMCM0_ac5.sct" version="1.0.0">
|
||||
<instance index="0" removed="1">RTE\Device\ARMCM0\ARMCM0_ac5.sct</instance>
|
||||
<component Cclass="Device" Cgroup="Startup" Cvariant="C Startup" Cvendor="ARM" Cversion="2.0.3" condition="ARMCM0 CMSIS" isDefaultVariant="1"/>
|
||||
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.8.0"/>
|
||||
<targetInfos/>
|
||||
</file>
|
||||
<file attr="config" category="sourceC" name="Device\ARM\ARMCM0\Source\startup_ARMCM0.c" version="2.0.3">
|
||||
<instance index="0" removed="1">RTE\Device\ARMCM0\startup_ARMCM0.c</instance>
|
||||
<component Cclass="Device" Cgroup="Startup" Cvariant="C Startup" Cvendor="ARM" Cversion="2.0.3" condition="ARMCM0 CMSIS" isDefaultVariant="1"/>
|
||||
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.8.0"/>
|
||||
<targetInfos/>
|
||||
</file>
|
||||
<file attr="config" category="sourceC" name="Device\ARM\ARMCM0\Source\system_ARMCM0.c" version="1.0.0">
|
||||
<instance index="0" removed="1">RTE\Device\ARMCM0\system_ARMCM0.c</instance>
|
||||
<component Cclass="Device" Cgroup="Startup" Cvariant="C Startup" Cvendor="ARM" Cversion="2.0.3" condition="ARMCM0 CMSIS" isDefaultVariant="1"/>
|
||||
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.8.0"/>
|
||||
<targetInfos/>
|
||||
</file>
|
||||
</files>
|
||||
</RTE>
|
||||
|
||||
<LayerInfo>
|
||||
<Layers>
|
||||
<Layer>
|
||||
<LayName><Project Info></LayName>
|
||||
<LayDesc></LayDesc>
|
||||
<LayUrl></LayUrl>
|
||||
<LayKeys></LayKeys>
|
||||
<LayCat></LayCat>
|
||||
<LayLic></LayLic>
|
||||
<LayTarg>0</LayTarg>
|
||||
<LayPrjMark>1</LayPrjMark>
|
||||
</Layer>
|
||||
</Layers>
|
||||
</LayerInfo>
|
||||
|
||||
</Project>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,73 @@
|
||||
@echo off
|
||||
mkdir output_bin
|
||||
set Download_bin=.\output_bin\ble_Central.bin
|
||||
set Ota_use_bin=.\output_bin\ota_data_single.bin
|
||||
set AES_OUTPUT_BIN= .\output_bin\ota_data_aes.bin
|
||||
|
||||
set Host_bin=.\output_tool\stack.bin
|
||||
set Host_addr=0x11002000
|
||||
|
||||
set App_bin=app.bin
|
||||
set App_loading_addr=0x11016000
|
||||
set App_save_addr=0x12000
|
||||
|
||||
|
||||
set Ota_app_bin=app.bin
|
||||
set ota_Loading_Save_addr=0x11016000
|
||||
|
||||
set soft_ver=0x10
|
||||
set hard_ver=0x20
|
||||
|
||||
set Is_xip_mode=1
|
||||
REM If If_add_app is set to 1, then Download_bin = Host_bin + Ota_app_bin + App_bin; else Download_bin = Host_bin + Ota_app_bin.
|
||||
set Is_add_app=1
|
||||
set Is_add_app2=0
|
||||
REM Set boot2 start app,Only 1 can set 1.
|
||||
set RUN1=0
|
||||
set RUN2=1
|
||||
set RUN3=0
|
||||
|
||||
REM AES Config
|
||||
set AES_START=1
|
||||
set KEY=0b0c0d0405060708090a0b0c0d0e0f10
|
||||
set MODE=ECB
|
||||
set PADDING=NONE
|
||||
set BLOCK_SIZE=128Bits
|
||||
@REM A area
|
||||
.\output_tool\BAT\ge.exe %App_bin% ^
|
||||
%soft_ver% %hard_ver% ^
|
||||
%App_save_addr% %App_loading_addr% ^
|
||||
%Ota_app_bin% %ota_Loading_Save_addr% ^
|
||||
%Is_xip_mode% ^
|
||||
%Ota_use_bin%
|
||||
|
||||
.\output_tool\aes.exe ^
|
||||
%AES_START% %Ota_use_bin% %AES_OUTPUT_BIN% ^
|
||||
%KEY% %MODE% %PADDING% %BLOCK_SIZE%
|
||||
|
||||
copy %Download_bin% .\
|
||||
|
||||
@REM B area
|
||||
set App_save_addr=0x1e000
|
||||
set Ota_use_bin=.\output_bin\ota_data_double.bin
|
||||
.\output_tool\BAT\ge.exe %App_bin% ^
|
||||
%soft_ver% %hard_ver% ^
|
||||
%App_save_addr% %App_loading_addr% ^
|
||||
%Ota_app_bin% %ota_Loading_Save_addr% ^
|
||||
%Is_xip_mode% ^
|
||||
%Ota_use_bin%
|
||||
|
||||
.\output_tool\BAT\xinchip_bootloader2_tool.exe .\output_tool\boot2 ^
|
||||
%Host_bin% %Host_addr% %RUN1% ^
|
||||
%App_bin% %App_loading_addr% %RUN2% ^
|
||||
%Ota_app_bin% %ota_Loading_Save_addr% %RUN3% ^
|
||||
%Download_bin% %Is_add_app% %Is_add_app2%
|
||||
|
||||
.\output_tool\aes.exe ^
|
||||
%AES_START% %Ota_use_bin% %AES_OUTPUT_BIN% ^
|
||||
%KEY% %MODE% %PADDING% %BLOCK_SIZE%
|
||||
|
||||
copy %Download_bin% .\
|
||||
|
||||
|
||||
|
||||
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user