usb驱动开发19——驱动生命线

本文深入探讨USB驱动的生命周期,从usb_generic_driver的注册开始,讲解驱动如何与设备模型交互,如何匹配设备并进行probe,以及如何选择和配置设备,最终达到Configured状态。内容涵盖usb_register_device_driver、probe过程、配置设备的细节,并阐述了在没有合适配置时的处理策略。
摘要由CSDN通过智能技术生成

现在开始就沿着usb_generic_driver的生命线继续往下走。设备的生命线你可以为是从你的usb设备连接到hub的某个端口时开始,而驱动的生命线就必须得回溯到usb子系统的初始化函数usb_init了:

if (retval)

goto hub_init_failed;

retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);

if (!retval)

goto out;

在usb子系统初始化的时候就调用driver.c里的usb_register_device_driver函数将usb_generic_driver注册给系统了,怀胎十月,嗷嗷一声之后,usb世界里的一个超级大美女诞生了。现在先看看带她来到这个世界上的usb_register_device_driver函数:

/**

* usb_register_device_driver - register a USB device (not interface) driver

* @new_udriver: USB operations for the device driver

* @owner: module owner of this driver.

*

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

* unattached devices will be rescanned whenever a new driver is

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

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

*/

int usb_register_device_driver(struct usb_device_driver *new_udriver,

struct module *owner)

{
   

int retval = 0;

if (usb_disabled())

return -ENODEV;

new_udriver->drvwrap.for_devices = 1;

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

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

new_udriver->drvwrap.driver.probe = usb_probe_device;

new_udriver->drvwrap.driver.remove = usb_unbind_device;

new_udriver->drvwrap.driver.owner = owner;

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

if (!retval) {
   

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

usbcore_name, new_udriver->name);

usbfs_update_special();

} else {
   

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

" driver %s\n",

usbcore_name, retval, new_udriver->name);

}

return retval;

}

usb_disabled函数判断一下usb子系统是不是在你启动内核的时候就被禁止了,如果是的话,这个超级大美女的生命也就太短暂了。

看到没,for_devices就是在这儿被初始化为1的,有了它,match里的那个is_usb_device_driver把门儿的才有章可循有凭可依。

下面就是充实了下usb_generic_driver里嵌入的那个struct device_driver结构体,usb_generic_driver就是通过它和设备模型搭上关系的。name就是usb_generic_driver的名字,即usb,所属的总线类型同样被设置为usb_bus_type,然后是指定probe函数和remove函数。

然后调用设备模型的函数driver_register将usb_generic_driver添加到usb总线的那条驱动链表里。
usb_generic_driver和usb设备匹配成功后,就会调用指定的probe函数usb_probe_device(),现在看看driver.c里定义的这个函数:

/* called from driver core with dev locked */

static int usb_probe_device(struct device *dev)

{
   

struct usb_device_driver *udriver = to_usb_device_driver(dev->driver);

struct usb_device *udev;

int error = -ENODEV;

dev_dbg(dev, "%s\n", __FUNCTION__);

if (!is_usb_device(dev
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kcyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值