123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- Device Classes
- Introduction
- ~~~~~~~~~~~~
- A device class describes a type of device, like an audio or network
- device. The following device classes have been identified:
- <Insert List of Device Classes Here>
- Each device class defines a set of semantics and a programming interface
- that devices of that class adhere to. Device drivers are the
- implementation of that programming interface for a particular device on
- a particular bus.
- Device classes are agnostic with respect to what bus a device resides
- on.
- Programming Interface
- ~~~~~~~~~~~~~~~~~~~~~
- The device class structure looks like:
- typedef int (*devclass_add)(struct device *);
- typedef void (*devclass_remove)(struct device *);
- See the kerneldoc for the struct class.
- A typical device class definition would look like:
- struct device_class input_devclass = {
- .name = "input",
- .add_device = input_add_device,
- .remove_device = input_remove_device,
- };
- Each device class structure should be exported in a header file so it
- can be used by drivers, extensions and interfaces.
- Device classes are registered and unregistered with the core using:
- int devclass_register(struct device_class * cls);
- void devclass_unregister(struct device_class * cls);
- Devices
- ~~~~~~~
- As devices are bound to drivers, they are added to the device class
- that the driver belongs to. Before the driver model core, this would
- typically happen during the driver's probe() callback, once the device
- has been initialized. It now happens after the probe() callback
- finishes from the core.
- The device is enumerated in the class. Each time a device is added to
- the class, the class's devnum field is incremented and assigned to the
- device. The field is never decremented, so if the device is removed
- from the class and re-added, it will receive a different enumerated
- value.
- The class is allowed to create a class-specific structure for the
- device and store it in the device's class_data pointer.
- There is no list of devices in the device class. Each driver has a
- list of devices that it supports. The device class has a list of
- drivers of that particular class. To access all of the devices in the
- class, iterate over the device lists of each driver in the class.
- Device Drivers
- ~~~~~~~~~~~~~~
- Device drivers are added to device classes when they are registered
- with the core. A driver specifies the class it belongs to by setting
- the struct device_driver::devclass field.
- sysfs directory structure
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- There is a top-level sysfs directory named 'class'.
- Each class gets a directory in the class directory, along with two
- default subdirectories:
- class/
- `-- input
- |-- devices
- `-- drivers
- Drivers registered with the class get a symlink in the drivers/ directory
- that points to the driver's directory (under its bus directory):
- class/
- `-- input
- |-- devices
- `-- drivers
- `-- usb:usb_mouse -> ../../../bus/drivers/usb_mouse/
- Each device gets a symlink in the devices/ directory that points to the
- device's directory in the physical hierarchy:
- class/
- `-- input
- |-- devices
- | `-- 1 -> ../../../root/pci0/00:1f.0/usb_bus/00:1f.2-1:0/
- `-- drivers
- Exporting Attributes
- ~~~~~~~~~~~~~~~~~~~~
- struct devclass_attribute {
- struct attribute attr;
- ssize_t (*show)(struct device_class *, char * buf, size_t count, loff_t off);
- ssize_t (*store)(struct device_class *, const char * buf, size_t count, loff_t off);
- };
- Class drivers can export attributes using the DEVCLASS_ATTR macro that works
- similarly to the DEVICE_ATTR macro for devices. For example, a definition
- like this:
- static DEVCLASS_ATTR(debug,0644,show_debug,store_debug);
- is equivalent to declaring:
- static devclass_attribute devclass_attr_debug;
- The bus driver can add and remove the attribute from the class's
- sysfs directory using:
- int devclass_create_file(struct device_class *, struct devclass_attribute *);
- void devclass_remove_file(struct device_class *, struct devclass_attribute *);
- In the example above, the file will be named 'debug' in placed in the
- class's directory in sysfs.
- Interfaces
- ~~~~~~~~~~
- There may exist multiple mechanisms for accessing the same device of a
- particular class type. Device interfaces describe these mechanisms.
- When a device is added to a device class, the core attempts to add it
- to every interface that is registered with the device class.
|