Qt控制gpio(sysfs控制gpio)
使用sysfs方式控制gpio
sysfs文件系统
sysfs 是一个基于内存的文件系统, 同 devfs、 proc 文件系统一样,称为虚拟文件系统; 它的作用是将内核信息以文件的方式提供给应用层使用。 sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。
sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件、 展示设备驱动模型中各组件的层次关系。 sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系, 用来导出内核对象(kernel object,譬如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。
sysfs 文件系统中的目录,包括 block、 bus、 class、 dev、 devices、firmware、 fs、kernel、modules、 power 等,每个目录下又有许多文件或子目录 。
/sys 下的子目录 | 说明 |
---|---|
/sys/devices | 这是系统中所有设备存放的目录,也就是系统中所有设备在sysfs中的呈现、表达,也是sysfs管理设备的最重要的目录结构。 |
/sys/block | 块设备的存放目录,这是一个过时的接口,按照sysfs的设计理念,系统所有的设备都存放在/sys/devices目录下,所以/sys/block目录下的文件通常是链接到/sys/devices目录下的文件。 |
/sys/bus | 这是系统中的所有设备按照总线类型分类放置的目录结构, /sys/devices 目录下每一种设备都是挂在某种总线下的,譬如 i2c 设备挂在 I2C 总线下。同样, /sys/bus 目录下的文件通常也是链接到了/sys/devices 目录。 |
/sys/class | 这是系统中的所有设备按照其功能分类放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。 按照设备的功能划分组织在/sys/class 目录下,譬如/sys/class/leds目录中存放了所有的 LED 设备, /sys/class/input 目录中存放了所有的输入类设备。 |
/sys/dev | 这是按照设备号的方式放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。该目录下有很多以主设备号:次设备号(major:minor)命名的文件,这些文件都是链接文件,链接到/sys/devices 目录下对应的设备。 |
/sys/firmware | 描述了内核中的固件。 |
/sys/fs | 用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点。 |
/sys/kernel | 这里是内核中所有可调参数的位置。 |
/sys/module | 这里有系统中所有模块的信息。 |
/sys/power | 这里是系统中电源选项,有一些属性可以用于控制整个系统的电源状态。 |
系统中所有的设备(对象)都会在/sys/devices 体现出来,是 sysfs 文件系统中最重要的目录结构;而/sys/bus、 /sys/class、 /sys/dev 分别将设备按照挂载的总线类型、功能分类以及设备号的形式将设备组织存放在这些目录中,这些目录下的文件都是链接到了/sys/devices 中。
GPIO部分
通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的操作接口包括 direction 和 value 等,direction 控制 GPIO 方向,而 value 可控制 GPIO 输出或获得 GPIO 输入。文件 IO 方式操作 GPIO,使用到了4个函数 open、close、read、write。
在系统图形化配置过程中,要加入支持选项。
1 | Device Drivers -> |
之后可以看到/sys/class/gpio下有如下文件。
1、gpio_operation 通过 /sys/ 文件接口操作 IO 端口 GPIO 到文件系统的映射。
2、控制 GPIO 的目录位于 /sys/class/gpio。
3、/sys/class/gpio/export 文件用于通知系统需要导出控制的 GPIO 引脚编号。
4、/sys/class/gpio/unexport 用于通知系统取消导出。
5、/sys/class/gpio/gpiochipX 目录保存系统中 GPIO 寄存器的信息,包括每个寄存器控制引脚的起始编号 base,寄存器名称,引脚总数。
查询gpio的真实引脚编号
还是在刚才的目录进入其中一个gpiochip32,查询地址
1 | cat label |
之后将得到的地址20a0000放入到设备树的文件中来进行查询。
所以gpio2的引脚的基准引脚32
如果想操作GPIO2_IO3 这个引脚的话,就需要操作gpio32这个控制器并且引脚的编号为32+3=35.
向 /sys/class/gpio/export 写入此编号,比如35号引脚,在 shell 中可以通过以下命令实现
1 | echo 35 > /sys/class/gpio/export |
direction 文件,定义输入输入方向,可以通过下面命令定义为输出。
1 | echo out > direction |
direction 接受的参数可以是:in、out、high、low。其中参数 high / low 在设置方向为输出的同时,将 value 设置为相应的 1 / 0。
几个简单的例子
1、导出
1 | echo 36 > /sys/class/gpio/export |
2、设置方向
1 | echo out > /sys/class/gpio/gpio36/direction |
3、查看方向
1 | cat /sys/class/gpio/gpio36/direction |
4、设置输出
1 | echo 1 > /sys/class/gpio/gpio36/value |
5、查看输出值
1 | cat /sys/class/gpio/gpio36/value |
6、取消导出
1 | echo 36 > /sys/class/gpio/unexport |
Qt程序
接下来就很简单了,就是通过QFile来给IO口进行输出数值。
1 |