• 前段时间在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\n",
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\n",
893 usbcore_name, retval, new_driver->name);
894 goto out;
895 }
896 EXPORT_SYMBOL_GPL(usb_register_driver);

USB 驱动之 usb_register 函数解析的更多相关文章

  1. Linux 内核注册一个 USB 驱动

    所有 USB 驱动必须创建的主要结构是 struct usb_driver. 这个结构必须被 USB 驱动填 充并且包含多个函数回调和变量, 来向 USB 核心代码描述 USB 驱动: struct ...

  2. usb驱动的基本结构和函数简介【转】

    转自:http://blog.csdn.net/jeffade/article/details/7698404 几个重要的结构 struct--接口 struct usb_interface { /* ...

  3. module_init宏解析 linux驱动的入口函数module_init的加载和释放

    linux驱动的入口函数module_init的加载和释放 http://blog.csdn.net/zhandoushi1982/article/details/4927579 void free_ ...

  4. 【驱动】USB驱动·入门

    [驱动]USB驱动·入门 Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导致计算机外部总线种类繁多,管理困难.USB总线正是因此而诞生的. ...

  5. 【驱动】USB驱动·入门【转】

    转自:http://www.cnblogs.com/lcw/p/3159371.html Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导 ...

  6. usb驱动开发之大结局

    从usb总线的那个match函数usb_device_match()开始到现在,遇到了设备,遇到了设备驱动,遇到了接口,也遇到了接口驱动,期间还多次遇到usb_device_match(),又多次与它 ...

  7. usb驱动开发24之接口驱动

    从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match, ...

  8. Linux内核USB驱动【转】

    本文转载自:http://www.360doc.com/content/12/0321/14/8363527_196286673.shtml 注意,该文件是2.4的内核的驱动源文件,并不保证在2.6内 ...

  9. USB驱动开发大全【转】

    本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构 ...

随机推荐

  1. AWK中的OFS的问题

    echo a b c d |awk '{OFS = ":";print $0}' 我的理解是应该把输出显示为如下的方式 a:b:c:d dan但执行的结果不是这样的 a b c d ...

  2. python中如何对list之间求交集,并集和差集

    最近遇到一个从list a里面去除list b的元素的问题,由于a很大,b也不小.所以遇到点困难,现在mark一下. 先说最简单的方法: a = [1, 2, 3, 4, 5, 6, 7, 8, 9, ...

  3. Linux命令-服务管理命令:chkconfig

    chkconfig --list 查看服务自启动状态列表,等同于查看服务列表 设置某一个服务为自启动服务: chkconfig 服务名 on 修改服务的启动级别为3,,5 查看某一个服务时候已经运行了 ...

  4. JQuery中事件one、bind、unbind、live、delegate、on、off、trigger、triggerHandler的各种使用区别

    JQuery事件one,支持参数 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> & ...

  5. 由SQL Server的job出错调查引起的思考

            最近一段时间数据库上的一个Job频繁报错,刚开始我们没有抽时间进行彻底的调查.只是处理了下不规范的数据 就没有管了,但是后面我们发现过了几天它又报错了.         今天我进行了彻 ...

  6. 在rhel6上安装Python 2.7和Python 3.3

    安装前,操作系统软件包准备编译python要安装development tools.此外,还要安装一些其他的libs,没有这些libs,python的interpreter可能会无法正常工作 # yu ...

  7. Python abs() 函数

    描述 abs() 函数返回数字的绝对值. 语法 以下是 abs() 方法的语法: abs( x ) 参数 x -- 数值表达式,可以是整数,浮点数,复数. 返回值 函数返回 x(数字)的绝对值,如果参 ...

  8. VS2010 单元测试,性能测试 案例

    http://www.cnblogs.com/heqichang/category/315226.html

  9. Eclipse color theme jsp javascript显示问题

    Q: 在eclipse 中,设置为sublime格式时, 在编辑器中,jsp中嵌套的javascript底色非常难看. A:在如下位置进行设置,Window -> Preferences-> ...

  10. 怎么在ubuntu中新增一个用户并赋予管理员权限

    用useradd时,并没有创建同名的用户主目录.例子:adduser user1这样他就会自动创建用户主目录,创建用户同名的组.root@ubuntu:~# sudo adduser db[sudo] ...