教你在全志T507开发板上添加两个GPIO按键

2022年10月14日 13:57    发布者:繁花之语
本文将为大家介绍如何在飞凌OKT507-C开发板上添加两个GPIO按键,希望能够对各位工程师有所帮助,本文章以PE5、PE6两个引脚为例。话不多说,下面我们进入主题。

一、GPIO按键添加方法

1. 添加内核配置
Linux内核源代码中集成了很多功能,一般的用户只会用到其中的部分功能。用户从中挑选自己需要的功能,这就叫内核配置。下面我们开始进行配置。

注意:

(1)在进行配置前,需要对

OKT507-linux-sdk/kernel/linux-4.9/arch/arm64/configs/sun50iw9p1smp_longan_dcfconfig文件提前做好备份;

(2)以下所有图中的红框为修改后的内容。

vi OKT507-linux-sdk/kernel/linux-4.9/.config






https://pic2.zhimg.com/80/v2-dcb4557f92a25d03f6ba2636917bc642_720w.png​




编辑






2. 添加key节点

添加结点需要我们到设备树中进行添加,设备树是一个描述硬件的数据结构,甚至你可以将其看成一个大结构体(这个结构体就是平台,成员就是具体的设备),将硬件的配置从linux内核的源码中提取出来。




下面打开我们的T507设备树文件,如下:

vi OKT507-linux-sdk/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/OKT507-C-Common.dtsi






https://pic1.zhimg.com/80/v2-5519b8829436f17ec0ce3dae692cd634_720w.png​




编辑






其中按键键值设置如下。



https://pica.zhimg.com/80/v2-a339583dc78384e64018058bb13403b9_720w.png​




编辑






相关键值可通过查看input-event-codes.h文件确定。

vi OKT507-linux-sdk/kernel/linux-4.9/include/uapi/linux/input-event-codes.h






https://pic1.zhimg.com/80/v2-5771095376145f7f8b3e183a76840b8e_720w.png​




编辑








https://pic1.zhimg.com/80/v2-f950c28c43974790903a64b0985241e4_720w.png​




编辑









3. 添加引脚定义
添加引脚定义需要用到pinctrl,下面给大家简单介绍下pinctrl。pinctrl就是系统中pin引脚的控制。




假如在使用到GPIO、I2C等功能时,若按引脚逐一地去找对应的寄存器进行配置非常浪费时间和精力,所以内核引入了pinctrl子系统,把引脚的复用和配置抽象出来,只需要芯片厂商把自家芯片的支持进去,就可以很方便的配置引脚。




下面打开我们的pinctrl文件,如下:

vi OKT507-linux-sdk/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw9p1-pinctrl.dtsi






https://pic2.zhimg.com/80/v2-88c1683f79ba9833b6ca7eeefc10f56f_720w.png​




编辑









4. 关闭冲突功能

因为有些功能结点使用的引脚与我们这次复用的引脚发生冲突,会发生引脚不生效的错误,所以我们一定要检查好,然后将其关闭。  

如下打开设备树文件:

vi OKT507-linux-sdk/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/OKT507-C-Common.dtsi






https://pic1.zhimg.com/80/v2-3feef8696e39128b3beb7cbcf7dcd871_720w.png​




编辑切换为居中














https://pic3.zhimg.com/80/v2-309d84f1e22c01bbe83e7193ab68cf96_720w.png​




编辑









vi OKT507-linux-sdk/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw9p1-pinctrl.dtsi




注意:

因摄像头csi复用的引脚与我们这里的冲突,虽然前面将状态disabled了,pinctrl这里也有可能会造成冲突,为了避免不必要的麻烦,我们也将这里注释掉。






https://pic1.zhimg.com/80/v2-b7a2b358f98cd41f0562397d7c52b15f_720w.png​




编辑切换为居中






5. 驱动修改

gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动基于platform_driver架构,实现了驱动和设备分离,符合Linux设备驱动模型的思想,也符合linux驱动实现模型,即driver和device分离模型。




一般按键驱动,都是基于gpio-keys进行开发的。驱动文件如下:

vi OKT507-linux-sdk/kernel/linux-4.9/drivers/input/keyboard/gpio_keys.c






https://pica.zhimg.com/80/v2-f8191f14341b6abf63d6a79daba32444_720w.png​




编辑














https://pic1.zhimg.com/80/v2-63c6802640efcd41b5c9e8e091c87cb5_720w.png​




编辑














https://pic3.zhimg.com/80/v2-e52aa6249bfe874cd066f4f2b3dc569e_720w.png​




编辑切换为居中














https://pica.zhimg.com/80/v2-2e821ffd31b19e918e3043c9954b1f07_720w.png​




编辑切换为居中




添加图片注释,不超过 140 字(可选)









https://pica.zhimg.com/80/v2-2ffd0c87ffbd7e755ee8267d2711f6d8_720w.png​




编辑切换为居中









二、测试方法

终端窗口输入evtest,选择 7。






https://pic1.zhimg.com/80/v2-34471976f33ef198403ffbc4a5b45a4e_720w.png​




编辑切换为居中






从上图红框可以看出,通过evtest测试工具将内核设备读取并打印设备描述的事件,到这里,GPIO按键就做完了,可以用它来实现很多的功能,比如说按一下切换灯的状态,蜂鸣器响等。




当然不只是这些啦,我们还可以利用它去实现很多其他功能,欢迎各位聪明的工程师小伙伴自行发挥!