【问题标题】:How do you get the vendor and product IDs for a USB device in a kernel extension?如何在内核扩展中获取 USB 设备的供应商和产品 ID?
【发布时间】:2018-02-22 07:06:16
【问题描述】:

我正在为 mac os 编写内核扩展,以便在大容量存储设备连接到机器时加载。

我为 plist 文件创建的工作完美,当大容量存储设备连接到机器时它会加载内核扩展,但我想找出连接的设备供应商 ID 和产品 ID 用于特定目的,请帮助..

【问题讨论】:

  • 您在什么情况下“想找出”VID/PID? Kext代码?外壳脚本?用户空间 C 代码?给出什么信息?一个 IOUSBInterface 实例?
  • 我想在连接设备 VID/PID 的 kext 代码中查找。
  • 好的,我在回答中提供了一些示例代码。如果您打算使用它来仅选择应为其加载驱动程序的某些设备,我还解释了如何执行此操作 - 这不是在您的 kext 代码中完成的,而是在 IOKitPersonalities 字典中完成的。跨度>

标签: macos usb device-driver iokit kernel-extension


【解决方案1】:

为某些 VID/PID 组合加载 kext

如果您希望您的 kext 只为具有特定 VID/PID 组合的设备加载,您应该扩展您的 IOKit 个性字典。 Apple 在 QA1076 中记录了 USB 设备/接口的完整规则,但本质上,您需要将 idVendor 和 idProduct 的整数属性添加到 Info.plist 中的个性:

<key>idVendor</key>
<integer>1234</integer>
<key>idProduct</key>
<integer>5678</key>

请注意,您需要将 ID 从十六进制转换为十进制。

如果您需要支持多个产品 ID,可以使用 idProductArray 代替 idProduct。该属性的值是一个包含整数的数组。

在 kext 中以编程方式访问供应商/产品 ID

如果您需要 VID/PID 信息以某种方式影响您的代码流,您可以直接在设备或接口对象上查询 idVendor/idProduct 属性。例如,假设您想在驱动程序实例的 start() 函数中执行此操作:

bool MyKext::start(IOService* provider)
{
    // …
    // call to superclass's start(), etc.
    // …

    // Fetch vendor ID:
    OSNumber* vid_num = OSDynamicCast(OSNumber, provider->getProperty(kUSBVendorID));
    if (vid_num != nullptr)
    {
        uint32_t vid = vid_num->unsigned32BitValue();
        // use vid here
    }
    // …
}

同样可以将kUSBVendorID替换为kUSBProductId查询产品ID。

【讨论】:

  • “在 kext 中以编程方式访问供应商/产品 ID”这个对我有用,谢谢。
猜你喜欢
  • 2011-02-25
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多