Linux内核驱动接口(kset,kobj)

struct kobject *power_kobj;

static struct attribute * g[] = {
    &state_attr.attr,
#ifdef CONFIG_PM_TRACE
    &pm_trace_attr.attr,
#endif
#ifdef CONFIG_PM_SLEEP
    &pm_async_attr.attr,
#ifdef CONFIG_PM_DEBUG
    &pm_test_attr.attr,
#endif
#endif
    NULL,
};
static struct attribute_group attr_group = {
    .attrs = g,
};

上面的pm_trace需要用power_attr(pm_async);这种方式定义一下
下面是通过power_attr()定义的方式

#define power_attr(_name) \
static struct kobj_attribute _name##_attr = { \
    .attr   = {             \
        .name = __stringify(_name), \
        .mode = 0644,           \
    },                  \
    .show   = _name##_show, \
    .store  = _name##_store, \
}

static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
                 char *buf)
{
    return sprintf(buf, "%d\n", pm_async_enabled);
}

static ssize_t pm_async_store(struct kobject *kobj, struct kobj_attribute *attr,
                  const char *buf, size_t n)
{

}
sysfs_create_group(power_kobj, &attr_group);


power_kobj = kobject_create_and_add("power", NULL);
if (!power_kobj)
    return -ENOMEM;
error = sysfs_create_group(power_kobj, &attr_group);

这样之后在sys/power下面就会出现pm_async和其他的。然后用cat /sys/power/pm_async的话,就会调用
pm_async_show() ,如果往里边写的话,就会调用pm_async_store()

kobject_create_and_add(“power”, NULL);
//这表示创建sys/power目录,第二个参数NULL表示在sys目录下。

#####################################################
sysfs_create_group(power_kobj, &attr_group);
//表示在sys/power/目录下生成一系列节点,具体参考sysfs接口说明

kobject_uevent(&k->kobj, KOBJ_ADD);

待续。。。

你可能感兴趣的:(linux,kernel)