LCOV - code coverage report
Current view: top level - zephyr/drivers/usb_c - usbc_pd.h Hit Total Coverage
Test: new.info Lines: 178 189 94.2 %
Date: 2024-12-22 00:14:23

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

Generated by: LCOV version 1.14