在我们移植嵌入式Linux系统的时候,会涉及到按键等一些用户层面的设置,单一的按键我们通过GPIO输入输出,或者中断就很好实现,但是当我们的工作中需要用到旋钮式的编码器单单通过前面所述就很麻烦,这里介绍一种简单的方法可快速实现编码器的软件驱动开发。
因为内核针对编码器是有现成的驱动代码的,我们要做的是使用它,驱动它
1,首先进入内核源码目录下的 /drivers/input/misc下,我们可以看见这个文件 rotary_encoder.c,没错这个就是内核自带的编码器驱动,如下所示:
2,打开这个文件,找到.compatible属性文件,这里可以看笔者的显示的是 { .compatible = "rotary-encoder", }, 这里 "rotary-encoder" 就是等会设备树里面要用的文件名,如下所示:
3,接下来就是在设备树中添加相应的硬件描述文件来使用该驱动,终端输入cd arch/arm/boot/dts/进入内核源码下的设备树文件目录,找到自己使用的设备树文件,笔者这里以imx6ull开发板为例(其他的原理一样),打开设备树文件,我这里打开的是imx6ull.dtsi文件(因为用到的设备树文件进行了两级包含最终还会包含到这个设备树文件,我就直接加在这里),找到soc节点,在该节点下加入设备树文件,我的如下:
设备树文件不知道怎么写,可以输入这个命令cd Documentation/devicetree/bindings/input,进入内核中的文档描述目录,找到编码器的驱动设备树编写文档 rotary-encoder.txt
打开该文档如下:
根据自己使用的GPIO引脚做出相应的修改,保存设备树文件。
4,执行make menuconfig命令打开用户可视化配置界面,找到如下的地方:
将这个配置选项编译进内核,保存退出
5,重新编译内核,将镜像再次烧录到板卡,在板卡终端执行 cd /dev/input/ 进入该目录,会发现有多个类似如下的驱动描述符:
输入evtest eventx(x是自己板卡对应的数字),再次旋转编码器会发现有输出,正向旋转和反向旋转出现的数值不同,通过输入子系统监听功能,我们就能够轻松使用编码器了!