AW_LOG("Received.NumDataObjects = %d\n", chip->port.SrcCapsHeaderReceived.NumDataObjects); for (i = chip->port.SrcCapsHeaderReceived.NumDataObjects; i > 0; i--) { if (chip->port.SrcCapsReceived[i - 1].PDO.SupplyType == pdoTypeAugmented) { apdo_num = i; break; } if (i == 1) { AW_LOG("The source does not support the PPS function\n"); return AW_FALSE; } }代码分析
时间: 2024-04-03 13:36:37 浏览: 7
这段代码的功能是读取一个变量 "NumDataObjects" 的值,并将其作为循环的次数。在每次循环中,它检查一个数组中的元素,如果这个元素的 "SupplyType" 值等于 "pdoTypeAugmented",则将一个变量 "apdo_num" 赋值为当前循环次数,并退出循环。如果整个数组都没有符合条件的元素,则输出一条错误信息并返回 FALSE。
这段代码的作用应该是在某种设备的驱动程序中,用于检查设备是否支持某种功能。具体来说,它读取了一个数据包中的 "NumDataObjects" 字段,该数据包可能包含了设备支持的各种功能的描述信息。然后,它遍历了这个描述信息数组,寻找其中是否有被标记为 "pdoTypeAugmented" 的描述信息。如果有,则意味着设备支持该功能,并将 "apdo_num" 设置为该描述信息在数组中的位置。如果没有找到,则意味着设备不支持该功能,并返回 FALSE。
相关问题
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 端口的配置信息。
void PolicySinkSelectCapability(Port_t *port) { /* AW_LOG("enter PolicySubIndex = %d\n", port->PolicySubIndex); */ switch (port->PolicySubIndex) { case 0: if (PolicySendData(port, DMTRequest, &port->SinkRequest, sizeof(doDataObject_t), peSinkSelectCapability, 1, SOP_TYPE_SOP, AW_FALSE) == STAT_SUCCESS) { TimerStart(&port->PolicyStateTimer, tSenderResponse); port->WaitingOnHR = AW_TRUE; } break; case 1: if (port->ProtocolMsgRx) { port->ProtocolMsgRx = AW_FALSE; if (port->PolicyRxHeader.NumDataObjects == 0) { switch (port->PolicyRxHeader.MessageType) { case CMTAccept: /* Check if PPS was selected (Here as well, for GUI req) */ port->PpsEnabled = (port->SrcCapsReceived[port->SinkRequest.FVRDO.ObjectPosition - 1].PDO.SupplyType == pdoTypeAugmented) ? AW_TRUE : AW_FALSE; port->PolicyHasContract = AW_TRUE; port->USBPDContract.object = port->SinkRequest.object; TimerStart(&port->PolicyStateTimer, tPSTransition); SetPEState(port, peSinkTransitionSink); if (port->PpsEnabled == AW_TRUE) TimerStart(&port->PpsTimer, tPPSRequest); break; case CMTWait: case CMTReject: if (port->PolicyHasContract) SetPEState(port, peSinkReady); else { SetPEState(port, peSinkWaitCaps); /* Make sure we don't send reset to prevent loop */ port->HardResetCounter = nHardResetCount + 1; } break; case CMTSoftReset: SetPEState(port, peSinkSoftReset); break; default: SetPEState(port, peSinkSendSoftReset); break; } } else { switch (port->PolicyRxHeader.MessageType) { case DMTSourceCapabilities: UpdateCapabilitiesRx(port, AW_TRUE); SetPEState(port, peSinkEvaluateCaps); break; default: SetPEState(port, peSinkSendSoftReset); break; } } } else if (TimerExpired(&port->PolicyStateTimer)) { SetPEState(port, peSinkSendHardReset); } else { port->PEIdle = AW_TRUE; } break; } }代码分析
这是一个函数,函数名称为PolicySinkSelectCapability,其参数为指向Port_t类型的指针port。
该函数的作用是选择Sink的能力并发送请求。
函数采用switch语句根据port->PolicySubIndex的值来进行不同的操作。当PolicySubIndex为0时,函数会调用PolicySendData函数发送一个DMTRequest类型的请求,并启动定时器TimerStart。当PolicySubIndex为1时,函数会判断port->ProtocolMsgRx的值,如果为真,则进行一系列的判断,根据接收到的消息类型进行不同的操作;如果为假,则判断定时器TimerExpired的值,如果为真,则调用SetPEState函数设置电源协商状态,并进行相应的操作;否则,将port->PEIdle的值设置为真。
在具体的操作中,当接收到的消息类型为CMTAccept时,会设置port->PpsEnabled的值,并启动定时器TimerStart;当接收到的消息类型为CMTWait或CMTReject时,如果已经有合同,则设置电源协商状态为peSinkReady;否则,设置电源协商状态为peSinkWaitCaps,并将port->HardResetCounter的值设置为nHardResetCount + 1;当接收到的消息类型为CMTSoftReset时,设置电源协商状态为peSinkSoftReset;否则,设置电源协商状态为peSinkSendSoftReset。
当接收到的消息类型为DMTSourceCapabilities时,调用UpdateCapabilitiesRx函数更新接收到的能力,并设置电源协商状态为peSinkEvaluateCaps;否则,设置电源协商状态为peSinkSendSoftReset。