- input_set_abs_params(input_dev, ABS_MT_POSITION_X, 61, 1085, 0, 0);
- 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文件的代码:
- #ifdef VIRTUAL_KEYS
- static ssize_t virtual_keys_show(struct kobject *kobj,
- <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>
- {
- <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>
- <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <wbr><wbr><wbr><wbr><span style="color:#0000cc">}</span><br></wbr></wbr></wbr></wbr>
- }
- static struct kobj_attribute virtual_keys_attr = {
- <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>
- <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>
- <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>
- <wbr><wbr><wbr><wbr><span style="color:#0000cc">}</span><span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><span style="color:#0000cc">.</span>show <span style="color:#0000cc">=</span> <span style="color:#0000cc">&</span>virtual_keys_show<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr>
- };
- static struct attribute *properties_attrs[] = {
- <wbr><wbr><wbr><wbr><span style="color:#0000cc">&</span>virtual_keys_attr<span style="color:#0000cc">.</span>attr<span style="color:#0000cc">,</span><br></wbr></wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><span style="color:#ff0000">NULL</span><br></wbr></wbr></wbr></wbr>
- };
- static struct attribute_group properties_attr_group = {
- <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>
- };
- static void virtual_keys_init(void)
- {
- <wbr><wbr><wbr><wbr><span style="color:#0000ff">int</span> ret<span style="color:#0000cc">;</span><br></wbr></wbr></wbr></wbr>
- <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>
- <wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr>
- <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>
- <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>
- <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>
- <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#0000cc">&</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>
- <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>
- <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>
- }
- #endif
其中.name = "virtualkeys.xxxx"的xxxx就是触摸屏设备名称,也就是前面说到的{deviceName},virtual_keys_init()函数可以在触摸屏probe函数中调用。另外,我将可视区域左侧的两侧按键移到了右侧实现,因此五个按键区域中心x坐标都是一样,这部分要在触摸屏驱动增加x轴坐标调整,这部分我就不再说明。
以上步骤完成后可以使用 cat /sys/board_properties/virtualkeys.{deviceName}查看虚拟按键的配置文件,并试试按下触摸屏上按键是否有反应,如果坐标不正确还要进行耐心地校准。