sys文件的创建,有两种方式,一种如例1自己在驱动任何需要的地方创建,是一种很灵活的方式;

还有一种(例2)是在驱动初始化的时候自动帮你创建,这种方式节省了精力,但是不如例1灵活。

##### 下面的例子都是基于linux3.10 #######


例1:

/*===============================================================
*   Copyright (C) 2015 All rights reserved.
*
*   File  :sys_1.c
*   Author:Gavin (gavinlu1015@gmail.com)
*   Date  :2015-04-22
*   Remark:基于linux3.10
*
================================================================*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/sysfs.h>

MODULE_LICENSE("GPL");

static struct kobject *sys_kobj;

/* 读sys文件,例如cat sys_test */
static size_t sys_test_show(struct kobject *kobj, struct kobj_attribute *attr,
        char *buf)
{
    return snprintf(buf, 10, "%s", "1234567890\n");
}

/* 写入sys文件,例如echo xxx sys_test*/
static size_t sys_test_store(struct kobject *kobj, struct kobj_attribute
        *attr, const char *buf, size_t count)
{
    return 0;
}

/* 定义创建sys文件的属性 */
static struct kobj_attribute sys_file_attribute =
    __ATTR(sys_test, 0775, sys_test_show, sys_test_store);

static struct attribute *sys_test_attr[] = {
    &sys_file_attribute.attr,
    NULL,
};

/* 定义一个group */
static struct attribute_group sys_file_test_group = {
     .name = "sys_file_test",
     .attrs = sys_test_attr,
};


/* /fs/sysfs/group.c */
static int __init create_sys_file_init(void)
{
    int ret;
    sys_kobj = kobject_create_and_add("sys_test_group", NULL);
    ret = sysfs_create_group(sys_kobj, &sys_file_test_group);
    if(ret) {
        printk(KERN_ERR "sysfs_create_group error\n");
        return -1;
    }
    printk(KERN_ERR "sysfs_create_group ok\n");
    sysfs_remove_group(sys_kobj, &sys_file_test_group);
    printk( KERN_ERR "sysfs_remove_group\n");

    return 0;
}

static void  __exit create_sys_file_exit(void)
{
    sysfs_remove_group(sys_kobj, &sys_file_test_group);
    printk( KERN_ERR "sysfs_remove_group\n");
}

module_init(create_sys_file_init);
module_exit(create_sys_file_exit);
MODULE_AUTHOR("gavinlu1990@gmail.com");
MODULE_DESCRIPTION("create sys file");

例2:

/*===============================================================
*   Copyright (C) 2015 All rights reserved.
*
*   File  :sys.c
*   Author:Gavin (gavinlu1990@gmail.com)
*   Date  :2015-04-22
*   Remark:基于linux3.10
*
================================================================*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/platform_device.h>

MODULE_LICENSE("GPL");

/* 读sys文件,例如cat sys_test*/
static size_t sys_test_show(struct kobject *kobj, struct kobj_attribute
        *attr, char *buf)
{
}

/* 写入sys文件,例如echo xxx > sys_test*/
static size_t sys_test_store(struct kobject *kobj, struct kobj_attribute
        *attr, char *buf, size_t count)
{
}

/* 定义创建sys文件的属性 */
static struct kobj_attribute sys_file_attribute =
    _ATTR(sys_test, 0775, sys_test_show, NULL);

static struct attribute *sys_test_attr[] = {
    &sys_file_attribute.attr,
    NULL,
};

/* 定义一个group */
static struct attribute_group sys_file_test_group = {
     .name = "sys_file_test",
     .attrs = sys_test_attr,
};

/* 可以将多个group组合在一起 */
static attribute_group *groups[] = {
     &sys_file_test_group,
     NULL,
};

/* device tree */
static struct of_device_id create_sys_dt_ids[] = {
    { .compatible = "gavin,create_sys_file_test", },
    {},
};

/* sys文件是基于此驱动初始化时而建立的 */
static struct platform_driver sys_test_driver = {
    .driver = {
        .name = "create_sys_test",
        .owner = THIS_MODULE,
        .group = groups,
        /* 根据定义的信息在device tree进行匹配 */
        .of_match_table = of_match_ptr(create_sys_dt_ids),
    },
};

static int __init create_sys_file_init(void)
{
     platform_driver_register(&create_sys_file_drv);

     return 0;
}

static void _exit create_sys_file_exit(void)
{
     platform_driver_unregister(&create_sys_file_drv);
}

module_init(create_sys_file_init);
module_exit(create_sys_file_exit);
MODULE_AUTHOR("gavinlu1990@gmail.com");
MODULE_DESCRIPTION("create sys file");


Logo

更多推荐