Device Classes

设备类描述一种类型的设备,如音频或网络设备。已标识以下设备类:每个设备类定义一组语义和编程接口,该类的设备都遵循这些接口。设备驱动程序是特定总线上特定设备的该编程接口的实现。

Programming Interface

  1. typedef int (*devclass_add)(struct device *);
  2. typedef void (*devclass_remove)(struct device *);

一个典型设备的定义

  1. struct device_class input_devclass = {
  2. .name = "input",
  3. .add_device = input_add_device,
  4. .remove_device = input_remove_device,
  5. };

注册

  1. int devclass_register(struct device_class * cls);
  2. void devclass_unregister(struct device_class * cls);

Devices

当设备绑定到驱动程序时,它们将添加到该驱动程序所属的设备类中。在驱动程序模型核心之前,一旦设备初始化,这通常会在驱动程序的probe()回调期间发生。现在,它是从核心完成probe()回调之后发生的。
该设备在该类中枚举。每次将设备添加到类中时,该类的devnum字段都会递增并分配给该设备。该字段永远不会减少,因此,如果将设备从类中删除并重新添加,它将收到不同的枚举值。
允许该类为设备创建特定于类的结构,并将其存储在设备的class_data指针中。设备类中没有设备列表。每个驱动程序都有其支持的设备列表。设备类别具有该特定类别的驱动程序的列表。要访问该类中的所有设备,请遍历该类中每个驱动程序的设备列表。

Device Drivers

设备驱动注册到内核当中的时候,他们将会被添加到设备类中。驱动程序通过设置结构device_driver::devclass 字段来指定它所属的类。

sysfs directory structure

在sfsfs文件夹下,有一个classs文件夹

  1. [root@imx6ull:/sys/class]# ls
  2. ata_device firmware mem rc thermal
  3. ata_link gpio misc regulator tty

在该类中注册的驱动程序在drivers /目录中获得一个指向该驱动程序目录(在其总线目录下)的符号链接:

  1. class/
  2. `-- input
  3. |-- devices
  4. `-- drivers
  5. `-- usb:usb_mouse -> ../../../bus/drivers/usb_mouse/

每个设备在devices /目录中都有一个符号链接,该链接指向物理层次结构中的设备目录:

  1. class/
  2. `-- input
  3. |-- devices
  4. | `-- 1 -> ../../../root/pci0/00:1f.0/usb_bus/00:1f.2-1:0/
  5. `-- drivers