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);
    
  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/chenfulin5/p/7509060.html
Copyright © 2011-2022 走看看