小键盘TCA8418驱动调试
代码中搜索发现kernel代码中有驱动
$ find -name "*tca841*"
./drivers/input/keyboard/tca8418_keypad.c
./Documentation/devicetree/bindings/input/tca8418_keypad.txt
./include/linux/input/tca8418_keypad.h
查看文档,依照说明配置dtsi
Required properties:
- compatible: "ti,tca8418"
- reg: the I2C address
- interrupts: IRQ line number, should trigger on falling edge
- linux,keymap: Keys definitions, see keypad-matrix.
配置dtsi时发现少了2个属性keypad,num-rows和keypad,num-columns
从datasheet获取芯片通讯地址
完成配置dtsi
tca8418@34 {
compatible = "ti,tca8418";
interrupt-parent = <&msm_gpio>;
interrupts = <11 0x2002>;
reg = <0x34>;
keypad,num-rows = <4>;
keypad,num-columns = <4>;
linux,keymap = <0x0000020a
0x0001000b
0x0002020b
0x0003001c
0x01000008
0x01010009
0x0102000a
0x0103000e
0x02000005
0x02010006
0x02020007
0x0203009e
0x03000002
0x03010003
0x03020004
0x0303001c>;
};
config中配置
CONFIG_KEYBOARD_TCA8418=y
编译烧写后
getevent驱动已经挂载上了,但是按按键没有反应
看原理图
发现外围没有接上拉电阻,一般都会有个上拉电阻,之前调试过小键盘sn7326就是因为没有上拉电阻的问题
只好再研究下芯片手册
果然不用的gpio要拉个上拉,这个纠结了好久,后来看reg设置时发现, 内部默认有个上拉,通过reg可以配置上拉,默认是配置的上拉,所以也没问题
接下来看看是不是reset信号有问题,量reset信号
查看原理图发现reset信号方向反了,对小键盘这边reset应该是输入,上图画成了输出,不过小键盘端有个上拉,reset脚可以一直保持高电平,芯片可以一直工作,不影响
再来看看是不是中断信号有问题,看中断信号
测量KEY_INT, 按键按下前为高,按下后为低,正常
测量GPIO11,按键按下前0.7V,电压不对,找到问题了
分析:从原理图上看电路应该是没问题的,GPIO11通过Q29与1.8V相接,Q29截止的话,实际上相当与拉了个很大的上拉电阻,会造成分压。Q29的1和2脚之前有个很大的电阻。
分析后把GPIO11配置修改成上拉,编译运行,小键盘开始正常工作了。但是当系统休眠后,再按按键就没有反应了。
量电压,系统休眠时1.8V掉电了,在tca8418代码中增加对VREG_L6_1P8V的控制,小键盘在系统休眠后也可以正常工作起来了。
剩下的就是收尾工作,调整下键值的对应关系。