欢迎光临散文网 会员登陆 & 注册

【i.MX6ULL】驱动开发7——按键输入捕获

2021-11-09 23:46 作者:码农爱学习-B站  | 我要投稿



前面几篇文章,从最基础的寄存器点灯,到设备树点灯,再到GPIO子系统点灯,一步步了解嵌入式Linux开发的各种点灯原理。

点灯用到的都是GPIO的输出功能,这篇,通过按键的使用,来学习GPIO输入功能的使用。

1 硬件介绍

1.1 板子上按键原理图

先来看原理图,我板子上有4个按键sw1~sw4:

1.1.1 SW1

SW1是板子的系统复位按键,不可编程使用

1.1.2 SW2、SW3

  • SW2:SNVS_TAMPER1,GPIO5_1

    平时是低电平,按下去是高电平。

  • SW3:ONOFF

    它也是系统级的按键,用于长按进行开关机。

1.1.3 SW4

SW4是BOOT_MODE1脚,用来进行串行烧录模式切换,需要再与复位键配合使用。

本篇仅测试按键功能,因此可以该按键。

1.1.4 使用其中2个按键

板子上这4个按键的功能特性如下表:

本实验使用SW2和SW4这两个按键来进行实验。

2 软件编写

2.1 修改设备树文件

2.1.1 修改iomuxc节点

修改imx6ull-myboard.dts,在iomuxc节点的imx6ull-evk字节点下创建一个名为pinctrl_key的子节点,节点内容如下:

这部分是对引脚进行配置,这两个引脚的定义是在imx6ull-pinfunc-snvs.h文件中:

引脚宏定义后面的值,是对引脚功能的配置:

SW2:0x3080,即0011 0000 1000 0000

SW4:0xF080,即1000 0000 1000 0000

对照之前讲解GPIO的PAD寄存器的配置,根据两个按键的实际电路配置上拉或下拉。

注:SW4 (MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11)这个GPIO,在设备中实际已经被其它设备(spi4)使用了。

在imx6ull-myboard.dts的300多行处,有:

pinctrl_spi4: spi4grp {
fsl,pins = <
    MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10        0x70a1
    MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11        0x70a1
    MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07      0x70a1
    MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08      0x80000000
    >;
};

理论上我们应该把这里的配置给注释掉,因为1个IO是不能同时进行2种功能的。由于本次实验不使用spi4,暂且也先不管它,看看会有什么影响,如果影响了本实验,再给把这里的配置给注掉。

2.1.2 添加key节点

在根节点下创建名为key的按键节点,内容如下:

2.2 编写按键驱动程序

按键驱动,也属于字符设备驱动,和之前的字符设备驱动的框架一样,主要的修改点在按键的硬件初始化配置已经按键的读取。

新建一个key-Bsp.c

2.2.1 按键的硬件初始化

初始化的流程,就是使用OF函数来从设备树中获取key节点,然后使用GPIO子系统的API函数,将GPIO配置为输入。

2.2.2 读取按键的值

读取按键的值,也是GPIO子系统的API函数来读取。读取到按键的值后,将该值传递出来给应用层使用,注意这里使用了原子操作的方式atomic_set和atomic_read实现数据的写入和读取。


2.3 编写按键应用程序

新建一个key-App.c

按键的应用层程序,主要就通过驱动程序提供的按键读取接口,来循环读取按键的值,并在按键按下时,将按键的值打印出来。


3 实验测试

3.1 编译程序

3.1.1 编译设备树

编译设备树文件,并将编译出的dtb文件复制到启动文件夹:

网络方式启动开发板,查看key节点:

3.1.2 编译按键驱动程序

3.1.3 编译按键应用程序

3.2 测试

3.3 查看CPU占用率

先Ctrl+C结束掉此按键进程,然后使用如下指令来后台运行按键程序:

./key-App /dev/key &

然后再使用指令:

top

来查看CPU是使用情况。从下图可以看出,此时CPU的使用率是99.8%,全被按键检查程序占用了,因为按键程序中有个while循环在一直读取按键的值。

使用指令:

ps

查看按键的进程号,如下图为149,再使用:

kill -9 149

来杀掉按键进程,然后再使用top指令查看,可以看到CPU的使用率又变回了0。

实际的按键使用中,一般不会使用本篇的这种持续检测导致CPU占满的方式,本篇只是先来介绍GPIO的输入功能的使用,后续会使用更加高效的按键检测机制来实现按键检测功能。

4 总结

本篇主要介绍了i.MX6ULL的按键检测的使用,主要的知识点是设备树的修改,以及GPIO的输入配置与高低电平的读取。



【i.MX6ULL】驱动开发7——按键输入捕获的评论 (共 条)

分享到微博请遵守国家法律