| Hugh Blemings's Blog | ||||||
|
Sections
Links |
Tue, 15 Jan 2008
Detaching Kernel Drivers w/libusb
Done some tinkering with libusb this last week or so in order to get the USBmicro boards that Jeremy and I bought going. More on the reason for the tinkering later but in the process I discovered the kernels HID driver happily seizes the device on plugin - not unreasonable as the device identifies itself as a HID device. After unsuccessfully going down the route of trying to tell the kernel HID driver to ignore it, I found that libusb has a couple of functions that are intended to deal with this very situation. It may be poor reading of the docs or search skills on my part, but I wasn't able to find a definitive reference on how to actually use them, so here's the sequence that worked for me, edited for brevity:
struct usb_bus *bus_list;
struct usb_device *dev = NULL;
struct usb_dev_handle *handle;
/* Look for the first u4xx device we can find then try and open */
if((dev = find_u4xx(bus_list)) == NULL) {
return NULL;
}
/* Try and get a handle to the device */
if((handle = usb_open(dev)) == NULL) {
return NULL;
}
/* The kernel's HID driver will seize the USBMicro device as it
says it's a HID device - we need to tell the kernel to
let go of it */
if (usb_detach_kernel_driver_np(handle, 0) < 0) {
/* If this fails, usually just means that no kernel driver
had attached itself to the device so just ignore/warn */
}
/* Set the configuration */
if(usb_set_configuration(handle, 1) != 0) {
usb_close(handle);
return NULL;
}
/* Clain interface - gather would need to this for each
interface if the device has more than one */
if (usb_claim_interface(handle, 0) != 0) {
usb_close(handle);
return NULL;
}
/* etc. etc. */
I'll post the actual code shortly, want to clean it up a wee bit first. It'll end up here but I'll post to that effect when it's up. |
|||||