JavaScript is required to for searching.
跳过导航链接
退出打印视图
编写设备驱动程序     Oracle Solaris 11.1 Information Library (简体中文)
为本文档评分
search filter icon
search icon

文档信息

前言

第 1 部分针对 Oracle Solaris 平台设计设备驱动程序

1.  Oracle Solaris 设备驱动程序概述

2.  Oracle Solaris 内核和设备树

3.  多线程

4.  属性

5.  管理事件和排队任务

6.  驱动程序自动配置

7.  设备访问:程控 I/O

8.  中断处理程序

9.  直接内存访问 (Direct Memory Access, DMA)

10.  映射设备和内核内存

11.  设备上下文管理

12.  电源管理

13.  强化 Oracle Solaris 驱动程序

14.  分层驱动程序接口 (Layered Driver Interface, LDI)

第 2 部分设计特定种类的设备驱动程序

15.  字符设备驱动程序

16.  块设备驱动程序

17.  SCSI 目标驱动程序

18.  SCSI 主机总线适配器驱动程序

19.  网络设备驱动程序

20.  USB 驱动程序

Oracle Solaris 环境中的 USB

USBA 2.0 框架

USB 客户机驱动程序

绑定客户机驱动程序

USB 设备如何显示在系统中

USB 设备和 Oracle Solaris 设备树

兼容设备名称

具有多个接口的设备

包含接口关联描述符的设备

检查设备驱动程序绑定

基本设备访问

连接客户机驱动程序之前

描述符树

注册驱动程序以获取设备访问权限

设备通信

USB 端点

缺省管道

管道状态

打开管道

关闭管道

数据传输

同步传输、异步传输和回调

请求

刷新管道

设备状态管理

热插拔 USB 设备

热插拔回调

热插入

热移除

热重新插入

电源管理

设备电源管理

系统电源管理

序列化

实用程序函数

设备配置工具

获取接口编号

管理整个设备

多配置设备

修改或获取替代设置

其他实用程序函数

检索字符串描述符

管道专用数据工具

清除 USB 条件

获取设备、接口或端点状态

获取设备的总线地址

USB 设备驱动程序样例

21.  SR-IOV 驱动程序

第 3 部分生成设备驱动程序

22.  编译、装入、打包和测试驱动程序

23.  调试、测试和调优设备驱动程序

24.  推荐的编码方法

第 4 部分附录

A.  硬件概述

B.  Oracle Solaris DDI/DKI 服务汇总

C.  使设备驱动程序支持 64 位

D.  控制台帧缓存器驱动程序

E.  pci.conf 文件

索引

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

绑定客户机驱动程序

本节讨论如何将驱动程序绑定到设备,还讨论具有单个接口的设备和具有多个接口的设备的兼容设备名称。

USB 设备如何显示在系统中

一个 USB 设备可以支持多种配置。在任何给定时间,只有一种配置处于活动状态。活动配置称为当前配置

一种配置可以具有多个接口,其间可能具有针对一个函数分组两个或更多接口的介入式接口关联。一种配置的所有接口同时处于活动状态。不同的接口可由不同的设备驱动程序操作。

接口可以使用替代设置以不同的方式在主机系统中呈现自己。对于任何给定接口只能有一种替代设置处于活动状态。

每种替代设置通过端点提供设备访问。每个端点都有特定用途。主机系统通过建立到端点的信道来与设备通信。此信道称为管道

USB 设备和 Oracle Solaris 设备树

如果 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 驱动程序为每个 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 摄像头的设备树,其中包含 videoaudioiausb_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 文件的每一行都有一个驱动程序名称,后面依次跟随一个空格和一个设备名称。使用此文件可检查现有的设备驱动程序绑定。


注 - 请不要手动编辑 /etc/driver_aliases 文件。使用 add_drv(1M) 命令可建立绑定。使用 update_drv(1M) 命令可更改绑定。