From af9b08d863a090133e1985c76b727d25d1767fa5 Mon Sep 17 00:00:00 2001 From: yulong Date: Thu, 13 Oct 2016 09:13:21 -0400 Subject: [PATCH] commponent bt:1.added the bt_prf_sys_main.c file which has been process the profile task event method; 2.modified the thread.h file==> added the profile task event in it 3.modified bt_prf_task.c==>added the ready function in it 4.added the bt_prf_sys.h file 5.remove the profile_sys.h file --- .../bt/bluedroid/bta/sys/bta_sys_main.c | 2 +- components/bt/bluedroid/osi/include/thread.h | 2 + .../bluedroid/profiles/core/bt_prf_sys_main.c | 154 ++++++++++++++++++ .../bt/bluedroid/profiles/core/bt_prf_task.c | 23 ++- .../profiles/core/include/bt_prf_sys.h | 86 ++++++++++ .../profiles/core/include/bt_prf_task.h | 3 + .../profiles/core/include/profile_sys.h | 33 ---- 7 files changed, 267 insertions(+), 36 deletions(-) create mode 100644 components/bt/bluedroid/profiles/core/bt_prf_sys_main.c create mode 100644 components/bt/bluedroid/profiles/core/include/bt_prf_sys.h delete mode 100644 components/bt/bluedroid/profiles/core/include/profile_sys.h diff --git a/components/bt/bluedroid/bta/sys/bta_sys_main.c b/components/bt/bluedroid/bta/sys/bta_sys_main.c index 48e1ecd007..36901e39dc 100755 --- a/components/bt/bluedroid/bta/sys/bta_sys_main.c +++ b/components/bt/bluedroid/bta/sys/bta_sys_main.c @@ -224,7 +224,7 @@ BOOLEAN bta_sys_sm_execute(BT_HDR *p_msg) UINT8 action; int i; - APPL_TRACE_EVENT("bta_sys_sm_execute state:%d, event:0x%x", bta_sys_cb.state, p_msg->event); + APPL_TRACE_EVENT("bta_sys_sm_execute state:%d, event:0x%x\n", bta_sys_cb.state, p_msg->event); /* look up the state table for the current state */ state_table = bta_sys_st_tbl[bta_sys_cb.state]; diff --git a/components/bt/bluedroid/osi/include/thread.h b/components/bt/bluedroid/osi/include/thread.h index e2c932367c..dcdc2b44ef 100644 --- a/components/bt/bluedroid/osi/include/thread.h +++ b/components/bt/bluedroid/osi/include/thread.h @@ -16,6 +16,8 @@ struct task_evt { typedef struct task_evt TaskEvt_t; enum { + SIG_PRF_START_UP = 0xfc, + SIG_PRF_WORK = 0xfd, SIG_BTU_START_UP = 0xfe, SIG_BTU_WORK = 0xff }; diff --git a/components/bt/bluedroid/profiles/core/bt_prf_sys_main.c b/components/bt/bluedroid/profiles/core/bt_prf_sys_main.c new file mode 100644 index 0000000000..d2eb922d7b --- /dev/null +++ b/components/bt/bluedroid/profiles/core/bt_prf_sys_main.c @@ -0,0 +1,154 @@ +/** + **************************************************************************************** + * + * @file bt_prf_sys_main.c + * + * @brief Application entry point + * + * Copyright (C) Espressif 2016 + * Created by Yulong at 2016/10/13 + * + * + **************************************************************************************** + */ + +#include "thread.h" +#include "bt_prf_sys.h" +#include "fixed_queue.h" +#include "bt_prf_task.h" +#include "gki.h" + +#include + + +tBT_PRF_SYS_CB bt_prf_sys_cb; +fixed_queue_t *bt_profile_msg_queue; + + +static const tBT_PRF_SYS_REG bt_prf_sys_reg = +{ + NULL, + NULL +}; + + +void bt_prf_sys_init(void) +{ + memset(&bt_prf_sys_cb,0,sizeof(tBT_PRF_SYS_CB)); +} + + +/******************************************************************************* +** +** Function bt_prf_sys_event +** +** Description profile task event handler; called from task event handler. +** +** +** Returns void +** +*******************************************************************************/ +void bt_prf_sys_event(BT_HDR *p_msg) +{ + UINT8 id; + BOOLEAN freebuf = TRUE; + + APPL_TRACE_EVENT("profile task got event 0x%x\n", p_msg->event); + + /* get subsystem id from event */ + id = (UINT8) (p_msg->event >> 8); + + /* verify id and call subsystem event handler */ + if ((id < PRF_ID_MAX) && (bt_prf_sys_cb.reg[id] != NULL)) + { + freebuf = (*bt_prf_sys_cb.reg[id]->evt_hdlr)(p_msg); + } + else + { + APPL_TRACE_WARNING("profile task got unregistered event id %d\n", id); + } + + if (freebuf) + { + GKI_freebuf(p_msg); + } + +} + + +/******************************************************************************* +** +** Function bt_prf_sys_register +** +** Description Called by other profile subsystems to register their event +** handler. +** +** Parameters id:the Identifiers index of the profile +** p_reg:the callback event which has been register to the profile task +** Returns void +** +*******************************************************************************/ +void bt_prf_sys_register(UINT8 id, const tBT_PRF_SYS_REG *p_reg) +{ + bt_prf_sys_cb.reg[id] = (tBT_PRF_SYS_REG *) p_reg; + bt_prf_sys_cb.is_reg[id] = TRUE; +} + +/******************************************************************************* +** +** Function bt_prf_sys_deregister +** +** Description Called by other profile subsystems to de-register +** handler. +** +** Parameters id:Identifiers index of the profile +** Returns void +** +*******************************************************************************/ +void bt_prf_sys_deregister(UINT8 id) +{ + bt_prf_sys_cb.is_reg[id] = FALSE; +} + +/******************************************************************************* +** +** Function bt_prf_sys_is_register +** +** Description Called by other profile subsystems to get registeration +** status. +** +** +** Returns void +** +*******************************************************************************/ +BOOLEAN bt_prf_sys_is_register(UINT8 id) +{ + return bt_prf_sys_cb.is_reg[id]; +} + +/******************************************************************************* +** +** Function bt_prf_sys_sendmsg +** +** Description Send a GKI message to the profile task. +** +** +** Returns void +** +*******************************************************************************/ +void bt_prf_sys_sendmsg(void *p_msg) +{ + // There is a race condition that occurs if the stack is shut down while + // there is a procedure in progress that can schedule a task via this + // message queue. This causes |btu_bta_msg_queue| to get cleaned up before + // it gets used here; hence we check for NULL before using it. + if (bt_profile_msg_queue) { + fixed_queue_enqueue(bt_profile_msg_queue, p_msg); + + bt_prf_task_post(SIG_PRF_WORK); + } +} + + + + diff --git a/components/bt/bluedroid/profiles/core/bt_prf_task.c b/components/bt/bluedroid/profiles/core/bt_prf_task.c index 7163f508a9..c92d4dc282 100644 --- a/components/bt/bluedroid/profiles/core/bt_prf_task.c +++ b/components/bt/bluedroid/profiles/core/bt_prf_task.c @@ -13,6 +13,7 @@ */ #include "bt_prf_task.h" +#include "bt_prf_sys.h" #include "allocator.h" #include "thread.h" #include "gki.h" @@ -37,12 +38,12 @@ //ke_event_clear(KE_EVENT_BTU_TASK_THREAD); TaskEvt_t *e; - for (;;) { if (pdTRUE == xQueueReceive(xProfileQueue, &e, (portTickType)portMAX_DELAY)) { if (e->sig == SIG_BTU_WORK) { - fixed_queue_process(bt_profile_msg_queue); + fixed_queue_process(bt_profile_msg_queue); + } else if (e->sig == SIG_BTU_START_UP) { bt_prf_task_start_up(); @@ -52,11 +53,29 @@ } } + void bt_prf_task_post(uint32_t sig) +{ + TaskEvt_t *evt = (TaskEvt_t *)osi_malloc(sizeof(TaskEvt_t)); + if (evt == NULL) + return; + + evt->sig = sig; + evt->par = 0; + + if (xQueueSend(xProfileQueue, &evt, 10/portTICK_RATE_MS) != pdTRUE) { + ets_printf("xProfileQueue failed\n"); + } +} + void bt_profile_msg_ready(fixed_queue_t *queue) { BT_HDR *p_msg; while (!fixed_queue_is_empty(queue)) { p_msg = (BT_HDR *)fixed_queue_dequeue(queue); + if(p_msg != NULL) + { + bt_prf_sys_event(p_msg); + } } } diff --git a/components/bt/bluedroid/profiles/core/include/bt_prf_sys.h b/components/bt/bluedroid/profiles/core/include/bt_prf_sys.h new file mode 100644 index 0000000000..9043e8e823 --- /dev/null +++ b/components/bt/bluedroid/profiles/core/include/bt_prf_sys.h @@ -0,0 +1,86 @@ +/** + **************************************************************************************** + * + * @file bt_prf_sys.h + * + * @brief Application entry point + * + * Copyright (C) Espressif 2016 + * Created by Yulong at 2016/10/12 + * + * + **************************************************************************************** + */ + +#ifndef _PROFILE_SYS_H__ +#define _PROFILE_SYS_H__ + +#include "bt_types.h" + +enum +{ + PRF_ID_SYS, + PRF_ID_CONN, + PRF_ID_HIDD_LE, + PRF_ID_HIDH_LE, + PRF_ID_DISS_LE, + PRF_ID_DISC_LE, + PRF_ID_AIRSYNC_LE, + PRF_ID_ANCC_LE, + PRF_ID_BUT_LE, + + PRF_ID_MAX +}; + +typedef UINT8 tBT_PRF_SYS_CONN_STATUS; + + +/* disable function type */ +typedef void (tBT_PRF_SYS_DISABLE)(void); +/* event handler function type */ +typedef BOOLEAN (tBT_PRF_SYS_EVT_HDLR)(BT_HDR *p_msg); + +/* conn callback for role / low power manager*/ +typedef void (tBT_PRF_SYS_CONN_CBACK)(tBT_PRF_SYS_CONN_STATUS status, + UINT8 id, UINT8 app_id, BD_ADDR peer_addr); + +/* Calculate start of event enumeration; id is top 8 bits of event */ +#define BT_PRF_SYS_EVT_START(id) ((id) << 8) + + + +/* registration structure */ +typedef struct +{ + tBT_PRF_SYS_EVT_HDLR *evt_hdlr; + tBT_PRF_SYS_DISABLE *disable; +} tBT_PRF_SYS_REG; + +/* system manager control block */ +typedef struct +{ + tBT_PRF_SYS_REG *reg[PRF_ID_MAX]; /* registration structures */ + BOOLEAN is_reg[PRF_ID_MAX]; /* registration structures */ + tBT_PRF_SYS_CONN_CBACK *prm_cb; /* role management callback registered by DM */ + tBT_PRF_SYS_CONN_CBACK *ppm_cb; /* low power management callback registered by DM */ + tBT_PRF_SYS_CONN_CBACK *p_policy_cb; /* link policy change callback registered by DM */ + +} tBT_PRF_SYS_CB; + + +extern tBT_PRF_SYS_CB bt_prf_sys_cb; + + +extern void bt_prf_sys_init(void); +extern void bt_prf_sys_free(void); +extern void bt_prf_sys_event(BT_HDR *p_msg); + +extern void bt_prf_sys_register(UINT8 id, const tBT_PRF_SYS_REG *p_reg); +extern void bt_prf_sys_deregister(UINT8 id); +extern BOOLEAN bt_prf_sys_is_register(UINT8 id); + +extern void bt_prf_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr); +extern void bt_prf_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr); + + +#endif ///_PROFILE_SYS_H__ diff --git a/components/bt/bluedroid/profiles/core/include/bt_prf_task.h b/components/bt/bluedroid/profiles/core/include/bt_prf_task.h index 3537522262..4077987698 100644 --- a/components/bt/bluedroid/profiles/core/include/bt_prf_task.h +++ b/components/bt/bluedroid/profiles/core/include/bt_prf_task.h @@ -29,6 +29,9 @@ void bt_prf_task_thread_handler(void *arg); void bt_prf_init_core(void); void bt_prf_free_core(void); +void bt_prf_task_post(uint32_t sig); + + void bt_prf_StartUp(void); void bt_prf_ShutDown(void); diff --git a/components/bt/bluedroid/profiles/core/include/profile_sys.h b/components/bt/bluedroid/profiles/core/include/profile_sys.h deleted file mode 100644 index 8337b504e4..0000000000 --- a/components/bt/bluedroid/profiles/core/include/profile_sys.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - **************************************************************************************** - * - * @file profile_sys.h - * - * @brief Application entry point - * - * Copyright (C) Espressif 2016 - * Created by Yulong at 2016/10/12 - * - * - **************************************************************************************** - */ - -#ifndef _PROFILE_SYS_H__ -#define _PROFILE_SYS_H__ - -enum -{ - PRF_ID_SYS, - PRF_ID_CONN, - PRF_ID_HIDD_LE, - PRF_ID_HIDH_LE, - PRF_ID_DISS_LE, - PRF_ID_DISC_LE, - PRF_ID_AIRSYNC_LE, - PRF_ID_ANCC_LE, - PRF_ID_BUT_LE -}; - - - -#endif ///_PROFILE_SYS_H__ \ No newline at end of file