原创 Linux应用层控制外设的两种不同的方式

2024-10-10 14:46 92 0 分类: 物联网


01

方法一:sysfs文件系统控制外设(linux4.8开始分析)


众所周知,linux下一切皆文件,那么应用层如何控制硬件层,同样是通过 文件I/O的方式来实现的,那、么应用层控制硬件层通常有两种方式:

1、/dev/ 目录下为各设备节点,通过对这些设备文件的I/O操作可以实现对底层硬件的操作

2、sysfs 文件系统的主要功能是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图,而 sysfs 文件系统挂载在 /sys 目录下

一、sys目录架构

进入到 sys 目录下,可以看到如下文件:

包括 block、bus、class、dev、devices、firmware、fs、kernel、

modules、power 等

二、sys 目录介绍

sysfs 是一个基于内存的文件系统,同 devfs 、 proc 文件系统一样,称为虚拟文件系统;它的作用是将内核信息以文件的方式提供给应用层使用。

sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。

sysfs 文件系统挂载在 /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:

这里是系统中电源选项,有一些属性可以用于控制整个系统的电源状态。

点击图片可查看完整电子表格

上表显示的便是 sysfs 文件系统中的目录,包括 block 、 bus 、 class 、 dev 、 devices 、 firmware 、 fs 、 kernel 、 modules、 power 等,每个目录下又有许多文件或子目录,对这些目录的说明如所示:

Linux 内核中为了尽量降低驱动开发者难度以及接口标准化,就出现了设备驱动框架的概念; Linux 针对各种常见的设备进行分类,譬如 LED 类设备、输入类设备、 FrameBuffer 类设备、 video 类设备、 PWM 设备等等,并为每一种类型的设备设计了一套成熟的、标准的、典型的驱动实现的框架,这个就叫做设备驱动框架。设备驱动框架为驱动开发和应用层提供了一套统一的接口规范,譬如对 LED 类设备来说,内核提供了 LED 设备驱动框架,驱动工程师编写 LED 驱动时,使用 LED 驱动框架来开发自己的 LED 驱动程序,这样做的好处就在于,能够对上层应用层提供统一、标准化的接口、同时又降低了驱动开发工程师的难度。


02

方法二:Libgpiod库控制外设


包括字符设备文件和块设备文件,设备文件便是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/ 目录下,我们也把/dev 目录下的文件称为设备节点。

libgpiod是用于与linux GPIO交互的C库和工具,从 linux 4.8 后,官方不推荐使用 GPIO sysfs 接口,libgpiod库封装了 ioctl 调用和简单的API接口。

与sysfs方式相比,libgpiod可以保证所有分配的资源,在关闭文件描述符后得到完全释放,并且拥有sysfs方式接口中不存在的功能(如时间轮询,一次设置/读取多个gpio值)。此外libgpiod还包含一组命令行工具,允许用户使用脚本对gpio进行个性化操作。

目前有六个命令行工具可用

gpiodetect:列举所有的gpio芯片以及它们名字,标签和io数目

gpioinfo:列举所有gpio芯片以及它们的名字,制造商,方向,激活状态,附加标志等

gpioget:获取特定gpio引脚的当前值

active-high是高电平 值为1 active-low是低电平 值为0

gpioset :设置特定的当前值

gpiofind :获取gpiochip的name和offset eg:gpiofind GPIO26 是加上line的名字

gpiomon : 监视特定io上的特定事件

本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki:Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)

(如有侵权,联系删除)

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
0
关闭 站长推荐上一条 /3 下一条