for (i = 0; i < DPM_GetSinkCapHeader(port->dpm, port)->NumDataObjects; i++) { if (DPM_GetSinkCap(port->dpm, port)[i].FPDOSink.SupplyType == pdoTypeAugmented) { PPSRDO = i; port->PpsEnabled = AW_TRUE; } else { port->PortConfig.SinkRequestMaxVoltage = ((DPM_GetSinkCap(port->dpm, port)[i].FPDOSink.Voltage > port->PortConfig.SinkRequestMaxVoltage) ? DPM_GetSinkCap(port->dpm, port)[i].FPDOSink.Voltage : port->PortConfig.SinkRequestMaxVoltage); } }代码分析
时间: 2024-04-04 15:31:30 浏览: 18
这段代码的作用是获取USB Type-C端口的能力集,并根据能力集中的信息进行相关配置。其中,循环语句中的变量i表示循环的次数,循环次数为端口的数据对象数量,即能力集中包含的数据对象的数量。在循环内部,判断当前数据对象的供电类型是否为pdoTypeAugmented,如果是,则将PPSRDO变量赋值为当前循环次数i,并将端口的PpsEnabled配置项设置为AW_TRUE。如果当前数据对象的供电类型不是pdoTypeAugmented,则将当前数据对象的电压与端口的SinkRequestMaxVoltage配置项进行比较,将较大值赋值给端口的SinkRequestMaxVoltage配置项。最终,根据循环中的处理结果,完成对USB Type-C端口的相关配置。
相关问题
for (i = 0; i < DPM_GetSinkCapHeader(port->dpm, port)->NumDataObjects; i++) { if (DPM_GetSinkCap(port->dpm, port)[i].FPDOSink.SupplyType == pdoTypeAugmented) { PPSRDO = i; port->PpsEnabled = AW_TRUE; } else { /* 如果不是pps,判断 充电器的最大电压 是否大于 sink要求的最大电压 因为SinkRequestMaxVoltage=0*/ port->PortConfig.SinkRequestMaxVoltage = /* 所以SinkRequestMaxVoltage=DPM_GetSinkCap(port->dpm, port)[i].FPDOSink.Voltage */ ((DPM_GetSinkCap(port->dpm, port)[i].FPDOSink.Voltage > port->PortConfig.SinkRequestMaxVoltage) ? DPM_GetSinkCap(port->dpm, port)[i].FPDOSink.Voltage : port->PortConfig.SinkRequestMaxVoltage); } }代码分析
这段代码是在遍历 DPM_GetSinkCapHeader(port->dpm, port) 数据表中的所有数据对象。对于每个数据对象,它会检查是否是 pdoTypeAugmented 类型,如果是,就将 PPSPDO 变量设置为当前迭代的索引 i,并将 port->PpsEnabled 标记设置为 true。如果不是 pdoTypeAugmented 类型,它会将充电器的最大电压与 sink 要求的最大电压进行比较,并将 port->PortConfig.SinkRequestMaxVoltage 设置为两者中的较大值。总的来说,这段代码是用于设置 USB Type-C 端口的配置信息。
if (port->PpsEnabled && PPSAPDO) { /* Req current (50mA units) and voltage (20mV units) */ port->SinkRequest.PPSRDO.ObjectPosition = PPSAPDO; if (port->SrcCapsReceived[PPSAPDO - 1].PPSAPDO.MaxCurrent >= DPM_GetSinkCap(port->dpm, port)[PPSRDO].PPSAPDO.MaxCurrent) port->SinkRequest.PPSRDO.OpCurrent = DPM_GetSinkCap(port->dpm, port)[PPSRDO].PPSAPDO.MaxCurrent; else port->SinkRequest.PPSRDO.OpCurrent = port->SrcCapsReceived[PPSAPDO - 1].PPSAPDO.MaxCurrent; port->SinkRequest.PPSRDO.Voltage = DPM_GetSinkCap(port->dpm, port)[PPSRDO]. PPSAPDO.MinVoltage * 5; }代码分析
这段代码实现的是如果一个端口的 PPS(Programmable Power Supply) 功能已经启用,并且 PPSAPDO(PPS Alternate Mode Object)不为 NULL,那么会向 Sink 发送请求获取当前的电压和电流。具体的实现如下:
- 首先,设置端口的 SinkRequest.PPSRDO.ObjectPosition 为 PPSAPDO。
- 然后,判断 PPSAPDO 对应的 SrcCapsReceived 中的最大电流是否大于等于当前 Sink 的最大电流,如果是,则将 SinkRequest.PPSRDO.OpCurrent 设置为当前 Sink 的最大电流,否则设置为 PPSAPDO 对应的 SrcCapsReceived 中的最大电流。
- 最后,将 SinkRequest.PPSRDO.Voltage 设置为当前 Sink 的最小电压乘以 5。
这段代码主要是用于实现 USB-PD 协议中的 PPS 功能,根据不同的电源和设备需求,可以动态调整电流和电压,从而实现更为高效的充电。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)