持续创作,加速成长!这是我参与「掘金日新计划 · 6月更文挑战」的第31天,点击查看活动详情
简介
USB的Type-C接口,通常来说一个典型的UCSI系统由三个组成部分,分别是OPM、PPM、LPMs。那么,在这个时候,EC应该只是作为操作系统和CCGX之间的一个协议转换器。UCSI的主要相关操作如下,为避免出现不可预知的错误,都需按照这样的方法进行。
一、CCG5 UCSI启动
- 启动UCSI命令(0x01->0x0039)应该由EC发送。
- a. 该命令必须在UCSI驱动程序启动之前发送。
- b. 这条命令必须在CCG5复位后发送完成。 2.EC在启动UCSI后需要检查UCSI版本。 直到EC从CCGX的UCSI接口读取VERSION寄存器,它应该忽略来自OPM的所有信息。
二、CCG5 UCSI 禁用
- UCSI驱动将在S5时停止运行,所以EC需要发送命令来禁用UCSI。
- EC需要每次启动CCG5 UCSI S5->S0,并停止UCSI S0->S5。
三、OPM<->CCG5,数据交换过程
- OPM(UCSI 驱动)通过调用 BIOS 方法向 EC 发送信息。
- BIOS 将通过 6266 端口向 EC RAM 发送信息,然后向 EC 写入一个标志,表示数据已被写入。
- EC 将信息传输到 PD(CCG5),然后清除 BIOS 的写入标志。
- 如果 Type_C 端口有任何变化,CCG5 将断言INTR,EC 需要读取 UCSI 信息。然后 EC 发送 Q_Event(0x79),通知 BIOS 读取信息。
- BIOS 必须从 EC 读取信息,然后向 EC 写入一个标志。数据已经被读取。在这之后,BIOS 将通知 UCSI 驱动程序来获取信息。
- 在 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;
}
}
五、完结
本章结束,撒花。