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