OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8740|回复: 9

【分享】IMX6ULL阿尔法开发板添加矩阵键盘

[复制链接]

8

主题

214

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1162
金钱
1162
注册时间
2020-12-1
在线时间
148 小时
发表于 2021-7-5 18:33:57 | 显示全部楼层 |阅读模式
本帖最后由 起个什么名字好 于 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
截图_20210906100927.png
矩阵键盘购买链接:https://detail.tmall.com/item.htm?spm=a1z10.5-b.w4011-22300975877.112.20de1f2dJmxsba&id=643960324602&rn=fb1c58cf8a6030479e6ef9e3b3e645b6&abbucket=5
截图_20211006101030.png
附件上传了一些要用到的文件和修改好的文件,可以直接拿去测试或者修改。

参考网友经验:https://blog.csdn.net/Ace_Shiyuan/article/details/110958057
矩阵键盘源码:【Matrix矩阵键盘】一般适用于多行多列多按键的情况,源码文件为:drivers/input/keyboard/matrix_keypad.c

硬件连接
矩阵模块(4行4列)、阿尔法开发板(mini板也可以)
矩阵模块原理图
截图_20211106031123.png

开发板接口管脚要求
能做GPIO使用,且有上拉电阻。例如这里用的几个管脚。最好不要接到其他芯片上,以防干扰。此处需要查看开发板底板原理图。
GPIO4和GPIO2
截图_20215505055543.png

U5_RX和U5_TX
截图_20215605055651.png

接口对应表格
截图_20211006101056.png

实物连接图

7acfb790e1bc898b62b073815d050e1.jpg
驱动配置
menuconfig配置
使能环境后,执行make imx_v7_defconfig和make menuconfig来打开出厂配置文件menuconfig。
  1. source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
  2. make imx_v7_defconfig
  3. make menuconfig
复制代码

参考以下配置,添加矩阵键盘驱动相关编译选项,去除出厂摄像头驱动编译选项(默认有V4L platform devices,注释掉)
截图_20213821043833.png


save保存为./arch/arm/configs/atk_keypad_defconfig文件,保存完可以在对应目录下查看是否有此文件生成。
截图_20210505060548.png
截图_20210805060817.png


修改出厂系统编译脚本,方便后续使用。修改脚本里的defconfig配置文件为我们刚刚配置的defconfig文件。
  1. vi build.sh
复制代码
截图_20211005061013.png


添加kpp节点
此处以4行x4列矩阵键盘为例。
Linux内核中定义矩阵键盘必须且只能为:行GPIO输入,列GPIO输出。

此处采用按键映射的写法,方便理解,与内核驱动源码中的写法有点差异。
打开arch/arm/boot/dts/imx6ull-14x14-evk.dts
  1. &kpp{
  2.         compatible = "gpio-matrix-keypad";
  3.         pinctrl-names = "default";
  4.         pinctrl-0 = <&pinctrl_key>;

  5.         debounce-delay-ms = <20>;         /*防反跳延时,即:去抖延时*/
  6.         col-scan-delay-us = <400>;                /*列扫描延时*/

  7.         /* 4行 */
  8.          row-gpios = <&gpio1 4 GPIO_ACTIVE_LOW
  9.                                  &gpio1 2 GPIO_ACTIVE_LOW
  10.                                  &gpio1 31 GPIO_ACTIVE_LOW
  11.                                  &gpio1 30 GPIO_ACTIVE_LOW
  12.         >;                  

  13.         /* 4列 */
  14.         col-gpios = <&gpio4 21 GPIO_ACTIVE_LOW
  15.                                  &gpio4 22 GPIO_ACTIVE_LOW
  16.                                  &gpio4 23 GPIO_ACTIVE_LOW
  17.                                  &gpio4 24 GPIO_ACTIVE_LOW
  18.         >;
  19.    
  20. /* 举例释义:MATRIX_KEY(0x2, 0x1, KEY_X)表示将【第2行1列的按键】映射为【KEY_X】 */
  21.         linux,keymap = <
  22.                 MATRIX_KEY(0x0,0x0,KEY_1)
  23.                 MATRIX_KEY(0x0,0x1,KEY_2)
  24.                 MATRIX_KEY(0x0,0x2,KEY_3)
  25.                 MATRIX_KEY(0x0,0x3,KEY_4)

  26.                 MATRIX_KEY(0x1,0x0,KEY_5)
  27.                 MATRIX_KEY(0x1,0x1,KEY_6)
  28.                 MATRIX_KEY(0x1,0x2,KEY_7)
  29.                 MATRIX_KEY(0x1,0x3,KEY_8)

  30.                 MATRIX_KEY(0x2,0x0,KEY_9)
  31.                 MATRIX_KEY(0x2,0x1,KEY_A)
  32.                 MATRIX_KEY(0x2,0x2,KEY_B)
  33.                 MATRIX_KEY(0x2,0x3,KEY_C)

  34.                 MATRIX_KEY(0x3,0x0,KEY_D)
  35.                 MATRIX_KEY(0x3,0x1,KEY_E)
  36.                 MATRIX_KEY(0x3,0x2,KEY_F)
  37.                 MATRIX_KEY(0x3,0x3,KEY_G)               
  38.         >;
  39.         gpio-activelow;
  40.         status = "okay";
  41. };
复制代码

在iomuxc中添加pinctrl_复用节点
  1.   pinctrl_key:kppgrp {
  2.                         fsl,pin = <
  3.                         /* 列 */
  4.                                 MX6UL_PAD_CSI_DATA03__GPIO4_IO24        0Xb0b1
  5.                                 MX6UL_PAD_CSI_DATA02__GPIO4_IO23        0Xb0b1
  6.                                 MX6UL_PAD_CSI_DATA01__GPIO4_IO22        0Xb0b1
  7.                                 MX6UL_PAD_CSI_DATA00__GPIO4_IO21        0Xb0b1
  8.                         /* 行 */
  9.                                 MX6UL_PAD_UART5_TX_DATA__GPIO1_IO30        0x70a1
  10.                                 MX6UL_PAD_GPIO1_IO02__GPIO1_IO02        0x70a1
  11.                                 MX6UL_PAD_GPIO1_IO04__GPIO1_IO04        0x70a1
  12.                                 MX6UL_PAD_UART5_RX_DATA__GPIO1_IO31        0x70a1
  13.                         >;
  14.                 };
复制代码


屏蔽掉GPIO复用的管脚

屏蔽掉MX6UL_PAD_CSI_DATA00~MX6UL_PAD_CSI_DATA03的其他复用管脚功能。
截图_20211305061345.png
这里节点名为pinctrl_csi1,注释掉此节点名相关的配置。
截图_20211405061408.png
截图_20211405061427.png
截图_20211405061455.png

屏蔽掉MX6UL_PAD_UART5_TX_DATA和MX6UL_PAD_UART5_RX_DATA其他的复用管脚。
截图_20211505061549.png
disabled掉pinctrl_i2c2节点
截图_20211605061612.png

屏蔽掉MX6UL_PAD_GPIO1_IO02和MX6UL_PAD_GPIO1_IO04其他的复用管脚。
截图_20211605061643.png

disabled掉pinctrl_tsc节点和csi_pwn_rst节点(前面已经屏注释掉摄像头相关配置)
截图_20211705061708.png

修改完成后,执行./build编译,如果没有修改错误则是编译成功的。
截图_20211705061735.png
然后把生成设备树和内核加载到开发板上运行启动。


调试矩阵键盘
调试按键的时候,/dev/input/路径下:event0是矩阵按键设备。
截图_20211905061918.png
类hexdump工具源码
工具源码参考自:https://blog.csdn.net/Ace_Shiyuan/article/details/110957430
将源码hexdump_tool.c使用出厂系统编译器交叉编译生成arm架构的可执行文件,命名为read_linux_key_value,然后将可执行文件拷贝到开发板上。
  1. source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
  2. $CXX hexdump_tool.c -o read_event_key_value
复制代码
截图_20212005062016.png
编译警告不用理会,最终生成一个read_event_key_value文件。
截图_20212005062042.png


将此文件拷贝到开发板后上并赋予权限。
截图_20212105062111.png
确认接线、内核、设备树都已经没有问题后,就可以直接使用read_event_key_value来调试矩阵键盘。
  1. ./read_event_key_value 0
复制代码
依次按顺序按下矩阵键盘16个按键,打印信息如下:
截图_20212205062250.png
截图_20212305062325.png

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阿尔法开发板上添加矩阵键盘完成。



修改好的矩阵键盘文件.zip

6.02 MB, 下载次数: 23

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

200

帖子

0

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
1063
金钱
1063
注册时间
2019-9-19
在线时间
194 小时
发表于 2021-7-5 19:01:08 | 显示全部楼层
=======================
出征,嗒嗒嗒——
快点上车!
=======================
回复 支持 反对

使用道具 举报

8

主题

214

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1162
金钱
1162
注册时间
2020-12-1
在线时间
148 小时
 楼主| 发表于 2021-7-6 12:21:41 | 显示全部楼层
自顶一下,还是挺好玩的
回复 支持 反对

使用道具 举报

8

主题

888

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2377
金钱
2377
注册时间
2019-9-25
在线时间
394 小时
发表于 2021-7-10 09:31:49 | 显示全部楼层
不错不错,帮顶
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2021-8-4
在线时间
6 小时
发表于 2021-8-18 14:10:48 | 显示全部楼层
厉害。。。。。。。。。。。
回复 支持 反对

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2020-1-26
在线时间
45 小时
发表于 2021-11-1 23:15:56 | 显示全部楼层
很强,我按照你的来已经成功了,太牛了
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-11-18
在线时间
8 小时
发表于 2022-8-11 08:26:31 | 显示全部楼层
我的怎么一执行测试程序,不按按键就自动往外打印按键值
回复 支持 反对

使用道具 举报

8

主题

214

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1162
金钱
1162
注册时间
2020-12-1
在线时间
148 小时
 楼主| 发表于 2022-8-12 09:43:03 | 显示全部楼层
可能硬件连接有误,注意下行列的连接,还有上拉电阻,结合你的矩阵键盘原理图分析
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-11-27
在线时间
6 小时
发表于 2023-2-10 20:21:11 | 显示全部楼层
成功!!!!!!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2022-10-6
在线时间
15 小时
发表于 2023-7-3 16:24:07 | 显示全部楼层
大佬,用你这个编译不出来imx6ull *.dtb
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 19:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表