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驱动都必须创建主要结构 ...
随机推荐
- UpdatePanel的用法详解
摘自:http://www.cnblogs.com/shangxia/articles/2281782.html 一.UpdatePanel的结构 <asp:ScriptManager ID=& ...
- JavaScript-event参数传递详解
onmouseover="over(event)" onmouseout="out(event)" onclick="change(event)&qu ...
- HDUOJ----数塔
数塔 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission ...
- 【C++】关于带const的指针问题
区分const出现在*前还是*后 前: 例如const int *p,这种表示情况下,p本身可以改变,即p可以指向不同的地址, 但是p指向的内容不可改变. 就像你喜欢看书,图书馆规定你可以任意借阅及更 ...
- OAF_OAF控件系列8 - SubTab的实现(案例)
2014-06-02 Created By BaoXinjian
- PLSQL_统计信息系列02_统计信息的对象
20150505 Created By BaoXinjian
- [Android开发那点破事]解决android.os.NetworkOnMainThreadException
[Android开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡 ...
- tomcat支持https的历程
tomcat真是业界良心啊,文档写的详细无比. 一.https是什么? 简单的说,就是http+SSL/TLS 协议还是http,但是在传输层过程中使用了加密(涉及握手.秘钥分发.加密.解密等过程). ...
- C# winform 请求http ( get , post 两种方式 )
一:.Net中有两个类 HttpWebRequest 和HttpWebResponse 类来实现Http的请求 实现步骤: 1.通过WebRequest类创建一个HttpWebRequest的对象,该 ...
- shell学习四十八天----文件校验和匹配
文件校验和匹配 要是你怀疑可能有非常多文件具有同样的内文,而是用cmp或diff进行比較全部横队的比較,导致所花费的时间会随着文件数目增长成次方的增长. 这是能够使用file checksum(文件校 ...