金牌会员
 
- 积分
- 1176
- 金钱
- 1176
- 注册时间
- 2020-12-1
- 在线时间
- 150 小时
|
本帖最后由 起个什么名字好 于 2021-7-21 16:38 编辑
目的
在IMX6ULL阿尔法开发板出厂系统上添加矩阵键盘功能。开发板购买链接:https://detail.tmall.com/item.htm?spm=a1z10.5-b.w4011-22300975877.46.31fb3ce2BvlM7p&id=609033604451&rn=1caade9fddd217267830888b1320c1e5&abbucket=5
矩阵键盘购买链接:https://detail.tmall.com/item.htm?spm=a1z10.5-b.w4011-22300975877.112.20de1f2dJmxsba&id=643960324602&rn=fb1c58cf8a6030479e6ef9e3b3e645b6&abbucket=5
附件上传了一些要用到的文件和修改好的文件,可以直接拿去测试或者修改。
参考网友经验:https://blog.csdn.net/Ace_Shiyuan/article/details/110958057
矩阵键盘源码:【Matrix矩阵键盘】一般适用于多行多列多按键的情况,源码文件为:drivers/input/keyboard/matrix_keypad.c
硬件连接
矩阵模块(4行4列)、阿尔法开发板(mini板也可以)
矩阵模块原理图
开发板接口管脚要求
能做GPIO使用,且有上拉电阻。例如这里用的几个管脚。最好不要接到其他芯片上,以防干扰。此处需要查看开发板底板原理图。
GPIO4和GPIO2
U5_RX和U5_TX
接口对应表格
实物连接图
驱动配置
menuconfig配置
使能环境后,执行make imx_v7_defconfig和make menuconfig来打开出厂配置文件menuconfig。- source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
- make imx_v7_defconfig
- make menuconfig
复制代码
参考以下配置,添加矩阵键盘驱动相关编译选项,去除出厂摄像头驱动编译选项(默认有V4L platform devices,注释掉)。
save保存为./arch/arm/configs/atk_keypad_defconfig文件,保存完可以在对应目录下查看是否有此文件生成。
修改出厂系统编译脚本,方便后续使用。修改脚本里的defconfig配置文件为我们刚刚配置的defconfig文件。
添加kpp节点
此处以4行x4列矩阵键盘为例。
Linux内核中定义矩阵键盘必须且只能为:行GPIO输入,列GPIO输出。
此处采用按键映射的写法,方便理解,与内核驱动源码中的写法有点差异。
打开arch/arm/boot/dts/imx6ull-14x14-evk.dts
- &kpp{
- compatible = "gpio-matrix-keypad";
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_key>;
- debounce-delay-ms = <20>; /*防反跳延时,即:去抖延时*/
- col-scan-delay-us = <400>; /*列扫描延时*/
- /* 4行 */
- row-gpios = <&gpio1 4 GPIO_ACTIVE_LOW
- &gpio1 2 GPIO_ACTIVE_LOW
- &gpio1 31 GPIO_ACTIVE_LOW
- &gpio1 30 GPIO_ACTIVE_LOW
- >;
- /* 4列 */
- col-gpios = <&gpio4 21 GPIO_ACTIVE_LOW
- &gpio4 22 GPIO_ACTIVE_LOW
- &gpio4 23 GPIO_ACTIVE_LOW
- &gpio4 24 GPIO_ACTIVE_LOW
- >;
-
- /* 举例释义:MATRIX_KEY(0x2, 0x1, KEY_X)表示将【第2行1列的按键】映射为【KEY_X】 */
- linux,keymap = <
- MATRIX_KEY(0x0,0x0,KEY_1)
- MATRIX_KEY(0x0,0x1,KEY_2)
- MATRIX_KEY(0x0,0x2,KEY_3)
- MATRIX_KEY(0x0,0x3,KEY_4)
- MATRIX_KEY(0x1,0x0,KEY_5)
- MATRIX_KEY(0x1,0x1,KEY_6)
- MATRIX_KEY(0x1,0x2,KEY_7)
- MATRIX_KEY(0x1,0x3,KEY_8)
- MATRIX_KEY(0x2,0x0,KEY_9)
- MATRIX_KEY(0x2,0x1,KEY_A)
- MATRIX_KEY(0x2,0x2,KEY_B)
- MATRIX_KEY(0x2,0x3,KEY_C)
- MATRIX_KEY(0x3,0x0,KEY_D)
- MATRIX_KEY(0x3,0x1,KEY_E)
- MATRIX_KEY(0x3,0x2,KEY_F)
- MATRIX_KEY(0x3,0x3,KEY_G)
- >;
- gpio-activelow;
- status = "okay";
- };
复制代码
在iomuxc中添加pinctrl_复用节点- pinctrl_key:kppgrp {
- fsl,pin = <
- /* 列 */
- MX6UL_PAD_CSI_DATA03__GPIO4_IO24 0Xb0b1
- MX6UL_PAD_CSI_DATA02__GPIO4_IO23 0Xb0b1
- MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0Xb0b1
- MX6UL_PAD_CSI_DATA00__GPIO4_IO21 0Xb0b1
- /* 行 */
- MX6UL_PAD_UART5_TX_DATA__GPIO1_IO30 0x70a1
- MX6UL_PAD_GPIO1_IO02__GPIO1_IO02 0x70a1
- MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0x70a1
- MX6UL_PAD_UART5_RX_DATA__GPIO1_IO31 0x70a1
- >;
- };
复制代码
屏蔽掉GPIO复用的管脚
屏蔽掉MX6UL_PAD_CSI_DATA00~MX6UL_PAD_CSI_DATA03的其他复用管脚功能。
这里节点名为pinctrl_csi1,注释掉此节点名相关的配置。
屏蔽掉MX6UL_PAD_UART5_TX_DATA和MX6UL_PAD_UART5_RX_DATA其他的复用管脚。
disabled掉pinctrl_i2c2节点
屏蔽掉MX6UL_PAD_GPIO1_IO02和MX6UL_PAD_GPIO1_IO04其他的复用管脚。
disabled掉pinctrl_tsc节点和csi_pwn_rst节点(前面已经屏注释掉摄像头相关配置)
修改完成后,执行./build编译,如果没有修改错误则是编译成功的。
然后把生成设备树和内核加载到开发板上运行启动。
调试矩阵键盘
调试按键的时候,/dev/input/路径下:event0是矩阵按键设备。
类hexdump工具源码
工具源码参考自:https://blog.csdn.net/Ace_Shiyuan/article/details/110957430
将源码hexdump_tool.c使用出厂系统编译器交叉编译生成arm架构的可执行文件,命名为read_linux_key_value,然后将可执行文件拷贝到开发板上。
- source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
- $CXX hexdump_tool.c -o read_event_key_value
复制代码
编译警告不用理会,最终生成一个read_event_key_value文件。
将此文件拷贝到开发板后上并赋予权限。
确认接线、内核、设备树都已经没有问题后,就可以直接使用read_event_key_value来调试矩阵键盘。
依次按顺序按下矩阵键盘16个按键,打印信息如下:
Linux键值分析参考:https://blog.csdn.net/cyf15238622067/article/details/78431709
根据内核源码kernel/include/uapi/linux/input.h中code值的定义可以得:
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
#define KEY_5 6
#define KEY_6 7
#define KEY_7 8
#define KEY_8 9
#define KEY_9 10
#define KEY_A 30
#define KEY_B 48
#define KEY_C 46
#define KEY_D 32
#define KEY_E 18
#define KEY_F 33
#define KEY_G 34
如果顺序不对,可以检查下接线顺序是否和kpp节点对应上
至此IMX6ULL阿尔法开发板上添加矩阵键盘完成。
|
|