【问题标题】:Figuring out data from IOUSBInterface pipes从 IOUSBInterface 管道中找出数据
【发布时间】:2013-03-11 01:16:58
【问题描述】:

我正在编写一个 Mac 应用程序,该应用程序使用 IOKit 向 Personal Video Recorder 发送和接收消息。我需要发送消息以更改其状态,并且它需要向我提供有关视频的信息,例如分辨率或是否录制。我意识到我必须找到正确的消息来发送它,所以首先我想我可以先从它那里收到一些消息。我已经找到了设备的接口。我如何能够转储收到的消息?

这是来自 USB Probe 的日志:

Composite device: "PVR"
    Port Information:   0x001d
           Captive
           Internal Device
           Connected
           Enabled
    Number Of Endpoints (includes EP0):   
        Total Endpoints for Configuration 1 (current):   7
    Device Descriptor   
        Descriptor Version Number:   0x0200
        Device Class:   0   (Composite)
        Device Subclass:   0
        Device Protocol:   0
        Device MaxPacketSize:   64
        Device VendorID/ProductID:   0x2040/0xE502   (Hauppauge Computer Works, Inc.)
        Device Version Number:   0x0800
        Number of Configurations:   1
        Manufacturer String:   1 "Hauppauge"
        Product String:   2 "WinTV"
        Serial Number String:   3 "E502-00-00AA3DEE"
    Configuration Descriptor (current config)   
        Length (and contents):   60
            Raw Descriptor (hex)    0000: 09 02 3C 00 01 01 00 C0  00 09 04 00 00 06 FF FF  
            Raw Descriptor (hex)    0010: FF 00 07 05 81 02 00 02  00 07 05 84 02 00 02 00  
            Raw Descriptor (hex)    0020: 07 05 88 02 00 02 00 07  05 01 02 00 02 00 07 05  
            Raw Descriptor (hex)    0030: 02 02 00 02 00 07 05 86  02 00 02 00 
        Number of Interfaces:   1
        Configuration Value:   1
        Attributes:   0xC0 (self-powered)
        MaxPower:   0 mA
        Interface #0 - Vendor-specific   
            Alternate Setting   0
            Number of Endpoints   6
            Interface Class:   255   (Vendor-specific)
            Interface Subclass;   255   (Vendor-specific)
            Interface Protocol:   255
            Endpoint 0x81 - Bulk Input   
                Address:   0x81  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   512
                Polling Interval:   0 ( Endpoint never NAKs)
            Endpoint 0x84 - Bulk Input   
                Address:   0x84  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   512
                Polling Interval:   0 ( Endpoint never NAKs)
            Endpoint 0x88 - Bulk Input   
                Address:   0x88  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   512
                Polling Interval:   0 ( Endpoint never NAKs)
            Endpoint 0x01 - Bulk Output   
                Address:   0x01  (OUT)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   512
                Polling Interval:   0 ( Endpoint never NAKs)
            Endpoint 0x02 - Bulk Output   
                Address:   0x02  (OUT)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   512
                Polling Interval:   0 ( Endpoint never NAKs)
            Endpoint 0x86 - Bulk Input   
                Address:   0x86  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   512
                Polling Interval:   0 ( Endpoint never NAKs)
    Device Qualifier Descriptor   
        Descriptor Version Number:   0x0200
        Device Class   0   (Composite)
        Device Subclass   0
        Device Protocol   0
        Device MaxPacketSize:   64
        Number of Configurations:   1
        bReserved:   0
    Other Speed Configuration Descriptor   
        Length (and contents):   60
            Raw Descriptor (hex)    0000: 09 07 3C 00 01 01 00 C0  00 09 04 00 00 06 FF FF  
            Raw Descriptor (hex)    0010: FF 00 07 05 81 02 40 00  00 07 05 84 02 40 00 00  
            Raw Descriptor (hex)    0020: 07 05 88 02 40 00 00 07  05 01 02 40 00 00 07 05  
            Raw Descriptor (hex)    0030: 02 02 40 00 00 07 05 86  02 40 00 00 
        Number of Interfaces:   1
        Configuration Value:   1
        Attributes:   0xC0 (self-powered)
        MaxPower:   0 mA
        Interface #0 - Vendor-specific   
            Alternate Setting   0
            Number of Endpoints   6
            Interface Class:   255   (Vendor-specific)
            Interface Subclass;   255   (Vendor-specific)
            Interface Protocol:   255
            Endpoint 0x81 - Bulk Input   
                Address:   0x81  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   64
                Polling Interval:   0 ms
            Endpoint 0x84 - Bulk Input   
                Address:   0x84  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   64
                Polling Interval:   0 ms
            Endpoint 0x88 - Bulk Input   
                Address:   0x88  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   64
                Polling Interval:   0 ms
            Endpoint 0x01 - Bulk Output   
                Address:   0x01  (OUT)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   64
                Polling Interval:   0 ms
            Endpoint 0x02 - Bulk Output   
                Address:   0x02  (OUT)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   64
                Polling Interval:   0 ms
            Endpoint 0x86 - Bulk Input   
                Address:   0x86  (IN)
                Attributes:   0x02  (Bulk)
                Max Packet Size:   64
                Polling Interval:   0 ms

【问题讨论】:

    标签: objective-c xcode cocoa io iokit


    【解决方案1】:

    USB 是主机驱动的。这意味着设备不会发送任何消息,除非是对来自主机 (Mac/PC) 的消息的回复。因此,要从中获取消息,您首先需要向其发送有效消息。

    我从您的问题中假设您实际上没有任何有关设备的文档/规范?这意味着您需要通过向制造商询问或通过逆向工程来获取该信息。

    逆向工程最简单的方法是监听现有驱动程序生成的消息,例如一些 Windows 软件,其功能与您想做的类似。然后你需要监听数据。过去,我曾在 Linux 上的 VM 中成功运行 Windows 软件,并将相关 USB 设备传递到 VM,并使用 Linux 的 USB 调试功能记录输出。您应该可以在 OSX 上使用“USB Prober”应用程序和 Apple 开发人员下载区域提供的“IOUSBFamily Log Release”来执行相同操作。

    【讨论】:

    • 感谢您的意见!我之前实际上已经尝试过 USB Prober,虽然它确实记录了 USB 的活动,但它没有记录发送的数据。虽然我有 Parallels 并且在它上面是 Windows 7。在 Windows 上有这个 PVR 的控制器应用程序。我可以使用什么应用程序在 Windows 上登录?
    • 我在 Windows 上使用过Snoopy Pro,但是我发现很多数据被丢弃了。也许你会有更多的运气。 OSX 上的 usbtracer 应该向您显示某些数据包的内容;您的虚拟化软件可能还具有记录所有转发的 USB 流量的模式。否则,安装 Linux 发行版并在其上安装 VirtualBox,然后通过 USB 并在 Linux 上启用 USB 调试。有大量的文档可以在 Linux 上执行此操作。
    • 好的,我已经使用 USBAnalyzer 来获取应用程序发送的数据。 (检查上图)我将通过 (*usbInterface)->WritePipe(void *self, UInt8 pipeRef, void *buf, UInt32 size) 在我的应用程序中发送相同的数据。当我调用它时,我将如何从上面的十六进制代码中设置数据?另外,当分析仪说出来时,它意味着从计算机到设备,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多