文章目录

  • 一、功能实现(代码)
    • 1.1 添加编译选项
    • 1.2 添加设备树节点
      • 1.2.1 添加kpp节点
      • 1.2.2 在iomuxc中添加pinctrl_复用节点
      • 1.2.3 屏蔽其他设备节点占用的键盘GPIO
    • 1.3 内核源码中按键映射写法
  • 二、硬件电路
    • 2.1 上拉模式:输入GPIO硬件设计为上拉
    • 2.2 下拉模式:输入GPIO硬件设计为下拉
  • 三、调试步骤
    • 3.1 调试工具推荐
      • 3.1.1 hexdump命令
      • 3.1.2 类hexdump工具源码(极力推荐,使用起来很方便)
    • 3.2 调试流程
      • 3.2.1 大致调试流程如下图
      • 3.2.2 调试流程具体步骤描述如下
    • 3.3 源码中添加调试log小技巧
  • 四、调试过程中遇到的坑
  • 五、Matrix内核源码逻辑分析
    • 5.1 Matrix整体功能逻辑图
    • 5.2 键盘matrix_keypad_scan()函数扫描原理
      • 5.2.1 键盘示意图
      • 5.2.2 键盘和保存GPIO状态的数组定义
      • 5.2.3 matrix_keypad_scan() 函数源码解析
    • 5.3 其他几个重要函数
      • 5.3.1 matrix_keypad_parse_dt()函数源码解析
      • 5.3.2 matrix_keypad_init_gpio()函数源码解析
  • 六、附加知识
    • 6.1 Linux内核中的事件类型


Linux内核中按键驱动分为:较为复杂的【矩阵键盘keyboard Matrix】和简单的【按键驱动】。

【Matrix矩阵键盘】一般适用于多行多列多按键的情况,源码文件为:drivers/input/keyboard/matrix_keypad.c

【GPIO按键驱动】一般适用于少量按键,一个GPIO口对应一个按键的情况,源码文件为:driers/input/keyboard/gpio_keys.c

本次在imx6ul中实现矩阵键盘功能:Linux内核版本为4.1.15,cpu为imx6ul。

以下对矩阵键盘原理、源码、调试步骤等逐一进行分析,简单的单按键就暂时不写了。



一、功能实现(代码)

具体开发流程如下:

1.1 添加编译选项

内核源码根目录下执行make menuconfig,选中如下几个选项来添加Matrix相关编译选项:

Device Drivers  --->  Input device support  ---> <*>   Event debugging (选中)[*]   Keyboards  ---> <*>  GPIO Buttons(选中)<*>  GPIO driven matrix keypad support(选中)<*>  IMX keypad support(选中)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

选中后,save保存,exit退出,使用【make zImage】编译生成新的zImage,路径为:【arch/arm/boot/】

lsy@ubuntu18:~/linux-4.1.15$ ls arch/arm/boot/
bootp  compressed  dts  Image  install.sh  Makefile  zImage
  • 1
  • 2

将新的zImage拷贝并烧写到板卡中,重启板卡,然后正式开始进行开发工作。

备注:如果觉得编译整个zImage麻烦,也可以使用【make modules】单独编译模块,将drivers/input/keyboard/matrix_keypad.c文件编译生成对应的.ko模块,然后使用insmod或者modprob加载到板卡内核中来进行调试也行。

1.2 添加设备树节点

此处以【8行*3列】矩阵键盘为例

一定注意:Linux内核中定义矩阵键盘必须且只能为:【行GPIO输入,列GPIO输出】!!!不能搞错!!!

1.2.1 添加kpp节点

备注:本示例中的linux,keymap按键映射以较为容易理解、且直观的方式实现,内核驱动源码中的示例以及网上很多demo中写法都是形如0x02010058的写法,这样不太直观,不好理解,后面会对这种写法含义做出说明,两种写法都是可以的。

/*lsy*/
&kpp {compatible = "gpio-matrix-keypad";pinctrl-names = "default";pinctrl-0 = <&pinctrl_key>;
debounce<span class="token operator">-</span>delay<span class="token operator">-</span>ms <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">20</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>   <span class="token comment">/*防反跳延时,即:去抖延时*/</span>
col<span class="token operator">-</span>scan<span class="token operator">-</span>delay<span class="token operator">-</span>us <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">400</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>  <span class="token comment">/*列扫描延时*/</span><span class="token comment">/*8行*/</span>
row<span class="token operator">-</span>gpios <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token operator">&amp;</span>gpio2 <span class="token number">11</span> GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">12</span> GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">10</span> GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">8</span>  GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">9</span>  GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">13</span> GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">14</span> GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">15</span> GPIO_ACTIVE_LOW<span class="token operator">&gt;</span><span class="token punctuation">;</span>
<span class="token comment">/*3列*/</span>
col<span class="token operator">-</span>gpios <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token operator">&amp;</span>gpio2 <span class="token number">16</span> GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">17</span> GPIO_ACTIVE_LOW<span class="token operator">&amp;</span>gpio2 <span class="token number">19</span> GPIO_ACTIVE_LOW<span class="token operator">&gt;</span><span class="token punctuation">;</span><span class="token comment">/* 举例释义:MATRIX_KEY(0x2, 0x1, KEY_X)表示将【第2行1列的按键】映射为【KEY_X】 */</span>
linux<span class="token punctuation">,</span>keymap <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token comment">/*row0*/</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_LEFT<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_DOWN<span class="token punctuation">)</span><span class="token comment">/* row1 */</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x1</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_UP<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x1</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_RIGHT<span class="token punctuation">)</span><span class="token comment">/* row2 */</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x2</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_M<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x2</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_X<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x2</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> KEY_ENTER<span class="token punctuation">)</span><span class="token comment">/*row3*/</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x3</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_N<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x3</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_O<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x3</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> KEY_I<span class="token punctuation">)</span><span class="token comment">/*row4*/</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_7<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_8<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> KEY_9<span class="token punctuation">)</span><span class="token comment">/*row5*/</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_4<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_5<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> KEY_6<span class="token punctuation">)</span><span class="token comment">/*row6*/</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x6</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_1<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x6</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_2<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x6</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> KEY_3<span class="token punctuation">)</span><span class="token comment">/*row7*/</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x7</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> KEY_MINUS<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x7</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> KEY_0<span class="token punctuation">)</span><span class="token function">MATRIX_KEY</span><span class="token punctuation">(</span><span class="token number">0x7</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> KEY_DOT<span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
gpio<span class="token operator">-</span>activelow<span class="token punctuation">;</span>
status <span class="token operator">=</span> <span class="token string">"okay"</span><span class="token punctuation">;</span>


http://www.taodudu.cc/news/show-7219738.html

相关文章:

  • 华为拆分的手机品牌逆袭苹果,再证其基因厉害
  • 人工智能中数学基础:线性代数,解析几何和微积分
  • FPGA量子类比机制-FPQA,将在量子运算设计中引发一场新的革命
  • 信息学奥赛一本通(1081:分苹果)
  • 代数小课堂:线性代数(矩阵的用途,提高批处理问题的能力)
  • 【信息学奥赛一本通】1206:放苹果(递归)
  • 矩阵键盘的改进(第一个专利)
  • 交流接触器对单片机的干扰怎么消除
  • 交流接触器的matlab仿真,交流接触器集成化智能控制及仿真
  • GHISALBA GHOPC-600B接触器HYDAC ENS 311P-8-0250-000-K 技术文章
  • LS产电GMC交流接触器
  • 交流接触器最新技术
  • 【电气专业知识问答】问:配置真空断路器或真空接触器的高压开关柜为什么要装设避雷器?
  • 怎么用计算机网络控制接触器,交流接触器怎么使用_交流接触器安装方法
  • 个人音乐app
  • 虚拟演播室,什么是虚拟演播室?(一)
  • 虚拟无限--对虚拟机与虚拟化的简单整理
  • [虚拟工具] Virtual box;虚拟技术的一点总结
  • WPF 虚拟化技术
  • 汉化Windows Azure上的虚拟机
  • vmware虚拟机web控制台开发
  • Wasm 玩出花?在浏览器中运行虚拟机!
  • 【虚拟思维】什么是虚拟机(virtual machine)
  • Java Virtual Machine(一)
  • 虚拟机VMwave使用
  • Java程序员最常用的Linxu命令
  • Java程序员最常用的Linux命令
  • 讲的比较好的linux命令
  • 在Android上部署深度学习模型之UI设计(七)
  • UI是什么优漫动游

keyboard Matrix矩阵键盘相关推荐

  1. imx6ul添加keyboard Matrix矩阵键盘

    文章目录 一.功能实现(代码) 1.1 添加编译选项 1.2 添加设备树节点 1.2.1 添加kpp节点 1.2.2 在iomuxc中添加pinctrl_复用节点 1.2.3 屏蔽其他设备节点占用的键 ...

  2. 【STM32扫描4x4矩阵键盘模块】 4x4 matrix keypad interface

    [STM32扫描4x4矩阵键盘模块] 4x4 matrix keypad interface 4x4矩阵键盘模块 矩阵键盘是将多个按键排布成类似矩阵形式的键盘组.为了减少IO资源的占用,将键盘组的每一 ...

  3. 11.嵌入式控制器EC实战 KBC矩阵键盘Keyboard开发流程

    文章目录 笔记本矩阵键盘概述 矩阵键盘的扫描方式 行列扫描方式 逐行逐列扫描方式 EC中矩阵键盘是如何扫描并得到码值的(代码分析) 笔记本矩阵键盘概述 在EC中支持两种形式的键盘,一种是PS/2接口的 ...

  4. 矩阵键盘简易计算机设计报告,矩阵键盘显设计报告..doc

    摘要 在日常生活中,我们经常要用到键盘来实现对电子装置的控制.小到手表手机,中到电视电脑,大到各种复杂仪器,都需要通过各种按键来实现各种操作.本次课程设计以按键控制显示为主题,以MSP430G2553 ...

  5. 行列式的计算机应用答辩ppt,矩阵键盘的研究毕业设计论文+开题报告+答辩PPT

    摘要 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,及时在LED数码管上,单片机控制的是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路 ...

  6. 利用c51进行数模转换并在液晶屏上显示_基于C51单片机的智能计算器、矩阵键盘、lcd1602...

    目录 1绪论.............................................................................................. ...

  7. 【蓝桥杯单片机】矩阵键盘和独立键盘新解(更稳定更高复用性)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5   目录 一.矩阵键盘 二.独立键盘 参考宋雪松老师的写法: 采用多个缓冲区 可以扩展至16个键码对应的指令 一.矩阵键盘 通过修改Key_OU ...

  8. AVR 矩阵键盘程序源代码2(有连续按键功能)(原创)

    Keyboard.h /********** AVR 矩阵键盘扫描程序 ********* * 版本.........: 2.0 * 作者.........: 陈利栋 * 目标.........: A ...

  9. STM32F103C8T6 操作矩阵键盘

    系列文章目录 第一章 STM32F103C8T6 点亮LED灯 第二章 STM32F103C8T6 按键扫描输入 第三章 STM32C8CT6 主控按键触发外部中断 第四章 STM32F103C8T6 ...

最新文章

  1. 企业如何进行团队协作?
  2. .Net中的设计模式——Iterator模式
  3. 洛谷 1858 多人背包
  4. 100万+奖金池!目标检测、车牌识别、人体分割等赛事全面启动! ECV-2021 来了
  5. 《SAS编程与数据挖掘商业案例》学习笔记之八
  6. 最大流,最小费用最大流:解析 + 各种板子
  7. 跨平台开发框架 Lynx 初探
  8. Oracle DBA课程系列笔记(5)
  9. 使用Android OpenGL ES 2.0绘图之五:添加运动
  10. 《基于Mozilla的扩展开发》系列文章
  11. mysql gis 高德_基于高德自定义地图数据的GIS矢量地图制作
  12. 利用Bitvise SSH Client设置二级代理
  13. c语言矩阵键盘控制四个led灯,51单片机矩阵键盘与左右流水灯控制C程序
  14. 【云片网】使用云片网发送注册短信验证码
  15. 使用GitHub制作一个高逼格的在线简历
  16. 远程计算机强迫关闭一个连接,远程主机强迫关闭了一个现有的连接,该怎么办...
  17. ConvE:Convolutional 2D Knowledge Graph Embeddings
  18. DevOps 测试实践
  19. Ubuntu 17.10安装搜狗拼音输入法
  20. 华为路由器用Linux开发,华为路由器常用配置 - osc_1v2pb1nt的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. HTTPS和和HTTP的区别
  2. 面试——测试工程师(20191009)
  3. 2022A特种设备相关管理(电梯)考试试题及模拟考试
  4. Hdu 2027 getchar用法
  5. 物理系统——范围检测
  6. 干货!神经辛形式:学习一般坐标系上的哈密尔顿方程
  7. Go 全套学习路线图
  8. 哪些食物慢性胃炎患者更适合多吃?
  9. 专业的视频会议和传统的即时通讯工具如QQ、微信视频聊天有什么区别
  10. 山西大学数学与计算机科学学院,山西大学