本帖最后由 robe.zhang 于 2021-5-29 00:47 编辑
【ALINX AXU2CGB试用】矩阵键盘linux驱动分析,驱动设备树配置
笔者手头暂时没有扫描矩阵键盘,仅仅分析完linux驱动源码,知道怎么使用,稍后键盘到手实际测试验证
矩阵键盘驱动源码分析: 源码位于linux内核中的drivers\input\keyboard\matrix_keypad.c文件中 先看 probe 函数: 487行获取 platform data, 获取不到转入 489行分析 dt 文件 分析出错直接退出,因为没有设备信息,驱动 probe 也就没有意义,直接退出 分析完成,没有linux,keymap属性信息,也就是没有定义keycode键值,驱动也没有意义,直接退出 497-509行,初始化keypad,其中498行分配 input_dev 结构体 511-515行,初始化input_dev 517行,初始化keymap_data,就是初始化矩阵键盘的键值,详细代码如下: 531行:矩阵键盘初始化 GPIO,详细代码如下,通过两个循环分别初始化各列GPIO为输出,各行GPIO为输入,接着使用了中断,最后关闭中断退出 再看一下中断代码:关中断,设置delay work,这个中断是检测到按键动作,就触发了中断,delay work 主要是防抖,过一会再扫描按键键值滤波防抖 看delay_work 代码,delay_work在 508 行被初始化为 matrix_keypad_scan 函数,这个函数先通过一个循环,扫描矩阵键盘的键值保存起来,再通过一个循环,把input事件发出去(input子系统完成),进中断时候关闭的中断,现在重新打开 代码535行,注册 input_dev 代码539行,初始化休眠唤醒 驱动probe 完成。
Input 是当作字符设备注册在系统中的,打开input 设备,执行 514行的 matrix_keypad_start函数,调度 delay work工作,delay work 立即开始工作,扫描键值,发送键盘事件,开中断,之后续就能持续扫描键值,发送键盘事件,如此循环下去 关闭 input 设备,flush delaywork,关闭中断 矩阵键盘工作工程从以上代码中已经看的很清楚明白了,以上是软件的工作过程
矩阵键盘实物:以下是4x4 的矩阵键盘,需要 8 个GPIO扫描实现 16 个按键的输入 电路图如下:列GPIO端口是 1,2,3,4,行GPIO端口是 5,6,7,8 按键工作原理: 按键1位于GPIO1 和5 交叉点,扫描GPIO1和5,就能检测到按键1是否按下 按键2位于GPIO2 和5 交叉点,扫描GPIO2和5,就能检测到按键2是否按下 同理就能全部扫描出16个按键的状态,其实这个工作原理,对应软件中的按键扫描过程。
触发扫描的是按键中断,一旦产生中断先滤波防抖,再开始扫描按键值,发送按键事件,继续等待中断。这部分需要在 EMIO GPIO 端口完成,
矩阵键盘电路设计:矩阵键盘用到了中断,所以需要使用 EMIO GPIO 端口,参考最近 EMIO GPIO 的文章。 4x4 行列的 16按键的矩阵键盘,vivado 电路设计需要从 EMIO GPIO 端口引出8个 GPIO,四个 GPIO 当作行,四个GPIO 当作列,分别接入矩阵键盘中的8个IO端口上
矩阵键盘设备树配置: 键码不一定对,调试的时候发现有问题自己改,键码位于linux内核中 include\uapi\linux\input-event-codes.h 文件中
矩阵键盘驱动:增加 input 驱动,增加 matrix 按键驱动
BOOT.BIN,内核,设备树,全部重新编译后启动生效
# ======== 设备树配置技巧: 从原理图可知,端口 1,2,3,4 作为一组,端口 5,6,7,8 作为另一组 不管哪一组当作行,哪一组当作列都行,不用特意区分,比如 1,2,3,4当作行,5,6,7,8当作列,或者1,2,3,4当作列,5,6,7,8当作行也行。 但是这两组内的 GPIO 端口不可搞混,比如 1,2,3,4 必须是一组,5,6,7,8必须是一组,这是唯一的分组方式,没有第二种分组。详细原因看源码就知道了。如果一组里面是1,2,3,5,那么 1,2,3 和 5 交叉点的三个按键永远都扫描不到,6,7,8 和 4 交叉点三个按键也是永远不会扫描到。
两组不用可以区分行列,keymap 要和相应的按键匹配就行。但是两组的GPIO不可搞混了。
# ========
本文内容,笔者没有在开发板上验证过,因为手头暂时没有矩阵键盘。电路设计部分没啥问题,以往两篇文章 EMIO GPIO,AXI GPIO 已经验证过电路设计,主要是设备树需要调试,keymap 可能不一定对,需要自己调试,稍后键盘到手测试验证
# ========
矩阵键盘,淘宝搜索:4*4矩阵扫描按键/4x4 薄膜开关,找出来很多种,这两种也能用
这种确认过可以用:
还有这种的也能用
笔者买的是这种的,重点是便宜,1.74元还包邮,玩一把拉倒也没啥要求,能用就行。或者自己找个洞洞板对着原理图焊一个玩玩
稍后键盘到手,调试完成,再更新
|