android 实现触摸屏按键

1.硬件分析
我所使用的触摸屏分辨率是1158*768,可视区域大小是1024*768(这也是LCD屏的大小),在触摸屏两侧总有5个按键。
<wbr></wbr>
2.触摸屏按键驱动的修改
既然可视区域在触摸屏中间部位,因此需要在触摸屏驱动中修改input_set_abs_params()函数中的参数
  1. input_set_abs_params(input_dev, ABS_MT_POSITION_X, 61, 1085, 0, 0);
  2. input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);

其中61是可视区域左侧x轴左边坐标,1085是右侧的。

<wbr></wbr>

3.Android框架层

Android上层通过读取触摸屏坐标并经过转算后来识别定义好的虚拟按键,代码位于frameworks/base/services/java/com/android/server/KeyInputQueue.java中:

static class Virtualkey{}是负责按键定位的方法;

private void readVirtualKeys(String deviceName)负责读取sys文件,这是最重要的代码,也是与底层sys文件系统沟通的桥梁,它会读取/sys/board_properties/virtualkeys.{deviceName}文件,deviceName一定要与触摸屏设备名称一致,不然会找不到指定的sys文件。

<wbr></wbr>

4.sys文件系统

前面讲到了readVirtualKeys会读取sys文件,这个sys文件就是定义虚拟按键的坐标以及键值,它的协议格式是一段字符串,每个按键有六项分别用冒号分割,按键按键之间也是用冒号分割,标准格式是:

键类型:键值:按键区域中心x坐标:按键区域中心y坐标:按键区域宽:按键区域高

创建sys文件的代码:

  1. #ifdef VIRTUAL_KEYS
  2. static ssize_t virtual_keys_show(struct kobject *kobj,
  3. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#0000ff">struct</span> kobj_attribute <span style="color:#0000cc"> *</span>attr<span style="color:#0000cc">,</span> <span style="color:#0000ff">char</span> <span style="color:#0000cc">*</span>buf<span style="color:#0000cc">)</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  4. {
  5. <wbr><wbr><wbr><wbr><span style="color:#0000ff">if</span> <span style="color:#0000cc">(</span>1<span style="color:#0000cc">)</span> <span style="color:#0000cc"> {</span><br></wbr></wbr></wbr></wbr>
  6. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  7. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#0000ff">return</span> <span style="color:#ff0000">sprintf</span><span style="color:#0000cc">(</span>buf<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  8. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> __stringify<span style="color:#0000cc">(</span>EV_KEY<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>KEY_VOLUMEUP<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":1030:370:30:30"</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  9. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>EV_KEY<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>KEY_VOLUMEDOWN<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":1030:470:30:30"</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  10. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>EV_KEY<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>KEY_BACK<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":1030:18:30:30"</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  11. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>EV_KEY<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>KEY_HOME<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":1030:136:30:30"</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  12. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>EV_KEY<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":"</span> __stringify<span style="color:#0000cc">(</span>KEY_MENU<span style="color:#0000cc">)</span> <span style="color:#ff00ff">":1030:236:30:30"</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  13. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ff00ff">"\n"</span><span style="color:#0000cc">)</span><span style="color:#0000cc">;</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  14. <wbr><wbr><wbr><wbr><span style="color:#0000cc">}</span> <span style="color:#0000ff">else</span> <span style="color:#0000cc">{</span><br></wbr></wbr></wbr></wbr>

  15. <wbr><wbr><wbr><wbr><span style="color:#0000cc">}</span><br></wbr></wbr></wbr></wbr>
  16. }

  17. static struct kobj_attribute virtual_keys_attr = {
  18. <wbr><wbr><wbr><wbr><span style="color:#0000cc">.</span>attr <span style="color:#0000cc">=</span> <span style="color:#0000cc">{</span><br></wbr></wbr></wbr></wbr>
  19. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#0000cc">.</span>name <span style="color:#0000cc">=</span> <span style="color:#ff00ff">"virtualkeys.xxxx"</span><span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  20. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#0000cc">.</span>mode <span style="color:#0000cc">=</span> S_IRUGO<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  21. <wbr><wbr><wbr><wbr><span style="color:#0000cc">}</span><span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr>
  22. <wbr><wbr><wbr><wbr><span style="color:#0000cc">.</span>show <span style="color:#0000cc">=</span> <span style="color:#0000cc">&amp;</span>virtual_keys_show<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr>
  23. };

  24. static struct attribute *properties_attrs[] = {
  25. <wbr><wbr><wbr><wbr><span style="color:#0000cc">&amp;</span>virtual_keys_attr<span style="color:#0000cc">.</span>attr<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr>
  26. <wbr><wbr><wbr><wbr><span style="color:#ff0000">NULL</span><br></wbr></wbr></wbr></wbr>
  27. };

  28. static struct attribute_group properties_attr_group = {
  29. <wbr><wbr><wbr><wbr><span style="color:#0000cc">.</span>attrs <span style="color:#0000cc">=</span> properties_attrs<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr>
  30. };

  31. static void virtual_keys_init(void)
  32. {
  33. <wbr><wbr><wbr><wbr><span style="color:#0000ff">int</span> ret<span style="color:#0000cc">;</span><br></wbr></wbr></wbr></wbr>
  34. <wbr><wbr><wbr><wbr><span style="color:#0000ff">struct</span> kobject <span style="color:#0000cc">*</span>properties_kobj<span style="color:#0000cc">;</span><br></wbr></wbr></wbr></wbr>
  35. <wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr>
  36. <wbr><wbr><wbr><wbr>properties_kobj <span style="color:#0000cc"> =</span> kobject_create_and_add<span style="color:#0000cc">(</span><span style="color:#ff00ff">"board_properties"</span><span style="color:#0000cc">,</span> <span style="color:#ff0000">NULL</span><span style="color:#0000cc">)</span><span style="color:#0000cc">;</span><br></wbr></wbr></wbr></wbr>
  37. <wbr><wbr><wbr><wbr><span style="color:#0000ff">if</span> <span style="color:#0000cc">(</span>properties_kobj<span style="color:#0000cc">)</span><br></wbr></wbr></wbr></wbr>
  38. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ret <span style="color:#0000cc">=</span> sysfs_create_group<span style="color:#0000cc">(</span>properties_kobj<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  39. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#0000cc">&amp;</span>properties_attr_group<span style="color:#0000cc">)</span><span style="color:#0000cc">;</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  40. <wbr><wbr><wbr><wbr><span style="color:#0000ff">if</span> <span style="color:#0000cc">(</span><span style="color:#0000cc">!</span>properties_kobj <span style="color:#0000cc">|</span><span style="color:#0000cc">|</span> ret<span style="color:#0000cc">)</span><br></wbr></wbr></wbr></wbr>
  41. <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>pr_err<span style="color:#0000cc">(</span><span style="color:#ff00ff">"failed to create board_properties\n"</span><span style="color:#0000cc">)</span><span style="color:#0000cc">;</span><wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  42. }

  43. #endif

其中.name = "virtualkeys.xxxx"的xxxx就是触摸屏设备名称,也就是前面说到的{deviceName},virtual_keys_init()函数可以在触摸屏probe函数中调用。另外,我将可视区域左侧的两侧按键移到了右侧实现,因此五个按键区域中心x坐标都是一样,这部分要在触摸屏驱动增加x轴坐标调整,这部分我就不再说明。

以上步骤完成后可以使用 cat /sys/board_properties/virtualkeys.{deviceName}查看虚拟按键的配置文件,并试试按下触摸屏上按键是否有反应,如果坐标不正确还要进行耐心地校准。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值