Question

I am coding for a Mac app that sends and receives messages to a Personel Video Recorder using with the IOKit. I need to send messages to change its status and it needs to give me info about the video like resolution or if its recording. I realize that I have to find the right messages to send it, so first I thought I could receive some messages from it first. I have already found the interface for the device. How would I be able to dump the received messages?

Here is a log from 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

enter image description here

Était-ce utile?

La solution

USB is host-driven. This means the device doesn't send any messages except as replies to messages from the host (Mac/PC). So to elicit a message from it, you will first need to send it a valid message.

I assume from your question that you don't actually have any documentation/specification for the device in question? This means you'll need to obtain that information, either by asking the manufacturer for it, or via reverse engineering it.

The easiest way to reverse engineer it is to listen in on the messages generated by an existing driver, e.g. some Windows software that does something similar to what you want to do. Then you need to listen in on the data. In the past, I've had success running the Windows software in a VM on Linux and passing through the USB device in question to the VM, and using Linux' USB debugging features to log the output. You should be able to do the same on OSX using the "USB Prober" application with the "IOUSBFamily Log Release" available from Apple's developer download area.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top