查看: 3080|回复: 0

[评测分享] 【ALINX AXU2CGB试用】矩阵键盘linux驱动分析,驱动设备树配置

[复制链接]
  • TA的每日心情
    开心
    7 天前
  • 签到天数: 597 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2021-5-27 00:34:18 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 robe.zhang 于 2021-5-29 00:47 编辑

    【ALINX AXU2CGB试用】矩阵键盘linux驱动分析,驱动设备树配置


    笔者手头暂时没有扫描矩阵键盘,仅仅分析完linux驱动源码,知道怎么使用,稍后键盘到手实际测试验证

    矩阵键盘驱动源码分析:
    源码位于linux内核中的drivers\input\keyboard\matrix_keypad.c文件中
    1.png
    先看 probe 函数:
    2.png
    3.png
    487行获取 platform data,
    获取不到转入 489行分析 dt 文件
    分析出错直接退出,因为没有设备信息,驱动 probe 也就没有意义,直接退出
    分析完成,没有linux,keymap属性信息,也就是没有定义keycode键值,驱动也没有意义,直接退出
    497-509行,初始化keypad,其中498行分配 input_dev 结构体
    511-515行,初始化input_dev
    517行,初始化keymap_data,就是初始化矩阵键盘的键值,详细代码如下:
    4.png
    5.png
    531行:矩阵键盘初始化 GPIO,详细代码如下,通过两个循环分别初始化各列GPIO为输出,各行GPIO为输入,接着使用了中断,最后关闭中断退出
    6.png
    再看一下中断代码:关中断,设置delay work,这个中断是检测到按键动作,就触发了中断,delay work 主要是防抖,过一会再扫描按键键值滤波防抖
    7.png
    看delay_work 代码,delay_work在 508 行被初始化为 matrix_keypad_scan 函数,这个函数先通过一个循环,扫描矩阵键盘的键值保存起来,再通过一个循环,把input事件发出去(input子系统完成),进中断时候关闭的中断,现在重新打开
    8.png
    代码535行,注册 input_dev
    代码539行,初始化休眠唤醒
    驱动probe 完成。

    Input 是当作字符设备注册在系统中的,打开input 设备,执行 514行的 matrix_keypad_start函数,调度 delay work工作,delay work 立即开始工作,扫描键值,发送键盘事件,开中断,之后续就能持续扫描键值,发送键盘事件,如此循环下去
    9.png
    关闭 input 设备,flush delaywork,关闭中断
    10.png
    矩阵键盘工作工程从以上代码中已经看的很清楚明白了,以上是软件的工作过程

    矩阵键盘实物:以下是4x4 的矩阵键盘,需要 8 个GPIO扫描实现 16 个按键的输入
    11.png
    电路图如下:列GPIO端口是 1,2,3,4,行GPIO端口是 5,6,7,8
    12.png
    按键工作原理:
    按键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端口上

    矩阵键盘设备树配置:
    13.png
    键码不一定对,调试的时候发现有问题自己改,键码位于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 薄膜开关,找出来很多种,这两种也能用
    这种确认过可以用:
    15.png
    16.png
    还有这种的也能用
    14.png
    笔者买的是这种的,重点是便宜,1.74元还包邮,玩一把拉倒也没啥要求,能用就行。或者自己找个洞洞板对着原理图焊一个玩玩
    17.png
    稍后键盘到手,调试完成,再更新

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-27 00:31 , Processed in 0.113595 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.