usb通用设备驱动注册

1. usb设备驱动注册流程图

......

2. usb设备驱动注册

usb_register_device_driver(&usb_generic_driver, THIS_MODULE);

usb通用驱动usb_generic_driver结构体

struct usb_device_driver usb_generic_driver = {
	.name =	"usb",
	.probe = generic_probe,
	.disconnect = generic_disconnect,
#ifdef	CONFIG_PM
	.suspend = generic_suspend,
	.resume = generic_resume,
#endif
	.supports_autosuspend = 1,
};

在usb主机控制器ehci、ohci检测到设备接入时都会调用这个通用的usb设备驱动,它的目的纯粹是作为设备接入时的一个接口,真正操作时usb_choose_configuration()、usb_set_configuration(),关于generic_probe()通用设备探测函数等会在分析,先来看下usb通用设备驱动时如何注册的。

int usb_register_device_driver(struct usb_device_driver *new_udriver,
		struct module *owner)
{
	int retval = 0;

	if (usb_disabled())
		return -ENODEV;

	//初始化一个usb驱动包
	new_udriver->drvwrap.for_devices = 1; //表示是设备,非驱动
	new_udriver->drvwrap.driver.name = (char *) new_udriver->name; //初始化驱动名为“usb”
	new_udriver->drvwrap.driver.bus = &usb_bus_type; //绑定驱动的总线为“usb”
	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);
	else
		printk(KERN_ERR "%s: error %d registering device "
			"	driver %s\n",
			usbcore_name, retval, new_udriver->name);

	return retval;
}

      driver_register(&new_udriver->drvwrap.driver)注册一个设备驱动在hub驱动注册时分析过,这里不再赘述,主要目地是完成usb设备驱动到usb总线上的注册,同时创建相应的设备模型kobject,详见:点击打开链接 3.hub驱动注册小节。

由于这里时内核刚起来时创建的设备驱动,这个时候在usb总线上还没有设备,所以在分析generic_probe()前,必须要了解usb主机控制器ehci、ohci是如何完成注册的、如何创建根root-hub,所以这里我们假设usb主机控制器驱动完成注册(关于usb主机控制器注册,详见:点击打开链接),并且这个时候有设备接入到usb主机控制器()上

3. generic_probe()

       备注,在分析该generic_probe()探测函数前,先要看下usb主机控制器驱动的注册流程,否则无法分析generic_probe()内部的工作原理,原因是只有usb主机控制器注册了,然后有usb设备接入到主机控制器上时,主机控制器检测到设备接入,通知hub_thread完成枚举、创建挂接在usb总线上的设备,然后该设备通过usb总线寻找到名称相同的驱动,调用usb_probe_device()-->generic_probe()完成接入usb设备接口的初始化....



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值