46inline uint16_t
le16(
const uint8_t *p)
48 return (uint16_t)p[0] | ((uint16_t)p[1] << 8);
56inline uint32_t
le32(
const uint8_t *p)
58 return (uint32_t)p[0] |
59 ((uint32_t)p[1] << 8) |
60 ((uint32_t)p[2] << 16) |
61 ((uint32_t)p[3] << 24);
69inline void wr_le16(uint8_t *p, uint16_t v)
71 p[0] = (uint8_t)(v & 0xFF);
72 p[1] = (uint8_t)((v >> 8) & 0xFF);
80inline void wr_le32(uint8_t *p, uint32_t v)
82 p[0] = (uint8_t)(v & 0xFF);
83 p[1] = (uint8_t)((v >> 8) & 0xFF);
84 p[2] = (uint8_t)((v >> 16) & 0xFF);
85 p[3] = (uint8_t)((v >> 24) & 0xFF);
107 return (uint8_t)(
raw & 0x1F);
113 return ((
raw >> 5) & 0x1) != 0;
119 return (uint8_t)((
raw >> 6) & 0x3);
125 return ((
raw >> 8) & 0x1) != 0;
131 return (uint8_t)((
raw >> 9) & 0x7);
137 return (uint8_t)((
raw >> 12) & 0x7);
143 return ((
raw >> 15) & 0x1) != 0;
149 raw = (uint16_t)((
raw & ~0x001F) | (v & 0x1F));
155 raw = (uint16_t)((
raw & ~(1u << 5)) | ((uint16_t)dfp << 5));
161 raw = (uint16_t)((
raw & ~(3u << 6)) | ((uint16_t)(r & 0x3) << 6));
167 raw = (uint16_t)((
raw & ~(1u << 8)) | ((uint16_t)src << 8));
173 raw = (uint16_t)((
raw & ~(7u << 9)) | ((uint16_t)(
id & 0x7) << 9));
179 raw = (uint16_t)((
raw & ~(7u << 12)) | ((uint16_t)(n & 0x7) << 12));
185 raw = (uint16_t)((
raw & ~(1u << 15)) | ((uint16_t)ex << 15));
240 bool powerRoleSource,
249 h.setPowerRoleSource(powerRoleSource);
250 h.setSpecRev((uint8_t)specRev);
251 h.setDataRoleDfp(dataRoleDfp);
252 h.setMsgType((uint8_t)type);
270 bool powerRoleSource,
277 h.setObjCount(objCount);
279 h.setPowerRoleSource(powerRoleSource);
280 h.setSpecRev((uint8_t)specRev);
281 h.setDataRoleDfp(dataRoleDfp);
282 h.setMsgType((uint8_t)type);
313 return (
PdoType)((pdo >> 30) & 0x03);
326 uint16_t v50 = (uint16_t)((pdo >> 10) & 0x03FF);
327 uint16_t i10 = (uint16_t)(pdo & 0x03FF);
329 out.
mv = (uint16_t)(v50 * 50);
330 out.
ma = (uint16_t)(i10 * 10);
353 uint8_t objectPos1based,
356 bool capMismatch =
false,
357 bool usbCommCapable =
true,
358 bool noUsbSuspend =
true
361 if (objectPos1based < 1) objectPos1based = 1;
362 if (objectPos1based > 7) objectPos1based = 7;
364 uint16_t opI10 = (uint16_t)(opMa / 10);
365 uint16_t maxI10 = (uint16_t)(maxMa / 10);
366 if (opI10 > 0x3FF) opI10 = 0x3FF;
367 if (maxI10 > 0x3FF) maxI10 = 0x3FF;
370 rdo |= ((uint32_t)(objectPos1based & 0x0F) << 28);
371 rdo |= ((uint32_t)(capMismatch ? 1u : 0u) << 26);
372 rdo |= ((uint32_t)(usbCommCapable ? 1u : 0u) << 25);
373 rdo |= ((uint32_t)(noUsbSuspend ? 1u : 0u) << 24);
374 rdo |= ((uint32_t)(opI10 & 0x3FF) << 10);
375 rdo |= ((uint32_t)(maxI10 & 0x3FF) << 0);
USB Power Delivery protocol helper definitions.
PdoType pdoType(uint32_t pdo)
Return the type field of a raw PDO.
bool parseFixedSourcePdo(uint32_t pdo, FixedSourcePdo &out)
Parse a fixed source PDO.
SpecRev
USB-PD specification revision values used in message headers.
ControlMsg
USB-PD control message type field values.
@ PS_RDY
Power Supply Ready.
@ PR_Swap
Power Role Swap.
@ GetSinkCap
Get Sink Capabilities.
@ GetSourceCap
Get Source Capabilities.
DataMsg
USB-PD data message type field values.
@ SinkCapabilities
Sink_Capabilities.
@ BIST
Built-In Self Test.
@ SourceCapabilities
Source_Capabilities.
@ VendorDefined
Vendor Defined Message.
uint16_t buildControlHeader(ControlMsg type, uint8_t msgId, bool powerRoleSource, bool dataRoleDfp, SpecRev specRev)
Build a USB-PD control message header.
void wr_le32(uint8_t *p, uint32_t v)
Write a 32-bit value to a byte buffer in little-endian order.
void wr_le16(uint8_t *p, uint16_t v)
Write a 16-bit value to a byte buffer in little-endian order.
uint16_t buildDataHeader(DataMsg type, uint8_t objCount, uint8_t msgId, bool powerRoleSource, bool dataRoleDfp, SpecRev specRev)
Build a USB-PD data message header.
PdoType
USB-PD Power Data Object type.
@ Variable
Variable supply PDO.
@ Augmented
Augmented PDO.
@ Battery
Battery supply PDO.
uint32_t le32(const uint8_t *p)
Read a 32-bit little-endian integer from a byte buffer.
uint32_t buildRdoFixedCurrent(uint8_t objectPos1based, uint16_t opMa, uint16_t maxMa, bool capMismatch=false, bool usbCommCapable=true, bool noUsbSuspend=true)
Build a fixed-current Request Data Object.
uint16_t le16(const uint8_t *p)
Read a 16-bit little-endian integer from a byte buffer.
Parsed fixed source PDO fields.
uint16_t ma
Maximum current in milliamps.
bool dualRolePower
Dual-role power flag.
uint16_t mv
Voltage in millivolts.
bool usbCommCapable
USB communications capable flag.