文档说明
本文档以msm8909平台为例,结合实际的原理图,说明矩阵键盘配置方法。
原理图
下面是一个键盘的原理图,4*5的矩阵键盘,行号为ROW0~3,列号为COL0~4。
嗯,键盘图画的很漂亮。
相关文档
OK,我们开始看看相关的文档:
kernel/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt
kernel/Documentation/devicetree/bindings/input/matrix-keymap.txt
打开gpio-matrix-keypad.txt:
把example这部分内容,原样copy到 kernel/arch/arm/boot/dts/qcom/sc806-evk/msm8909-mtp.dtsi
修改:
debounce-delay-ms = <200>
col-scan-delay-us = <200>
上述两个值,根据实际按键效果自行调整,避免误判和错判。
matrix-keymap.txt 对 linux,keymap做了解释:
以某个值为例:
如何确定keymap
以原理图的KEY8为例,是由ROW3*COL0交叉而成,行号:0x03;列号:0x00
那么键值是多少呢?
KEY8对应”←”功能键,查询kernel/include/uapi/linux/input.h,里面列出了所有键值。
到这里,我们确定了KEY8的键值是105,换算成16进制0x69。
那么KEY8在keymap中对应的值就是:0x03000069,键值不够16bit高位用0补齐。
现在我们写下里程碑的第一个keymap值:
linux,keymap = <0x03000069 //105 KEY_LEFT
用同样的办法,参考原理图,计算出其他按键对应的keymap值。
keymap值的排列顺序无所谓,可以按照个人喜好,只要和实际电路图相符即可。
确定行号列号对应的GPIO管脚
这一步很简单,根据原理图找出行和列对应的GPIO管脚,注意是GPIO号,不是模块的管脚编号。
把上图的信息整理并顺序填入 kernel/arch/arm/boot/dts/qcom/sc806-evk/msm8909-mtp.dtsi
打开编译选项
在 kernel/arch/arm/configs/la0920_defconfig 和 kernel/arch/arm/configs/la0920_user_defconfig中增加编译选项:
CONFIG_KEYBOARD_MATRIX=y