歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核中的 struct class 簡介

【問題回溯】

在分析 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。

Copyright © Linux教程網 All Rights Reserved