全志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事件
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、安装PC上的升级工具Livesuite.exe。      2、打开Livesuit      找到升级工具文件双击打开,如下图所示:      3、选择固件      点击上图的“否”关闭用户向导升级,并点击“选择固件”按钮选择后缀名为.img文件,如下图:      4、关闭电源      确保将I130关机(开机状态下,长按电源键8秒钟以上可强制断电关机)      5、按下组合键开始升级      按住I130平板的任意键(除了电源键,推荐音量+)不放开,再通过USB数据线连上电脑,然后快速连续点击电源键5-6次,记住此时千万不能松开开始按住的按键,直到电脑上出现下图界面时,松开所有键开始升级。      (注:如果此时弹出安装驱动程序的对话框,请把路径指向Livesuit安装目录下的UsbDriver文件夹,并按下一步提示完成驱动程序的安装)。      6、选择强制格式化升级      Livesuit提示“是否强制格式化”,点击“是”,则原先安装的APK全部被删除,点击否则原装APK不会删除。      推荐强制格式化,进行彻底更新升级!否则可能更新不彻底而变砖!      7、升级开始      弹出“确定要强制格式化”对话框,选择“是”,升级开始,如下图:      8、升级完成      固件更新过程大约持续3分半钟左右,请耐心等待,直到提示“升级成功”。   

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fiveyear_chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值