/* * @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 #include /* 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