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_トレースはパワーが必要だ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
", 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ディレクトリの作成を示し、2番目のパラメータNULLはsysディレクトリの下に表示されます.
##################################################### sysfs_create_group(power_kobj, &attr_group); //sys/power/ディレクトリの下で一連のノードを生成することを示します.sysfsインタフェースの説明を参照してください.
kobject_uevent(&k->kobj, KOBJ_ADD);
続きます...