从IOUSBInterface管道中找出数据

时间:2013-03-11 01:16:58

标签: objective-c xcode cocoa io iokit

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

以下是USB探测器的日志:

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

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