Attach to a USB device
#include <sys/usbdi.h> int usbd_attach( struct usbd_connection *connection, usbd_device_instance_t *instance, size_t extra, struct usbd_device **device );
libusbdi
You use the usbd_attach() function to attach to a USB device. Typically, you do this out of the insertion callback (made when the device matched your filter), which will give you the connection and instance parameters involved. The insertion callback is prototyped as follows:
void (*insertion)(struct usbd_connection *, usbd_device_instance_t *instance)
The usbd_device_instance_t structure looks like this:
typedef struct usbd_device_instance { uint8_t path; uint8_t devno; uint16_t generation; usbd_device_ident_t ident; uint32_t config; uint32_t iface; uint32_t alternate; } usbd_device_instance_t;
Another way to attach is to loop and attach to all devices (in which case you build the instance yourself). For example:
for (busno = 0; busno < 10; ++busno) { for (devno = 0; devno < 64; ++devno) { memset(&instance, USBD_CONNECT_WILDCARD, sizeof(usbd_device_instance_t)); instance.path = busno, instance.devno = devno; if (usbd_attach(connection, &instance, 0, &device) == EOK) { ...... } } }
The degree of “attachedness” depends on how you connected:
Safety: | |
---|---|
Cancellation point | Yes |
Interrupt handler | No |
Signal handler | No |
Thread | Yes |
usbd_connect(), usbd_detach(), usbd_device_extra(), usbd_disconnect()