zephyr/subsys/usb/usb_c/usbc_prl.h

197 lines
5.2 KiB
C

/*
* Copyright (c) 2023 The Chromium OS Authors
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_SUBSYS_USBC_PRL_H_
#define ZEPHYR_SUBSYS_USBC_PRL_H_
#include <zephyr/kernel.h>
#include <zephyr/usb_c/usbc.h>
#include <zephyr/drivers/usb_c/usbc_tcpc.h>
#include <zephyr/smf.h>
#include "usbc_pe_common_internal.h"
#include "usbc_timer.h"
/**
* @brief PD counter definitions
* See Table 6-63 Counter parameters
* Parameter Name: nMessageIDCount
*/
#define PD_MESSAGE_ID_COUNT 7
/**
* @brief Message Reception State Machine Object
*/
struct protocol_layer_rx_t {
/** state machine flags */
atomic_t flags;
/** message ids for all valid port partners */
int msg_id[NUM_SOP_STAR_TYPES];
/** Received Power Delivery Messages are stored in emsg */
struct pd_msg emsg;
};
/**
* @brief Message Transmission State Machine Object
*/
struct protocol_layer_tx_t {
/** state machine context */
struct smf_ctx ctx;
/** Port device */
const struct device *dev;
/** state machine flags */
atomic_t flags;
/** last packet type we transmitted */
enum pd_packet_type last_xmit_type;
/** Current message type to transmit */
uint8_t msg_type;
/**
* Power Delivery Messages meant for transmission are stored
* in emsg
*/
struct pd_msg emsg;
/* Counters */
/** message id counters for all 6 port partners */
uint32_t msg_id_counter[NUM_SOP_STAR_TYPES];
/* Timers */
/** tTxTimeout timer */
struct usbc_timer_t pd_t_tx_timeout;
/** tSinkTx timer */
struct usbc_timer_t pd_t_sink_tx;
};
/**
* @brief Hard Reset State Machine Object
*/
struct protocol_hard_reset_t {
/** state machine context */
struct smf_ctx ctx;
/** Port device */
const struct device *dev;
/** state machine flags */
atomic_t flags;
/* Timers */
/** tHardResetComplete timer */
struct usbc_timer_t pd_t_hard_reset_complete;
};
/**
* @brief This function must only be called in the subsystem init function.
*
* @param dev Pointer to the device structure for the driver instance.
*/
void prl_subsys_init(const struct device *dev);
/**
* @brief Start the PRL Layer state machine. This is only called from the
* Type-C state machine.
*
* @param dev Pointer to the device structure for the driver instance
*/
void prl_start(const struct device *dev);
/**
* @brief Inform the PRL that the first message in an AMS is being sent
*
* @param dev Pointer to the device structure for the driver instance
*/
void prl_first_msg_notificaiton(const struct device *dev);
/**
* @brief Suspends the PRL Layer state machine. This is only called from the
* Type-C state machine.
*
* @param dev Pointer to the device structure for the driver instance
*/
void prl_suspend(const struct device *dev);
/**
* @brief Reset the PRL Layer state machine
*
* @param dev Pointer to the device structure for the driver instance
*/
void prl_reset(const struct device *dev);
/**
* @brief Run the PRL Layer state machine. This is called from the subsystems
* port stack thread
*
* @param dev Pointer to the device structure for the driver instance
*/
void prl_run(const struct device *dev);
/**
* @brief Called from the Policy Engine to signal that a hard reset is complete
*
* @param dev Pointer to the device structure for the driver instance
*/
void prl_hard_reset_complete(const struct device *dev);
/**
* @brief Sets the revision received from the port partner
*
* @param dev Pointer to the device structure for the driver instance
* @param type SOP* packet sent from port partner
* @param rev Revision sent from the port partner
*/
void prl_set_rev(const struct device *dev, const enum pd_packet_type type,
const enum pd_rev_type rev);
/**
* @brief Gets the revision received assciated with a packet type
*
* @param dev Pointer to the device structure for the driver instance
* @param type SOP* packet type to get the revision for
*
* @retval revsion associated with the packet type
*/
enum pd_rev_type prl_get_rev(const struct device *dev, const enum pd_packet_type type);
/**
* @brief Instructs the Protocol Layer to send a Power Delivery control message
*
* @param dev Pointer to the device structure for the driver instance
* @param type The port partner to send this message to
* @param msg The control message to send
*/
void prl_send_ctrl_msg(const struct device *dev, const enum pd_packet_type type,
const enum pd_ctrl_msg_type msg);
/**
* @brief Instructs the Protocol Layer to send a Power Delivery data message
*
* @param dev Pointer to the device structure for the driver instance
* @param type The port partner to send this message to
* @param msg The data message to send
*/
void prl_send_data_msg(const struct device *dev, const enum pd_packet_type type,
const enum pd_data_msg_type msg);
/**
* @brief Instructs the Protocol Layer to execute a hard reset
*
* @param dev Pointer to the device structure for the driver instance
*/
void prl_execute_hard_reset(const struct device *dev);
/**
* @brief Query if the Protocol Layer is running
*
* @param dev Pointer to the device structure for the driver instance
*
* @retval TRUE if the Protocol Layer is running
* @retval FALSE if the Protocol Layer is not running
*/
bool prl_is_running(const struct device *dev);
#endif /* ZEPHYR_SUBSYS_USBC_PRL_H_ */