Line data Source code
1 1 : /*
2 : * Copyright 2022 The Chromium OS Authors
3 : * SPDX-License-Identifier: Apache-2.0
4 : */
5 :
6 : /**
7 : * @file
8 : * @brief USB-C Power Delivery API used for USB-C drivers
9 : *
10 : * The information in this file was taken from the USB PD
11 : * Specification Revision 3.0, Version 2.0
12 : */
13 :
14 : #ifndef ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_PD_H_
15 : #define ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_PD_H_
16 :
17 : /**
18 : * @brief USB Power Delivery
19 : * @defgroup usb_power_delivery USB Power Delivery
20 : * @ingroup io_interfaces
21 : * @{
22 : */
23 :
24 : #include <zephyr/types.h>
25 :
26 : #ifdef __cplusplus
27 : extern "C" {
28 : #endif
29 :
30 : /**
31 : * @brief Maximum length of a non-Extended Message in bytes.
32 : * See Table 6-75 Value Parameters
33 : * Parameter Name: MaxExtendedMsgLegacyLen
34 : */
35 1 : #define PD_MAX_EXTENDED_MSG_LEGACY_LEN 26
36 :
37 : /**
38 : * @brief Maximum length of an Extended Message in bytes.
39 : * See Table 6-75 Value Parameters
40 : * Parameter Name: MaxExtendedMsgLen
41 : */
42 1 : #define PD_MAX_EXTENDED_MSG_LEN 260
43 :
44 : /**
45 : * @brief Maximum length of a Chunked Message in bytes.
46 : * When one of both Port Partners do not support Extended
47 : * Messages of Data Size greater than PD_MAX_EXTENDED_MSG_LEGACY_LEN
48 : * then the Protocol Layer supports a Chunking mechanism to
49 : * break larger Messages into smaller Chunks of size
50 : * PD_MAX_EXTENDED_MSG_CHUNK_LEN.
51 : * See Table 6-75 Value Parameters
52 : * Parameter Name: MaxExtendedMsgChunkLen
53 : */
54 1 : #define PD_MAX_EXTENDED_MSG_CHUNK_LEN 26
55 :
56 : /**
57 : * @name USB PD 3.1 Rev 1.6, Table 6-70 Counter Parameters
58 : * @{
59 : */
60 :
61 : /**
62 : * @brief The CapsCounter is used to count the number of Source_Capabilities
63 : * Messages which have been sent by a Source at power up or after a
64 : * Hard Reset.
65 : * Parameter Name: nCapsCounter
66 : */
67 1 : #define PD_N_CAPS_COUNT 50
68 :
69 : /**
70 : * @brief The HardResetCounter is used to retry the Hard Reset whenever there
71 : * is no response from the remote device (see Section 6.6.6)
72 : * Parameter Name: nHardResetCounter
73 : */
74 1 : #define PD_N_HARD_RESET_COUNT 2
75 :
76 : /** @} */
77 :
78 : /**
79 : * @name USB PD 3.1 Rev 1.6, Table 6-68 Time Values
80 : * @{
81 : */
82 :
83 : /**
84 : * @brief The NoResponseTimer is used by the Policy Engine in a Source to
85 : * determine that its Port Partner is not responding after a Hard Reset.
86 : * Parameter Name: tNoResponseTimer
87 : */
88 1 : #define PD_T_NO_RESPONSE_MIN_MS 4500
89 :
90 : /**
91 : * @brief The NoResponseTimer is used by the Policy Engine in a Source to
92 : * determine that its Port Partner is not responding after a Hard Reset.
93 : * Parameter Name: tNoResponseTimer
94 : */
95 1 : #define PD_T_NO_RESPONSE_MAX_MS 5500
96 :
97 : /**
98 : * @brief Min time the Source waits to ensure that the Sink has had
99 : * sufficient time to process Hard Reset Signaling before
100 : * turning off its power supply to VBUS
101 : * Parameter Name: tPSHardReset
102 : */
103 1 : #define PD_T_PS_HARD_RESET_MIN_MS 25
104 :
105 : /**
106 : * @brief Max time the Source waits to ensure that the Sink has had
107 : * sufficient time to process Hard Reset Signaling before
108 : * turning off its power supply to VBUS
109 : * Parameter Name: tPSHardReset
110 : */
111 1 : #define PD_T_PS_HARD_RESET_MAX_MS 35
112 :
113 : /**
114 : * @brief Minimum time a Source waits after changing Rp from SinkTxOk to SinkTxNG
115 : * before initiating an AMS by sending a Message.
116 : * Parameter Name: tSinkTx
117 : */
118 1 : #define PD_T_SINK_TX_MIN_MS 16
119 :
120 : /**
121 : * @brief Maximum time a Source waits after changing Rp from SinkTxOk to SinkTxNG
122 : * before initiating an AMS by sending a Message.
123 : * Parameter Name: tSinkTx
124 : */
125 1 : #define PD_T_SINK_TX_MAX_MS 20
126 :
127 : /**
128 : * @brief Minimum time a source shall wait before sending a
129 : * Source_Capabilities message while the following is true:
130 : * 1) The Port is Attached.
131 : * 2) The Source is not in an active connection with a PD Sink Port.
132 : * Parameter Name: tTypeCSendSourceCap
133 : */
134 1 : #define PD_T_TYPEC_SEND_SOURCE_CAP_MIN_MS 100
135 :
136 : /**
137 : * @brief Maximum time a source shall wait before sending a
138 : * Source_Capabilities message while the following is true:
139 : * 1) The Port is Attached.
140 : * 2) The Source is not in an active connection with a PD Sink Port.
141 : * Parameter Name: tTypeCSendSourceCap
142 : */
143 1 : #define PD_T_TYPEC_SEND_SOURCE_CAP_MAX_MS 200
144 :
145 : /** @} */
146 :
147 : /**
148 : * @brief Minimum time a sink shall wait for a Source_Capabilities message
149 : * before sending a Hard Reset
150 : * See Table 6-61 Time Values
151 : * Parameter Name: tTypeCSinkWaitCap
152 : */
153 1 : #define PD_T_TYPEC_SINK_WAIT_CAP_MIN_MS 310
154 :
155 : /**
156 : * @brief Minimum time a sink shall wait for a Source_Capabilities message
157 : * before sending a Hard Reset
158 : * See Table 6-61 Time Values
159 : * Parameter Name: tTypeCSinkWaitCap
160 : */
161 1 : #define PD_T_TYPEC_SINK_WAIT_CAP_MAX_MS 620
162 :
163 : /**
164 : * @brief VBUS maximum safe operating voltage at "zero volts".
165 : * See Table 7-24 Common Source/Sink Electrical Parameters
166 : * Parameter Name: vSafe0V
167 : */
168 1 : #define PD_V_SAFE_0V_MAX_MV 800
169 :
170 : /**
171 : * @brief VBUS minimum safe operating voltage at 5V.
172 : * See Table 7-24 Common Source/Sink Electrical Parameters
173 : * Parameter Name: vSafe5V
174 : */
175 1 : #define PD_V_SAFE_5V_MIN_MV 4750
176 :
177 : /**
178 : * @brief Time to reach PD_V_SAFE_0V_MV max in milliseconds.
179 : * See Table 7-24 Common Source/Sink Electrical Parameters
180 : * Parameter Name: tSafe0V
181 : */
182 1 : #define PD_T_SAFE_0V_MAX_MS 650
183 :
184 : /**
185 : * @brief Time to reach PD_V_SAFE_5V_MV max in milliseconds.
186 : * See Table 7-24 Common Source/Sink Electrical Parameters
187 : * Parameter Name: tSafe5V
188 : */
189 1 : #define PD_T_SAFE_5V_MAX_MS 275
190 :
191 : /**
192 : * @brief Time to wait for TCPC to complete transmit
193 : */
194 1 : #define PD_T_TX_TIMEOUT_MS 100
195 :
196 : /**
197 : * @brief Minimum time a Hard Reset must complete.
198 : * See Table 6-68 Time Values
199 : */
200 1 : #define PD_T_HARD_RESET_COMPLETE_MIN_MS 4
201 :
202 : /**
203 : * @brief Maximum time a Hard Reset must complete.
204 : * See Table 6-68 Time Values
205 : */
206 1 : #define PD_T_HARD_RESET_COMPLETE_MAX_MS 5
207 :
208 : /**
209 : * @brief Minimum time a response must be sent from a Port Partner
210 : * See Table 6-68 Time Values
211 : */
212 1 : #define PD_T_SENDER_RESPONSE_MIN_MS 24
213 :
214 : /**
215 : * @brief Nomiminal time a response must be sent from a Port Partner
216 : * See Table 6-68 Time Values
217 : */
218 1 : #define PD_T_SENDER_RESPONSE_NOM_MS 27
219 :
220 : /**
221 : * @brief Maximum time a response must be sent from a Port Partner
222 : * See Table 6-68 Time Values
223 : */
224 1 : #define PD_T_SENDER_RESPONSE_MAX_MS 30
225 :
226 : /**
227 : * @brief Minimum SPR Mode time for a power supply to transition to a new level
228 : * See Table 6-68 Time Values
229 : */
230 1 : #define PD_T_SPR_PS_TRANSITION_MIN_MS 450
231 :
232 : /**
233 : * @brief Nominal SPR Mode time for a power supply to transition to a new level
234 : * See Table 6-68 Time Values
235 : */
236 1 : #define PD_T_SPR_PS_TRANSITION_NOM_MS 500
237 :
238 : /**
239 : * @brief Maximum SPR Mode time for a power supply to transition to a new level
240 : * See Table 6-68 Time Values
241 : */
242 1 : #define PD_T_SPR_PS_TRANSITION_MAX_MS 550
243 :
244 : /**
245 : * @brief Minimum EPR Mode time for a power supply to transition to a new level
246 : * See Table 6-68 Time Values
247 : */
248 1 : #define PD_T_EPR_PS_TRANSITION_MIN_MS 830
249 :
250 : /**
251 : * @brief Nominal EPR Mode time for a power supply to transition to a new level
252 : * See Table 6-68 Time Values
253 : */
254 1 : #define PD_T_EPR_PS_TRANSITION_NOM_MS 925
255 :
256 : /**
257 : * @brief Maximum EPR Mode time for a power supply to transition to a new level
258 : * See Table 6-68 Time Values
259 : */
260 1 : #define PD_T_EPR_PS_TRANSITION_MAX_MS 1020
261 :
262 : /**
263 : * @brief Minimum time to wait before sending another request after receiving a Wait message
264 : * See Table 6-68 Time Values
265 : */
266 1 : #define PD_T_SINK_REQUEST_MIN_MS 100
267 :
268 : /**
269 : * @brief Minimum time to wait before sending a Not_Supported message after receiving a
270 : * Chunked message
271 : * See Table 6-68 Time Values
272 : */
273 1 : #define PD_T_CHUNKING_NOT_SUPPORTED_MIN_MS 40
274 :
275 : /**
276 : * @brief Nominal time to wait before sending a Not_Supported message after receiving a
277 : * Chunked message
278 : * See Table 6-68 Time Values
279 : */
280 1 : #define PD_T_CHUNKING_NOT_SUPPORTED_NOM_MS 45
281 :
282 : /**
283 : * @brief Maximum time to wait before sending a Not_Supported message after receiving a
284 : * Chunked message
285 : * See Table 6-68 Time Values
286 : */
287 1 : #define PD_T_CHUNKING_NOT_SUPPORTED_MAX_MS 50
288 :
289 : /**
290 : * @brief Convert bytes to PD Header data object count, where a
291 : * data object is 4-bytes.
292 : *
293 : * @param c number of bytes to convert
294 : */
295 1 : #define PD_CONVERT_BYTES_TO_PD_HEADER_COUNT(c) ((c) >> 2)
296 :
297 : /**
298 : * @brief Convert PD Header data object count to bytes
299 : *
300 : * @param c number of PD Header data objects
301 : */
302 1 : #define PD_CONVERT_PD_HEADER_COUNT_TO_BYTES(c) ((c) << 2)
303 :
304 : /**
305 : * @brief Collision avoidance Rp values in REV 3.0
306 : * Sink Transmit "OK"
307 : */
308 1 : #define SINK_TX_OK TC_RP_3A0
309 :
310 : /**
311 : * @brief Collision avoidance Rp values in REV 3.0
312 : * Sink Transmit "NO GO"
313 : */
314 1 : #define SINK_TX_NG TC_RP_1A5
315 :
316 : /**
317 : * @brief Build a PD message header
318 : * See Table 6-1 Message Header
319 : */
320 1 : union pd_header {
321 : struct {
322 : /** Type of message */
323 1 : uint16_t message_type : 5;
324 : /** Port Data role */
325 1 : uint16_t port_data_role : 1;
326 : /** Specification Revision */
327 1 : uint16_t specification_revision : 2;
328 : /** Port Power Role */
329 1 : uint16_t port_power_role : 1;
330 : /** Message ID */
331 1 : uint16_t message_id : 3;
332 : /** Number of Data Objects */
333 1 : uint16_t number_of_data_objects : 3;
334 : /** Extended Message */
335 1 : uint16_t extended : 1;
336 0 : };
337 0 : uint16_t raw_value;
338 : };
339 :
340 : /**
341 : * @brief Used to get extended header from the first 32-bit word of the message
342 : *
343 : * @param c first 32-bit word of the message
344 : */
345 1 : #define PD_GET_EXT_HEADER(c) ((c) & 0xffff)
346 :
347 : /**
348 : * @brief Build an extended message header
349 : * See Table 6-3 Extended Message Header
350 : */
351 1 : union pd_ext_header {
352 : struct {
353 : /** Number of total bytes in data block */
354 1 : uint16_t data_size : 9;
355 : /** Reserved */
356 1 : uint16_t reserved0 : 1;
357 : /** 1 for a chunked message, else 0 */
358 1 : uint16_t request_chunk : 1;
359 : /** Chunk number when chkd = 1, else 0 */
360 1 : uint16_t chunk_number : 4;
361 : /** 1 for chunked messages */
362 1 : uint16_t chunked : 1;
363 0 : };
364 : /** Raw PD Ext Header value */
365 1 : uint16_t raw_value;
366 : };
367 :
368 : /**
369 : * PDO - Power Data Object
370 : * RDO - Request Data Object
371 : */
372 :
373 : /**
374 : * @brief Maximum number of 32-bit data objects sent in a single request
375 : */
376 1 : #define PDO_MAX_DATA_OBJECTS 7
377 :
378 : /**
379 : * @brief Power Data Object Type
380 : * Table 6-7 Power Data Object
381 : */
382 1 : enum pdo_type {
383 : /** Fixed supply (Vmin = Vmax) */
384 : PDO_FIXED = 0,
385 : /** Battery */
386 : PDO_BATTERY = 1,
387 : /** Variable Supply (non-Battery) */
388 : PDO_VARIABLE = 2,
389 : /** Augmented Power Data Object (APDO) */
390 : PDO_AUGMENTED = 3
391 : };
392 :
393 : /**
394 : * @brief Convert milliamps to Fixed PDO Current in 10mA units.
395 : *
396 : * @param c Current in milliamps
397 : */
398 1 : #define PD_CONVERT_MA_TO_FIXED_PDO_CURRENT(c) ((c) / 10)
399 :
400 : /**
401 : * @brief Convert millivolts to Fixed PDO Voltage in 50mV units
402 : *
403 : * @param v Voltage in millivolts
404 : */
405 1 : #define PD_CONVERT_MV_TO_FIXED_PDO_VOLTAGE(v) ((v) / 50)
406 :
407 : /**
408 : * @brief Convert a Fixed PDO Current from 10mA units to milliamps.
409 : *
410 : * @param c Fixed PDO current in 10mA units.
411 : */
412 1 : #define PD_CONVERT_FIXED_PDO_CURRENT_TO_MA(c) ((c) * 10)
413 :
414 : /**
415 : * @brief Convert a Fixed PDO Voltage from 50mV units to millivolts.
416 : * Used for converting pd_fixed_supply_pdo_source.voltage and
417 : * pd_fixed_supply_pdo_sink.voltage
418 : *
419 : * @param v Fixed PDO voltage in 50mV units.
420 : */
421 1 : #define PD_CONVERT_FIXED_PDO_VOLTAGE_TO_MV(v) ((v) * 50)
422 :
423 : /**
424 : * @brief Create a Fixed Supply PDO Source value
425 : * See Table 6-9 Fixed Supply PDO - Source
426 : */
427 1 : union pd_fixed_supply_pdo_source {
428 : struct {
429 : /** Maximum Current in 10mA units */
430 1 : uint32_t max_current : 10;
431 : /** Voltage in 50mV units */
432 1 : uint32_t voltage : 10;
433 : /** Peak Current */
434 1 : uint32_t peak_current : 2;
435 : /** Reserved – Shall be set to zero. */
436 1 : uint32_t reserved0 : 2;
437 : /** Unchunked Extended Messages Supported */
438 1 : uint32_t unchunked_ext_msg_supported : 1;
439 : /** Dual-Role Data */
440 1 : uint32_t dual_role_data : 1;
441 : /** USB Communications Capable */
442 1 : uint32_t usb_comms_capable : 1;
443 : /** Unconstrained Power */
444 1 : uint32_t unconstrained_power : 1;
445 : /** USB Suspend Supported */
446 1 : uint32_t usb_suspend_supported : 1;
447 : /** Dual-Role Power */
448 1 : uint32_t dual_role_power : 1;
449 : /** Fixed supply. SET TO PDO_FIXED */
450 1 : enum pdo_type type : 2;
451 0 : };
452 : /** Raw PDO value */
453 1 : uint32_t raw_value;
454 : };
455 :
456 : /**
457 : * @brief Fast Role Swap Required for USB Type-C current
458 : */
459 1 : enum pd_frs_type {
460 : /** Fast Swap not supported */
461 : FRS_NOT_SUPPORTED,
462 : /** Default USB Power */
463 : FRS_DEFAULT_USB_POWER,
464 : /** 1.5A @ 5V */
465 : FRS_1P5A_5V,
466 : /** 3.0A @ 5V */
467 : FRS_3P0A_5V
468 : };
469 :
470 : /**
471 : * @brief Create a Fixed Supply PDO Sink value
472 : * See Table 6-14 Fixed Supply PDO - Sink
473 : */
474 1 : union pd_fixed_supply_pdo_sink {
475 : struct {
476 : /** Operational Current in 10mA units */
477 1 : uint32_t operational_current : 10;
478 : /** Voltage in 50mV units */
479 1 : uint32_t voltage : 10;
480 : /** Reserved – Shall be set to zero. */
481 1 : uint32_t reserved0 : 3;
482 : /** Fast Role Swap required USB Type-C Current */
483 1 : enum pd_frs_type frs_required : 2;
484 : /** Dual-Role Data */
485 1 : uint32_t dual_role_data : 1;
486 : /** USB Communications Capable */
487 1 : uint32_t usb_comms_capable : 1;
488 : /** Unconstrained Power */
489 1 : uint32_t unconstrained_power : 1;
490 : /** Higher Capability */
491 1 : uint32_t higher_capability : 1;
492 : /** Dual-Role Power */
493 1 : uint32_t dual_role_power : 1;
494 : /** Fixed supply. SET TO PDO_FIXED */
495 1 : enum pdo_type type : 2;
496 0 : };
497 : /** Raw PDO value */
498 1 : uint32_t raw_value;
499 : };
500 :
501 : /**
502 : * @brief Convert milliamps to Variable PDO Current in 10ma units.
503 : *
504 : * @param c Current in milliamps
505 : */
506 1 : #define PD_CONVERT_MA_TO_VARIABLE_PDO_CURRENT(c) ((c) / 10)
507 :
508 : /**
509 : * @brief Convert millivolts to Variable PDO Voltage in 50mV units
510 : *
511 : * @param v Voltage in millivolts
512 : */
513 1 : #define PD_CONVERT_MV_TO_VARIABLE_PDO_VOLTAGE(v) ((v) / 50)
514 :
515 : /**
516 : * @brief Convert a Variable PDO Current from 10mA units to milliamps.
517 : *
518 : * @param c Variable PDO current in 10mA units.
519 : */
520 1 : #define PD_CONVERT_VARIABLE_PDO_CURRENT_TO_MA(c) ((c) * 10)
521 :
522 : /**
523 : * @brief Convert a Variable PDO Voltage from 50mV units to millivolts.
524 : *
525 : * @param v Variable PDO voltage in 50mV units.
526 : */
527 1 : #define PD_CONVERT_VARIABLE_PDO_VOLTAGE_TO_MV(v) ((v) * 50)
528 :
529 : /**
530 : * @brief Create a Variable Supply PDO Source value
531 : * See Table 6-11 Variable Supply (non-Battery) PDO - Source
532 : */
533 1 : union pd_variable_supply_pdo_source {
534 : struct {
535 : /** Maximum Current in 10mA units */
536 1 : uint32_t max_current : 10;
537 : /** Minimum Voltage in 50mV units */
538 1 : uint32_t min_voltage : 10;
539 : /** Maximum Voltage in 50mV units */
540 1 : uint32_t max_voltage : 10;
541 : /** Variable supply. SET TO PDO_VARIABLE */
542 1 : enum pdo_type type : 2;
543 0 : };
544 : /** Raw PDO value */
545 1 : uint32_t raw_value;
546 : };
547 :
548 : /**
549 : * @brief Create a Variable Supply PDO Sink value
550 : * See Table 6-15 Variable Supply (non-Battery) PDO - Sink
551 : */
552 1 : union pd_variable_supply_pdo_sink {
553 : struct {
554 : /** operational Current in 10mA units */
555 1 : uint32_t operational_current : 10;
556 : /** Minimum Voltage in 50mV units */
557 1 : uint32_t min_voltage : 10;
558 : /** Maximum Voltage in 50mV units */
559 1 : uint32_t max_voltage : 10;
560 : /** Variable supply. SET TO PDO_VARIABLE */
561 1 : enum pdo_type type : 2;
562 0 : };
563 : /** Raw PDO value */
564 1 : uint32_t raw_value;
565 : };
566 :
567 : /**
568 : * @brief Convert milliwatts to Battery PDO Power in 250mW units
569 : *
570 : * @param c Power in milliwatts
571 : */
572 1 : #define PD_CONVERT_MW_TO_BATTERY_PDO_POWER(c) ((c) / 250)
573 :
574 : /**
575 : * @brief Convert milliwatts to Battery PDO Voltage in 50mV units
576 : *
577 : * @param v Voltage in millivolts
578 : */
579 1 : #define PD_CONVERT_MV_TO_BATTERY_PDO_VOLTAGE(v) ((v) / 50)
580 :
581 : /**
582 : * @brief Convert a Battery PDO Power from 250mW units to milliwatts
583 : *
584 : * @param c Power in 250mW units.
585 : */
586 1 : #define PD_CONVERT_BATTERY_PDO_POWER_TO_MW(c) ((c) * 250)
587 :
588 : /**
589 : * @brief Convert a Battery PDO Voltage from 50mV units to millivolts
590 : *
591 : * @param v Voltage in 50mV units.
592 : */
593 1 : #define PD_CONVERT_BATTERY_PDO_VOLTAGE_TO_MV(v) ((v) * 50)
594 :
595 : /**
596 : * @brief Create a Battery Supply PDO Source value
597 : * See Table 6-12 Battery Supply PDO - Source
598 : */
599 1 : union pd_battery_supply_pdo_source {
600 : struct {
601 : /** Maximum Allowable Power in 250mW units */
602 1 : uint32_t max_power : 10;
603 : /** Minimum Voltage in 50mV units */
604 1 : uint32_t min_voltage : 10;
605 : /** Maximum Voltage in 50mV units */
606 1 : uint32_t max_voltage : 10;
607 : /** Battery supply. SET TO PDO_BATTERY */
608 1 : enum pdo_type type : 2;
609 0 : };
610 : /** Raw PDO value */
611 1 : uint32_t raw_value;
612 : };
613 :
614 : /**
615 : * @brief Create a Battery Supply PDO Sink value
616 : * See Table 6-16 Battery Supply PDO - Sink
617 : */
618 1 : union pd_battery_supply_pdo_sink {
619 : struct {
620 : /** Operational Power in 250mW units */
621 1 : uint32_t operational_power : 10;
622 : /** Minimum Voltage in 50mV units */
623 1 : uint32_t min_voltage : 10;
624 : /** Maximum Voltage in 50mV units */
625 1 : uint32_t max_voltage : 10;
626 : /** Battery supply. SET TO PDO_BATTERY */
627 1 : enum pdo_type type : 2;
628 0 : };
629 : /** Raw PDO value */
630 1 : uint32_t raw_value;
631 : };
632 :
633 : /**
634 : * @brief Convert milliamps to Augmented PDO Current in 50mA units
635 : *
636 : * @param c Current in milliamps
637 : */
638 1 : #define PD_CONVERT_MA_TO_AUGMENTED_PDO_CURRENT(c) ((c) / 50)
639 :
640 : /**
641 : * @brief Convert millivolts to Augmented PDO Voltage in 100mV units
642 : *
643 : * @param v Voltage in millivolts
644 : */
645 1 : #define PD_CONVERT_MV_TO_AUGMENTED_PDO_VOLTAGE(v) ((v) / 100)
646 :
647 : /**
648 : * @brief Convert an Augmented PDO Current from 50mA units to milliamps
649 : *
650 : * @param c Augmented PDO current in 50mA units.
651 : */
652 1 : #define PD_CONVERT_AUGMENTED_PDO_CURRENT_TO_MA(c) ((c) * 50)
653 :
654 : /**
655 : * @brief Convert an Augmented PDO Voltage from 100mV units to millivolts
656 : *
657 : * @param v Augmented PDO voltage in 100mV units.
658 : */
659 1 : #define PD_CONVERT_AUGMENTED_PDO_VOLTAGE_TO_MV(v) ((v) * 100)
660 :
661 : /**
662 : * @brief Create Augmented Supply PDO Source value
663 : * See Table 6-13 Programmable Power Supply APDO - Source
664 : */
665 1 : union pd_augmented_supply_pdo_source {
666 : struct {
667 : /** Maximum Current in 50mA increments */
668 1 : uint32_t max_current : 7;
669 : /** Reserved – Shall be set to zero */
670 1 : uint32_t reserved0 : 1;
671 : /** Minimum Voltage in 100mV increments */
672 1 : uint32_t min_voltage : 8;
673 : /** Reserved – Shall be set to zero */
674 1 : uint32_t reserved1 : 1;
675 : /** Maximum Voltage in 100mV increments */
676 1 : uint32_t max_voltage : 8;
677 : /** Reserved – Shall be set to zero */
678 1 : uint32_t reserved2 : 2;
679 : /** PPS Power Limited */
680 1 : uint32_t pps_power_limited : 1;
681 : /**
682 : * 00b – Programmable Power Supply
683 : * 01b…11b - Reserved, Shall Not be used
684 : * Setting as reserved because it defaults to 0 when not set.
685 : */
686 1 : uint32_t reserved3 : 2;
687 : /** Augmented Power Data Object (APDO). SET TO PDO_AUGMENTED */
688 1 : enum pdo_type type : 2;
689 0 : };
690 : /** Raw PDO value */
691 1 : uint32_t raw_value;
692 : };
693 :
694 : /**
695 : * @brief Create Augmented Supply PDO Sink value
696 : * See Table 6-17 Programmable Power Supply APDO - Sink
697 : */
698 1 : union pd_augmented_supply_pdo_sink {
699 : struct {
700 : /** Maximum Current in 50mA increments */
701 1 : uint32_t max_current : 7;
702 : /** Reserved – Shall be set to zero */
703 1 : uint32_t reserved0 : 1;
704 : /** Minimum Voltage in 100mV increments */
705 1 : uint32_t min_voltage : 8;
706 : /** Reserved – Shall be set to zero */
707 1 : uint32_t reserved1 : 1;
708 : /** Maximum Voltage in 100mV increments */
709 1 : uint32_t max_voltage : 8;
710 : /** Reserved – Shall be set to zero */
711 1 : uint32_t reserved2 : 3;
712 : /**
713 : * 00b – Programmable Power Supply
714 : * 01b…11b - Reserved, Shall Not be used
715 : * Setting as reserved because it defaults to 0 when not set.
716 : */
717 1 : uint32_t reserved3 : 2;
718 : /** Augmented Power Data Object (APDO). SET TO PDO_AUGMENTED */
719 1 : enum pdo_type type : 2;
720 0 : };
721 : /** Raw PDO value */
722 1 : uint32_t raw_value;
723 : };
724 :
725 : /**
726 : * @brief The Request Data Object (RDO) Shall be returned by the Sink making
727 : * a request for power.
728 : * See Section 6.4.2 Request Message
729 : */
730 1 : union pd_rdo {
731 : /**
732 : * @brief Create a Fixed RDO value
733 : * See Table 6-19 Fixed and Variable Request Data Object
734 : */
735 : struct {
736 : /**
737 : * Operating Current 10mA units
738 : * NOTE: If Give Back Flag is zero, this field is
739 : * the Maximum Operating Current.
740 : * If Give Back Flag is one, this field is
741 : * the Minimum Operating Current.
742 : */
743 1 : uint32_t min_or_max_operating_current : 10;
744 : /** Operating current in 10mA units */
745 1 : uint32_t operating_current : 10;
746 : /** Reserved - Shall be set to zero. */
747 1 : uint32_t reserved0 : 3;
748 : /** Unchunked Extended Messages Supported */
749 1 : uint32_t unchunked_ext_msg_supported : 1;
750 : /** No USB Suspend */
751 1 : uint32_t no_usb_suspend : 1;
752 : /** USB Communications Capable */
753 1 : uint32_t usb_comm_capable : 1;
754 : /** Capability Mismatch */
755 1 : uint32_t cap_mismatch : 1;
756 : /** Give Back Flag */
757 1 : uint32_t giveback : 1;
758 : /** Object Position (000b is Reserved and Shall Not be used) */
759 1 : uint32_t object_pos : 3;
760 : /** Reserved - Shall be set to zero. */
761 1 : uint32_t reserved1 : 1;
762 1 : } fixed;
763 :
764 : /**
765 : * @brief Create a Variable RDO value
766 : * See Table 6-19 Fixed and Variable Request Data Object
767 : */
768 : struct {
769 : /**
770 : * Operating Current 10mA units
771 : * NOTE: If Give Back Flag is zero, this field is
772 : * the Maximum Operating Current.
773 : * If Give Back Flag is one, this field is
774 : * the Minimum Operating Current.
775 : */
776 : uint32_t min_or_max_operating_current : 10;
777 : /** Operating current in 10mA units */
778 : uint32_t operating_current : 10;
779 : /** Reserved - Shall be set to zero. */
780 : uint32_t reserved0 : 3;
781 : /** Unchunked Extended Messages Supported */
782 : uint32_t unchunked_ext_msg_supported : 1;
783 : /** No USB Suspend */
784 : uint32_t no_usb_suspend : 1;
785 : /** USB Communications Capable */
786 : uint32_t usb_comm_capable : 1;
787 : /** Capability Mismatch */
788 : uint32_t cap_mismatch : 1;
789 : /** Give Back Flag */
790 : uint32_t giveback : 1;
791 : /** Object Position (000b is Reserved and Shall Not be used) */
792 : uint32_t object_pos : 3;
793 : /** Reserved - Shall be set to zero. */
794 : uint32_t reserved1 : 1;
795 1 : } variable;
796 :
797 : /**
798 : * @brief Create a Battery RDO value
799 : * See Table 6-20 Battery Request Data Object
800 : */
801 : struct {
802 : /** Minimum Operating Power in 250mW units */
803 1 : uint32_t min_operating_power : 10;
804 : /** Operating power in 250mW units */
805 1 : uint32_t operating_power : 10;
806 : /** Reserved - Shall be set to zero. */
807 : uint32_t reserved0 : 3;
808 : /** Unchunked Extended Messages Supported */
809 : uint32_t unchunked_ext_msg_supported : 1;
810 : /** No USB Suspend */
811 : uint32_t no_usb_suspend : 1;
812 : /** USB Communications Capable */
813 : uint32_t usb_comm_capable : 1;
814 : /** Capability Mismatch */
815 : uint32_t cap_mismatch : 1;
816 : /** Give Back Flag */
817 : uint32_t giveback : 1;
818 : /** Object Position (000b is Reserved and Shall Not be used) */
819 : uint32_t object_pos : 3;
820 : /** Reserved - Shall be set to zero. */
821 : uint32_t reserved1 : 1;
822 1 : } battery;
823 :
824 : /**
825 : * @brief Create an Augmented RDO value
826 : * See Table 6-22 Programmable Request Data Object
827 : */
828 : struct {
829 : /** Operating Current 50mA units */
830 : uint32_t operating_current : 7;
831 : /** Reserved - Shall be set to zero. */
832 : uint32_t reserved0 : 2;
833 : /** Output Voltage in 20mV units */
834 1 : uint32_t output_voltage : 11;
835 : /** Reserved - Shall be set to zero. */
836 : uint32_t reserved1 : 3;
837 : /** Unchunked Extended Messages Supported */
838 : uint32_t unchunked_ext_msg_supported : 1;
839 : /** No USB Suspend */
840 : uint32_t no_usb_suspend : 1;
841 : /** USB Communications Capable */
842 : uint32_t usb_comm_capable : 1;
843 : /** Capability Mismatch */
844 : uint32_t cap_mismatch : 1;
845 : /** Reserved - Shall be set to zero */
846 1 : uint32_t reserved2 : 1;
847 : /** Object Position (000b is Reserved and Shall Not be used) */
848 : uint32_t object_pos : 3;
849 : /** Reserved - Shall be set to zero. */
850 1 : uint32_t reserved3 : 1;
851 1 : } augmented;
852 : /** Raw RDO value */
853 1 : uint32_t raw_value;
854 : };
855 :
856 : /**
857 : * @brief Protocol revision
858 : */
859 1 : enum pd_rev_type {
860 : /** PD revision 1.0 */
861 : PD_REV10 = 0,
862 : /** PD revision 2.0 */
863 : PD_REV20 = 1,
864 : /** PD revision 3.0 */
865 : PD_REV30 = 2,
866 : };
867 :
868 : /**
869 : * @brief Power Delivery packet type
870 : * See USB Type-C Port Controller Interface Specification,
871 : * Revision 2.0, Version 1.2, Table 4-38 TRANSMIT Register Definition
872 : */
873 1 : enum pd_packet_type {
874 : /** Port Partner message */
875 : PD_PACKET_SOP = 0,
876 : /** Cable Plug message */
877 : PD_PACKET_SOP_PRIME = 1,
878 : /** Cable Plug message far end*/
879 : PD_PACKET_PRIME_PRIME = 2,
880 : /** Currently undefined in the PD specification */
881 : PD_PACKET_DEBUG_PRIME = 3,
882 : /** Currently undefined in the PD specification */
883 : PD_PACKET_DEBUG_PRIME_PRIME = 4,
884 : /** Hard Reset message to the Port Partner */
885 : PD_PACKET_TX_HARD_RESET = 5,
886 : /** Cable Reset message to the Cable */
887 : PD_PACKET_CABLE_RESET = 6,
888 : /** BIST_MODE_2 message to the Port Partner */
889 : PD_PACKET_TX_BIST_MODE_2 = 7,
890 :
891 : /** USED ONLY FOR RECEPTION OF UNKNOWN MSG TYPES */
892 : PD_PACKET_MSG_INVALID = 0xf
893 : };
894 :
895 : /**
896 : * @brief Number of valid Transmit Types
897 : */
898 1 : #define NUM_SOP_STAR_TYPES (PD_PACKET_DEBUG_PRIME_PRIME + 1)
899 :
900 : /**
901 : * @brief Control Message type
902 : * See Table 6-5 Control Message Types
903 : */
904 1 : enum pd_ctrl_msg_type {
905 : /** 0 Reserved */
906 :
907 : /** GoodCRC Message */
908 : PD_CTRL_GOOD_CRC = 1,
909 : /** GotoMin Message */
910 : PD_CTRL_GOTO_MIN = 2,
911 : /** Accept Message */
912 : PD_CTRL_ACCEPT = 3,
913 : /** Reject Message */
914 : PD_CTRL_REJECT = 4,
915 : /** Ping Message */
916 : PD_CTRL_PING = 5,
917 : /** PS_RDY Message */
918 : PD_CTRL_PS_RDY = 6,
919 : /** Get_Source_Cap Message */
920 : PD_CTRL_GET_SOURCE_CAP = 7,
921 : /** Get_Sink_Cap Message */
922 : PD_CTRL_GET_SINK_CAP = 8,
923 : /** DR_Swap Message */
924 : PD_CTRL_DR_SWAP = 9,
925 : /** PR_Swap Message */
926 : PD_CTRL_PR_SWAP = 10,
927 : /** VCONN_Swap Message */
928 : PD_CTRL_VCONN_SWAP = 11,
929 : /** Wait Message */
930 : PD_CTRL_WAIT = 12,
931 : /** Soft Reset Message */
932 : PD_CTRL_SOFT_RESET = 13,
933 :
934 : /** Used for REV 3.0 */
935 :
936 : /** Data_Reset Message */
937 : PD_CTRL_DATA_RESET = 14,
938 : /** Data_Reset_Complete Message */
939 : PD_CTRL_DATA_RESET_COMPLETE = 15,
940 : /** Not_Supported Message */
941 : PD_CTRL_NOT_SUPPORTED = 16,
942 : /** Get_Source_Cap_Extended Message */
943 : PD_CTRL_GET_SOURCE_CAP_EXT = 17,
944 : /** Get_Status Message */
945 : PD_CTRL_GET_STATUS = 18,
946 : /** FR_Swap Message */
947 : PD_CTRL_FR_SWAP = 19,
948 : /** Get_PPS_Status Message */
949 : PD_CTRL_GET_PPS_STATUS = 20,
950 : /** Get_Country_Codes Message */
951 : PD_CTRL_GET_COUNTRY_CODES = 21,
952 : /** Get_Sink_Cap_Extended Message */
953 : PD_CTRL_GET_SINK_CAP_EXT = 22
954 :
955 : /** 23-31 Reserved */
956 : };
957 :
958 : /**
959 : * @brief Data message type
960 : * See Table 6-6 Data Message Types
961 : */
962 1 : enum pd_data_msg_type {
963 : /** 0 Reserved */
964 :
965 : /** Source_Capabilities Message */
966 : PD_DATA_SOURCE_CAP = 1,
967 : /** Request Message */
968 : PD_DATA_REQUEST = 2,
969 : /** BIST Message */
970 : PD_DATA_BIST = 3,
971 : /** Sink Capabilities Message */
972 : PD_DATA_SINK_CAP = 4,
973 : /** 5-14 Reserved for REV 2.0 */
974 : PD_DATA_BATTERY_STATUS = 5,
975 : /** Alert Message */
976 : PD_DATA_ALERT = 6,
977 : /** Get Country Info Message */
978 : PD_DATA_GET_COUNTRY_INFO = 7,
979 :
980 : /** 8-14 Reserved for REV 3.0 */
981 :
982 : /** Enter USB message */
983 : PD_DATA_ENTER_USB = 8,
984 : /** Vendor Defined Message */
985 : PD_DATA_VENDOR_DEF = 15,
986 : };
987 :
988 : /**
989 : * @brief Extended message type for REV 3.0
990 : * See Table 6-48 Extended Message Types
991 : */
992 1 : enum pd_ext_msg_type {
993 : /** 0 Reserved */
994 :
995 : /** Source_Capabilities_Extended Message */
996 : PD_EXT_SOURCE_CAP = 1,
997 : /** Status Message */
998 : PD_EXT_STATUS = 2,
999 : /** Get_Battery_Cap Message */
1000 : PD_EXT_GET_BATTERY_CAP = 3,
1001 : /** Get_Battery_Status Message */
1002 : PD_EXT_GET_BATTERY_STATUS = 4,
1003 : /** Battery_Capabilities Message */
1004 : PD_EXT_BATTERY_CAP = 5,
1005 : /** Get_Manufacturer_Info Message */
1006 : PD_EXT_GET_MANUFACTURER_INFO = 6,
1007 : /** Manufacturer_Info Message */
1008 : PD_EXT_MANUFACTURER_INFO = 7,
1009 : /** Security_Request Message */
1010 : PD_EXT_SECURITY_REQUEST = 8,
1011 : /** Security_Response Message */
1012 : PD_EXT_SECURITY_RESPONSE = 9,
1013 : /** Firmware_Update_Request Message */
1014 : PD_EXT_FIRMWARE_UPDATE_REQUEST = 10,
1015 : /** Firmware_Update_Response Message */
1016 : PD_EXT_FIRMWARE_UPDATE_RESPONSE = 11,
1017 : /** PPS_Status Message */
1018 : PD_EXT_PPS_STATUS = 12,
1019 : /** Country_Codes Message */
1020 : PD_EXT_COUNTRY_INFO = 13,
1021 : /** Country_Info Message */
1022 : PD_EXT_COUNTRY_CODES = 14,
1023 :
1024 : /*8 15-31 Reserved */
1025 : };
1026 :
1027 : /**
1028 : * @brief Active PD CC pin
1029 : */
1030 1 : enum usbpd_cc_pin {
1031 : /** PD is active on CC1 */
1032 : USBPD_CC_PIN_1 = 0,
1033 : /** PD is active on CC2 */
1034 : USBPD_CC_PIN_2 = 1,
1035 : };
1036 :
1037 : /**
1038 : * @brief Power Delivery message
1039 : */
1040 1 : struct pd_msg {
1041 : /** Type of this packet */
1042 1 : enum pd_packet_type type;
1043 : /** Header of this message */
1044 1 : union pd_header header;
1045 : /** Length of bytes in data */
1046 1 : uint32_t len;
1047 : /** Message data */
1048 1 : uint8_t data[PD_MAX_EXTENDED_MSG_LEN];
1049 : };
1050 :
1051 : /**
1052 : * @}
1053 : */
1054 :
1055 : #ifdef __cplusplus
1056 : }
1057 : #endif
1058 :
1059 : #endif /* ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_PD_H_ */
|