I've written a simple usb device driver but it's not getting probed when the device is connected to the system, instead the kernel is calling the usb-storage module instead.
Code for my kernel module:
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/device.h>
#define USB_IT8951_VENDOR_ID 0x048d //ITE Vendor ID
#define USB_IT8951_PRODUCT_ID 0x0220
static int it8951_usb_probe(struct usb_interface *interface, const struct usb_device_id *id)
{
pr_info("test_string 2\n");
return 0;
}
static void it8951_usb_disconnect(struct usb_interface *interface)
{
pr_info("Disconnect enter\n");
}
static const struct usb_device_id it8951_usb_devices [] = {
{ USB_DEVICE(USB_IT8951_VENDOR_ID, USB_IT8951_PRODUCT_ID) },
{},
};
MODULE_DEVICE_TABLE(usb, it8951_usb_devices);
static struct usb_driver it8951_usb_driver_struct = {
.name = "it8951_usb",
.probe = it8951_usb_probe,
.disconnect = it8951_usb_disconnect,
//.fops = &skel_fops,
.id_table = it8951_usb_devices,
};
static int __init it8951_usb_init(void)
{
int result;
pr_info("test_string 1\n");
result = usb_register(&it8951_usb_driver_struct);
if (result < 0) {
pr_err("usb_register failed for the "__FILE__ "driver."
"Error number %d", result);
return -1;
}
return 0;
}
module_init(it8951_usb_init);
static void __exit it8951_usb_exit(void)
{
usb_deregister(&it8951_usb_driver_struct);
}
module_exit(it8951_usb_exit);
Dmesg when the device is connnected:
[ 668.940000] usb 1-2: new high-speed USB device number 3 using atmel-ehci
[ 669.130000] usb 1-2: New USB device found, idVendor=048d, idProduct=0220
[ 669.130000] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 669.140000] usb 1-2: Product: Digi-Photo-Frame
[ 669.140000] usb 1-2: Manufacturer: Smedia inc.
[ 669.140000] usb 1-2: SerialNumber: 14024689FA08
[ 669.160000] usb-storage 1-2:1.0: USB Mass Storage device detected
[ 669.170000] scsi host0: usb-storage 1-2:1.0
[ 670.240000] scsi 0:0:0:0: Direct-Access Generic Storage RamDisc 1.00 PQ: 0 ANSI: 0 CCS
[ 670.260000] sd 0:0:0:0: [sda] 1 512-byte logical blocks: (512 B/512 B)
[ 670.270000] sd 0:0:0:0: [sda] Write Protect is off
[ 670.270000] sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00
[ 670.270000] sd 0:0:0:0: [sda] No Caching mode page found
[ 670.270000] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 670.320000] sd 0:0:0:0: [sda] Attached SCSI removable disk
I can't remove usb-storage support from the system, so is there a way to force the kernel to use my module instead of usb-storage? Or can I write a udev rule to re-assign the device?
Thanks in advance.