Linux内核中的 struct class 简介
【问题回溯】 在分析 LED 控制的代码时,发现 Led-class.c 文件的首部出现了这样一句声明: static struct class *leds_class; 这里出现了 class 这种在 C++中被广泛运用的概念。【释疑解惑】 代码中出现的 class 指的是 设备类(device classes),是对于设备的高级抽象。但实际上
·
【问题回溯】
在分析 LED 控制的代码时,发现 Led-class.c 文件的首部出现了这样一句声明:
static struct class *leds_class;
这里出现了 class 这种在 C++中被广泛运用的概念。
【释疑解惑】
代码中出现的 class 指的是 设备类(device classes),是对于设备的高级抽象。但 实际上 class 也是一个结构体,只不过 class 结构体在声明时是按照类的思想来组织其成员的。
运用 class,可以让用户空间的程序根据自己要处理的事情来调用设备,而不是根据设备被接入到系统的方式或设备的工作原理来调用。
class 结构体的原型和相关描述可以在 linux-4.3/include/linux/device.h 中找到,内容如下:
一旦创建了类,再调用 device_create() 函数在 /dev 目录下创建相应的设备节点。
相关的源码可以在 Led-class.c 文件中的 static int __init leds_init(void) 函数中看到,如下:
在分析 LED 控制的代码时,发现 Led-class.c 文件的首部出现了这样一句声明:
static struct class *leds_class;
这里出现了 class 这种在 C++中被广泛运用的概念。
【释疑解惑】
代码中出现的 class 指的是 设备类(device classes),是对于设备的高级抽象。但 实际上 class 也是一个结构体,只不过 class 结构体在声明时是按照类的思想来组织其成员的。
运用 class,可以让用户空间的程序根据自己要处理的事情来调用设备,而不是根据设备被接入到系统的方式或设备的工作原理来调用。
class 结构体的原型和相关描述可以在 linux-4.3/include/linux/device.h 中找到,内容如下:
struct class {
const char *name; // 类名称
struct module *owner; // 类所属的模块,比如 usb模块、led模块等
struct class_attribute *class_attrs; // 类所添加的属性
const struct attribute_group **dev_groups; // 类所包含的设备所添加的属性
struct kobject *dev_kobj; // 用于标识 类所包含的设备属于块设备还是字符设备
int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env); // 用于在设备发出 uevent 消息时添加环境变量
char *(*devnode)(struct device *dev, umode_t *mode); // 设备节点的相对路径名
void (*class_release)(struct class *class); // 类被释放时调用的函数
void (*dev_release)(struct device *dev); // 设备被释放时调用的函数
int (*suspend)(struct device *dev, pm_message_t state); // 设备休眠时调用的函数
int (*resume)(struct device *dev); // 设备被唤醒时调用的函数
const struct kobj_ns_type_operations *ns_type;
const void *(*namespace)(struct device *dev);
const struct dev_pm_ops *pm; // 用于电源管理的函数
struct subsys_private *p; // 指向 class_private 结构的指针
};
一个 struct class 结构体类型变量对应一个类,内核提供了class_create() 函数,可以用它来创建一个类,这个类存放于 sysfs 下面。
一旦创建了类,再调用 device_create() 函数在 /dev 目录下创建相应的设备节点。
相关的源码可以在 Led-class.c 文件中的 static int __init leds_init(void) 函数中看到,如下:
static int __init leds_init(void)
{
leds_class = class_create(THIS_MODULE, "leds"); // 创建 leds_class 类
if (IS_ERR(leds_class))
return PTR_ERR(leds_class);
leds_class->suspend = led_suspend; // 关联 LED设备休眠函数
leds_class->resume = led_resume; // 关联 LED设备唤醒函数
leds_class->dev_attrs = led_class_attrs; // 创建设备属性文件 brightness、max_brightness、trigger
return 0;
}
于是在我们的工程中,便可以在 /sys/devices/platform/leds-gpio/ 目录下找到 leds_class 类所对应的文件夹 leds/ 了。
进入 led/ 目录,在其子目录 2g/ 下可以找到设备属性文件 brightness、max_brightness、trigger。
更多推荐
已为社区贡献2条内容
所有评论(0)