ZHCU943A November   2020  – July 2022 TPS25750

 

  1.   请先阅读
    1.     关于本手册
    2.     命名惯例
    3.     术语表
    4.     相关文档
    5.     支持资源
    6.     商标
  2. 1引言
    1. 1.1 引言
      1. 1.1.1 用途和范围
    2. 1.2 PD 控制器主机接口说明
      1. 1.2.1 概述
      2. 1.2.2 寄存器和字段表示法
    3. 1.3 唯一地址接口
      1. 1.3.1 唯一地址接口协议
      2. 1.3.2 唯一地址接口寄存器
  3. 2唯一地址接口寄存器详细说明
    1. 2.1  0x03 MODE 寄存器
    2. 2.2  0x0D DEVICE_CAPABILITIES 寄存器
    3. 2.3  0x14 - 0x19 INT_EVENT、INT_MASK、INT_CLEAR 寄存器
    4. 2.4  0x1A STATUS 寄存器
    5. 2.5  0x26 POWER_PATH_STATUS 寄存器
    6. 2.6  0x29 PORT_CONTROL 寄存器
    7. 2.7  0x2D BOOT_STATUS 寄存器
    8. 2.8  0x30 RX_SOURCE_CAPS 寄存器
    9. 2.9  0x31 RX_SINK_CAPS 寄存器
    10. 2.10 0x32 TX_SOURCE_CAPS 寄存器
    11. 2.11 0x33 TX_SINK_CAPS 寄存器
    12. 2.12 0x34 ACTIVE_CONTRACT_PDO 寄存器
    13. 2.13 0x35 ACTIVE_CONTRACT_RDO 寄存器
    14. 2.14 0x3F POWER_STATUS 寄存器
    15. 2.15 0x40 PD_STATUS 寄存器
    16. 2.16 GPIO 事件
    17. 2.17 0x69 TYPEC_STATE 寄存器
    18. 2.18 0x70 SLEEP_CONFIG 寄存器
    19. 2.19 0x72 GPIO_STATUS 寄存器
  4. 34CC 任务详细说明
    1. 3.1 概述
    2. 3.2 PD 消息任务
      1. 3.2.1 'SWSk' - PD PR_Swap 到受电方
      2. 3.2.2 'SWSr' - PD PR_Swap 到供电方
      3. 3.2.3 'SWDF' - PD DR_Swap 到 DFP
      4. 3.2.4 'SWUF' - PD DR_Swap 到 UFP
      5. 3.2.5 'GSkC' - PD 获取受电方能力
      6. 3.2.6 'GSrC' - PD 获取供电方能力
      7. 3.2.7 'SSrC' - PD 发送供电方能力
    3. 3.3 补丁捆绑包更新任务
      1. 3.3.1 'PBMs' - 启动补丁突发模式下载序列
      2. 3.3.2 'PBMc' - 补丁突发模式下载完成
      3. 3.3.3 'PBMe' - 结束补丁突发模式下载序列
      4. 3.3.4 补丁突发模式示例
      5. 3.3.5 'GO2P' - 转到补丁模式
    4. 3.4 系统任务
      1. 3.4.1 'DBfg' - 清除电池电量耗尽标志
      2. 3.4.2 'I2Cr' - I2C 读取事务
      3. 3.4.3 'I2Cw' - I2C 写入事务
  5. 4用户参考
    1. 4.1 PD 控制器应用程序自定义
    2. 4.2 加载补丁捆绑包
  6. 5修订历史记录

补丁突发模式示例

命令

  • PBMs:'PBMs' 任务启动补丁加载序列。此任务初始化固件以准备补丁捆绑包加载序列并指示补丁捆绑包中包含的内容。
  • PBMc:'PBMc' 任务结束补丁加载序列。此命令应在所有补丁数据传输完毕后执行。此任务启动对已传输的二进制补丁数据进行的 CRC 校验,如果 CRC 成功,则执行补丁中包含的 patch_init 函数。如果此任务在 'PBMs' 启动任务之前发送,则会向 PD 控制器指示没有可用的补丁并绕过补丁过程。
  • PBMe:'PBMe' 任务结束补丁加载序列。此任务指示 PD 控制器完成补丁加载过程。
  • PTCr:此任务将补丁固件重置为无补丁状态。

1.器件生成一个 I2C 中断 INT_EVENT.ReadyForPatch,表明其已准备好进行修补。主机只有在收到器件发出的此通知后才会启动补丁下载过程。

2.主机应通过向器件发送 PBMs 命令来启动补丁下载过程。

3.主机随后应发送整个补丁捆绑包数据。主机可以在单个 I2C 事务中发送整个补丁捆绑包,也可以将其拆分为多个事务。PD 控制器会递增其补丁存储器空间的指针,并在补丁从器件地址(在 'PBMs' 4CC 任务中进行配置)上接收每个字节。

4.主机随后应发送 PBMc 命令以指示 PD 控制器补丁加载序列已完成。成功完成引导序列后,PD 控制器开始执行应用程序。

若要执行 4CC 命令,主机应用程序应遵循以下顺序:

  • 如果 4CC 命令需要输入,应用程序应首先将输入数据写入 DataX(0x09 或 0x11)寄存器。

  • 应用程序随后应将 4CC 命令字符写入相应的 CmdX(0x08 或 0x10)寄存器。

  • 应用程序可以注册并等待 CmdXComplete 事件或重复读取 CmdX 寄存器的四字节内容,直至读取到:

    • 0x00',表示命令执行成功。

    • 或 '!CMD',表示命令执行失败。

  • 如果命令成功执行,应用程序将继续读取包含输出的 DataX 寄存器 'n' 字节内容。

执行流程

GUID-20210628-CA0I-8SGD-5N6X-B9LKT7DHXJCC-low.png

示例代码

1.

void AsyncEvtHandlerP11()

{

s_AppContext *const pCtx = &gAppCtx;

I2C_IF_TPS6598xIntDisable(pCtx->i2cPort);

ProcessEvent();

}

static int32_t ProcessEvent()

{

s_AppContext *const pCtx = &gAppCtx;

s_AppData *const pData = &gAppData[pCtx->i2cPort];

uint8_t outdata[MAX_BUF_BSIZE] = {0};

uint8_t indata[MAX_BUF_BSIZE] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

s_TPS_IntEvent *pSetEvent = NULL;

s_TPS_IntEvent *pClrEvent = NULL;

int32_t retVal = -1;

#ifdef WORKAROUND_WAIT_AFTER_GAID

if(0 == wait_after_gaid)

{

wait_after_gaid += 1;

/*

* The 100ms delay here is to allow the device to ACK the I2C transactions

* after a cold start

*/

Board_IF_Delay(100000);

}

#endif /* WORKAROUND_WAIT_AFTER_GAID */

retVal = ReadReg(pData->event_reg, REG_LEN_INTEVENT1, &outdata[0]);

RETURN_ON_ERROR(retVal);

/*

* output[0] = Register's size in bytes

* output[1..REG_LEN_INTEVENT1] = Register's content, and hence '&outdata[1]' below.!

*/

pSetEvent = (s_TPS_IntEvent *)&outdata[1];

pClrEvent = (s_TPS_IntEvent *)&indata[0];

if(0 != pSetEvent->cmd1complete)

{

pData->cmdExeInProgress = 0;

pClrEvent->cmd1complete = 1;

}

if(0 != pSetEvent->readyforpatch)

{

pClrEvent->readyforpatch = 1;

SignalEvent(APP_EVENT_READY_FOR_PATCH);

}

if(0 != pSetEvent->patchloaded)

{

pClrEvent->patchloaded = 1;

SignalEvent(APP_EVENT_PATCH_LOADED);

}

/* App events are triggred - The corresponding events of the device can now be cleared */ retVal = WriteReg(pData->clear_reg, REG_LEN_INTCLEAR1, &indata[0]); RETURN_ON_ERROR(retVal);

return 0;

}

2.

static int32_t StartPatchDownloadBurstMode()

{

uint8_t outdata[MAX_BUF_BSIZE] = {0};

s_PBMs_InData pbmsInData = {0};

s_PBMs_OutData *p_pbmsOutData = NULL;

int32_t retVal = -1;

UART_PRINT("Starting Patch Download in Burst Mode\n\r");

retVal = ReadMode();

RETURN_ON_ERROR(retVal);

retVal = ReadVersion(); RETURN_ON_ERROR(retVal); /* If the device is in APP mode, don't allow burst-mode patch download */

if(isDeviceInAppMode())

{

UART_PRINT("Burst mode patching not allowed in APP mode\n\r");

retVal = -1;

goto error;

} /* Wait for CmdComplete event when executing the 4CC commands */

retVal = MaskCmdComplete(1);

RETURN_ON_ERROR(retVal); /* Fill the input, and execute 'PBMs' */

pbmsInData.lrBinSize = gSizeLowregionArray;

pbmsInData.slaveAddress = SLAVE_ADDR_FOR_PATCH_DATA;

pbmsInData.timeout = BURST_MODE_TIMEOUT;

retVal = ExecCmd(PBMs, sizeof(pbmsInData), (uint8_t *)&pbmsInData, \ PBMs_OUTPUT_SIZE, &outdata[0]);

RETURN_ON_ERROR(retVal); /* 'outdata' will contain the command's output after the successful execution of PBMs.*/

p_pbmsOutData = (s_PBMs_OutData *)&outdata[1];

if(PBMs_SUCCESS != p_pbmsOutData->patch_start_status)

{

ERR_PRINT(p_pbmsOutData->patch_start_status);

retVal = -1; goto error;

}

error: return retVal;

}

3.

可使用应用程序自定义 GUI 生成低区二进制 'C' 数组格式。以下代码段中引用的 tps6598x_lowregion_array 和 gSizeLowregionArray 取自这个生成的文件。

static int32_t DownloadDataBurstMode()

{

int32_t retVal = 0;

#ifdef WORKAROUND_IGNORE_CMDxCMPLT_BURST_TX

/*

* Workaround: Device was erroneously sending an unexpected CmdXComplete

* event occationally while in the middle of the patch download process,

* causing the SM to go for a toss.!

*/

MaskCmdComplete(0);

#endif /* WORKAROUND_IGNORE_CMDxCMPLT_BURST_TX */

/*

* tps6598x_lowregion_array and gSizeLowregionArray are defined

* in the 'C' array file that can be created using the

* Application customization GUI

*/

UART_PRINT(".");

SendDataToSlave(SLAVE_ADDR_FOR_PATCH_DATA, gSizeLowregionArray, (uint8_t *)&tps6598x_lowregion_array[0]);

/* Proceed to the next step after the patch is successfully downloaded */

UART_PRINT("\n\r");

SignalEvent(APP_EVENT_PATCH_DOWNLOADED);

return retVal;

}

4.

static int32_t PatchDownloadCompleteBurstMode()

{

s_AppContext *const pCtx = &gAppCtx;

/* PBMc return structure and statuses are exactly same as PTCc */

s_PTCc_OutData *p_pbmcOutData = NULL;

uint8_t outdata[MAX_BUF_BSIZE] = {0};

int32_t retVal = -1;

UART_PRINT("Patch Download Complete\n\r");

#ifdef WORKAROUND_IGNORE_CMDxCMPLT_BURST_TX

MaskCmdComplete(1);

#endif /* WORKAROUND_IGNORE_CMDxCMPLT_BURST_TX */

/* Execute PBMc to indicate to the device that the patch is successfully downloaded */

retVal = ExecCmd(PBMc, 0, NULL, PTCc_OUTPUT_SIZE, &outdata[0]);

RETURN_ON_ERROR(retVal);

/* 'outdata’ will contain the command's output after the successful execution of PBMc.*/

p_pbmcOutData = (s_PTCc_OutData *)&outdata[3];

if(p_pbmcOutData->patch_complete_status != PTCc_SUCCESS)

{

ERR_PRINT(p_pbmcOutData->patch_complete_status);

retVal = -1;

goto error;

}

/* Expecting 'PatchLoaded' event */

retVal = I2C_IF_TPS6598xIntEnable(pCtx->i2cPort);

RETURN_ON_ERROR(retVal);

error: return retVal;

}