首先需要一个能够接收广播的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);
ret = request_irq(home_key_irq_num,kpd_homekey_eint_handler,IRQ_TYPE_EDGE_FALLING|IRQ_TYPE_EDGE_RISING,"H_key",NULL);//边沿触发
if(ret > 0){
printk("qzg test home key irq request failed+++++++++++++++++++++++\n");
}else{
__set_bit(KPD_HOME_MAP,kpd_input_dev->keybit);
enable_irq(home_key_irq_num);
}
#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”);
pressed = mt_get_gpio_in(KPD_HOME_EINT_PIN); //hw++
if (pressed ==0 ) //down
{
input_report_key(kpd_input_dev,KPD_HOME_MAP,!pressed);
}
else if (pressed ==1 ) //up
{;
input_report_key(kpd_input_dev,KPD_HOME_MAP, !pressed);
}
input_sync(kpd_input_dev);
printk("+_+_+_+_+__+_++_ old_state = %d,pressed = %d,!!KPD_HOME_POLARITY = %d\n",old_state,pressed,!!KPD_HOME_POLARITY);
enable_irq(home_key_irq_num);
}
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//