注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

时间记录器

记录我的Linux、Android学习之路

 
 
 

日志

 
 

设备usb_driver的注册和使用  

2012-08-14 10:57:40|  分类: USB相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在新的USB驱动被创建和注册的时候会跟进到如下函数

/**

* usb_register_driver - register a USB interface driver

* @new_driver: USB operations for the interface driver

* @owner: module owner of this driver.

* @mod_name: module name string

*

* Registers a USB interface driver with the USB core. The list of

* unattached interfaces will be rescanned whenever a new driver is

* added, allowing the new driver to attach to any recognized interfaces.

* Returns a negative error code on failure and 0 on success.

*

* NOTE: if you want your driver to use the USB major number, you must call

* usb_register_dev() to enable that functionality. This function no longer

* takes care of that.

*/

int usb_register_driver(struct usb_driver *new_driver, struct module *owner,

            const char *mod_name)

{

    int retval = 0;

 

    if (usb_disabled())

        return -ENODEV;

 

    new_driver->drvwrap.for_devices = 0;

    new_driver->drvwrap.driver.name = (char *) new_driver->name;

    new_driver->drvwrap.driver.bus = &usb_bus_type;

    new_driver->drvwrap.driver.probe = usb_probe_interface;

    new_driver->drvwrap.driver.remove = usb_unbind_interface;

    new_driver->drvwrap.driver.owner = owner;

    new_driver->drvwrap.driver.mod_name = mod_name;

    spin_lock_init(&new_driver->dynids.lock);

    INIT_LIST_HEAD(&new_driver->dynids.list);

 

    retval = driver_register(&new_driver->drvwrap.driver);

 

    if (!retval) {

        pr_info("%s: registered new interface driver %s\n",

            usbcore_name, new_driver->name);

        usbfs_update_special();

        usb_create_newid_file(new_driver);

    } else {

        printk(KERN_ERR "%s: error %d registering interface "

            "    driver %s\n",

            usbcore_name, retval, new_driver->name);

    }

 

    return retval;

}

EXPORT_SYMBOL_GPL(usb_register_driver);

该函数将新的driver中的new_driver->drvwrap.driver结构填充好之后,却调用

driver_register(&new_driver->drvwrap.driver);

将其注册进bus,而不是将new_driver进行注册。

 

这是USB驱动的通用处理方法,其实,drvwap.driver是属于new_driver的,也就是是其的一部分,而将自己的一部分进行注册

而不是自己本身注册,很好的屏蔽了具体驱动的细节,内核中有一个强大的宏

Container_of()

这个宏的作用就是,通过成员找到成员所属的大结构体,所以,在

new_driver->drvwrap.driver.probe = usb_probe_interface;

 

中的usb_probe_interface函数中

static int usb_probe_interface(struct device *dev)

{

    struct usb_driver *driver = to_usb_driver(dev->driver);

 

这一句的to_usb_driver定义为

#define    to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver)

可以看到,返回的就是之前我们注册的new_driver。

 

  评论这张
 
阅读(397)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017