12.6 基于 sysfs (sys文件系统)的设备驱动
一些设备驱动以 sysfs 结点的形式存在,其本身没有对应的/dev 结点;一些设备驱动虽然有对应的/dev 结点,也依赖于sysfs 结点进行一些工作。
Linux 专门提供了一种类型的设备驱动,以结构体sysdev_driver 进行描述,该结构体的定义如代码清单12.22 所示。
代码清单 12.22 sysdev_driver
2.6内核
include/linux/sysdev.h
struct sysdev_driver {
struct list_head entry;
int (*add)(struct sys_device *);
int (*remove)(struct sys_device *);
int (*shutdown)(struct sys_device *);
int (*suspend)(struct sys_device *, pm_message_t state);
int (*resume)(struct sys_device *);
};
注册和注销此类驱动的API 为:
int sysdev_driver_register(struct sysdev_class *, struct sysdev_driver *);
void sysdev_driver_unregister(struct sysdev_class *, struct sysdev_driver *);
而此类驱动中通常会通过如下两个API 来创建和移除sysfs 的结点:
int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);
void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *);
drivers/base/sys.c
int sysdev_create_file(struct sys_device * s, struct sysdev_attribute * a)
{
return sysfs_create_file(&s->kobj, &a->attr);
}
void sysdev_remove_file(struct sys_device * s, struct sysdev_attribute * a)
{