@岭南码农夫
这是之前帮客户开发Linux矩阵按键驱动时记录的笔记。
1. 在SCAN函数和probe函数里添加详细打印,编译内核和
ko文件,更新内核,下载ko后测试。
只按下K1键,然后详细分析日志。
发现K1按键被识别为6行6列。
2. 日志中打印了probe函数从DTS拿到的GPIO编号列表,经
分析与DTS一致。
3. 考虑可能与GPIO引脚顺序有关,于是分析几种可能的情况。
当前情况为
ROW 0 GP1
ROW 1 GP2
ROW 2 GP3
ROW 3 GP4
ROW 4 GP5
ROW 5 GP6
ROW 6 GP7
COL 0 GP8
COL 1 GP9
COL 2 GP10
COL 3 GP11
COL 4 GP12
COL 5 GP13
COL 6 GP14
先假定“行”和“列”组没反,只是“行”或“列”内部顺序反了。
情况1:行不变,列不变(当前情况)
情况2:行不变,列反序
情况3:行反序,列不变
情况4:行反序,列反序
由于硬件线路已经固定,所以某个按键(比如K1)对应的2个
引脚的GPIO编号肯定是不变的。
只是某个GPIO是行X还是列Y,这个映射关系可能变化。
于是,先按某个按键,得到当前的行号和列号,在probe日志中
找到当前对应的2个GPIO号,在按照上面情况1到4调整后得到新的
行号和列号,看是否与原理图相符。经分析,上述4种情况调整后
的行号和列号都不符合。
于是考虑先将行组和列组交换,之后依然有4种情况。逐个分析,
最终确认“行组和列组交换,且行内反序,且列内反序”这种情况
才能得到正确的行列号。
修改代码后进一步调试确认,客户的按键整体上插反了。
本来按键的插座是有防插反设计的,但是客户焊接时顺序弄反了,
导致整体插反。
到此解决了按键行号列号不正确的问题。矩阵按键驱动开发调试
也结束了。