358 lines
8.5 KiB
C
358 lines
8.5 KiB
C
/*
|
|
* @file btdm_host.h
|
|
* @version v1.0
|
|
* @brief GAP API exposed to app layer
|
|
* @attention
|
|
* Copyright (c) 2022 Freqchip. \n
|
|
* All rights reserved. \n
|
|
*/
|
|
|
|
#ifndef _BTDM_HOST_H
|
|
#define _BTDM_HOST_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
/* Exported types ------------------------------------------------------------*/
|
|
|
|
enum btdm_nvds_tag {
|
|
BTDM_NVDS_TAG_IRK, //!< local device irk
|
|
BTDM_NVDS_TAG_BOND_INFO, //!< BLE bonding information
|
|
BTDM_NVDS_TAG_MAX = BTDM_NVDS_TAG_BOND_INFO+16, //!< reserve 16 bonding information
|
|
BTDM_NVDS_TAG_CONTROLLER_INFO, //!< controller information
|
|
};
|
|
|
|
enum btdm_nvds_status {
|
|
BTDM_NVDS_STATUS_OK,
|
|
BTDM_NVDS_STATUS_FAILED,
|
|
};
|
|
|
|
struct ble_host_param {
|
|
/*
|
|
* this field is to indicate identity address is PUBLIC or RANDOM PRIVATE.
|
|
*/
|
|
uint8_t own_addr_type; // 0: public, 1:random static, other: unacceptable
|
|
|
|
/* local random static address, valied when own_addr_type is 1 */
|
|
struct {
|
|
uint8_t addr[6];
|
|
} own_addr;
|
|
};
|
|
|
|
/* Exported constants --------------------------------------------------------*/
|
|
/* Exported macro ------------------------------------------------------------*/
|
|
/* Private macros ------------------------------------------------------------*/
|
|
/* Exported functions --------------------------------------------------------*/
|
|
|
|
/*
|
|
* @fn ble_host_init
|
|
*
|
|
* @brief initialize ble host and HCI interface.
|
|
*
|
|
* param[in] param: BLE host parameters, @ref ble_host_param, default value is used when
|
|
* param is NULL
|
|
*/
|
|
void ble_host_init(struct ble_host_param *param);
|
|
|
|
/*
|
|
* @fn bt_host_init
|
|
*
|
|
* @brief initialize bt host, ble host should be ready before call this function.
|
|
*/
|
|
void bt_host_init(void);
|
|
|
|
/*
|
|
* @fn bt_a2dp_init
|
|
*
|
|
* @brief initialize a2dp profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_a2dp_init(void);
|
|
|
|
/*
|
|
* @fn bt_avrcp_init
|
|
*
|
|
* @brief initialize avrcp profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_avrcp_init(void);
|
|
|
|
/*
|
|
* @fn bt_hf_init
|
|
*
|
|
* @brief initialize HF profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_hf_init(void);
|
|
|
|
/*
|
|
* @fn bt_hfg_init
|
|
*
|
|
* @brief initialize HFG profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_hfg_init(void);
|
|
|
|
/*
|
|
* @fn bt_pan_init
|
|
*
|
|
* @brief initialize BNEP/PAN profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_pan_init(void);
|
|
|
|
/*
|
|
* @fn bt_hid_init
|
|
*
|
|
* @brief initialize HID profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_hid_init(void);
|
|
|
|
/*
|
|
* @fn bt_spp_init
|
|
*
|
|
* @brief initialize SPP profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_spp_init(void);
|
|
|
|
/*
|
|
* @fn bt_pbap_init
|
|
*
|
|
* @brief initialize PBAP profile, this function should be called following bt_stack_init.
|
|
*/
|
|
void bt_pbap_init(void);
|
|
|
|
/*
|
|
* @fn ble_host_ready
|
|
*
|
|
* @brief used to check whether ble host is ready or not.
|
|
*
|
|
* @return true: ble host is ready
|
|
*/
|
|
bool ble_host_ready(void);
|
|
|
|
/*
|
|
* @fn bt_host_ready
|
|
*
|
|
* @brief used to check whether bt host is ready or not.
|
|
*
|
|
* @return true: bt host is ready
|
|
*/
|
|
bool bt_host_ready(void);
|
|
|
|
/*
|
|
* @fn btdm_host_schedule
|
|
*
|
|
* @brief used to schedule btdm host internal event, this function should be called
|
|
* in system main loop.
|
|
*
|
|
* @example no RTOS:
|
|
* while(1) {
|
|
* btdm_host_schedule();
|
|
* // other process
|
|
* ...
|
|
* }
|
|
*
|
|
* RTOS:
|
|
* void stack_task(void)
|
|
* {
|
|
* while(1) {
|
|
* pending_new_event();
|
|
* btdm_host_schedule();
|
|
* }
|
|
* }
|
|
*
|
|
* void btdm_host_notify_schedule(void)
|
|
* {
|
|
* post_new_event();
|
|
* }
|
|
*/
|
|
void btdm_host_schedule(void);
|
|
|
|
/*
|
|
* @fn btdm_host_check_sleep
|
|
*
|
|
* @brief used to check whether system is allowed to enter sleep.
|
|
*
|
|
* @return true: btdm host can enter sleep right now
|
|
*/
|
|
bool btdm_host_check_sleep(void);
|
|
|
|
/*
|
|
* @fn btdm_host_schedule_ble
|
|
*
|
|
* @brief used to schedule ble host internal event, this function should be called
|
|
* in system main loop. This function is useful when only BLE is enabled.
|
|
*/
|
|
void btdm_host_schedule_ble(void);
|
|
|
|
/*
|
|
* @fn btdm_host_check_sleep_ble
|
|
*
|
|
* @brief used to check whether system is allowed to enter sleep. This function is useful
|
|
* when only BLE is enabled.
|
|
*
|
|
* @return true: ble host can enter sleep right now
|
|
*/
|
|
bool btdm_host_check_sleep_ble(void);
|
|
|
|
/*
|
|
* @fn btdm_timer_trigger
|
|
*
|
|
* @brief used to notice host timer is triggered.
|
|
*/
|
|
void btdm_timer_trigger(void);
|
|
|
|
/*
|
|
* @fn btdm_set_seed
|
|
*
|
|
* @brief initial seed for random generate function inside btdm stack.
|
|
*
|
|
* @param[in] seed: random seed.
|
|
*/
|
|
void btdm_set_seed(uint16_t seed);
|
|
|
|
/* Need to be implemented functions ------------------------------------------------*/
|
|
|
|
/*
|
|
* @fn btdm_malloc
|
|
*
|
|
* @brief allocate request size memory.
|
|
*
|
|
* @param[in] size: request size.
|
|
*
|
|
* @return allocated memory pointer
|
|
*/
|
|
void *btdm_malloc(uint32_t size);
|
|
|
|
/*
|
|
* @fn btdm_free
|
|
*
|
|
* @brief free allocated memory by btdm_malloc.
|
|
*
|
|
* @param[in] ptr: allocated memory pointer.
|
|
*/
|
|
void btdm_free(void *ptr);
|
|
|
|
/*
|
|
* @fn btdm_host_notify_schedule
|
|
*
|
|
* @brief used to notify btdm_host_schedule should be called to handle new btdm event,
|
|
* user should implement this function when RTOS is used, @ref btdm_host_schedule.
|
|
* Counting semaphore should be used because btdm_notify_schedule may be called more
|
|
* than one time before btdm_stack_schedule is called.
|
|
*/
|
|
void btdm_host_notify_schedule(void);
|
|
|
|
/*
|
|
* @fn btdm_host_lock
|
|
*
|
|
* @brief Called by the host to indicate the host and its APIs must not be entered by
|
|
* another task. This function should be implement when RTOS is used, and binary
|
|
* semaphore or mutex should be used.
|
|
*
|
|
* @example void btdm_stack_lock(void)
|
|
* {
|
|
* xSemaphoreTake();
|
|
* }
|
|
*/
|
|
void btdm_host_lock(void);
|
|
|
|
/*
|
|
* @fn btdm_host_unlock
|
|
*
|
|
* @brief Called by the host to allow access to the host again. This function should
|
|
* be implement when RTOS is used
|
|
*
|
|
* @example void btdm_stack_unlock(void)
|
|
* {
|
|
* xSemaphoreGive();
|
|
* }
|
|
*/
|
|
void btdm_host_unlock(void);
|
|
|
|
/*
|
|
* @fn btdm_timer_start
|
|
*
|
|
* @brief used to start or restart timer with target timeout time.
|
|
*
|
|
* @param[in] ms: timeout time(millisecond).
|
|
*/
|
|
void btdm_timer_start(uint32_t ms);
|
|
|
|
/*
|
|
* @fn btdm_timer_stop
|
|
*
|
|
* @brief used to stop timer.
|
|
*/
|
|
void btdm_timer_stop(void);
|
|
|
|
/*
|
|
* @fn btdm_get_system_time
|
|
*
|
|
* @brief used to get current time.
|
|
*
|
|
* @return current time(millisecond)
|
|
*/
|
|
uint32_t btdm_get_system_time(void);
|
|
|
|
/*
|
|
* @fn btdm_time_diff
|
|
*
|
|
* @brief Clocks time difference.
|
|
*
|
|
* @param[in] a_time value (in ms).
|
|
* @param[in] b_time value (in ms).
|
|
*
|
|
* @return result the time difference from a_time to b_time
|
|
* - result < 0 => b_time is in the past
|
|
* - result == 0 => a_time is equal to b_time
|
|
* - result > 0 => b_time is in the future
|
|
*/
|
|
int btdm_time_diff(uint32_t a_time, uint32_t b_time);
|
|
|
|
/*
|
|
* @fn btdm_nvds_put
|
|
*
|
|
* @brief Save generated data into NVDS.
|
|
*
|
|
* @param[in] tag: data type
|
|
* @param[in] length: data length
|
|
* @param[in] data: data pointer
|
|
*
|
|
* @return storage status, @ref btdm_nvds_status
|
|
*/
|
|
enum btdm_nvds_status btdm_nvds_put(uint8_t tag, uint16_t length, uint8_t *data);
|
|
|
|
/*
|
|
* @fn btdm_nvds_get
|
|
*
|
|
* @brief Get data from NVDS.
|
|
*
|
|
* @param[in] tag: data type
|
|
* @param[inout] length: buffer length for input, real data length for outpu
|
|
* @param[in] data: data pointer
|
|
*
|
|
* @return get data success or not, @ref btdm_nvds_status
|
|
*/
|
|
enum btdm_nvds_status btdm_nvds_get(uint8_t tag, uint16_t *length, uint8_t *buffer);
|
|
|
|
/*
|
|
* @fn btdm_nvds_del
|
|
*
|
|
* @brief delete data from NVDS with given tag.
|
|
*
|
|
* @param[in] tag: data type to be deleted
|
|
*
|
|
* @return delete success or not, @ref btdm_nvds_status
|
|
*/
|
|
enum btdm_nvds_status btdm_nvds_del(uint8_t tag);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _BTDM_HOST_H
|
|
|
|
|