转自:https://blog.csdn.net/u010299133/article/details/103741672
inux中USB模块的注册方式分为两种:
1.按照常规驱动的注册方式注册
2.使用内核提供的宏:module_usb_driver注册
#if 1 //常规模块注册方式
static int __init usb_drv_init(void)
{
/*3、注册usb_driver驱动*/
usb_register_driver(&usb_driver,THIS_MODULE,"XL_USB");
printk(" usb_drv_init OK!!\n");
return 0;
}
static void __exit usb_drv_exit(void)
{
usb_deregister(&usb_driver);
printk("usb_drv_exit ok!!\n");
}
module_init(usb_drv_init);
module_exit(usb_drv_exit);
#else //快捷宏注册方式
/** usb.h 1032行
* module_usb_driver() - Helper macro for registering a USB driver
* @__usb_driver: usb_driver struct
*
* Helper macro for USB drivers which do not do anything special in module
* init/exit. This eliminates a lot of boilerplate. Each module may only
* use this macro once, and calling it replaces module_init() and module_exit()
*/
//#define module_usb_driver(__usb_driver) module_driver(__usb_driver, usb_register, usb_deregister)
module_usb_driver(usb_driver);
#endif
其中USB驱动注册的时候最为重要的数据结构就是usb_driver。
通常实现的主要是以下几种成员:
struct usb_driver usb_driver =
{
.name = "USB_DEMO",//驱动名
.probe = usb_drv_probe,//和设备层匹配到后执行的探测函数,linux3.10内核版本后是设备树操作,需要注意。
.disconnect = usb_drv_disconnect, //自动卸载-热插拔
.id_table = usb_id_table, // ID列表
};
具体操作如下:
/*1、分配usb_driver结构体*/
/*2、初始化usb_driver结构体,主要是id_table*/
/*3、注册usb_driver结构体*/
//usb_host_interface
static int usb_drv_probe (struct usb_interface *intf,const struct usb_device_id *id)
{
printk("usb demo:USB devices have access!!*****\n");
return 0;
}
static usb_drv_disconnect (struct usb_interface *intf)
{
printk("usb demo:USB has been unplugged!!*****\n");//热插拔自动卸载"
return 0 ;
}
static struct usb_device_id usb_id_table[] = {//参考usbmouse的配置
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_MOUSE)
},
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, usb_id_table);
struct usb_driver usb_driver =
{
.name = "USB_DEMO",
.probe = usb_drv_probe,
.disconnect = usb_drv_disconnect, //自动卸载-热插拔
.id_table = usb_id_table, // ID列表
};
完整的代码:
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/usb/input.h>
#include <linux/hid.h>
MODULE_LICENSE("GPL");
/*1、分配usb_driver结构体*/
/*2、初始化usb_driver结构体,主要是id_table*/
/*3、注册usb_driver结构体*/
//usb_host_interface
static int usb_drv_probe (struct usb_interface *intf,const struct usb_device_id *id)
{
printk("usb demo:USB devices have access!!*****\n");
return 0;
}
static usb_drv_disconnect (struct usb_interface *intf)
{
printk("usb demo:USB has been unplugged!!*****\n");//热插拔自动卸载"
return 0 ;
}
static struct usb_device_id usb_id_table[] = {//参考usbmouse的配置
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_MOUSE)
},
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, usb_id_table);
struct usb_driver usb_driver =
{
.name = "USB_DEMO",
.probe = usb_drv_probe,
.disconnect = usb_drv_disconnect, //自动卸载-热插拔
.id_table = usb_id_table, // ID列表
};
#if 1 //常规模块注册方式
static int __init usb_drv_init(void)
{
/*3、注册usb_driver驱动*/
usb_register_driver(&usb_driver,THIS_MODULE,"XL_USB");
printk(" usb_drv_init OK!!\n");
return 0;
}
static void __exit usb_drv_exit(void)
{
usb_deregister(&usb_driver);
printk("usb_drv_exit ok!!\n");
}
module_init(usb_drv_init);
module_exit(usb_drv_exit);
#else //快捷宏注册方式
/** usb.h 1032行
* module_usb_driver() - Helper macro for registering a USB driver
* @__usb_driver: usb_driver struct
*
* Helper macro for USB drivers which do not do anything special in module
* init/exit. This eliminates a lot of boilerplate. Each module may only
* use this macro once, and calling it replaces module_init() and module_exit()
*/
//#define module_usb_driver(__usb_driver) module_driver(__usb_driver, usb_register, usb_deregister)
module_usb_driver(usb_driver);
#endif