全志V3s USB控制器驱动分析

USB Controler与USB PHY

参考:
USB芯片到底完成了哪些工作?
usb-phy

设备树节点

ehci0: usb@01c1a000 {
	compatible = "allwinner,sun8i-v3s-ehci", "generic-ehci";
	reg = <0x01c1a000 0x100>;
	interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
	clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>;
	resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
	status = "disabled";
};
ohci0: usb@01c1a400 {
	compatible = "allwinner,sun8i-v3s-ohci", "generic-ohci";
	reg = <0x01c1a400 0x100>;
	interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
	clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>,
		 <&ccu CLK_USB_OHCI0>;
	resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
	status = "disabled";
};

控制器驱动源码路径

linux-5.1.0\drivers\usb\host\ohci-platform.c
linux-5.1.0\drivers\usb\host\ehci-platform.c

控制器结构体与注册到核心层

linux-5.1.0\include\linux\usb\hcd.h
struct usb_hcd; // usb_hcd —— USB Host Controller Driver
通过usb_create_hcd创建一个usb_hcd对象。

linux-5.1.0\drivers\usb\core\hcd.c
int usb_add_hcd(struct usb_hcd *hcd, unsigned int irqnum, unsigned long irqflags);
将usb_hcd对象加入到usb核心层

硬件连接大概

在这里插入图片描述

core层初始化序列

linux-5.1.0\drivers\usb\core\usb.c
static int __init usb_init(void)
	retval = bus_register(&usb_bus_type); // struct bus_type usb_bus_typ,其中有match函数匹配驱动与设备
	retval = usb_hub_init();
		linux-5.1.0\drivers\usb\core\hub.c
		if (usb_register(&hub_driver) < 0);
			.probe =	hub_probe, // 等待hub device (usb_new_device) 
		hub_wq = alloc_workqueue("usb_hub_wq", WQ_FREEZABLE, 0);  // hub_wq 该wq暂时未跑起来

hcd(host controller driver)注册到core层的序列

linux-5.1.0\drivers\usb\host\ohci-platform.c
static int ohci_platform_probe(struct platform_device *dev)
	linux-5.1.0\drivers\usb\core\hcd.c
	err = usb_add_hcd(hcd, irq, IRQF_SHARED);
		/* starting here, usbcore will pay attention to this root hub */
		retval = register_root_hub(hcd); // root register也是core的hcd中提供
			retval = usb_new_device (usb_dev);
				linux-5.1.0\drivers\usb\core\hub.c
				err = device_add(&udev->dev); // 添加设备,hub_probe会被调用
					hub_probe
						// hub event的初始化
						INIT_WORK(&hub->events, hub_event); // hub_event 会被queue_work触发,传递的参数是hub->events
							hub_event // 当queue_work触发
								hub = container_of(work, struct usb_hub, events); // events只是用来传usb_hub(子类与父类)
						// hub 的配置
						if (hub_configure(hub, &desc->endpoint[0].desc) >= 0)
							// hub usb中断事件
							usb_fill_int_urb(hub->urb, hdev, pipe, *hub->buffer, maxp, hub_irq,hub, endpoint->bInterval);
								// 当hub usb 中断触发
								static void hub_irq(struct urb *urb)
									// 触发hub event
									kick_hub_wq(hub);
			usb_hc_died (hcd)
				linux-5.1.0\drivers\usb\core\hub.c  // hub与hcd一样,是core中独立的一个文件
				/* make hub_wq clean up old urbs and devices */
				usb_set_device_state (hcd->self.root_hub, USB_STATE_NOTATTACHED);
				usb_kick_hub_wq(hcd->self.root_hub);
					// 触发hub event
					kick_hub_wq(hub);
						if (queue_work(hub_wq, &hub->events)) // hub_wq, 就是core层初始化时候的wq
							static void hub_event(struct work_struct *work) // 处理hub事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fiveyear_chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值