1

我正在编写一个 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

在此处输入图像描述

4

1 回答 1

1

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

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

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

于 2013-03-11T12:29:16.433 回答