MTK 8735A 8.1 自定义按键向APP发送广播
首先需要一個能夠接收廣播的APP
然后需要自定義一個按鍵,通過GPIO中斷觸發鍵值
一、在kernel-3.18/drivers/input/keyboard/mediatek/kpd.c中注冊中斷
1.聲明函數,定義命名
#ifdef CONFIG_KPD_HOMEKEY_USE_EINT
int home_key_irq_num;
static u8 kpd_homekey_state = !KPD_HOME_POLARITY;
static void kpd_homekey_handler(unsigned long data);
static DECLARE_TASKLET(kpd_homekey_tasklet,kpd_homekey_handler,0);
#endif
2.注冊中斷,定義響應條件
#if defined(CONFIG_KPD_HOMEKEY_USE_EINT)
home_key_irq_num = mt_gpio_to_irq(KPD_HOME_EINT_PIN);
printk(“qzg test home irq number = %d+++++++++\n”,home_key_irq_num);
mt_gpio_set_debounce(KPD_HOME_EINT_PIN,KPD_HOME_DEBOUNCE_CN);
#endif
3.上報鍵值
#ifdef CONFIG_KPD_HOMEKEY_USE_EINT
void kpd_homekey_handler_hal(unsigned long data){
bool pressed;
u8 old_state = kpd_homekey_state;
kpd_homekey_state = !kpd_homekey_state;
pressed = (kpd_homekey_state == !!KPD_HOME_POLARITY);
if(kpd_show_hw_keycode)
kpd_print(KPD_SAY “(%s) HOME HW keycode = using EINT\n”, pressed ? “pressed” : “released”);
}
static void kpd_homekey_handler(unsigned long data)
{
kpd_homekey_handler_hal(data);
}
static irqreturn_t kpd_homekey_eint_handler(int irq, void *dev_id)
{
disable_irq_nosync(home_key_irq_num);
tasklet_schedule(&kpd_homekey_tasklet);
return IRQ_HANDLED;
}
#endif
二、修改DWS將相應GPIO設置為中斷管腳
[kernel層]
kernel-3.18/drivers/misc/mediatek/dws/mt6735/miki8735b_h6.dws
[preload層]
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/miki8735b_h6/dct/dct/codegen.dws
[lk層]
vendor/mediatek/proprietary/bootable/bootloader/lk/target/miki8735b_h6/dct/dct/codegen.dws
[custom層]
vendor\mediatek\proprietary\custom\t51_8735a_64_bsp\kernel\dct\dct\codegen.dws
三、然后再device/mediateksample/t51_8735a_64_bsp/mtk-kpd.kl 中定義對應鍵值,同時在
frameworks/base/core/java/android/view/KeyEvent.java 等(在keyevent文件中會有說明其他文件的位置) 文件中增加對應匹配的鍵值。
如果鍵值列表不匹配則會出現按鍵失靈錯亂的后果。
四、現在就能通過ADB查看是否有鍵值上報了,有鍵值上報之后只需要framework層增加廣播操作就行了。
在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java中增加廣播行為。
public class PhoneWindowManager implements WindowManagerPolicy{
//增加廣播聲明
static public final String ACTION_KEYEVENT_KEYCODE_UHF_DOWN = “com.android.action.keyevent.KEYCODE_KEYCODE_UHF_DOWN”;
static public final String ACTION_KEYEVENT_KEYCODE_UHF_UP = “com.android.action.keyevent.KEYCODE_KEYCODE_UHF_UP”;
}
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
//定義廣播行為
else if(keyCode == KeyEvent.KEYCODE_UHF&&down){
- mContext.sendBroadcast(new Intent(ACTION_KEYEVENT_KEYCODE_UHF_UP)); //down-->按下 -->UHF UP-->START
- Log.i("ll","zzzzzzzzzzzzzzzzzzzzzzUHF STARTzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\n");
- return 0;
- }else if(keyCode == KeyEvent.KEYCODE_UHF&&up){
- mContext.sendBroadcast(new Intent(ACTION_KEYEVENT_KEYCODE_UHF_DOWN)); //up-->松開 -->UHF DOWN-->STOP
- Log.i("ll","zzzzzzzzzzzzzzzzzzzzzzUHF STOPzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\n");}
}
附:
注意所用版本和項目使用的KL文件,在adb shell中進入system/usr/keylyout/可以看到所用的KL,可以修改確認使用的KL
一般定義在kpd.c 的新按鍵會使用mtk-kpd.kl,也就是注冊input設備為mtk-kpd的會使用mtk-kpd.kl
新增加設備名稱的時候一般會使用generic.kl和qwerty.kl
generic.kl 和qwerty.kl 在alps/frameworks/base/data/keyboards/
mtk-kpd.kl在mediatek/config//
總結
以上是生活随笔為你收集整理的MTK 8735A 8.1 自定义按键向APP发送广播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 请以pass-by-refere
- 下一篇: Databricks 加载MySQL数据