| /* |
| * Copyright (c) 2022 The Chromium OS Authors |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_DRIVERS_USBC_DEVICE_UCPD_STM32_PRIV_H_ |
| #define ZEPHYR_DRIVERS_USBC_DEVICE_UCPD_STM32_PRIV_H_ |
| |
| #include <zephyr/sys/util.h> |
| #include <zephyr/drivers/usbc/usbc_tcpc.h> |
| #include <stm32_ll_ucpd.h> |
| |
| /** |
| * @brief The packet type(SOP*) consists of 2-bytes |
| */ |
| #define PACKET_TYPE_SIZE 2 |
| |
| /** |
| * @brief The message header consists of 2-bytes |
| */ |
| #define MSG_HEADER_SIZE 2 |
| |
| /** |
| * @brief USB PD message buffer length. |
| */ |
| #define UCPD_BUF_LEN (PD_MAX_EXTENDED_MSG_LEN + \ |
| PACKET_TYPE_SIZE + \ |
| MSG_HEADER_SIZE) |
| |
| /** |
| * @brief UCPD alert mask used for enabling alerts |
| * used to receive a message |
| */ |
| #define UCPD_IMR_RX_INT_MASK (UCPD_IMR_RXNEIE | \ |
| UCPD_IMR_RXORDDETIE | \ |
| UCPD_IMR_RXHRSTDETIE | \ |
| UCPD_IMR_RXOVRIE | \ |
| UCPD_IMR_RXMSGENDIE) |
| /** |
| * @brief UCPD alert mask used for clearing alerts |
| * used to receive a message |
| */ |
| #define UCPD_ICR_RX_INT_MASK (UCPD_ICR_RXORDDETCF | \ |
| UCPD_ICR_RXHRSTDETCF | \ |
| UCPD_ICR_RXOVRCF | \ |
| UCPD_ICR_RXMSGENDCF) |
| |
| /** |
| * @brief UCPD alert mask used for enabling alerts |
| * used to transmit a message |
| */ |
| #define UCPD_IMR_TX_INT_MASK (UCPD_IMR_TXISIE | \ |
| UCPD_IMR_TXMSGDISCIE | \ |
| UCPD_IMR_TXMSGSENTIE | \ |
| UCPD_IMR_TXMSGABTIE | \ |
| UCPD_IMR_TXUNDIE) |
| |
| /** |
| * @brief UCPD alert mask used for clearing alerts |
| * used to transmit a message |
| */ |
| #define UCPD_ICR_TX_INT_MASK (UCPD_ICR_TXMSGDISCCF | \ |
| UCPD_ICR_TXMSGSENTCF | \ |
| UCPD_ICR_TXMSGABTCF | \ |
| UCPD_ICR_TXUNDCF) |
| |
| /** |
| * @brief UCPD alert mask for all alerts |
| */ |
| #define UCPD_ICR_ALL_INT_MASK (UCPD_ICR_FRSEVTCF | \ |
| UCPD_ICR_TYPECEVT2CF | \ |
| UCPD_ICR_TYPECEVT1CF | \ |
| UCPD_ICR_RXMSGENDCF | \ |
| UCPD_ICR_RXOVRCF | \ |
| UCPD_ICR_RXHRSTDETCF | \ |
| UCPD_ICR_RXORDDETCF | \ |
| UCPD_ICR_TXUNDCF | \ |
| UCPD_ICR_HRSTSENTCF | \ |
| UCPD_ICR_HRSTDISCCF | \ |
| UCPD_ICR_TXMSGABTCF | \ |
| UCPD_ICR_TXMSGSENTCF | \ |
| UCPD_ICR_TXMSGDISCCF) |
| |
| /** |
| * @brief Map UCPD ANASUB value to TCPC RP value |
| * |
| * @param r UCPD ANASUB value |
| */ |
| #define UCPD_ANASUB_TO_RP(r) ((r - 1) & 0x3) |
| |
| /** |
| * @brief Map TCPC RP value to UCPD ANASUB value |
| * |
| * @param r TCPC RP value |
| */ |
| #define UCPD_RP_TO_ANASUB(r) ((r + 1) & 0x3) |
| |
| /** |
| * @brief Create value for writing to UCPD CR ANASUBMOD |
| */ |
| #define STM32_UCPD_CR_ANASUBMODE_VAL(x) ((x) << UCPD_CR_ANASUBMODE_Pos) |
| |
| /** |
| * @brief UCPD VSTATE CCx open value when in source mode |
| */ |
| #define STM32_UCPD_SR_VSTATE_OPEN 3 |
| |
| /** |
| * @brief UCPD VSTATE CCx RA value when in source mode |
| */ |
| #define STM32_UCPD_SR_VSTATE_RA 0 |
| |
| /** |
| * @brief PD message send retry count for Rev 2.0 |
| */ |
| #define UCPD_N_RETRY_COUNT_REV20 3 |
| |
| /** |
| * @brief PD message send retry count for Rev 3.0 |
| */ |
| #define UCPD_N_RETRY_COUNT_REV30 2 |
| |
| /** |
| * @brief Events for ucpd_alert_handler |
| */ |
| enum { |
| /* Request to send a goodCRC message */ |
| UCPD_EVT_GOOD_CRC_REQ, |
| /* Request to send a power delivery message */ |
| UCPD_EVT_TCPM_MSG_REQ, |
| /* Request to send a Hard Reset message */ |
| UCPD_EVT_HR_REQ, |
| /* Transmission of power delivery message failed */ |
| UCPD_EVT_TX_MSG_FAIL, |
| /* Transmission of power delivery message was discarded */ |
| UCPD_EVT_TX_MSG_DISC, |
| /* Transmission of power delivery message was successful */ |
| UCPD_EVT_TX_MSG_SUCCESS, |
| /* Transmission of Hard Reset message was successful */ |
| UCPD_EVT_HR_DONE, |
| /* Transmission of Hard Reset message failed */ |
| UCPD_EVT_HR_FAIL, |
| /* A goodCRC message was received */ |
| UCPD_EVT_RX_GOOD_CRC, |
| /* A power delivery message was received */ |
| UCPD_EVT_RX_MSG, |
| /* A CC event occurred */ |
| UCPD_EVT_EVENT_CC, |
| /* A Hard Reset message was received */ |
| UCPD_EVT_HARD_RESET_RECEIVED, |
| }; |
| |
| /** |
| * @brief GoodCRC message header roles |
| */ |
| struct msg_header_info { |
| /* Power Role */ |
| enum tc_power_role pr; |
| /* Data Role */ |
| enum tc_data_role dr; |
| }; |
| |
| /** |
| * @brief States for managing TX messages |
| */ |
| enum ucpd_state { |
| /* Idle state */ |
| STATE_IDLE, |
| /* Transmitting a message state */ |
| STATE_ACTIVE_TCPM, |
| /* Transmitting a goodCRC message state */ |
| STATE_ACTIVE_CRC, |
| /* Transmitting a Hard Reset message state */ |
| STATE_HARD_RESET, |
| /* Waiting for a goodCRC message state */ |
| STATE_WAIT_CRC_ACK |
| }; |
| |
| /** |
| * @brief Tx messages are initiated either by the application or from |
| * the driver when a GoodCRC ack message needs to be sent. |
| */ |
| enum ucpd_tx_msg { |
| /* Default value for not sending a message */ |
| TX_MSG_NONE = -1, |
| /* Message initiated from the application */ |
| TX_MSG_TCPM = 0, |
| /* Message initiated from the driver */ |
| TX_MSG_GOOD_CRC = 1, |
| /* Total number sources that can initiate a message */ |
| TX_MSG_TOTAL = 2 |
| }; |
| |
| /** |
| * @brief Message from application mask |
| */ |
| #define MSG_TCPM_MASK BIT(TX_MSG_TCPM) |
| |
| /** |
| * @brief Message from driver mask |
| */ |
| #define MSG_GOOD_CRC_MASK BIT(TX_MSG_GOOD_CRC) |
| |
| /** |
| * @brief Buffer for holding the received message |
| */ |
| union pd_buffer { |
| /* Power Delivery message header */ |
| uint16_t header; |
| /* Power Deliver message data including the message header */ |
| uint8_t msg[UCPD_BUF_LEN]; |
| }; |
| |
| /** |
| * @brief Struct used for transmitting a power delivery message |
| */ |
| struct ucpd_tx_desc { |
| /* Type of the message */ |
| enum pd_packet_type type; |
| /* Length of the message */ |
| int msg_len; |
| /* Index of the current byte to transmit */ |
| int msg_index; |
| /* Power Delivery message to transmit */ |
| union pd_buffer data; |
| }; |
| |
| /** |
| * @brief Alert handler information |
| */ |
| struct alert_info { |
| /* Runtime device structure */ |
| const struct device *dev; |
| /* Application supplied data that's passed to the |
| * application's alert handler callback |
| **/ |
| void *data; |
| /* Application's alert handler callback */ |
| tcpc_alert_handler_cb_t handler; |
| /* |
| * Kernel worker used to call the application's |
| * alert handler callback |
| */ |
| struct k_work work; |
| /* Event flags used in the kernel worker */ |
| atomic_t evt; |
| }; |
| |
| /** |
| * @brief Driver config |
| */ |
| struct tcpc_config { |
| /* STM32 UCPD port */ |
| UCPD_TypeDef *ucpd_port; |
| /* STM32 UCPD parameters */ |
| LL_UCPD_InitTypeDef ucpd_params; |
| }; |
| |
| /** |
| * @brief Driver data |
| */ |
| struct tcpc_data { |
| /* VBUS callback function */ |
| tcpc_vbus_cb_t vbus_cb; |
| /* Discharge VBUS callback function */ |
| tcpc_discharge_vbus_cb_t discharge_vbus_cb; |
| /* VCONN callback function */ |
| tcpc_vconn_control_cb_t vconn_cb; |
| /* Alert information */ |
| struct alert_info alert_info; |
| |
| /* CC Rp value */ |
| enum tc_rp_value rp; |
| |
| /* PD Rx variables */ |
| |
| /* Number of RX bytes received */ |
| int ucpd_rx_byte_count; |
| /* Buffer to hold the received bytes */ |
| uint8_t ucpd_rx_buffer[UCPD_BUF_LEN]; |
| /* GoodCRC message ID */ |
| int ucpd_crc_id; |
| /* Flag to receive or ignore SOP Prime messages */ |
| bool ucpd_rx_sop_prime_enabled; |
| /* Flag set to true when receiving a message */ |
| bool ucpd_rx_msg_active; |
| /* Flag set to true when in RX BIST Mode */ |
| bool ucpd_rx_bist_mode; |
| |
| /* Tx message variables */ |
| |
| /* Buffers to hold messages ready for transmission */ |
| struct ucpd_tx_desc ucpd_tx_buffers[TX_MSG_TOTAL]; |
| /* Current buffer being transmitted */ |
| struct ucpd_tx_desc *ucpd_tx_active_buffer; |
| /* Request to send a transmission message */ |
| int ucpd_tx_request; |
| /* State of the TX state machine */ |
| enum ucpd_state ucpd_tx_state; |
| /* Transmission message ID */ |
| int msg_id_match; |
| /* Retry count on failure to transmit a message */ |
| int tx_retry_count; |
| /* Max number of reties before giving up */ |
| int tx_retry_max; |
| |
| /* GoodCRC message Header */ |
| struct msg_header_info msg_header; |
| /* Track VCONN on/off state */ |
| bool ucpd_vconn_enable; |
| }; |
| |
| #endif /* ZEPHYR_DRIVERS_USBC_DEVICE_UCPD_STM32_PRIV_H_ */ |