内容简介
在高通的QCC51xx软件框架下,LED的控制都是在headset_led.c/h和headset_leds_config_table.c/h中定义并且统一管理的,但遇到一些特殊情况,则不希望用这些代码来控制LED,本文为介绍如何做到这一点。
测试工具
MDE:MDE_WIN_2.8.0.37_x64
Toolkit:ADK Toolkit 1.2.13.21_x64
QACT:NULL
Bluesuite:NULL
Hardware:Qualcomm QCC5171 DEV.
Software:adk-src-1-0_qtil_standard_oem_qcc517x-qcc307x,ADK-22.2-CS1-r00344.1
正文
本文来处理这么一个场景,假设耳机物理上有LED1、LED2和LED3三颗LED,其中LED1和LED2作为正常的LED指使用,比如配对、播放音乐、打电话等状态,而LED3作为ANC是否开启来使用,很明显LED3的点亮与否跟其他状态没有关系,LED3只是根据ANC状态进行动作,所以如果采用headset_led.c里的方式进行app_led_pattern_xxx的配置的话,需要为每一个状态分别配置一个LED3开启和关闭的app_led_pattern_xxx,这样在状态上处理起来就比较麻烦。
从手册上了解到,LED口本质上也就是一个PIO口:
所以我们能否用pio.h中的API来直接控制LED呢?答案肯定是可以的。
首先假设我们之前定义了三颗LED,那么我们可以按照以下步骤来修改。
更改工程属性,把LED数量相关的宏定义由3改为2:
在headset_led.c中添加以下代码:
#elif defined(HAVE_2_LEDS)
{
.number_of_leds = 2,
.leds_use_pio = TRUE,
.led0_pio = CHIP_LED_0_PIO,
.led1_pio = CHIP_LED_1_PIO,
.led2_pio = 0,
};
#elif defined(HAVE_2_LEDS)
#define LED_0_STATE (1 << 0)
#define LED_1_STATE (1 << 1)
#define LED_2_STATE (1 << 1)
在led_manager_config.h中添加以下代码:
#elif defined(HAVE_2_LEDS)
/* The number of LEDs led_manager will control. */
#define appConfigNumberOfLeds()(2)
/*! PIO to control LED0 */
#define appConfigLed0Pio()CHIP_LED_0_PIO
/*! PIO to control LED1 */
#define appConfigLed1Pio()CHIP_LED_1_PIO
/*! PIO to control LED2 */
#define appConfigLed2Pio()(0)
在headset_sm_private.h中添加一个事件,用于每500ms检查一次anc状态:
在headset_sm.c中添加宏定义,这里的LED3对应的pio口为61:
#define pio_num 61
#define PIO2BANK(pio) ((uint16)((pio) / 32))
#define PIO2MASK(pio) (1UL << ((pio) % 32))
在headsetSmInit函数中添加对LED3端口的初始化代码:
PanicNotZero(PioSetMapPins32Bank(PIO2BANK(pio_num), PIO2MASK(pio_num), PIO2MASK(pio_num)));
PanicNotZero(PioSetDir32Bank(PIO2BANK(pio_num), PIO2MASK(pio_num),PIO2MASK(pio_num)));
MessageSendLater(headsetSmGetTask(), SM_INTERNAL_ANC_USE_SEPARATE_LED,NULL, 500);
在headsetSmHandleMessage函数中添加事件处理代码:
case SM_INTERNAL_ANC_USE_SEPARATE_LED:
if(AncStateManager_IsEnabled())
{
PanicNotZero(PioSet32Bank(PIO2BANK(pio_num), PIO2MASK(pio_num),0));//LED ON
}
else
{
PanicNotZero(PioSet32Bank(PIO2BANK(pio_num), PIO2MASK(pio_num),PIO2MASK(pio_num)));//LED OFF
}
MessageSendLater(headsetSmGetTask(), SM_INTERNAL_ANC_USE_SEPARATE_LED,NULL, 500);
break;
这样处理后,headset_led.c/h相关的代码就只控制了LED1和LED2,LED3则可以直接通过PioSet32Bank函数来进行控制了。
审核编辑:汤梓红
评论
查看更多