赞
踩
本文主要讲述usb 2.0 host 中struct phy、struct usb_hcd、struct usb_hub、struct usb_port以及struct urb之间的关系。hcd方面只讲述echi,不讲述ohci。理解了它们的关系有助于我们移植usb驱动。
先来理清几个概念:
1、usb controller:USB主机控制器。CPU通过主机控制器跟usb设备进行通信。CPU把要做的事情告诉主机控制器,主机控制器帮CPU把事情完成后以中断的形式告诉CPU。主机控制器对应的驱动叫做usb hcd,linux使用struct usb_hcd描述USB主机控制器。
2、usb phy:usb物理层。它负责最底层的信号转换,类似网口的phy。他有有两种接口,一种是ULPI,一种是UTMI。UTMI是USB2.0的高速设备检测协议,它需要具备能够检测设备是高速端口还是全速端口的功能,并以作相应的速度模式进行工作。从4412的usb框架图可以看出4412芯片上的phy使用的是UTMI。如图1 所示。但是4412的ehci主机控制器并不需要usb phy,只需要phy相关的就行。
3、usb hub:集线器。4412芯片内有一个root hub(如图3),它属于EHCI Host Controller,可以看出它具有3个usb port。所以在注册EHCI相关驱动后会去注册usb device(usb_bus的root_hub),由于它是一个root_hub所以会调用root_hub的hub_probe。这里不止有一个hub哦,因为外挂的usb芯片4604也是属于一个hub,所以当检测到4604之后,会再生成一个hub。
4、usb port:usb端口。4412的root hub(如图3)有3个port,一个给了microUSB,一个给了usb4604(外挂usb usb芯片),一个没有接线。这个usb port的数量是通过hub的描述符获取的。
图1 usb phy UTMI功能模块描述图
图2 4412 USB System Block Diagram
图3 4412 USB 2.0主机控制器模块单元
以下框架图描述的是Exynos4412平台usb2.0 host模式下的程序框架,并非物理框架和数据流动框架。
1、phy层
phy有四类:device、host、hsic0、hsic1。由exynos4x12_phy_id和exynos4x12_phys指定。4412实例化了4个struct phy,存放在struct samsung_usb2_phy_driver的成员instances[0]成员中。hcd层通过exynos_ehci_hcd结构体可以访问到stuct phy。phy还提供了phy_ops,通过它可以设置对应链路为device模式,host模式,phy时钟,还有使能/失能hsic0、hsic1。
2、hcd
hcd层以stuct usb_hcd为核心。它主要有两个功能,一个是通过ehci_hcd去操作phy层,一个是通过hc_driver去操作上层传递下来的urb数据包。
3、hub层
hub层以struct usb_hub为核心。它主要负责检测端口状态,处理插入/拔出的设备,创建/删除usb_device,对于新插入的设备会去匹配他的设备驱动程序,然后调用相关probe函数。
4、urb层
urb是一种用来描述与USB设备通信所用的基本载体和核心数据结构,与网络设备驱动中的sk_buff结构体类似。
接下来分析代码,一些可以通过框架图看出来的指针关系我不会特地去列出他们的赋值代码。
首先来看下phy的相关dts
# exynos4.dtsi
sys_reg: syscon@10010000 {
compatible = "samsung,exynos4-sysreg", "syscon";
reg = <0x10010000 0x400>;
};
exynos_usbphy: exynos-usbphy@125B0000 {
compatible = "samsung,exynos4210-usb2-phy";
reg = <0x125B0000 0x100>;
samsung,pmureg-phandle = <&pmu_system_controller>;
clocks = <&clock CLK_USB_DEVICE>, <&clock CLK_XUSBXTI>;
clock-names = "phy", "ref";
#phy-cells = <1>;
status = "disabled";
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。