zoukankan      html  css  js  c++  java
  • USB 驱动之 usb_register 函数解析

    • 前段时间在kernel 添加了 USB to LAN 模块 AX88772B 的驱动。

    • 根据相关添加解析一下 usb_register_driver 函数

    • drivers/net/usb/asix.c

        1677 static int __init asix_init(void)
        1678 {
        679     return usb_register(&asix_driver);    //---> usb注册
        1680 }
        1681 module_init(asix_init);
    
    • include/linux/usb.h

         // 今天就是要解析这个函数
         947 extern int usb_register_driver(struct usb_driver *, struct module *,
         948                    const char *);
         949 
         950 /* use a define to avoid include chaining to get THIS_MODULE & friends */
         951 #define usb_register(driver) 
         952     usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
    
    • include/linux/usb.h

         861 struct usb_driver {
         862     const char *name;
         863 
         864     int (*probe) (struct usb_interface *intf,
         865               const struct usb_device_id *id);
         866 
         867     void (*disconnect) (struct usb_interface *intf);
         868 
         869     int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code,
         870             void *buf);
         871 
         872     int (*suspend) (struct usb_interface *intf, pm_message_t message);
         873     int (*resume) (struct usb_interface *intf);
         874     int (*reset_resume)(struct usb_interface *intf);
         875 
         876     int (*pre_reset)(struct usb_interface *intf);
         877     int (*post_reset)(struct usb_interface *intf);
         878 
         879     const struct usb_device_id *id_table;
         880 
         881     struct usb_dynids dynids;
         882     struct usbdrv_wrap drvwrap;
         883     unsigned int no_dynamic_id:1;
         884     unsigned int supports_autosuspend:1;
         885     unsigned int soft_unbind:1;
         886 };
         887 #define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver)
    
    • drivers/usb/core/driver.c usb_register_driver

         848 int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
         849             const char *mod_name)
         850 {
         851     int retval = 0;
         852 
         853     if (usb_disabled())
         854         return -ENODEV;
         855 
         856     new_driver->drvwrap.for_devices = 0;
         857     new_driver->drvwrap.driver.name = (char *) new_driver->name;
         858     new_driver->drvwrap.driver.bus = &usb_bus_type;
         859     new_driver->drvwrap.driver.probe = usb_probe_interface;
         860     new_driver->drvwrap.driver.remove = usb_unbind_interface;
         861     new_driver->drvwrap.driver.owner = owner;
         862     new_driver->drvwrap.driver.mod_name = mod_name;
         863     spin_lock_init(&new_driver->dynids.lock);
         864     INIT_LIST_HEAD(&new_driver->dynids.list);
         865 
         866     retval = driver_register(&new_driver->drvwrap.driver);
         867     if (retval)
         868         goto out;
         869 
         870     usbfs_update_special();
         871 
         872     retval = usb_create_newid_file(new_driver);
         873     if (retval)
         874         goto out_newid;
         875 
         876     retval = usb_create_removeid_file(new_driver);
         877     if (retval)
         878         goto out_removeid;
         879 
         880     pr_info("%s: registered new interface driver %s
    ",
         881             usbcore_name, new_driver->name);
         882 
         883 out:
         884     return retval;
         885 
         886 out_removeid:
         887     usb_remove_newid_file(new_driver);
         888 out_newid:
         889     driver_unregister(&new_driver->drvwrap.driver);
         890 
         891     printk(KERN_ERR "%s: error %d registering interface "
         892             "   driver %s
    ",
         893             usbcore_name, retval, new_driver->name);
         894     goto out;
         895 }
         896 EXPORT_SYMBOL_GPL(usb_register_driver);
    
  • 相关阅读:
    mysql逻辑架构
    delete与truncate的区别
    mycat
    mycat
    MyCat数据库中间件
    mysql主从复制
    docker学习笔记之快速安装
    linux学习笔记之CentOS7系统快速安装
    Redis学习笔记
    双绞线的种类与型号
  • 原文地址:https://www.cnblogs.com/chenfulin5/p/7509060.html
Copyright © 2011-2022 走看看