天天看點

[Android6.0][RK3399] Type-C 驅動流程分析

    • 基本概念
      • USB 控制器
        • OHCIOpen Host Controller Interface
        • UHCIUniversal Host Controller Interface
        • EHCIEnhanced Host Controller Interface
        • XHCIeXtensible Host Controller Interface
        • DWC3DRD
        • USB HOSTUSB HSICUSB OTG
      • TypeC Phy
    • 驅動代碼
      • 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

[Android6.0][RK3399] Type-C 驅動流程分析

驅動代碼

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