LCOV - code coverage report
Current view: top level - zephyr/drivers/usb_c - usbc_pd.h Coverage Total Hit
Test: new.info Lines: 94.2 % 189 178
Test Date: 2025-09-05 16:43:28

            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 usb_type_c
      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_ */
        

Generated by: LCOV version 2.0-1