---
# System prepended metadata

title: Type-C OIAC Cable

---

Type-C OIAC Cable
===

Active_Cable
---
特點:
1. E-Marker
2. Repeater, 包含 `Re-Timer` or  `Re-Drive`
3. 至少支援 USB 3.2 Gen 2x2
4. 支援 USB PD eMarkers，並**可能**支援 `Alternate Modes`

變體:
#### Hybrid Optical Active Cables
使用銅線傳輸電源和 USB 2.0 資料，但高速度訊號（TX/RX）使用光纖傳輸。
#### Optically Isolated Active Cables
* **內部方向性**(==開發者自行設計==)，僅限於兩端Cable溝通，但是使用上不分方向  
* `使用光纖傳輸高速度訊號`（TX/RX）
* 不傳輸 `VBUS`、`VCONN`、`GND`、`SBx(若支援Alternate Mode會傳輸)` and `USB2.0`，每端主機/裝置需自供電並供應 VCONN
* `雙端供電` VCONN 和 USB Power Delivery (PD) 來建立 DFP-UFP 連結
* 長距離傳輸（最高可達 50 公尺）
![image](https://hackmd.io/_uploads/ryuRgyp2xl.png)
> The following features are optional:
> * DP Alternate Mode.
> * USB 2.0.
> * USB PD Unchunked Messages.
> * For USB4 Gen4 OIAC, USB4 Asymmetric Mode.
> 
![image](https://hackmd.io/_uploads/By-G1a32xg.png)


OIAC
---
#### Requirements
[Optically Isolated Active Cables](#Active_Cable)
##### 兩端Host/Device要求:
* 供應 `VCONN`。
* 支援 `USB PD`。
* 初始為 `Sourc DFP`。
* Dual Role Data（至少一端接受 `DR_Swap`）。

##### OIAC_USB_PD_Requirements
support USB PD Revision 3, Version 1.6 or later.
* SOP’/SOP”:
    * `Discover_Identity` and `Get_Status` on `SOP’`
    * `SOP”`controller is `not required ` 
    * Get_Status of **SOP’** will respond with **Thermal Shutdown** and **temperature information of the worst case** of both cable ends.
* USB4 Gen4-capable OIAC 
    * may optionally support USB4 Asymmetric Mode. 
    * This support shall be reported in
the USB PD Active Cable VDO2 (Bit 1) response.

* USB PD Message Handling
==這些 Messages 不會到另一端!!!==, 其他  PD messages 都會到另一端
  ![image](https://hackmd.io/_uploads/SJedc1p3xx.png =70%x)
    * Reset (Hard, Cable, Soft, Data)
        * All Resets (Cable, Hard, Data, Soft) will be `handled the same` by the OIAC and all be treated as `Hard Reset`
            1. Detect the Reset ordered set,
            2. Forward “disconnect event” to the `remote plug`
            3. Remove `Rd`
            
            At the Remote OIAC Plug:
            1. 接收 “disconnect event”
               Note: 可以用任何方式轉達“disconnect event”
            2. Remove `Rd`
            
    * Locally-Handled Messages
    **See Spec**
    > 6.3.4.3.2 Locally-Handled SOP USB PD Messages Received by the OIAC Plug
    * Conditional Response Messages
        * Accept
        * Reject
        * Wait
        
    ![image](https://hackmd.io/_uploads/HJddde6hgg.png =80%x)
    ![image](https://hackmd.io/_uploads/SJwKdl6nxx.png =80%x)

---
#### Internal Cable Messages
The actual **definition and implementation** of each message is left to the **implemente**r.
用於兩端Cable溝通, 因內部方向性, 某些 Messages 只會有一端會發送 e.g. Plug-A -> Plug-B，但是還是==依照開發者自行設計==
:::spoiler Internal Cable Messages List
* MSG_Keep_Alive (Informative)
* MSG_Keep_Alive_ACK
* MSG_Port_Capabilities
* MSG_Cable_Config
* MSG_Release_Remote_SourceCap_GoodCRC
* MSG_DR_Swap_Init
* MSG_DR_Swap_Reject
* MSG_DR_Swap_Accept
* MSG_Force_Detach
* MSG_Reset
* MSG_Acknowledgement
:::

---
#### Data Role Swap in Active State
:::spoiler Successful
![image](https://hackmd.io/_uploads/rJUyqe6nle.png =70%x)
:::
:::spoiler Rejected
![image](https://hackmd.io/_uploads/r1aP5lThxe.png =70%x)
:::
:::spoiler Wait
![image](https://hackmd.io/_uploads/BkT5qxTngl.png =70%x)
:::
:::spoiler Initiator Reject
![image](https://hackmd.io/_uploads/rk2A5eahge.png =70%x)
:::
:::spoiler Initiator Wait
![image](https://hackmd.io/_uploads/r1EiTe6hle.png =70%x)
:::

---
#### Connection Flow
1. **Discovery** – Phase 1
* ==這階段會決定好 DFP/UFP, 到 Phase 3 再做 DR_Swap==
* 兩端Host/Device都是DRD的話, Plug A當DFP
![image](https://hackmd.io/_uploads/SJij6Z6hxl.png  =70%x)

2. **Reboot** – Phase 2
* Plug-A will always start by repeatedly sending `MSG_Cable_Config` to Plug-B to start reboot.
* Plug-B Reboots
* Plug-B sees `MSG_Cable_Config` and holds off on `SourceCap GoodCRC` until it is allowed to release it.
* Plug-B sends `MSG_Cable_Config` to Plug-A.
* Plug-A Reboots
* Plug-A sees `MSG_Cable_Config` and holds off on `SourceCap GoodCRC` until it is allowed to release it.
![image](https://hackmd.io/_uploads/r1aaalfTge.png =70%x)



3. **Configuration** – Phase 3
* The side that issues the `DR_Swap` send a `DR_Swap` and **releases** the other side `SourceCap GoodCRC`.
![image](https://hackmd.io/_uploads/Sk7e_Wz6ge.png)

:::spoiler Plug-A → DFP
![image](https://hackmd.io/_uploads/S1_dD-zpll.png)
:::
:::spoiler Plug-A → UFP
![image](https://hackmd.io/_uploads/ByJmdbfTll.png)
:::
:::spoiler Billboard/no connection
![image](https://hackmd.io/_uploads/B1qBRZGTex.png)
:::

#### Connection State Diagrams Plug-A
The following sections detail a ==possible== OIAC state diagram for Plug-A
:::spoiler Phase 1 and 2
![image](https://hackmd.io/_uploads/SkPG0bzplg.png)
* ==M1==
進入 `Attached.SNK`，禁用 USB 3.2 (RTSSM eSS.Disabled)，等待 MSG_Cable_Config 或 Timeout (~100ms)。
    :::info
    Timeout -> ==M2==
    Receive MSG_Cable_Config(Plug-A is DFP) -> ==M8==
    Receive MSG_Cable_Config(Plug-A is UFP) -> ==M10==
    :::
* ==M2==
建立初始 PD 合約，回應 Source Capabilities(對接的Host/Device) 以 default RDO (5V @ 0A)，評估 DRD 能力
    1. Send a `GoodCRC` in response to a [`Source Capabilities`](#OIAC_USB_PD_Requirements) message from the local attached port
    2. Evaluate the local attached port’s DRD capability (as indicated in the `Source Capabilities` message)
    3. Respond to the Source Capabilities message with the “default” RDO specified in Section 6.3.4.3.2.1.2.
    :::info
    Receive MSG_Port_Capabilities
    -Plug-A is DRD and Plug-B port is DRD/DFP -> ==M3==
    -Plug-A is DFP and Plug-B port is DRD -> ==M4==
    Plug-A and Plug-B are connected to DFP -> ==M5==
    
    :::
:::
:::spoiler Phase 3
![image](https://hackmd.io/_uploads/B1dQ_mfaxl.png)
:::




Ref
---
1. Universal Serial Bus Type-C Cable and Connector Specification, Release 2.4 October 2024