Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156913
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 374
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-30 10:46








分类: 嵌入式

2015-06-15 11:47:48

Linux--usb(5)usb_bus_type 中我们提到 usb_interface类型。

一个设备有两种功能 一个键盘 一个音频,两种接口,那这样肯定得要两个驱动程序,一个是键盘驱动程序,一个是音频流驱动程序。两种功能整合在一起称为一个设备。但是不同的接口需要不同的驱动,音频驱动 和键盘驱动。用interface来区分,就有了接口类型struct usb_interface。
结构体之后附带 元素说明
struct usb_interface {
/* array of alternate settings for this interface,
* stored in no particular order */
struct usb_host_interface *altsetting;  // 当前接口的可选设置

struct usb_host_interface *cur_altsetting; /* the currently  // 当前接口使用的设置
* active alternate setting */
unsigned num_altsetting; /* number of alternate settings */  // 当前接口具有的可选设置总数

/* If there is an interface association descriptor then it will list
* the associated interfaces */
struct usb_interface_assoc_descriptor *intf_assoc;

int minor; /* minor number this interface is * bound to */   // 当前接口的在主设备号为USB_MAJOR时的子设备号,minor只在USB_MAJOR起作用时起
作用。 usb设备没有与其它任何子系统关联,就需要在对应驱动的probe函数里使用usb_register_dev函数来注册并获得主设备号USB_MAJOR如果usb设备关联了其它子系统,则需要在对应驱动的probe函数里使用相应的注册函数,USB_MAJOR也就该干吗干吗去,用不着它了。比如,usb键盘关联了input子系统,驱动对应drivers/hid/usbhid目录下的usbkbd.c文件,在它的probe函数里可以看到使用了input_register_device来注册一个输入设备。

enum usb_interface_condition condition; /* state of binding */ // 当前接口 所处的连接绑定阶段
unsigned sysfs_files_created:1; /* the sysfs attributes exist */
unsigned ep_devs_created:1; /* endpoint "devices" exist */
unsigned unregistering:1; /* unregistration is in progress */
unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */
unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */
unsigned needs_binding:1; /* needs delayed unbind/rebind */
unsigned resetting_device:1; /* true: bandwidth alloc after reset */

struct device dev; /* interface specific device info */ // linux设备模型里的device嵌在这儿的对象
struct device *usb_dev;  // 当接口使用USB_MAJOR作为主设备号时,usb_dev才会用到, usb_register_dev和usb_deregister_dev使用这个结构体,usb_dev指向的
                                   就是usb_register_dev函数里创建的usb class device。

atomic_t pm_usage_cnt; /* usage counter for autosuspend */
struct work_struct reset_ws; /* for resets in atomic context */
 * struct usb_interface - what usb device drivers talk to
 * @altsetting: 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.
 * @cur_altsetting: the current altsetting.
 * @num_altsetting: number of altsettings defined.
 * @intf_assoc: interface association descriptor
 * @minor: 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().
 * @condition: binding state of the interface: not bound, binding
 * (in probe()), bound to a driver, or unbinding (in disconnect())
 * @sysfs_files_created: sysfs attributes exist
 * @ep_devs_created: endpoint child pseudo-devices exist
 * @unregistering: flag set when the interface is being unregistered
 * @needs_remote_wakeup: flag set when the driver requires remote-wakeup
 * capability during autosuspend.
 * @needs_altsetting0: flag set when a set-interface request for altsetting 0
 * has been deferred.
 * @needs_binding: flag set when the driver should be re-probed or unbound
 * following a reset or suspend operation it doesn't support.
 * @dev: driver model's view of this device
 * @usb_dev: if an interface is bound to the USB major, this will point
 * to the sysfs representation for that device.
 * @pm_usage_cnt: PM usage counter for this interface
 * @reset_ws: Used for scheduling resets from atomic context.
 * @resetting_device: USB core reset the device, so use alt setting 0 as
 * current; needs bandwidth alloc after reset.
 * 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 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.

阅读(3184) | 评论(0) | 转发(0) |