Linux的Sysfs 接口

2023-11-29 20:36
文章标签 linux 接口 sysfs

本文主要是介绍Linux的Sysfs 接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、sysfs接口

        在linux系统中,用户空间访问驱动程序一般是以“设备文件”的方式通过“read/write/ioctl”访问,还有一种方式,可以通过echo的方式来直接控制硬件或者修改驱动,也能为底层驱动提供一个接口便于应用层调用,非常简单。

例如:

//打开
echo 1 > /sys/class/my/sensor/my_attr//关闭
echo 0 > /sys/class/my/sensor/my_attr

二、sysfs接口创建

本文以在sys/class目录下创建节点为例

1、使用DEVICE_ATTR声明一个sys节点

static DEVICE_ATTR(led_status, 0600, led_status_show, led_status_store);
static DEVICE_ATTR(my_attr, S_IRUGO | S_IWUSR, my_attr_show, my_attr_store);

my_attr:在sys接口中显示的节点名字

S_IRUGO | S_IWUSR:表示操作这个节点的权限

my_attr_show:使用cat命令查看sys接口时调用的函数

my_attr_store:使用echo命令往sys接口写入内容时调用的函数

2、完成sys节点的读写函数

//执行 cat /sys/...时会调用
static ssize_t my_attr_show(struct device *dev, struct device_attribute *attr, char *buf)
{int len=-1;// 将 mode 的值转换为字符串格式len += snprintf(buf, PAGE_SIZE, "%d\n", mode);return len;return 0;
}//节点写入内容时,会调用该函数
static ssize_t my_attr_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{switch (buf[0])//写入的内容会存放到buf中{case '0':mode = 0;break;case '1':mode = 1;break;default:printk(KERN_INFO "%s: unsupported parameter: %c\n", __func__, buf[0]);}return count;
}

3、创建接口

int add_sysfs_interfaces(struct device *dev)
{int result;struct class *my_class;my_class = class_create(THIS_MODULE, "my");if (IS_ERR(my_class)) {pr_err("Failed to create class\n");return PTR_ERR(my_class);}dev = device_create(my_class, NULL, MKDEV(0, 0), NULL, "sensor");result = device_create_file(dev, &dev_attr_my_attr);if (result) {pr_err("Failed to create sysfs file\n");class_destroy(my_class);return result;}return 0;
}

这段代码是一个函数,用于在sysfs文件系统中创建一个名为"sensor"的设备,并添加一个名为"dev_attr_my_attr"的属性文件。

函数的实现逻辑如下:

  1. 创建一个名为"my"的设备类(class)对象,使用class_create()函数进行创建。

  2. 使用device_create()函数基于"my_class"类创建一个名为"sensor"的设备(dev)。

  3. 使用device_create_file()函数为设备添加一个名为"dev_attr_my_attr"的属性文件。

4、在probe函数中调用add_sysfs_interfaces(dev);函数注册sysfs接口

static int probe(struct i2c_client *client)
{struct device *dev = &client->dev;struct device_node *node = dev->of_node;add_sysfs_interfaces(dev);
}

三、创建结果

1.查看节点:ls查看,会看到我们自己创建的节点my

 2.echo写入

echo 1 > /sys/class/my/sensor/my_attr

3.cat 查看

cat /sys/class/my/sensor/my_attr

这篇关于Linux的Sysfs 接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/434231

相关文章

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提