2024-10-10 14:46
66 次阅读|
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) (如有侵权,联系删除)