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); } }代码分析
时间: 2024-04-04 12:30:02 浏览: 16
这段代码是在遍历 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 功能,根据不同的电源和设备需求,可以动态调整电流和电压,从而实现更为高效的充电。
void DPC_ObjectDetection_chirpEvent (DPM_DPCHandle handle) { ObjDetObj *objDetObj = (ObjDetObj *) handle; uint32_t margin; if(objDetObj->chirpIndex != 0) { margin = Cycleprofiler_getTimeStamp() - objDetObj->chirpEndTime; if(margin < objDetObj->chirpMargin) { /* Find the smallest margin to report as chirp margin */ objDetObj->chirpMargin = margin; } } else { /* Reset margin min */ objDetObj->chirpMargin = 0xffffffff; } /* Notify the DPM Module that the DPC is ready for execution */ DebugP_assert (DPM_notifyExecute (objDetObj->dpmHandle, handle, true) == 0); return; }详细讲一下这段代码里的语法
好的,以下是对这段代码中的语法进行详细讲解:
1. void
在这个函数的定义中,void 表示该函数没有返回值。
2. DPC_ObjectDetection_chirpEvent
这是函数的名称,用来标识这个函数。函数名一般以字母开头,可以包含字母、数字和下划线。
3. (DPM_DPCHandle handle)
这是函数的参数列表,用于接收外部传入的数据。在这个函数中,只有一个参数,类型为 DPM_DPCHandle,名称为 handle。参数列表用括号括起来,多个参数之间用逗号分隔。
4. ObjDetObj *objDetObj = (ObjDetObj *) handle;
这一行代码定义了一个指针变量 objDetObj,类型为 ObjDetObj*,并将参数 handle 强制转换为 ObjDetObj* 类型。这是一种常用的将 void 指针转换为其他类型指针的方法。
5. uint32_t margin;
这一行代码定义了一个无符号 32 位整数变量 margin。
6. if(objDetObj->chirpIndex != 0)
这是一个 if 语句,用于判断 objDetObj 指针所指向的结构体中的 chirpIndex 成员变量是否不等于 0。如果成立,则执行花括号中的代码块,否则跳过花括号中的代码块。
7. margin = Cycleprofiler_getTimeStamp() - objDetObj->chirpEndTime;
这一行代码计算 margin 变量的值,等于 Cycleprofiler_getTimeStamp() 函数的返回值减去 objDetObj 指针所指向的结构体中的 chirpEndTime 成员变量的值。
8. if(margin < objDetObj->chirpMargin)
这是一个 if 语句,用于判断 margin 变量的值是否小于 objDetObj 指针所指向的结构体中的 chirpMargin 成员变量的值。如果成立,则执行花括号中的代码块,否则跳过花括号中的代码块。
9. objDetObj->chirpMargin = margin;
这一行代码将 margin 的值赋给 objDetObj 指针所指向的结构体中的 chirpMargin 成员变量。
10. else
这是一个 else 语句,表示当 if 语句不成立时,执行花括号中的代码块。
11. objDetObj->chirpMargin = 0xffffffff;
这一行代码将 objDetObj 指针所指向的结构体中的 chirpMargin 成员变量的值设置为 0xffffffff。
12. DebugP_assert(DPM_notifyExecute(objDetObj->dpmHandle, handle, true) == 0);
这一行代码调用了 DPM_notifyExecute 函数,用于通知 DPM 模块该 DPC 准备好执行。如果函数返回值不等于 0,会触发 DebugP_assert 断言。
13. return;
这是函数的结束语句,用于将控制流返回到函数调用处。在这个函数中,没有返回值。