EC中的UCSI处理

733 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6月更文挑战」的第31天,点击查看活动详情

简介

USB的Type-C接口,通常来说一个典型的UCSI系统由三个组成部分,分别是OPM、PPM、LPMs。那么,在这个时候,EC应该只是作为操作系统和CCGX之间的一个协议转换器。UCSI的主要相关操作如下,为避免出现不可预知的错误,都需按照这样的方法进行。

一、CCG5 UCSI启动

  1. 启动UCSI命令(0x01->0x0039)应该由EC发送。
  • a. 该命令必须在UCSI驱动程序启动之前发送。
  • b. 这条命令必须在CCG5复位后发送完成。 2.EC在启动UCSI后需要检查UCSI版本。 直到EC从CCGX的UCSI接口读取VERSION寄存器,它应该忽略来自OPM的所有信息。

二、CCG5 UCSI 禁用

  1. UCSI驱动将在S5时停止运行,所以EC需要发送命令来禁用UCSI。
  2. EC需要每次启动CCG5 UCSI S5->S0,并停止UCSI S0->S5。

三、OPM<->CCG5,数据交换过程

  1. OPM(UCSI 驱动)通过调用 BIOS 方法向 EC 发送信息。
  2. BIOS 将通过 6266 端口向 EC RAM 发送信息,然后向 EC 写入一个标志,表示数据已被写入。
  3. EC 将信息传输到 PD(CCG5),然后清除 BIOS 的写入标志。
  4. 如果 Type_C 端口有任何变化,CCG5 将断言INTR,EC 需要读取 UCSI 信息。然后 EC 发送 Q_Event(0x79),通知 BIOS 读取信息。
  5. BIOS 必须从 EC 读取信息,然后向 EC 写入一个标志。数据已经被读取。在这之后,BIOS 将通知 UCSI 驱动程序来获取信息。
  6. 在 BIOS 读取信息后,EC 将清除 BIOS 读取标志。

需要注意的点:

1. PPM_RESET 命令可以在任何时候由 OPM 发送。OPM Message_Out 必须由 EC 优先处理。 2. EC和BIOS改变为共享内存来交换数据。

四、 示例

下面是关于UCSI处理的部分代码示例:

void Handle_UCSI(void)
{
    if (SystemNotS0)
	{
        if(SystemIsS5 || SystemIsG3)
        {
            if(IS_MASK_SET(CCG5_UCSI_Status, UCSI_Init_OK))
            {
                CCG5_UCSI_Disable();
            }
        }
		return;
	}

    // After UCSI init OK.
    // OPM must be priority send command to PPM(PPM_Reset maybe send any time)
    // So, EC need priority processing OPM command
    if(IS_MASK_CLEAR(CCG5_UCSI_Status, UCSI_Init_OK))
	{
		UCSI_Handel_Step = UCSI_Step_Init;
	}
    else if(BIOS_Write_Done == MailBox_UCSI_BIOS_WDone) // If BIOS write data to buffer
	{
		UCSI_Handel_Step = UCSI_Step_BIOS_To_EC;
	}
    else if(BIOS_Read_Done == MailBox_UCSI_BIOS_RDone) // If BIOS read data from buffer
    {
    	UCSI_Handel_Step = UCSI_Step_Idle;
        MailBox_UCSI_BIOS_RDone = 0;
    }
}

五、完结

本章结束,撒花。