USBLIBDD 传递驱动程序
用途
支持通过使用 利布萨 API 来编写的应用程序驱动程序。
语法
#include <usbdi.h>
#include <usb.h> 描述
libusb passthru 驱动程序是用户级别的应用程序驱动程序与 USB 协议驱动程序 (USBD) 之间的层。 /dev/usblibdevX 特殊文件提供 libusb 应用程序的接口,以通过 passthru 驱动程序直接与设备通信。 passthru 驱动程序将 libusb API 转换为 USBD 函数向量,这些向量与相应的通用串行总线 (USB) 主机控制器 (例如,开放式主机控制器接口 (OHCI) ,增强型主机控制器接口 (EHCI) 或 eXtensible 主机控制器接口 (xHCI) 进行交互。
libusb 设备是在 /dev 文件系统中创建的,而不考虑是否存在内置 AIX® 客户机 USB 驱动程序。 此设备的父代是由 /usr/lib/methods/cfgusb 文件枚举的 usb0 和 libusb 设备。
/usr/lib/drivers/usb/usblibdd 驱动程序实现 libusb passthru 驱动程序。 passthru 驱动程序使用 /usr/lib/methods/cfgusblibke 配置方法。 这些设备具有两个称为 usbdevice 和 speed的对象数据管理器 (ODM) 属性。 如果设备属于标准类 (例如, Mass Storage , Tape , human interface device (HID)) ,那么这些设备由 AIX 操作系统的内置 USB 客户机驱动程序声明。 在这种情况下,会将 利布萨 设备创建为伪设备。 使用设备 属性用于标识与伪设备关联的客户机驱动程序的设备。 如果某个设备属于其他类,并且客户机驱动程序未与该设备关联,那么 使用设备 属性无效。
# lsattr -El usblibdev0
speed highspeed USB Protocol Speed of Device False
usbdevice usbms0 Actual USB Device with Client Driver False 在此示例中,连接的 USB 设备是一个闪存驱动器,它具有内置 /usr/lib/drivers/usb/usbcd Mass Storage Class 客户机驱动程序的 AIX 操作系统。 与 usblibdev0 设备关联的客户机驱动程序的设备是 usbms0。
缺省情况下,此设备由内置的客户机驱动程序声明。 利布萨 通路 驱动程序也会声明相同的设备。 因此,对于一个物理 USB 设备,在您运行父设备 (即 USBD 协议驱动程序) 的配置方法后,您有两个操作系统设备 (usbms0 和 usblibdev0) 位于 /dev 文件系统中。
# lsdev -C | grep usb
将显示类似于以下示例的输出:
usb0 Available USB System Software
usbhc0 Available 00-00 PCIe2 USB 3.0 xHCI 4-Port Adapter (4c10418214109e04)
usblibdev0 Available USB Library Interface Device
usbms0 Available 0.3 USB Mass Storage# lsdev -C | grep usb
将显示类似于以下示例的输出:
usb0 Available USB System Software
usbhc0 Available 00-00 PCIe2 USB 3.0 xHCI 4-Port Adapter (4c10418214109e04)
usblibdev1 Available 0.4 USB Library Interface Device在此示例中, usblibdev1 设备是 利布萨 驱动程序的加密设备。与设备相关的子例程
- 打开
- 关闭
- ioctl
打开和关闭子例程
open 和 close 子例程在 usblibdevX 设备上不受直接支持。 您可以使用 利布萨 API 来 开 和 关闭 子例程。
ioctl 子例程
利布萨 驱动程序将 ioctl 子例程公开给 利布萨 用户环境。 操作系统后端的 利布萨 实现将使用这些 ioctl 子例程。 ioctl 子例程作为应用程序与协议驱动程序之间的传递。
libusb 驱动程序支持以下 USBD ioctl 操作:
| 操作 | 描述 |
|---|---|
| USBLIB_PIPE_IO | 通过 艾赫西皮埃奥 结构在所需端点上发出 I/O。 |
| usblib_halt_clear | 发出用于停止端点的请求。 |
| usblib_getirp_status | 读取已发出的 I/O 请求信息包 (IRP) 的状态。 |
| usblib_set_configuration | 在设备上发出集合配置。 |
| usblib_claim_interface | 确保该接口正由 libusb passthru 驱动程序使用。 |
| usblib_release_interface | 将接口设置为备用设置值零。 |
| usblib_set_alt_intfc | 在接口上设置备用设置。 |
| usblib_reset_device | 在设备上复位。 |
| usblib_abort_io | 中止或取消已提交的 I/O。 |
| usblib_get_config_desc | 发出读取整个配置描述符的请求。 如果设备具有 X 个配置,那么将读取 X 个总配置描述符并将其存储在单个缓冲区中。 |
USBD 错误条件
适配器设备驱动程序的可能 错误号 值如下所示:
| 值 | 描述 |
|---|---|
| EAGAIN | 指示已重试此操作。 |
| EEXIST | 设备已配置完毕。 |
| EINVAL | 参数无效,或者设备未打开。 |
| EIO |
|
| ENOCONNECT | 发生 USB 总线故障。 |
| ENODEV | 无法选择目标设备或目标设备未响应。 |
| ENOMEM | 由于内存不足,无法完成该命令。 |
| ENXIO | 此适配器不支持所请求的 ioctl 操作。 |
| EPERM | 调用者不具有必需的权限。 |
无响应 USB 设备
libusb 应用程序关联的 USB 设备可能未在非控制端点上响应。 此情况可能是由于 AIX USB 协议驱动程序在打开 USB 设备时发送 CLEAR_FEATURE 请求的缺省行为。CLEAR_FEATURE 请求是用于除去设备上的 halt 条件的标准 USB 命令。PdAtclass object(类对象)- 预定义属性 (
PdAt) 对象类包含每个 USB 设备的每个现有属性的条目。 这包括诸如中断级别,总线 I/O 地址范围,波特率,奇偶性设置,块大小和微码文件名之类的信息。 要初始化PdAt类对象,请设置以下值:uniquetype = "generic/usbif/usblibke" attribute = "<vendorid>_<productid>" deflt = "toggle_no" values = "toggle_yes,toggle_no" width = "" type = "R" generic = "U" rep = "sl" nls_index = 0 - VendorId
- USB 设备的供应商标识,可从 USB 设备的描述符数据中获取。
VendorID必须是十六进制数字。 - ProductID
- USB 设备的产品标识,可从 USB 设备的描述符数据中获取。
ProductID必须是十六进制数字。 - 切换_否
- 指示在管道初始化期间未将
CLEAR_FEATURE请求发送到设备。 - 切换_是
- 指示 USB 设备发送
CLEAR_FEATURE请求的缺省行为。
PdAt:
uniquetype = "generic/usbif/usblibke"
attribute = "0951_1656"
deflt = "toggle_no"
values = "toggle_yes,toggle_no"
width = ""
type = "R"
generic = "U"
rep = "sl"
nls_index = 0要向 PdAt 对象类添加预定义属性,请完成以下步骤:
- 运行以下命令以从 ODM 条目中除去无响应 USB 设备。
该输出可能与以下示例类似:rmdev -Rl usb0usbms0 Defined usblibdev0 Defined usblibdev1 Defined usb0 Defined - 使用任何标准文件编辑命令 (例如
vi) 将odm PdAt条目添加到文件中。 - 运行以下命令。
不显示该输出。odmadd entry - 运行以下命令。
不显示该输出。cfgmgr -l usb0 - 运行
libusb应用程序。 以下示例显示了 USB 应用程序的执行情况。# ./xusb -k XXXX:YYYY Opening device XXXX:YYYY... found /dev/usbhc0 found 1 devices found /dev/usbhc1 found 0 devices found /dev/usbhc2 found 1 devices Reading device descriptor: length: 18 device class: 0 S/N: 0 VID:PID: XXXX:YYYY bcdDevice: 0303 iMan:iProd:iSer: 1:2:0 nb confs: 1 Reading BOS descriptor: no descriptor Reading first configuration descriptor: nb interfaces: 1 interface[0]: id = 0 interface[0].altsetting[0]: num endpoints = 1 Class.SubClass.Protocol: 03.00.00 endpoint[0].address: 81 max packet size: 0008 polling interval: 0A Claiming interface 0... in aix_claim_interface Reading string descriptors: String (0x01): "DeviceName" String (0x02): "Elitename" Releasing interface 0... Closing device... - 运行以下命令以删除无响应 USB 设备的
PdAt条目:
该输出可能与以下示例类似:odmdelete -o PdAt -q 'attribute=0951_1656 and uniquetype="generic/usbif/usblibke"'0518-307 odmdelete: 1 object deleted