二、usb子系统初始化

    在/drivers/usb/core/Usb.c中,subsys_initcall(usb_init)声明了usb子系统入口函数usb_init

static int __init usb_init(void)
{
	int retval;
	if (nousb) {
		pr_info("%s: USB support disabled\n", usbcore_name);
		return 0;
	}
	retval = usb_debugfs_init();	//1.usb debugfs初始化
	if (retval)
		goto out;
	retval = bus_register(&usb_bus_type);	//2.usb总线注册
	if (retval)
		goto bus_register_failed;
	retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb);	//3.usb总线通知链注册
	if (retval)
		goto bus_notifier_failed;
	retval = usb_major_init();	//4.注册usb主控器字符设备
	if (retval)
		goto major_init_failed;
	retval = usb_register(&usbfs_driver);	//5.注册usbfs驱动
	if (retval)
		goto driver_register_failed;
	retval = usb_devio_init();	//6.usb设备字符设备初始化
	if (retval)
		goto usb_devio_init_failed;
	retval = usbfs_init();	//7.usbfs初始化
	if (retval)
		goto fs_init_failed;
	retval = usb_hub_init();	//8.usb hub初始化
	if (retval)
		goto hub_init_failed;
	retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);	//9.usb注册同样设备驱动
	if (!retval)
		goto out;
	usb_hub_cleanup();
hub_init_failed:
	usbfs_cleanup();
fs_init_failed:
	usb_devio_cleanup();
usb_devio_init_failed:
	usb_deregister(&usbfs_driver);
driver_register_failed:
	usb_major_cleanup();
major_init_failed:
	bus_unregister_notifier(&usb_bus_type, &usb_bus_nb);
bus_notifier_failed:
	bus_unregister(&usb_bus_type);
bus_register_failed:
	usb_debugfs_cleanup();
out:
	return retval;
}

1.usb_debugfs_init --usb debugfs初始化

static int usb_debugfs_init(void)
{
	usb_debug_root = debugfs_create_dir("usb", NULL);	//创建"$(debugfs)/usb"
	if (!usb_debug_root)
		return -ENOENT;		
	usb_debug_devices = debugfs_create_file("devices", 0444,usb_debug_root, NULL,&usbfs_devices_fops);
	//创建"$(debugfs)/usb/device",捆绑usbfs_devices_fops结构体
	if (!usb_debug_devices) {	//若创建失败
		debugfs_remove(usb_debug_root);	//则必须把“$(debugfs)/usb”也删除掉
		usb_debug_root = NULL;
		return -ENOENT;
	}
	return 0;
}

要使用debugfs下面的usb功能,需要先挂着debugfs(mount -t debugfs none $(debugfs) ),具体初始化了啥调试接口,看下usbfs_devices_fops操作函数集
2.usb总线的注册

struct bus_type usb_bus_type = {
	.name =	"usb",	//总线名
	.match =	usb_device_match,	//匹配方法
	.uevent =	usb_uevent,	//事件处理
#ifdef CONFIG_USB_SUSPEND
	.pm =	&usb_bus_pm_ops,	//电源管理
#endif
};

这里总线的match方法是usb设备与usb驱动匹配的函数.

3.注册usb总线通知链

int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb)
{
	return blocking_notifier_chain_register(&bus->p->bus_notifier, nb);
}

当总线添加删除设备的时候会调用usb_bus_nb指定的notifier_cal方法,既usb_bus_notify

static int usb_bus_notify(struct notifier_block *nb, unsigned long action,void *data)
{
	struct device *dev = data;
	switch (action) {
	case BUS_NOTIFY_ADD_DEVICE:	//添加设备
		if (dev->type == &usb_device_type)	//usb设备
			(void) usb_create_sysfs_dev_files(to_usb_device(dev));
		else if (dev->type == &usb_if_de
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值