Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Jun 2009 22:11:47 +0200
From:      Markus Dolze <bsdfan@nurfuerspam.de>
To:        freebsd-usb@freebsd.org
Subject:   Re: Failing controls transfers in VMware
Message-ID:  <4A4A7183.2060700@nurfuerspam.de>
In-Reply-To: <4A4A5D7E.70708@nurfuerspam.de>
References:  <4A4A5D7E.70708@nurfuerspam.de>

next in thread | previous in thread | raw e-mail | index | archive | help
Markus Dolze wrote:
> To repeat run the attached program:
>
>    1. Fill in some vendor / product ID of a device detected as ugen device
>    2. Compile and run the code (devel/libusb must be installed).
>
> The result will look like this:
>
>   
The mailing list didn't send the attachment. Here is the code, put
together from different example programs:

/*
 * A program to test USB control messages
 */

#include <stdio.h>
#include <string.h>
#include <usb.h>

#define USBASP_SHARED_VID   0x16C0
#define USBASP_SHARED_PID   0x05DC

#define TIMEOUT 5000
#define LANGID  0x0409  /* english */

char* usbStringToAscii(char *buffer, int len)
{
    char    buf[256];
    int     i;

    printf("%02x %02x\n", buffer[0], buffer[1]);

    if(buffer[1] != USB_DT_STRING){
        *buf = 0;
        return 0;
    }
    if((unsigned char)buffer[0] < len)
        len = (unsigned char)buffer[0];
    len /= 2;
    /* lossy conversion to ISO Latin1: */
    for(i=1;i<len;i++){
        if(i > sizeof(buf))              /* destination buffer overflow */
            break;
        buf[i-1] = buffer[2 * i];
        if(buffer[2 * i + 1] != 0)  /* outside of ISO Latin1 range */
            buf[i-1] = '?';
    }
    buf[i-1] = 0;
    return strdup(buf);
}


int main(int argc, char *argv[])
{
    struct usb_bus      *bus;
    struct usb_device   *dev;
    usb_dev_handle      *handle = NULL;
    char    string[255];
    int     len;

    usb_init();
    usb_find_busses();
    usb_find_devices();
    for(bus = usb_get_busses(); bus; bus = bus->next) {
        for(dev = bus->devices; dev; dev = dev->next) {
            if((dev->descriptor.idVendor == USBASP_SHARED_VID &&
               dev->descriptor.idProduct == USBASP_SHARED_PID) {
                printf("Found AVR-USB device\n");
               
                handle = usb_open(dev);
                if(!handle) {
                    printf("Warning: cannot open USB device: %s\n",
usb_strerror());
                    continue;
                }

                memset(string, 0, sizeof(string));
                len = usb_control_msg(handle, USB_ENDPOINT_IN,
USB_REQ_GET_DESCRIPTOR,
                    (USB_DT_STRING << 8) +
dev->descriptor.iManufacturer, LANGID, string,
                    sizeof(string), TIMEOUT);
                printf("USB_control_msg result: %d\n", len);
                if(len < 0)
                    printf("Warning: cannot query manufacturer for
device: %s\n",
                        usb_strerror());
                else
                    printf("Found device from vendor: %s\n",
usbStringToAscii(string, len));
               
                memset(string, 0, sizeof(string));
                len = usb_control_msg(handle, USB_ENDPOINT_IN,
USB_REQ_GET_DESCRIPTOR,
                    (USB_DT_STRING << 8) + dev->descriptor.iProduct,
LANGID, string,
                    sizeof(string), TIMEOUT);
                printf("USB_control_msg result: %d\n", len);
                if(len < 0)
                    printf("Warning: cannot query product: %s\n",
                        usb_strerror());
                else
                    printf("Found device: %s\n",
usbStringToAscii(string, len));
               
                usb_close(handle);
                handle = NULL;
            }
        }
    }

    return 0;
}




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4A4A7183.2060700>