On Wed, Apr 08, 2015 at 04:17:12PM +0200, ludovic coues wrote:
>2015-04-08 3:09 GMT+02:00 Mario St-Gelais:
>> On Mon, Apr 06, 2015 at 07:39:35PM -0700, Philip Guenther wrote:
>>>On Mon, Apr 6, 2015 at 3:59 PM, Mario St-Gelais wrote:
>>>> I have been playing around trying to come up with something that kind of 
>>>> have
>>>> the verbosity of lsusb but use OpenBSD's #include <dev/usb/usb.h> and 
>>>> avoid all of libusb stuff.
>>>>
>>>> I hit a wall when I try to use USB_DEVICE_GET_FDESC :
>>>...
>>>> So basically I have the following function that fails.
>>>> I set udf_size=25 as this is the value I get from wTotalLength shown above 
>>>> as
>>>>  explained in the man.
>>>>
>>>> int
>>>> get_usb_device_fdesc(int f, int a, struct usb_device_fdesc *u)
>>>> {
>>>>     u->udf_addr = a;
>>>>     u->udf_config_index = USB_CURRENT_CONFIG_INDEX;
>>>>     u->udf_size=25;
>>>>     int e = ioctl(f, USB_DEVICE_GET_FDESC, u);
>>>>     return e;
>>>> }
>>>
>>>First, when a system call fails you should be looking at errno to see
>>>why the call failed, or at least get a hint.  I strongly advise using
>>>the err(3) family of functions, even in test or 'toy' programs,
>>>because one wrong assumption can waste *hours* of time.  So:
>>>
>>>#include <err.h>
>>>
>>>and then use it like
>>>
>>>     if (ioctl(f, USB_DEVICE_GET_FDESC, u) == -1)
>>>          err(1, "ioctl(GET_FDESC)");
>>>
>>>Now, my guess in this case is that it would report "Bad Address"
>>>indicating the errno was EFAULT.  Why?  Well, let's look at usb(4):
>>>
>>>     USB_DEVICE_GET_FDESC (struct usb_device_fdesc *)
>>>             This command can be used to retrieve all descriptors for the
>>>             given configuration of a device on the bus.  The udf_addr field
>>>             needs to be filled with the bus device address.  The
>>>             udf_config_index field needs to be filled with the configuration
>>>             index for the relevant configuration descriptor.  For 
>>> convenience
>>>             the current configuration can be specified by
>>>             USB_CURRENT_CONFIG_INDEX.  The udf_data field needs to point to 
>>> a
>>>             memory area of the size given in the udf_size field.  The proper
>>>             size can be determined by first issuing a USB_DEVICE_GET_CDESC
>>>             command and inspecting the wTotalLength field:
>>>...
>>>
>>>So, where's the allocation of wTotalLength bytes of memory and the
>>>initialization of u->udf_data to point to it?
>>>
>>>
>>>Philip Guenther
>>
>> Thanks Philip.
>>
>> I made some progress.  I had #include <err.h> but wasn't using it.
>> I read and re-read the USB_DEVICE_GET_CDESC so many times...
>> Indeed after implementing err function, I got "Bad Address".  You were right.
>> So I introduced a malloc in my function.  No more bad address, not I get
>> "Device not configured".
>>
>> int
>> get_usb_device_fdesc(int f, int a, struct usb_device_fdesc *u)
>> {
>>     u->udf_addr = a;
>>     u->udf_config_index = USB_CURRENT_CONFIG_INDEX;
>>     u->udf_size=25; //25  not to be hardcoded
>>     if ((u->udf_data=malloc(25)) == NULL)
>>         err(1, "malloc");
>>     if (ioctl(f, USB_DEVICE_GET_FDESC, u) == -1)
>>         err(1, "ioctl(GET_FDESC)");
>>     return 0; //fwiw
>> }
>>
>> Not quite sur what that udf_data is supposed to contain, I have some more
>> homework to do.
>>
>> (gdb) p *u
>> $1 = {udf_bus = 0 '\0', udf_addr = 1 '\001', udf_config_index = -1,
>>   udf_size = 25, udf_data = 0x12dea87fd280 "\t\002\031"}
>> (gdb)
>>
>
>udf_data will contain the data you requested :)
Thank you smarty pants :)

>First a config descriptor, then your first interface descriptor
>followed by an HID descriptor for HID device then endpoint
>descriptors.
>

Ok, that gives me something to work with.  It's quite a learning curve for a
hobbyist...  Thanks.

>I have a similar project on the stoves and I have the feeling the USB
>thing is a rabbit hole.
>
>-- 
>
>Cordialement, Coues Ludovic
>+336 148 743 42

Mario St-Gelais

Reply via email to