Linux boot 时 USB 的初始化过程分析1

本文详细介绍了Linux内核5.11版本在OK6410A平台上的USB子系统的初始化过程,包括usb_common_init、usb_init、ohci_hcd_mod_init和ohci_s3c2410_init等关键模块的功能。这些模块负责USB核心功能的设置、设备驱动注册、总线通知以及硬件控制器的初始化。此外,还涉及到了设备驱动注册、接口驱动和设备类驱动的注册过程。
摘要由CSDN通过智能技术生成

有关模块及顺序
  • linux-5.11 ok6410a 中 与 usb 相关的模块如下

drivers/usb$ nm built-in.a  |grep initcall  
00000000 d __initcall_usb_common_init4    // c092d774 在System.map 中的位置
00000000 d __initcall_usb_init4           // c092d778
00000000 d __initcall_ohci_hcd_mod_init6  // c092d92c
00000000 d __initcall_ohci_s3c2410_init6  // c092d930

hid 相关
drivers/hid$ nm built-in.a  |grep initcall 
00000000 d __initcall_hid_init6           // c092d9dc
00000000 d __initcall_hid_generic_init6   // c092d9e0
00000000 d __initcall_usb_mouse_driver_init6 // c092d9e4

  • 模块初始化顺序
__initcall_usb_common_init4    // drivers/usb/common/common.c   // usb_common_init
__initcall_usb_init4           // drivers/usb/core/usb.c        // usb_init
__initcall_ohci_hcd_mod_init6  // drivers/usb/host/ohci-hcd.c   // ohci_hcd_mod_init
__initcall_ohci_s3c2410_init6  // drivers/usb/host/ohci-s3c2410.c // ohci_s3c2410_init

各个模块的功能
USB 核心相关
usb_common_init
usb_common_init
	debugfs_create_dir("usb", NULL);
		// https://www.systutorials.com/docs/linux/man/9-debugfs_create_dir/
		//在debugfs 的根目录创建了usb目录 , 即 /sys/kernel/debug/usb
	ledtrig_usb_init();
		// usb也有led指示灯,但是很少见.

# pwd
/sys/kernel/debug/usb
# ls
devices   ohci      uvcvideo
# ls -R -l 
.:
-r--r--r--    1 root     root             0 Jan  1 00:00 devices
drwxr-xr-x    3 root     root             0 Jan  1 00:00 ohci
drwxr-xr-x    2 root     root             0 Jan  1 00:00 uvcvideo

./ohci:
drwxr-xr-x    2 root     root             0 Jan  1 00:00 s3c24xx

./ohci/s3c24xx:
-r--r--r--    1 root     root             0 Jan  1 00:00 async
-r--r--r--    1 root     root             0 Jan  1 00:00 periodic
-r--r--r--    1 root     root             0 Jan  1 00:00 registers

./uvcvideo:
usb_init
usb_init
	usb_disabled // 内核参数 nousb 的检测
	usb_init_pool_max  // 根据 ARCH_KMALLOC_MINALIGN 的值 计算 pool_max[0]的值 ? TODO
	usb_debugfs_init   // 创建 /sys/kernel/debug/usb/devices 文件
	usb_acpi_register  // 没有配置 CONFIG_ACPI,什么都不做
	bus_register(&usb_bus_type);  // 注册 总线驱动设备模型 中的总线
	bus_register_notifier(&usb_bus_type, &usb_bus_nb); 
	// 通知链
	// https://www.cnblogs.com/cslunatic/p/3726053.html
	/*
	  当总线发现新的设备调用device_add->blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_ADD_DEVICE, dev)
	
	  当总线卸载设备时调用device_del->blocking_notifier_call_chain(&dev->bus->p->bus_notifier,BUS_NOTIFY_DEL_DEVICE, dev);
	*/
	usb_major_init();
		// 创建一个 cdev 设备
		register_chrdev(USB_MAJOR/*180*/, "usb", &usb_fops);
	
	USB FS
	// /dev/bus/usb
	// /sys/bus/usb/drivers/usbfs
	// /sys/kernel/debug/usb
	// /proc/bus/usb
	///
	usb_register(&usbfs_driver);
		usb_register_driver // 应该是接口驱动
	usb_devio_init();
		// 创建 64* 128 个 cdev设备
		register_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX, "usb_device");
		cdev_init(&usb_device_cdev, &usbdev_file_operations);
		cdev_add(&usb_device_cdev, USB_DEVICE_DEV, USB_DEVICE_MAX);
		
		usb_register_notify(&usbdev_nb);
			blocking_notifier_chain_register(&usb_notifier_list, &usbdev_nb);
				/*
				  usb_register_notify->blocking_notifier_chain_register(&usb_notifier_list, nb):向usb_notifier_list通知链表注册
				
				  blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev):通知有usb设备增加
				  blocking_notifier_call_chain(&usb_notifier_list,USB_DEVICE_REMOVE, udev):通知有usb设备移除
				  blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus):通知有usb总线增加
				  blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus):通知有usb总线移除
				*/
	//
	usb_hub_init();
		usb_register(&hub_driver)
		hub_wq = alloc_workqueue("usb_hub_wq", WQ_FREEZABLE, 0);
		
	usb_register_device_driver(&usb_generic_driver, THIS_MODULE);  
		// 将设备driver(会匹配任一个设备device)注册到usb总线上

# cat /proc/devices 
Character devices:
180 usb 			// USB_MAJOR
189 usb_device 		// USB_DEVICE_MAJOR

ohci_hcd_mod_init
ohci_hcd_mod_init
	usb_disabled // 内核参数 nousb 的检测
	set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
		// 将 usb_hcds_loaded 的 bit1 设置为1, 表示 加载的是ohci,而不是 ehci或者 xhci
		// host controller drivers 的类型
	debugfs_create_dir("ohci", usb_debug_root);
		// 创建 /sys/kernel/debug/usb/ohci 目录
ohci_s3c2410_init
ohci_s3c2410_init
	platform_driver_register(&ohci_hcd_s3c2410_driver);
		ohci_hcd_s3c2410_probe
			两个行为
				硬件行为
					为 port 供电  // s3c2410_usb_set_power 
					初始化PHY
					为 HC 供时钟  // s3c2410_start_hc(dev, hcd);
				软件行为
					struct usb_hcd * hcd = usb_create_hcd(&ohci_s3c2410_hc_driver, &dev->dev, "s3c24xx");
					填充hcd 的 rsrc_start rsrc_len regs 
					// 以 第二个参数为 硬件中断号码,第三个参数为 中断flag , 调用 usb_add_hcd
					usb_add_hcd(hcd, dev->resource[1].start, 0); 
						// 里面注册中断函数
					// 让 usb 成为 唤醒源 TODO
					device_wakeup_enable(hcd->self.controller);
USB 设备类驱动(接口驱动)(不包括hub)相关
其他
设备driver
	usb_register_device_driver
接口driver
	usb_register
	usb_register_driver
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值