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\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 函数解析的更多相关文章
- Linux 内核注册一个 USB 驱动
所有 USB 驱动必须创建的主要结构是 struct usb_driver. 这个结构必须被 USB 驱动填 充并且包含多个函数回调和变量, 来向 USB 核心代码描述 USB 驱动: struct ...
- usb驱动的基本结构和函数简介【转】
转自:http://blog.csdn.net/jeffade/article/details/7698404 几个重要的结构 struct--接口 struct usb_interface { /* ...
- module_init宏解析 linux驱动的入口函数module_init的加载和释放
linux驱动的入口函数module_init的加载和释放 http://blog.csdn.net/zhandoushi1982/article/details/4927579 void free_ ...
- 【驱动】USB驱动·入门
[驱动]USB驱动·入门 Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导致计算机外部总线种类繁多,管理困难.USB总线正是因此而诞生的. ...
- 【驱动】USB驱动·入门【转】
转自:http://www.cnblogs.com/lcw/p/3159371.html Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导 ...
- usb驱动开发之大结局
从usb总线的那个match函数usb_device_match()开始到现在,遇到了设备,遇到了设备驱动,遇到了接口,也遇到了接口驱动,期间还多次遇到usb_device_match(),又多次与它 ...
- usb驱动开发24之接口驱动
从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match, ...
- Linux内核USB驱动【转】
本文转载自:http://www.360doc.com/content/12/0321/14/8363527_196286673.shtml 注意,该文件是2.4的内核的驱动源文件,并不保证在2.6内 ...
- USB驱动开发大全【转】
本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构 ...
随机推荐
- delphi實現按键精靈的功能
unit kbKernel; interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo ...
- 使用Apache FtpServer
Java大法一统天下.遇到任何问题,先查一下Java中的解决方案. 地球上的许多事情,在Java中都能找到完美的解决方案. FtpServer是apache MINA项目的一个子项目,它实现了一个ft ...
- 在python中使用静态方法staticmethod
静态方法: 静态方法是类中的函数,不需要实例.静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作.可以理解为将静态方法存在 ...
- 面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现
课程名称:程序设计方法学 实验5:OOP设计模式-行为型模式的应用与实现 时间:2015年12月02日三,第3.4节地点:理 一.实验目的 加深对行为型设计模式的理解以及在开发中的实际应用能力. 二. ...
- iOS高级教程:处理1000张图片的内存优化
一.项目需求 在实际项目中,用户在上传图片时,有时会一次性上传大量的图片.在上传图片前,我们要进行一系列操作,比如:旋转图片为正确方向,压缩图片等,这些操作需要将图片加载到内存中,下面对内存的使用做详 ...
- python练习笔记——分解质因数
分解质因数:输入一个正整数,分解质因数:如输入: 90 则打印: 90 = 2 * 3 * 3 * 5 get_str = input("请输入一个100以内的正整数,以分解质因数:&q ...
- PS_Form个性化复杂需求新增Menu并调用Request(案例)
2014-06-01 Created By BaoXinjian
- python bs4 + requests4 简单爬虫
参考链接: bs4和requests的使用:https://www.cnblogs.com/baojinjin/p/6819389.html 安装pip:https://blog.csdn.net/z ...
- 使用和学习 ES2015
调试网站 http://babeljs.io/repl/ 扩展阅读: # export.exports.modules.exports 和 require .import 的一些常用方法和套路 htt ...
- php 利用转转法去除重复数组
w3scool学习地址 http://www.w3school.com.cn/tiy/s.asp?f=demo_php_func_array_flip 利用array键名不能重复的原理,使用两次 ar ...