第 1 部分针对 Oracle Solaris 平台设计设备驱动程序
9. 直接内存访问 (Direct Memory Access, DMA)
14. 分层驱动程序接口 (Layered Driver Interface, LDI)
本节讨论如何将驱动程序绑定到设备,还讨论具有单个接口的设备和具有多个接口的设备的兼容设备名称。
一个 USB 设备可以支持多种配置。在任何给定时间,只有一种配置处于活动状态。活动配置称为当前配置。
一种配置可以具有多个接口,其间可能具有针对一个函数分组两个或更多接口的介入式接口关联。一种配置的所有接口同时处于活动状态。不同的接口可由不同的设备驱动程序操作。
接口可以使用替代设置以不同的方式在主机系统中呈现自己。对于任何给定接口只能有一种替代设置处于活动状态。
每种替代设置通过端点提供设备访问。每个端点都有特定用途。主机系统通过建立到端点的信道来与设备通信。此信道称为管道。
如果 USB 设备具有一种配置、一个接口,没有设备类,则可将该设备表示为单个设备节点。如果 USB 设备具有多个接口,则可将该设备表示为分层设备结构。在分层设备结构中,每个接口的设备节点是顶层设备节点的子节点。例如,音频设备即是具有多个接口的设备,该设备向主机同时呈现为音频控制和音频流两种接口。音频控制接口和音频流接口可以分别由各自的驱动程序控制。
Oracle Solaris 软件基于每个设备中存储的标识信息为 USB 绑定生成有序的兼容设备名称列表。此信息包括设备类、子类、供应商 ID、产品 ID、修订版和协议。有关 USB 类和子类的列表,请参见 http://www.usb.org/home。
采用此名称分层结构,可以在没有特定于设备的驱动程序时,绑定到相对较常用的驱动程序。特定于类的驱动程序即是常规驱动程序。以 usbif 开头的设备名称指定单个接口的设备。有关示例,请参见示例 20-1。USBA 2.0 框架定义设备的所有兼容名称。使用 prtconf 命令可显示这些设备名称,如示例 20-2 中所示。
以下示例显示了 USB 鼠标设备的兼容设备名称。此鼠标设备表示完全由单个驱动程序操作的组合节点。USBA 2.0 框架为此设备节点指定了示例中所示的名称(按所示顺序)。
示例 20-1 USB 鼠标的兼容设备名称
1. 'usb430,100.102' Vendor 430, product 100, revision 102 2. 'usb430,100' Vendor 430, product 100 3. 'usbif430,class3.1.2' Vendor 430, class 3, subclass 1, protocol 2 4. 'usbif430,class3.1' Vendor 430, class 3, subclass 1 5. 'usbif430,class3' Vendor 430, class 3 6. 'usbif,class3.1.2' Class 3, subclass 1, protocol 2 7. 'usbif,class3.1' Class 3, subclass 1 8. 'usbif,class3' Class 3
请注意,上面示例中的名称按从最具体到最常规的顺序进行排列。第 1 项仅绑定到特定供应商的特定产品的特定修订版。第 3、4 和 5 项用于由供应商 430 生产的类 3 设备。第 6、7 和 8 项用于任何供应商生产的类 3 设备。绑定过程将按从上到下的顺序查找名称匹配项。要进行绑定,必须将驱动程序添加到其别名与上述其中一个名称匹配的系统。要获取在添加驱动程序时要绑定到的兼容设备名称的列表,请在 prtconf -vp 命令的输出中检查设备的 compatible 属性。
以下示例显示了键盘和鼠标的兼容属性列表。使用 prtconf -D 命令可显示绑定的驱动程序。
示例 20-2 列显配置命令显示的兼容设备名称
# prtconf -vD | grep compatible compatible: 'usb430,5.200' + 'usb430,5' + 'usbif430,class3.1.1' + 'usbif430,class3.1' + 'usbif430,class3' + 'usbif,class3.1.1' + 'usbif,class3.1' + 'usbif,class3' compatible: 'usb2222,2071.200' + 'usb2222,2071' + 'usbif2222,class3.1.2' + 'usbif2222,class3.1' + 'usbif2222,class3' + 'usbif,class3.1.2' + 'usbif,class3.1' + 'usbif,class3'
使用最具体的名称可以更准确地确定一个设备或一组设备的驱动程序。要绑定为特定产品的特定修订版编写的驱动程序,请尽可能使用最具体的名称匹配项。例如,如果您有由供应商 430 为其产品 100 的修订版 102 编写的 USB 鼠标驱动程序,则可以使用以下命令将该驱动程序添加到系统中:
add_drv -n -i '"usb430,100.102"' specific_mouse_driver
要添加为供应商 430 的任何 USB 鼠标(类 3、子类 1、协议 2)编写的驱动程序,请使用以下命令:
add_drv -n -i '"usbif430,class3.1.2"' more_generic_mouse_driver
如果安装这两个驱动程序并连接兼容设备,则系统会将正确的驱动程序绑定到所连接的设备。例如,如果安装这两个驱动程序,并连接供应商 430、型号 100、修订版 102 的设备,则此设备将绑定到 specific_mouse_driver。如果连接供应商 430、型号 98 的设备,则此设备将绑定到 more_generic_mouse_driver 。如果连接其他供应商的鼠标,则此设备也将绑定到 more_generic_mouse_driver。如果有多个驱动程序可供特定设备使用,则驱动程序绑定框架将选择与兼容名称列表中第一个兼容名称匹配的驱动程序。
复合设备是支持多个接口的设备。复合设备的每个接口都有一个兼容名称列表。此兼容名称列表可确保将最有效的驱动程序绑定到该接口。最常规的多接口项是 usb,device。
对于 USB 音频复合设备,兼容名称如下:
1. 'usb471,101.100' Vendor 471, product 101, revision 100 2. 'usb471,101' Vendor 471, product 101 3. 'usb,device' Generic USB device
名称 usb,device 是可表示任何整个 USB 设备的兼容名称。如果没有其他驱动程序请求该整个设备,则 usb_mid(7D) 驱动程序(USB 多接口驱动程序)将绑定到 usb,device 设备节点。usb_mid 驱动程序为物理设备的每个接口创建一个子设备节点。usb_mid 驱动程序还为每个接口生成一组兼容名称。生成的所有这些兼容名称都以 usbif 开头。系统将使用生成的这些兼容名称为每一个接口查找最佳的驱动程序。通过这种方法,可以将一个物理设备的不同接口绑定到不同的驱动程序。
例如,usb_mid 驱动程序通过多接口音频设备的 usb,device 节点名称绑定到该音频设备。然后 usb_mid 驱动程序创建特定于接口的设备节点。这些特定于接口的设备节点中的每个节点都有各自的兼容名称列表。对于音频控制接口节点,兼容名称列表可能类似于下例中所示的列表。
示例 20-3 USB 音频兼容设备名称
1. 'usbif471,101.100.config1.0' Vend 471, prod 101, rev 100, cnfg 1, iface 0 2. 'usbif471,101.config1.0' Vend 471, product 101, config 1, interface 0 3. 'usbif471,class1.1.0' Vend 471, class 1, subclass 1, protocol 0 4. 'usbif471,class1.1' Vend 471, class 1, subclass 1 5. 'usbif471,class1' Vend 471, class 1 6. 'usbif,class1.1.0' Class 1, subclass 1, protocol 0 7. 'usbif,class1.1' Class 1, subclass 1 8. 'usbif,class1' Class 1
使用以下命令可将特定于供应商、特定于设备的客户机驱动程序(名为 vendor_model_audio_usb)绑定到特定于供应商、特定于设备的配置 1、接口 0 的接口兼容名称,如示例 20-3 中所示。
add_drv -n -i '"usbif471,101.config1.0"' vendor_model_audio_usb
使用以下命令可将名为 audio_class_usb_if_driver 的类驱动程序绑定到较常规的类 1、子类 1 的接口兼容名称,如示例 20-3 中所示:
add_drv -n -i '"usbif,class1.1"' audio_class_usb_if_driver
使用 prtconf -D 命令可显示设备及其驱动程序的列表。在以下示例中,prtconf -D 命令显示 usb_mid 驱动程序管理 audio 设备。usb_mid 驱动程序将 audio 设备拆分为多个接口。每个接口在 audio 设备名称下以缩进方式列出。对于缩进列表中所示的每个接口,prtconf -D 命令显示了哪个驱动程序管理该接口。
audio, instance #0 (driver name: usb_mid) sound-control, instance #2 (driver name: usb_ac) sound, instance #2 (driver name: usb_as) input, instance #8 (driver name: hid)
如果设备包括接口关联描述符,则设备树可以在以下三个级别上进行解析:
如果没有特定于供应商或类的驱动程序可用,则 usb_mid(7D) USB 多接口驱动程序将绑定到复合设备的设备级别节点。
客户机驱动程序绑定到接口关联节点。
如果未找到任何客户机驱动程序,则缺省情况下会绑定 usb_ia(7D) USB 接口关联驱动程序。然后,客户机驱动程序可以绑定到此接口关联的接口级别。
usb_mid 驱动程序为每个 ia 创建一个 ia(接口关联)节点。兼容的 ia 节点名称通常以 usbia 开头。名称 usb,ia 是可将任何 ia 表示为兼容名称尾部的一个兼容名称。如果没有任何其他驱动程序申请此 ia,则 usb_ia 驱动程序将绑定到 ia 节点。usb_ia 驱动程序为每个接口创建一个子节点。作为 ia 节点子节点的接口节点与作为设备节点子节点的接口节点具有相同属性。
示例 20-4 USB 视频接口关联兼容名称
1. 'usbia46d,8c9.5.config1.0' vend 46d, prod 8c9, rev 5, cnfg 1, first_if_in_ia 0 2. 'usbia46d,8c9.config1.0' vend 46d, prod 8c9, cnfg 1, first_if_in_ia 0 3. 'usbia46d,classe.3.0' vend 46d, class e, subclass 3, protocol 0 4. 'usbia46d,classe.3' vend 46d, class e, subclass 3 5. 'usbia46d,classe' vend 46d, class e 6. 'usbia,classe.3.0' class e, subclass 3, protocol 0 7. 'usbia,classe.3' class e, subclass 3 8. 'usbia,classe' class e 9. 'usb,ia' by default
使用以下命令可将特定于供应商和设备的、名为 vendor_model_video_usb 的客户机驱动程序绑定到特定于供应商和设备的配置 1 的 first_if_in_ia 兼容名称,如示例 20-4 中所示:
add_drv -n -i '"usbia46d,8c9.config1.0"' vendor_model_video_usb
使用以下命令可将名为 video_class_usb_ia_driver 的类驱动程序绑定到较常规的 e 类兼容名称,如示例 20-4 中所示:
add_drv -n -i '"usbia,classee"' video_class_usb_ia_driver
在以下示例中,prtconf -D 命令显示了 Web 摄像头的设备树,其中包含 video 和 audio 的 ia。usb_mid 驱动程序管理设备并分别为 video 和 audio 创建两个 ia。视频驱动程序 usbvc 绑定到视频 ia,而音频驱动程序绑定到音频 ia 的接口。
miscellaneous, instance #28 (driver name: usb_mid) video, instance #24 (driver name: usbvc) audio, instance #30 (driver name: usb_ia) sound-control, instance #38 (driver name: usb_ac) sound, instance #47 (driver name: usb_as)
文件 /etc/driver_aliases 包含对应于系统中已存在的绑定的项。/etc/driver_aliases 文件的每一行都有一个驱动程序名称,后面依次跟随一个空格和一个设备名称。使用此文件可检查现有的设备驱动程序绑定。