keyboard Matrix矩阵键盘
文章目录
- 一、功能实现(代码)
- 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"><</span><span class="token number">20</span><span class="token operator">></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"><</span><span class="token number">400</span><span class="token operator">></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"><</span><span class="token operator">&</span>gpio2 <span class="token number">11</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">12</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">10</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">8</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">9</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">13</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">14</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">15</span> GPIO_ACTIVE_LOW<span class="token operator">></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"><</span><span class="token operator">&</span>gpio2 <span class="token number">16</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">17</span> GPIO_ACTIVE_LOW<span class="token operator">&</span>gpio2 <span class="token number">19</span> GPIO_ACTIVE_LOW<span class="token operator">></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"><</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">></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矩阵键盘相关推荐
- imx6ul添加keyboard Matrix矩阵键盘
文章目录 一.功能实现(代码) 1.1 添加编译选项 1.2 添加设备树节点 1.2.1 添加kpp节点 1.2.2 在iomuxc中添加pinctrl_复用节点 1.2.3 屏蔽其他设备节点占用的键 ...
- 【STM32扫描4x4矩阵键盘模块】 4x4 matrix keypad interface
[STM32扫描4x4矩阵键盘模块] 4x4 matrix keypad interface 4x4矩阵键盘模块 矩阵键盘是将多个按键排布成类似矩阵形式的键盘组.为了减少IO资源的占用,将键盘组的每一 ...
- 11.嵌入式控制器EC实战 KBC矩阵键盘Keyboard开发流程
文章目录 笔记本矩阵键盘概述 矩阵键盘的扫描方式 行列扫描方式 逐行逐列扫描方式 EC中矩阵键盘是如何扫描并得到码值的(代码分析) 笔记本矩阵键盘概述 在EC中支持两种形式的键盘,一种是PS/2接口的 ...
- 矩阵键盘简易计算机设计报告,矩阵键盘显设计报告..doc
摘要 在日常生活中,我们经常要用到键盘来实现对电子装置的控制.小到手表手机,中到电视电脑,大到各种复杂仪器,都需要通过各种按键来实现各种操作.本次课程设计以按键控制显示为主题,以MSP430G2553 ...
- 行列式的计算机应用答辩ppt,矩阵键盘的研究毕业设计论文+开题报告+答辩PPT
摘要 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,及时在LED数码管上,单片机控制的是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路 ...
- 利用c51进行数模转换并在液晶屏上显示_基于C51单片机的智能计算器、矩阵键盘、lcd1602...
目录 1绪论.............................................................................................. ...
- 【蓝桥杯单片机】矩阵键盘和独立键盘新解(更稳定更高复用性)
实验开发板为CT107D蓝桥官方板,编译环境为MDK5 目录 一.矩阵键盘 二.独立键盘 参考宋雪松老师的写法: 采用多个缓冲区 可以扩展至16个键码对应的指令 一.矩阵键盘 通过修改Key_OU ...
- AVR 矩阵键盘程序源代码2(有连续按键功能)(原创)
Keyboard.h /********** AVR 矩阵键盘扫描程序 ********* * 版本.........: 2.0 * 作者.........: 陈利栋 * 目标.........: A ...
- STM32F103C8T6 操作矩阵键盘
系列文章目录 第一章 STM32F103C8T6 点亮LED灯 第二章 STM32F103C8T6 按键扫描输入 第三章 STM32C8CT6 主控按键触发外部中断 第四章 STM32F103C8T6 ...
最新文章
- 企业如何进行团队协作?
- .Net中的设计模式——Iterator模式
- 洛谷 1858 多人背包
- 100万+奖金池!目标检测、车牌识别、人体分割等赛事全面启动! ECV-2021 来了
- 《SAS编程与数据挖掘商业案例》学习笔记之八
- 最大流,最小费用最大流:解析 + 各种板子
- 跨平台开发框架 Lynx 初探
- Oracle DBA课程系列笔记(5)
- 使用Android OpenGL ES 2.0绘图之五:添加运动
- 《基于Mozilla的扩展开发》系列文章
- mysql gis 高德_基于高德自定义地图数据的GIS矢量地图制作
- 利用Bitvise SSH Client设置二级代理
- c语言矩阵键盘控制四个led灯,51单片机矩阵键盘与左右流水灯控制C程序
- 【云片网】使用云片网发送注册短信验证码
- 使用GitHub制作一个高逼格的在线简历
- 远程计算机强迫关闭一个连接,远程主机强迫关闭了一个现有的连接,该怎么办...
- ConvE:Convolutional 2D Knowledge Graph Embeddings
- DevOps 测试实践
- Ubuntu 17.10安装搜狗拼音输入法
- 华为路由器用Linux开发,华为路由器常用配置 - osc_1v2pb1nt的个人空间 - OSCHINA - 中文开源技术交流社区...