-
- 基本概念
- USB 控制器
- OHCIOpen Host Controller Interface
- UHCIUniversal Host Controller Interface
- EHCIEnhanced Host Controller Interface
- XHCIeXtensible Host Controller Interface
- DWC3DRD
- USB HOSTUSB HSICUSB OTG
- TypeC Phy
- USB 控制器
- 驅動代碼
- typec_phy 結構體
- probe 流程
- 參考
- 基本概念
基本概念
USB 控制器
OHCI(Open Host Controller Interface)
是支援USB1.1的标準,但它不僅僅是針對USB,還支援其他的一些接口,比如它還支援Apple的火線(Firewire,IEEE 1394)接口。與UHCI相比,OHCI的硬體複雜,硬體做的事情更多,是以實作對應的軟體驅動的任務,就相對較簡單。主要用于非x86的USB,如擴充卡、嵌入式開發闆的USB主要。
UHCI(Universal Host Controller Interface)
**是Intel主導的對USB1.0、1.1的接口标準,與OHCI不相容。**UHCI的軟體驅動的任務重,需要做得比較複雜,但可以使用較便宜、較簡單的硬體的USB控制器。Intel和VIA使用UHCI,而其餘的硬體提供商使用OHCI。
EHCI(Enhanced Host Controller Interface)
是Intel主導的USB2.0的接口标準。
XHCI(eXtensible Host Controller Interface)
是最新的USB3.0的接口标準,它在速度、節能、虛拟化等方面都比前面3中有了較大的提高。
xHCI支援所有種類速度的USB裝置(USB 3.0 SuperSpeed, USB 2.0 Low-, Full-, and High-speed, USB 1.1 Low- and Full-speed)。xHCI的目的是為了替換前面3種(UHCI/OHCI/EHCI)。
DWC3(DRD )
is a SuperSpeed (SS) USB 3.0 Dual-Role-Device (DRD) from Synopsys.
特性:
The SuperSpeed USB controller features:
Dual-role device (DRD) capability:
Same programming model for SuperSpeed (SS), High-Speed (HS), Full-Speed (FS), and Low-Speed (LS)
Internal DMA controller
LPM protocol in USB 2.0 and U0, U1, U2, and U3 states for USB 3.0
USB HOST、USB HSIC、USB OTG
USB2.0 HOST(EHCI&OHCI):隻能做主機(接電腦無法識别,因為電腦也是 HOST)。
USB HSIC(EHCI):輸出的不是普通的USB信号,而是XhsicSTROBE1,和XhsicDATA1的信号,必須接USB信号轉換出來。
USB2.0/3.0 OTG(DWC3/XHCI):既能做主機也能做從機,因為有USB的ID腳,可以識别是主機從機。
TypeC Phy
驅動代碼
typec_phy 結構體
先看一下 typec_phy 的結構體
struct rockchip_typec_phy {
struct device *dev;
void __iomem *base;
struct extcon_dev *extcon;
struct regmap *grf_regs;
struct clk *clk_core;
struct clk *clk_ref;
struct reset_control *uphy_rst;
struct reset_control *pipe_rst;
struct reset_control *tcphy_rst;
struct rockchip_usb3phy_port_cfg port_cfgs;
/* mutex to protect access to individual PHYs */
struct mutex lock;
bool flip;
u8 mode;
};
probe 流程
rockchip_typec_phy_probe
{
1. typec_phy_pre_init(tcphy);
property_enable(tcphy, &cfg->external_psm, 1);
property_enable(tcphy, &cfg->usb3tousb2_en, 0);
*/
2. for_each_available_child_of_node(np, child_np)
用這個宏看是否有子節點,如果有就把資料放到子節點的私有資料中(dev_set_drvdata)
3. phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
實際上就是 list_add_tail(&phy_provider->list, &phy_provider_list);
将隊列 phy_provider->list 放到 phy_provider_list 這個隊列的尾部
}
參考
USB - wikipedia