目录
框架及代码分析
首先来看一下按键处理逻辑框图
然后我们在来分析具体的代码逻辑
对于初始化部分,主要是硬件初始化,注册按键事件处理函数(app_key_handle_process),以及注册事件-接口的table表格等
/* 首先是初始化部分 */
app_init
/*硬件初始化,注册中断等*/
app_key_open
/* 这里指定了线程APP_MODUAL_KEY的处理函数为app_key_handle_process */
app_set_threadhandle(APP_MODUAL_KEY, app_key_handle_process);
/* 这里注册按键中断事件的回调函数 */
hal_key_open(checkPwrKey, key_event_process)
hal_pwrkey_open
hal_adckey_open
hal_gpiokey_open
hal_iomux_init
/* 这里对于tws工程和立体声工程初始化会有所差别,主要体现在有各自的table */
app_key_init
#if IBRT /* ibrt tws 工程*/
/* 按键map(app_ibrt_ui_test_key_cfg)注册 */
app_ibrt_ui_test_key_init
app_key_handle_registration(app_ibrt_ui_test_key_cfg
list_append(app_key_conifg.key_list, dest_key_handle);
#else /* stereo 工程*/
/* 按键map(app_key_handle_cfg)注册 */
app_key_handle_registration(app_key_handle_cfg
list_append(app_key_conifg.key_list, dest_key_handle);
#endif
当有按键触发之后,底层将按键封装成按键事件,通过callback函数(key_event_process)发送event给到app线程处理,也就是app_key_handle_process函数,在这里通过事件类型,在table中找相应的处理函数
/*timer的回调函数,定时器的时间为40ms,中断触发之后启动,主要用于去抖*/
hal_key_debounce_handler
send_key_event
/* 通过上面初始化过程中注册是回调函数,发送消息到app线程的APP_MODUAL_KEY中进行处理,也就是app_key_handle_process回调函数 */
key_detected_callback->key_event_process
#if IBRT /* ibrt tws 工程*/
/*处理底层上报(key_event_process)的按键事件,并根据按键和事件类型执行对应的操作*/
app_key_handle_process
app_key_handle_find
/*从list即 app_ibrt_ui_test_key_cfg 中,根据事件与按键code查找对应的函数入口*/
app_key_conifg.key_list
/* app_ibrt_ui_test_key_cfg 索引对应按键事件处理函数*/
#else
/*处理底层上报(key_event_process)的按键事件,并根据按键和事件类型执行对应的操作*/
app_key_handle_process
app_key_handle_find
/*从list即 app_key_handle_cfg 中,根据事件与按键code查找对应的函数入口*/
app_key_conifg.key_list
/* 如果需要到bt(当前线程为app线程)的线程中处理,则使用下面的逻辑发送到bt线程*/
app_bt_key
/* 这里发给bt线程,处理蓝牙相关操作*/
bt_key_send
app_bt_start_custom_function_in_bt_thread(..., ..., bt_update_key_event)
/*bt线程中轮询检查注册的回调函数,是否有执行条件,上面的app的消息会发到这里来*/
Besbt_hook_proc
/* bt线程的 mail 处理函数*/
app_bt_mail_poll
app_bt_mail_process
/* 这里根据上面发来的消息,进到BT_Custom_Func_req中处理*/
BT_Custom_Func_req
/*这里更新了bt_key的值*/
bt_update_key_event
/* 当按键状态bt_key不等于默认值,就会进入相应的按键处理逻辑,上面一步已经改变了bt_key状态 */
bt_key_handle
/* 根据相应的按键事件处理 */
bt_key_handle_func_key
#endif
配置按键
首先是配置GPIO,power_key是不用额外配置的,默认已经配置好了
//gpiokey define
#define CFG_HW_GPIOKEY_DOWN_LEVEL (0)
#define CFG_HW_GPIOKEY_UP_LEVEL (1)
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
#if (CFG_HW_GPIOKEY_NUM > 0)
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENALBE}},
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENALBE}},
#endif
};
比如这里,我将PIO2映射到FN1,PIO3映射到FN2,然后在根据不同的工程配置按键map
立体声工程
对于立体声工程
const APP_KEY_HANDLE app_key_handle_cfg[] = {
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGLONGPRESS},"bt function key",app_bt_key_shutdown, NULL},
{{APP_KEY_CODE_FN1,APP_KEY_EVENT_UP},"bt play backward key",app_bt_key, NULL},
{{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"bt play forward key",app_bt_key, NULL},
};
如上,这里我配置了超长按power按键关机,按下抬起(单击)F1下一曲,按下抬起(单击)F2上一曲。其他可参考如上配置!
tws工程
对于tws(ibrt)工程
const APP_KEY_HANDLE app_ibrt_ui_test_key_cfg[] =
{
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_DOUBLECLICK},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
};
这里的配置时超长按power按键关机,双击power按键进入tws搜索
最后在说一下,按键的长按、单击等等的时长配置,在hal_key.c中,如下图所示:
相关资料请到<bes2300开发调试笔记>文章底部的网盘链接中下载!