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);

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//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值