include/linux/sysfs.h中对attribute和attribute_group结构体的定义:
root@msm8909:/ # cd /sys/class/input/input5
root@msm8909:/sys/class/input/input5 # ls
cali
capabilities
data
direct
enable
event4
id
modalias
name
phys
poll_delay
power
properties
subsystem
uevent
uniq
struct attribute {
const char *name;
umode_t mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
bool ignore_lockdep:1;
struct lock_class_key *key;
struct lock_class_key skey;
#endif
};
struct attribute_group {
const char *name;
umode_t (*is_visible)(struct kobject *,
struct attribute *, int);
struct attribute **attrs;
};
sysfs_create_group和sysfs_remove_group定义在fs/sysfs/group.c中,声明在include/linux/sysfs.h中,sysfs_create_group返回0代表创建成功。
int sysfs_create_group(struct kobject *kobj,
const struct attribute_group *grp)
{
return internal_create_group(kobj, 0, grp);
}
void sysfs_remove_group(struct kobject * kobj,
const struct attribute_group * grp)
{
struct sysfs_dirent *dir_sd = kobj->sd;
struct sysfs_dirent *sd;
if (grp->name) {
sd = sysfs_get_dirent(dir_sd, NULL, grp->name);
if (!sd) {
WARN(!sd, KERN_WARNING "sysfs group %p not found for "
"kobject '%s'\n", grp, kobject_name(kobj));
return;
}
} else
sd = sysfs_get(dir_sd);
remove_files(sd, kobj, grp);
if (grp->name)
sysfs_remove_subdir(sd);
sysfs_put(sd);
}
sysfs_create_group的使用:
1.定义
static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP | S_IWOTH,
kionix_accel_get_enable, kionix_accel_set_enable);
static DEVICE_ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP | S_IWOTH,
kionix_accel_get_delay, kionix_accel_set_delay);
static DEVICE_ATTR(direct, S_IRUGO | S_IWUSR | S_IWGRP | S_IWOTH,
kionix_accel_get_direct, kionix_accel_set_direct);
static DEVICE_ATTR(data, S_IRUGO, kionix_accel_get_data, NULL);
static DEVICE_ATTR(cali, S_IRUGO | S_IWUSR | S_IWGRP | S_IWOTH,
kionix_accel_get_cali, kionix_accel_set_cali);
2.创建接口
static struct attribute *kionix_accel_attributes[] = {
&dev_attr_enable.attr,
&dev_attr_poll_delay.attr,
&dev_attr_direct.attr,
&dev_attr_data.attr,
&dev_attr_cali.attr,
NULL
};
3.封装
static struct attribute_group kionix_accel_attribute_group = {
.attrs = kionix_accel_attributes,
};
4.调用
sysfs_create_group(&acceld->input_dev->dev.kobj, &kionix_accel_attribute_group);
在文件系统下面会生成相应的节点:
root@msm8909:/ # cd /sys/class/input/input5
root@msm8909:/sys/class/input/input5 # ls
cali
capabilities
data
direct
enable
event4
id
modalias
name
phys
poll_delay
power
properties
subsystem
uevent
uniq
5.删除
sysfs_remove_group(&acceld->input_dev->dev.kobj, &kionix_accel_attribute_group);