?
內容簡介
在高通的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函數來進行控制了。
?
審核編輯:湯梓紅
評論
查看更多