1. dev->kobj 下面创建属性
方法一:
static inline int __must_check sysfs_create_file(struct kobject *kobj, const struct attribute *attr)
方法二:
就是方法一的封装
int device_create_file(struct device *dev,
const struct device_attribute *attr)
{
int error = 0;
if (dev) {
error = sysfs_create_file(&dev->kobj, &attr->attr);
}
return error;
}
2. dev->kobj下面创建属性组
方法一:
int sysfs_create_files(struct kobject *kobj, const struct attribute **ptr)
{
int err = 0;
int i;
for (i = 0; ptr[i] && !err; i++)
err = sysfs_create_file(kobj, ptr[i]);
if (err)
while (--i >= 0)
sysfs_remove_file(kobj, ptr[i]);
return err;
}
方法二
int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp)
3.demo
static struct class *my_class = NULL;
static dev_t my_devno;
struct device *mysys_dev = NULL;
static int my_flag=0;
static ssize_t xxx_read(struct device *dev, struct device_attribute *attr, char *buf)
{
int ret = 0;
sprintf(buf, "%d\n",my_flag);
ret = strlen(buf) + 1;
printk(" %s my_flag=%d\n",__func__,ret);
return ret;
}
static ssize_t xxx_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{
my_flag = simple_strtoul(buf, NULL, 10);
return size;
}
static DEVICE_ATTR(xxx, 0664 , xxx_read, xxx_write);
static int __init mycreat_sys_attr(void)
{
if( alloc_chrdev_region(&my_devno, 0, 1,"mysys") )
{
return -EAGAIN;
}
my_class = class_create(THIS_MODULE, "mysys");
mysys_dev = device_create(my_class, NULL, my_devno, NULL, "mysys_dev");
if(NULL == mysys_dev)
{
return -EIO;
}
err = device_create_file(mysys_dev, &dev_attr_xxx);
}
module_init(mycreat_sys_attr)