linux中USB驱动的注册方式

转自: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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值