Linux内核中的 struct class 简介

42 篇文章 2 订阅
【问题回溯】
    在分析 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。


  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值