sysfs参考代码

简介: #include #include #include static ssize_t sysfs_read(struct kobject *kobj, struct kobj_attribute *attr, char *buf){ return sprintf(buf, "%s\...
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kobject.h>

static ssize_t sysfs_read(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
    return sprintf(buf, "%s\n", "sysfs test read,created by vincent");
}

static ssize_t sysfs_write(struct kobject *kobj, struct kobj_attribute *attr, const char *buf,ssize_t  count)
{
    printk("\nfrom user,length=0x%X,content=%s\n",count,buf);
    
    if(count)
        return count;
    else
        return 1 ;
}

//static struct kobj_attribute my_sysfs_read = __ATTR(read, S_IRUGO, sysfs_read, NULL);
//static struct kobj_attribute my_sysfs_write = __ATTR(write, S_IWUGO, NULL,sysfs_write);
static struct kobj_attribute my_sysfs_read = __ATTR(aaa, 0664, sysfs_read, NULL);
static struct kobj_attribute my_sysfs_write = __ATTR(bbb, 0664, NULL,sysfs_write);

static struct attribute *my_sysfs_test[] = {
    &my_sysfs_read.attr,
    &my_sysfs_write.attr,
    NULL,
};

static struct attribute_group my_attr_group = {
    .attrs = my_sysfs_test,
};

static int sysfs_status = 0 ;

struct kobject *soc_kobj = NULL;

int my_sysfs_init(void)
{
    int ret = 0;

    printk("my_sysfs_init: %s\n",__func__);

    soc_kobj = kobject_create_and_add("my_sysfs", NULL);
    if (!soc_kobj)
        goto err_board_obj;

    ret = sysfs_create_group(soc_kobj, &my_attr_group);
    if (ret)
        goto err_soc_sysfs_create;
    
    sysfs_status = 1;
    /* init func must contain a return vaule,otherwise meet warning when insmod this module */
    return 0;

    sysfs_status = 0;
    
err_soc_sysfs_create:
    kobject_put(soc_kobj);
    sysfs_remove_group(soc_kobj, &my_attr_group);
    printk("\n sysfs_create_group ERROR : %s\n",__func__);
    return 0;
    
err_board_obj:
    printk("\n object_create_and_add ERROR : %s\n",__func__);
    return 0;
}

void my_sysfs_exit(void)
{
    printk("\n my_sysfs_exit : %s\n",__func__);

    if(sysfs_status == 1)
    {
        sysfs_status = 0;
        kobject_put(soc_kobj);
        sysfs_remove_group(soc_kobj, &my_attr_group);
    }
}

MODULE_AUTHOR("derek yi");
MODULE_LICENSE("Dual BSD/GPL");

module_init(my_sysfs_init);
module_exit(my_sysfs_exit);

 

目录
相关文章
|
7月前
|
C#
C# Dev chartControl的用法
C# Dev chartControl的用法
|
7月前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
272 0
|
Linux C语言
Linux驱动 | debugfs接口创建
Linux驱动 | debugfs接口创建
|
Linux C语言
Linux驱动 | 在驱动中创建sysfs接口
Linux驱动 | 在驱动中创建sysfs接口
|
Linux
通过sysfs文件系统接口来改变内核模块中的变量值(一)--通过fasync实现
通过sysfs文件系统接口来改变内核模块中的变量值(一)--通过fasync实现
100 0
|
NoSQL Linux 开发工具
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(二)
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析
218 0
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(二)
|
Linux
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(一)
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析
221 0
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(一)
|
Linux
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(三)
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析
348 0
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(三)
|
Java Linux API
内核笔记](九)——sysfs相关API
内核笔记](九)——sysfs相关API
194 0
内核笔记](九)——sysfs相关API
|
机器学习/深度学习 Linux
linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】
转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等。 用户空间函数原型:int ioctl(int fd,unsinged long cmd,...)   fd-文件描述符 cmd-对设备的发出的控制命令 ...表示这是一个可选的参数,存在与否依赖于cmd,如cmd为修改波特率,那么....就表示波特率的值。
1356 0