struct usb_interface — what usb device drivers talk to
struct usb_interface { struct usb_host_interface * altsetting; struct usb_host_interface * cur_altsetting; unsigned num_altsetting; int minor; enum usb_interface_condition condition; struct device dev; struct class_device * class_dev; };
array of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order.
the current altsetting.
number of altsettings defined.
the minor number assigned to this interface, if this
interface is bound to a driver that uses the USB major number.
If this interface does not use the USB major, this field should
be unused. The driver should set this value in the probe
function of the driver, after it has been assigned a minor
number from the USB core by calling usb_register_dev
.
binding state of the interface: not bound, binding
(in probe
), bound to a driver, or unbinding (in disconnect
)
driver model's view of this device
driver model's class view of this device.
USB device drivers attach to interfaces on a physical device. Each interface encapsulates a single high level function, such as feeding an audio stream to a speaker or reporting a change in a volume control. Many USB devices only have one interface. The protocol used to talk to an interface's endpoints can be defined in a usb “class” specification, or by a product's vendor. The (default) control endpoint is part of every interface, but is never listed among the interface's descriptors.
The driver that is bound to the interface can use standard driver model
calls such as dev_get_drvdata
on the dev member of this structure.
Each interface may have alternate settings. The initial configuration
of a device sets altsetting 0, but the device driver can change
that setting using usb_set_interface
. Alternate settings are often
used to control the the use of periodic endpoints, such as by having
different endpoints use different amounts of reserved USB bandwidth.
All standards-conformant USB devices that use isochronous endpoints
will use them in non-default settings.
The USB specification says that alternate setting numbers must run from
0 to one less than the total number of alternate settings. But some
devices manage to mess this up, and the structures aren't necessarily
stored in numerical order anyhow. Use usb_altnum_to_altsetting
to
look up an alternate setting in the altsetting array based on its number.