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 文件枚举的 usb0libusb 设备。

/usr/lib/drivers/usb/usblibdd 驱动程序实现 libusb passthru 驱动程序。 passthru 驱动程序使用 /usr/lib/methods/cfgusblibke 配置方法。 这些设备具有两个称为 usbdevicespeed的对象数据管理器 (ODM) 属性。 如果设备属于标准类 (例如, Mass Storage , Tape , human interface device (HID)) ,那么这些设备由 AIX 操作系统的内置 USB 客户机驱动程序声明。 在这种情况下,会将 利布萨 设备创建为伪设备。 使用设备 属性用于标识与伪设备关联的客户机驱动程序的设备。 如果某个设备属于其他类,并且客户机驱动程序未与该设备关联,那么 使用设备 属性无效。

对于每个具有 AIX 操作系统内置客户机驱动程序的 libusb 设备,将在 ODM 中创建名为 usbdevice 的新属性,以标识与 libusb 设备相关联的客户机驱动程序设备。 以下示例显示了设备的显示方式:
# 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 协议驱动程序) 的配置方法后,您有两个操作系统设备 (usbms0usblibdev0) 位于 /dev 文件系统中。

注: 一次只有内置客户机驱动程序或 libusb passthru 驱动程序可使用此设备。 不能在两个驱动程序上同时运行操作。
使用以下命令来显示此场景中的 USB 设备:
# 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
在此示例中, USB 加密设备 (供应商定义的类) 已连接至 AIX 系统。 该设备没有内置的客户机驱动程序。 此设备仅由 利布萨 通路 驱动程序声明,并且仅显示一个设备。 另一个显示 USB 设备的示例如下:
# 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
注: 不支持 子例程和 子例程。

打开和关闭子例程

openclose 子例程在 usblibdevX 设备上不受直接支持。 您可以使用 利布萨 API 来 关闭 子例程。

ioctl 子例程

利布萨 驱动程序将 ioctl 子例程公开给 利布萨 用户环境。 操作系统后端的 利布萨 实现将使用这些 ioctl 子例程。 ioctl 子例程作为应用程序与协议驱动程序之间的传递。

libusb 驱动程序支持以下 USBD ioctl 操作:

表 1. UUSBD 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 错误条件

适配器设备驱动程序的可能 错误号 值如下所示:

表 2. USBD 错误条件
描述
EAGAIN 指示已重试此操作。
EEXIST 设备已配置完毕。
EINVAL 参数无效,或者设备未打开。
EIO
  • 由于发生错误,命令失败。
  • 设备驱动程序无法将代码置顶。
  • 内核服务失败或发生不可恢复的 I/O 错误。
ENOCONNECT 发生 USB 总线故障。
ENODEV 无法选择目标设备或目标设备未响应。
ENOMEM 由于内存不足,无法完成该命令。
ENXIO 此适配器不支持所请求的 ioctl 操作。
EPERM 调用者不具有必需的权限。

无响应 USB 设备

与 AIX 操作系统上的 libusb 应用程序关联的 USB 设备可能未在非控制端点上响应。 此情况可能是由于 AIX USB 协议驱动程序在打开 USB 设备时发送 CLEAR_FEATURE 请求的缺省行为。
注: CLEAR_FEATURE 请求是用于除去设备上的 halt 条件的标准 USB 命令。
要解决与无响应 USB 设备关联的问题,必须设置下列属性:
PdAt class 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 请求的缺省行为。
注: 必须将 ODM 条目添加到未在非控制端点上响应的每个设备。
以下是 ODM 属性示例。 此示例考虑 Kingston USB 闪存驱动器 (DataTraveler Ultimate G2)。 Kingston USB 闪存驱动器的供应商标识为 0951 ,产品标识为 1656。
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 对象类添加预定义属性,请完成以下步骤:

  1. 运行以下命令以从 ODM 条目中除去无响应 USB 设备。
    rmdev -Rl usb0
    该输出可能与以下示例类似:
    
    usbms0 Defined
    usblibdev0 Defined
    usblibdev1 Defined
    usb0 Defined
  2. 使用任何标准文件编辑命令 (例如 vi) 将 odm PdAt 条目添加到文件中。
  3. 运行以下命令。
    odmadd entry
    不显示该输出。
  4. 运行以下命令。
    cfgmgr -l usb0
    不显示该输出。
  5. 运行 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...
  6. 运行以下命令以删除无响应 USB 设备的 PdAt 条目:
    odmdelete -o PdAt -q 'attribute=0951_1656 and uniquetype="generic/usbif/usblibke"'
    
    该输出可能与以下示例类似:
    0518-307 odmdelete: 1 object deleted