2025/12/28 3:02:48
网站建设
项目流程
广东建的电商网站叫啥,网站可视化后台,网站原创文章来源,网站访问速度分析目录
目录
前言
DTS配置的参考
内核配置的参考
验证测试的参考
常见问题
驱动匹配失败
按键无响应
按键误触发或重复触发
无法唤醒系统
键值上报错误
总结 前言
矩阵键盘#xff08;Matrix Keypad#xff09;是一种通过行列扫描实现多按键识别的电路设计#x…目录目录前言DTS配置的参考内核配置的参考验证测试的参考常见问题驱动匹配失败按键无响应按键误触发或重复触发无法唤醒系统键值上报错误总结前言矩阵键盘Matrix Keypad是一种通过行列扫描实现多按键识别的电路设计可显著减少I/O占用。其核心原理与实现方法如下1. 结构设计将按键排列为行Row和列Column的矩阵形式每个按键位于行线与列线的交叉点。例如4x4矩阵仅需8个I/O4行4列即可检测16个按键。2. 电平检测机制按键闭合时对应行线与列线导通通过扫描行列电平变化确定按键位置。3. 扫描方法逐行扫描法步骤1所有列线置低电平检测行线是否有低电平判断是否有按键按下。步骤2逐列置低电平检测行线变化定位具体按键。线反转法通过交替反转行/列电平状态结合逻辑运算快速定位按键适用于高速扫描场景。矩阵按键是嵌入式系统中常用的输入设备其中Linux内核自带的驱动核心源码位于linux-x.xx/drivers/input/keyboard/matrix_keypad.c原生的参考文档路径位于linux-x.xx/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt和linux-x.xx/Documentation/devicetree/bindings/input/matrix-keymap.txt。DTS配置的参考matrix-keypad { compatible gpio-matrix-keypad; /* 匹配驱动名称 */ debounce-delay-ms 60; /* 按键消抖延时推荐10~20ms需要根据具体硬件调整 */ col-scan-delay-us 60; /* 列扫描间隔推荐10~50us避免信号串扰 */ linux,no-autorepeat 1; /* 禁止按键自动重复 */ linux,wakeup 0; /* 支持系统唤醒 */ wakeup-source 0; gpio-activelow 1; /* GPIO低电平有效 */ drive-inactive-cols 0; /* 在扫描过程中驱动非活动列默认情况下是将非活动列转换为输入 */ keypad,num-rows 4; /* 行GPIO引脚数量 */ keypad,num-columns 4; /* 列GPIO引脚数量 */ pinctrl-names default; pinctrl-0 pinctrl_row_gpios; row-gpios /* 行GPIO引脚包含引脚编号与电平属性 */ gpioe 5 GPIO_ACTIVE_HIGH gpioc 22 GPIO_ACTIVE_HIGH gpioc 26 GPIO_ACTIVE_HIGH gpioc 27 GPIO_ACTIVE_HIGH ; col-gpios /* 列GPIO引脚包含引脚编号与电平属性 */ gpioc 16 GPIO_ACTIVE_HIGH gpioc 17 GPIO_ACTIVE_HIGH gpioc 18 GPIO_ACTIVE_HIGH gpioc 19 GPIO_ACTIVE_HIGH ; linux,keymap /* 键码映射格式为行 列 键值需转换为32位数据行24 | 列16 | 键值 */ 0x00000074 /* row 0, col 0 */ 0x00010027 /* row 0, col 1 */ 0x0002001c /* row 0, col 2 */ 0x0003006c /* row 0, col 3 */ 0x0100003a /* row 1, col 0 */ 0x0101008b /* row 1, col 1 */ 0x01020067 /* row 1, col 2 */ 0x01030008 /* row 1, col 3 */ 0x02000009 /* row 2, col 0 */ 0x02010010 /* row 2, col 1 */ 0x02020011 /* row 2, col 2 */ 0x02030012 /* row 2, col 3 */ 0x03000013 /* row 3, col 0 */ 0x03010014 /* row 3, col 1 */ 0x03020015 /* row 3, col 2 */ 0x03030016 /* row 3, col 3 */ ; };内核配置的参考CONFIG_INPUT_KEYBOARDy CONFIG_KEYBOARD_MATRIXy验证测试的参考1. 烧录固件后主控端接入矩阵键盘正常开机命令行终端可以输入dmesg | grep matrix-keypad如下# dmesg | grep matrix-keypad [0.873870] input: matrix-keypad as /devices/platform/matrix-keypad/input/input12. 确认输入设备注册状态命令行终端可以输入cat /proc/bus/input/devices如下# cat /proc/bus/input/devices ... I: Bus0019 Vendor0000 Product0000 Version0000 N: Namematrix-keypad P: Phys S: Sysfs/devices/platform/matrix-keypad/input/input1 U: Uniq H: Handlersevent1 B: PROP0 B: EV13 B: KEY800 101080 0 4000080 107f0300 B: MSC10 ...3. 使用evtest工具实时监测按键事件上报验证键值与触发逻辑如下# evtest /dev/input/event1 Input driver version is 1.0.1 Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0 Input device name: matrix-keypad Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 8 (KEY_7) Event code 9 (KEY_8) Event code 16 (KEY_Q) Event code 17 (KEY_W) Event code 18 (KEY_E) Event code 19 (KEY_R) Event code 20 (KEY_T) Event code 21 (KEY_Y) Event code 22 (KEY_U) Event code 28 (KEY_ENTER) Event code 39 (KEY_SEMICOLON) Event code 58 (KEY_CAPSLOCK) Event code 103 (KEY_UP) Event code 108 (KEY_DOWN) Event code 116 (KEY_POWER) Event code 139 (KEY_MENU) Event type 4 (EV_MSC) Event code 4 (MSC_SCAN) Properties: Testing ... (interrupt to exit) Event: time 1686704106.478928, type 4 (EV_MSC), code 4 (MSC_SCAN), value 03 Event: time 1686704106.478928, type 1 (EV_KEY), code 108 (KEY_DOWN), value 1 Event: time 1686704106.478928, -------------- SYN_REPORT ------------ Event: time 1686704106.738950, type 4 (EV_MSC), code 4 (MSC_SCAN), value 03 Event: time 1686704106.738950, type 1 (EV_KEY), code 108 (KEY_DOWN), value 0 Event: time 1686704106.738950, -------------- SYN_REPORT ------------常见问题驱动匹配失败1. 将检查设备树compatible属性是否与驱动匹配驱动表为“gpio-matrix-keypad”。2. 确认GPIO引脚编号是否正确是否与其它设备冲突。3. 查看内核日志dmesg | grep matrix-keypad排查资源分配失败原因。按键无响应1. 排除硬件的问题比如按键是否已经损坏或接触不良等。2. 验证GPIO配置方向行线为输入、列线为输出电平属性与硬件一致。3. 调整DTS配置的debouce-delay-ms消抖时间避免因消抖过短或过长导致检测失败。4. 检查键码映射配置确保linux,keymap的32位格式正确行、列、键值未颠倒。5. 通过cat /proc/bus/input/devices确认输入设备已注册。按键误触发或重复触发1. 增大debounce-delay-ms消抖延迟推荐15~20ms需要根据实际具体硬件调整。2. 启用linux,no-autorepeat属性禁止按键自动重复功能。3. 调整col-scan-delay-us扫描间隔减少信号串扰导致的误检测。4. 检查硬件电路排查GPIO引脚虚焊、供电电源纹波干扰等问题。无法唤醒系统1. 确保设备树配置linux,wakeup属性。2. 验证行GPIO中断支持唤醒功能设备树中GPIO需要配置wakeup-source属性。3. 检查内核电源管理配置确保中断唤醒功能已启用CONFIG_PM_SLEEPy键值上报错误1. 对照Linux标准键码表linux-x.xx/include/linux/input.h确保键值定义正确。2. 检查matrix_keymap_data的keymap数组确保行列与键值映射对应。3. 通过evtest工具测试执行evtest /dev/input/eventXX为输入设备编码按压按键查看是否上报正确事件。总结矩阵键盘作为一种在MCU或SoC片外设备中常见的键盘布局其排布类似于矩阵。在电路设计中 矩阵键盘通过行列式结构优化了MCU或SoC的I/O资源使用可以满足更多的外部输入需求可解决单独控制每个按键会消耗大量的IO资源的问题。因此矩阵键盘一定程度上可有效地节约了资源常见的矩阵键盘尺寸有4x4和8x8而其中4x4尺寸的矩阵键盘应用最为广泛。