linux驱动—在自己的总线目录下创建属性文件

在总线目录下创建属性文件以扩展其功能。 通过创建属性文件, 我们可以为总线添加额外的信息和控制选项, 以便与设备和驱动进行交互。 简单就是,属性文件,可以完成用户空间和内核空间的数据交互, 比如在应用层快速修改gpio引脚的电平。

介绍一下API

bus_create_file() 函数用于在总线的 sysfs 目录下创建一个属性文件。

参数说明:​

bus: 指向总线类型结构体 struct bus_type 的指针, 表示要在这个目录下创建属性文件的 总线。​

attr:指向属性 struct bus_attribute的指针, 表示要创建的属性文件的属性。

函数原型:

int bus_create_file(struct bus_type *bus,struct bus_attribute *attr);

在调用 bus_create_file()函数之前, 需要先定义好属性结构体 struct bus_attribute *attr, 并将其相关字段填充好。 通常, 属性结构体会包含以下字段:

第一个字段,attr

复制代码
static ssize_t my_show (struct bus_type *bus, char *buf)
{
    // 在 sysfs 中显示总线的值​
    return sprintf(buf, "%s\n", "mybus_show");
}

static ssize_t my_store(struct bus_type *bus, const char *buf, size_t count)
{
    // 在 sysfs 中显示总线的值​
    return sprintf(buf, "%s\n", "mybus_show");
}

struct bus_attribute mybus_attr = {
    /*属性文件的名字和操作权限*/
    .attr = {
        .name = "value",
        .mode = 0664,
    },
    .show = my_show,
    .store= my_store,

};

代码编写

复制代码
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/configfs.h>
#include <linux/kernel.h>
#include <linux/kobject.h>
#include <linux/device.h>
#include <linux/sysfs.h>


int mybus_match(struct device *dev, struct device_driver *drv)
{
    // 检查设备名称和驱动程序名称是否匹配
    return (strcmp(dev_name(dev), drv->name) == 0);
}

int mybus_probe(struct device *dev)
{
    struct device_driver *drv = dev->driver;
    if(drv->probe)
    {
        drv->probe(dev);
    }
    return 0;
}

static ssize_t my_show (struct bus_type *bus, char *buf)
{
    // 在 sysfs 中显示总线的值​
    return sprintf(buf, "%s\n", "mybus_show");
}

static ssize_t my_store(struct bus_type *bus, const char *buf, size_t count)
{
    // 在 sysfs 中显示总线的值​
    return sprintf(buf, "%s\n", "mybus_show");
}

struct bus_attribute mybus_attr = {
    /*属性文件的名字和操作权限*/
    .attr = {
        .name = "value",
        .mode = 0664,
    },
    .show = my_show,
    .store= my_store,

};

struct bus_type mybus ={
    .name  = "mabus",        // 总线的名称
    .match =  mybus_match,   // 设备和驱动程序匹配的回调函数
    .probe =  mybus_probe,   //设备探测的回调函数
}

EXPORT_SYMBOL_GPL(mybus);             // 导出总线符号

static int bus_attr_init (void)
{
    int ret;
    ret = bus_register(&mybus);      // 注册总线
    buf_create_file(&mybus, &mybus_attr);
    return 0;
}

static void bus_attr_exit (void)
{
    bus_remove_file(&mybus, &mybus_attr);  // 从 sysfs 中移除属性文件​
    bus_unregister(&mybus);                // 取消注册总线
}


/* 加载和卸载*/
module_init(bus_attr_init);
module_eixt(bus_attr_exit );
MODULE_LICENSE("GPL");
MODULE_AUTHOR("xiaoyang");

看现象

相关推荐
小韩博36 分钟前
Windows 权限提升(一)
windows
To_再飞行43 分钟前
K8s 调度管理
linux·云原生·kubernetes
2302_799525741 小时前
【Hadoop】Hadoop集群安装中出现的问题
linux·hadoop
刘一说1 小时前
Linux调试命令速查:Java/微服务必备
java·linux·微服务
枫の准大一1 小时前
【Linux游记】基础指令篇
linux
ypf52081 小时前
OrbStack 配置国内镜像加速
linux
Hello.Reader2 小时前
一文通关 Proto3完整语法与工程实践
java·linux·数据库·proto3
Hello.Reader2 小时前
一文吃透 Protobuf “Editions” 模式从概念、语法到迁移与实战
linux·服务器·网络·protobuf·editions
陌上花开缓缓归以2 小时前
linux ubi文件系统
linux
口嗨农民工2 小时前
exiftool 分析jpeg图片使用
linux