You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
7.4 KiB
317 lines
7.4 KiB
4 months ago
|
#ifndef __TASK_PD_H__
|
||
|
#define __TASK_PD_H__
|
||
|
|
||
|
#include "task_define.h"
|
||
|
|
||
|
#define MAX_VOLTAGE 12
|
||
|
|
||
|
|
||
|
#define tTypeCSinkWaitCap 620
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
PE_SNK_Startup = 0,
|
||
|
PE_SNK_Discovery,
|
||
|
PE_SNK_Wait_for_Capability,
|
||
|
PE_SNK_Evaluate_Capability,
|
||
|
PE_SNK_Select_Capability,
|
||
|
PE_SNK_Transition_Sink,
|
||
|
PE_SNK_Ready,
|
||
|
PE_SNK_Give_Sink_Cap,
|
||
|
PE_SNK_Get_Source_Cap,
|
||
|
PE_SNK_Hard_Reset,
|
||
|
PE_SNK_Transition_to_default,
|
||
|
} e_pd_status;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
pd_entry_status,
|
||
|
pd_during_status,
|
||
|
pd_exit_status,
|
||
|
} e_pd_sub_status;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
No_Event = 0,
|
||
|
Protocol_Layer_Reset,
|
||
|
Vbus_Present,
|
||
|
Source_Cap_Msg_Received,
|
||
|
Response_Received,
|
||
|
Accept_Msg_Received,
|
||
|
PS_RDY_Msg_Received,
|
||
|
GotoMin_Msg_Received,
|
||
|
Get_Sink_Cap_Msg_Received,
|
||
|
Sink_Cap_Msg_Sent,
|
||
|
Get_Source_Cap_Msg_Sent,
|
||
|
Update_Remote_Cap_Msg_Received,
|
||
|
No_Contract_and_Reject_Msg_Reseived,
|
||
|
No_Contract_and_Wait_Msg_Received,
|
||
|
Contract_and_Reject_Msg_Reseived,
|
||
|
Contract_and_Wait_Msg_Received,
|
||
|
New_Pwr_Requestd,
|
||
|
Sink_Request_Timeout,
|
||
|
Sink_PPS_Period_Timout,
|
||
|
Protocol_Error,
|
||
|
Sender_Response_Timout,
|
||
|
Hard_Reset_Complete,
|
||
|
Power_Sink_Default,
|
||
|
} e_pd_event;
|
||
|
|
||
|
typedef union
|
||
|
{
|
||
|
uint16_t data16;
|
||
|
struct
|
||
|
{
|
||
|
uint8_t byte1; //high byte
|
||
|
uint8_t byte0;
|
||
|
} bytes;
|
||
|
struct
|
||
|
{
|
||
|
uint16_t MessageType: 5;
|
||
|
uint16_t PortDataRole: 1;
|
||
|
uint16_t SpecificationRevision: 2;
|
||
|
uint16_t PortPowerRole: 1;
|
||
|
uint16_t MessageID: 3;
|
||
|
uint16_t NumOfDataObjects: 3;
|
||
|
uint16_t Extended: 1;
|
||
|
} bits;
|
||
|
} s_pd_msg_header;
|
||
|
|
||
|
typedef union
|
||
|
{
|
||
|
uint16_t data16;
|
||
|
struct
|
||
|
{
|
||
|
uint8_t byte1; //high byte
|
||
|
uint8_t byte0;
|
||
|
} bytes;
|
||
|
struct
|
||
|
{
|
||
|
uint16_t DataSize: 9;
|
||
|
uint16_t Reserved: 1;
|
||
|
uint16_t RequestChunk: 1;
|
||
|
uint16_t ChunkNumber: 4;
|
||
|
uint16_t Chunked: 1;
|
||
|
} bits;
|
||
|
} s_pd_ext_msg_header;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
none = 0,
|
||
|
pd_ctrl_msg,
|
||
|
pd_data_msg,
|
||
|
pd_ext_msg,
|
||
|
} e_pd_msg_type;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
pd_sink = 0,
|
||
|
pd_source,
|
||
|
} e_pd_pwr_role;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
pd_UFP = 0,
|
||
|
pd_DFP,
|
||
|
} e_pd_data_role;
|
||
|
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
Ctrl_Reserved = 0,
|
||
|
Ctrl_GoodCRC = 1,
|
||
|
Ctrl_GotoMin = 2,
|
||
|
Ctrl_Accept = 3,
|
||
|
Ctrl_Reject = 4,
|
||
|
Ctrl_Ping = 5,
|
||
|
Ctrl_PS_RDY = 6,
|
||
|
Ctrl_Get_Source_Cap = 7,
|
||
|
Ctrl_Get_Sink_Cap = 8,
|
||
|
Ctrl_DR_Swap = 9,
|
||
|
Ctrl_PR_Swap = 10,
|
||
|
Ctrl_VCONN_Swap = 11,
|
||
|
Ctrl_Wait = 12,
|
||
|
Ctrl_Soft_Reset = 13,
|
||
|
Ctrl_Not_Supported = 16,
|
||
|
Ctrl_Get_Source_Cap_Extended = 17,
|
||
|
Ctrl_Status = 18,
|
||
|
Ctrl_FR_Swap = 19,
|
||
|
Ctrl_Get_PPS_Status = 20,
|
||
|
Ctrl_Get_Country_Codes = 21,
|
||
|
Ctrl_Sink_Cap_Extended = 22,
|
||
|
} e_pd_ctrl_msg_type;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
Data_Reserved = 0,
|
||
|
Data_Source_Cap = 1,
|
||
|
Data_Request = 2,
|
||
|
Data_BIST = 3,
|
||
|
Data_Sink_Cap = 4,
|
||
|
Data_Battery_Status = 5,
|
||
|
Data_Alert = 6,
|
||
|
Data_Get_Country_Info = 7,
|
||
|
Data_Vendor_Defined = 15,
|
||
|
} e_pd_data_msg_type;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint16_t SenderResponseTimer;
|
||
|
uint16_t SourceCapabilityTimer;
|
||
|
uint16_t SinkWaitCapTimer;
|
||
|
uint16_t SinkRequestTimer;
|
||
|
uint16_t PSTransitionTimer;
|
||
|
uint16_t PSSourceOffTimer;
|
||
|
uint16_t PSSourceOnTimer;
|
||
|
uint16_t NoResponseTimer;
|
||
|
uint16_t swapSourceStartTimer;
|
||
|
uint16_t BISTContModeTimer;
|
||
|
uint16_t SwapSourceStartTimer;
|
||
|
uint16_t HardResetCompleteTimer;
|
||
|
uint16_t PSHardResetTimer;
|
||
|
uint16_t VDMResponseTimer;
|
||
|
uint16_t VDMModeEntryTimer;
|
||
|
uint16_t VDMModeExitTimer;
|
||
|
uint16_t VCONNOnTimer;
|
||
|
uint16_t DiscoverIdentityTimer;
|
||
|
uint16_t SinkTxTimer;
|
||
|
uint16_t ChunkingNotSupportedTimer;
|
||
|
uint16_t ChunkSenderRequestTimer;
|
||
|
uint16_t ChunkSenderResponseTimer;
|
||
|
uint16_t SinkPPSPeriodicTimer;
|
||
|
uint16_t SourcePPSCommTimer;
|
||
|
uint16_t CRCReceiveTimer;
|
||
|
} s_pd_timers;
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint8_t SenderResponseTimer_Mask;
|
||
|
uint8_t SourceCapabilityTimer_Mask;
|
||
|
uint8_t SinkWaitCapTimer_Mask;
|
||
|
uint8_t SinkRequestTimer_Mask;
|
||
|
uint8_t PSTransitionTimer_Mask;
|
||
|
uint8_t PSSourceOffTimer_Mask;
|
||
|
uint8_t PSSourceOnTimer_Mask;
|
||
|
uint8_t NoResponseTimer_Mask;
|
||
|
uint8_t swapSourceStartTimer_Mask;
|
||
|
uint8_t BISTContModeTimer_Mask;
|
||
|
uint8_t SwapSourceStartTimer_Mask;
|
||
|
uint8_t HardResetCompleteTimer_Mask;
|
||
|
uint8_t PSHardResetTimer_Mask;
|
||
|
uint8_t VDMResponseTimer_Mask;
|
||
|
uint8_t VDMModeEntryTimer_Mask;
|
||
|
uint8_t VDMModeExitTimer_Mask;
|
||
|
uint8_t VCONNOnTimer_Mask;
|
||
|
uint8_t DiscoverIdentityTimer_Mask;
|
||
|
uint8_t SinkTxTimer_Mask;
|
||
|
uint8_t ChunkingNotSupportedTimer_Mask;
|
||
|
uint8_t ChunkSenderRequestTimer_Mask;
|
||
|
uint8_t ChunkSenderResponseTimer_Mask;
|
||
|
uint8_t SinkPPSPeriodicTimer_Mask;
|
||
|
uint8_t SourcePPSCommTimer_Mask;
|
||
|
uint8_t CRCReceiveTimer_Mask;
|
||
|
} s_pd_timers_mask;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint8_t CapsCounter;
|
||
|
uint8_t DiscoverIdentityCounter;
|
||
|
uint8_t HardResetCounter;
|
||
|
uint8_t MessageIDCounter;
|
||
|
uint8_t RetryCounter;
|
||
|
uint8_t VDMBusyCounter;
|
||
|
} s_pd_counters;
|
||
|
|
||
|
typedef union
|
||
|
{
|
||
|
uint32_t data32;
|
||
|
uint8_t byte[4];
|
||
|
struct
|
||
|
{
|
||
|
uint8_t Max_Current_10mV_L8: 8;
|
||
|
|
||
|
uint8_t Max_Current_10mV_H2: 2;
|
||
|
uint8_t Voltage_50mV_L6: 6;
|
||
|
|
||
|
uint8_t Voltage_50mV_H4: 4;
|
||
|
uint8_t Peak_Current: 2;
|
||
|
uint8_t Reserved: 2;
|
||
|
|
||
|
uint8_t Unchunked_Msg_Supported: 1;
|
||
|
uint8_t Dual_Role_Data: 1;
|
||
|
uint8_t USB_Comm_Capable: 1;
|
||
|
uint8_t Unconstrained_Pwr: 1;
|
||
|
uint8_t USB_Suspend_Supported: 1;
|
||
|
uint8_t Dual_Role_Pwr: 1;
|
||
|
uint8_t Fixed_Supply: 2;
|
||
|
} s_FPS_PDO_bits;
|
||
|
|
||
|
struct
|
||
|
{
|
||
|
uint8_t Max_Current_10mV_L8: 8;
|
||
|
|
||
|
uint8_t Max_Current_10mV_H2: 2;
|
||
|
uint8_t Opt_Current_10mV_L6: 6;
|
||
|
|
||
|
uint8_t Opt_Current_10mV_H4: 4;
|
||
|
uint8_t Reserved1: 3;
|
||
|
uint8_t Unchunked_Msg_Supported: 1;
|
||
|
|
||
|
uint8_t No_USB_Suspend: 1;
|
||
|
uint8_t USB_Comm_Capable: 1;
|
||
|
uint8_t Cap_Mismatch: 1;
|
||
|
uint8_t Give_Back_Flag: 1;
|
||
|
|
||
|
uint8_t Object_Position: 3;
|
||
|
uint8_t Reserved2: 1;
|
||
|
} s_FPR_PDO_bits;
|
||
|
} u_pd_pdos_raw;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint16_t voltage;
|
||
|
uint16_t max_current;
|
||
|
} s_pd_pdos;
|
||
|
|
||
|
extern uint8_t pd_int_flag;
|
||
|
extern s_pd_timers pd_timers;
|
||
|
extern s_pd_timers_mask pd_timers_mask;
|
||
|
|
||
|
|
||
|
void pd_init(void);
|
||
|
void pd_run(void);
|
||
|
|
||
|
static void pd_event_detect(void);
|
||
|
static void get_pd_pkt(void);
|
||
|
static void get_ctrl_msg_pkt(void);
|
||
|
static void get_data_msg_pkt(void);
|
||
|
static void get_ext_data_msg_pkt(void);
|
||
|
static void analyse_src_cap_pkt(void);
|
||
|
|
||
|
static void PE_SNK_Startup_action(void);
|
||
|
static void PE_SNK_Discovery_action(void);
|
||
|
static void PE_SNK_Wait_for_Capabilities_action(void);
|
||
|
static void PE_SNK_Evaluate_Capabilities_action(void);
|
||
|
static void PE_SNK_Select_Capability_action(void);
|
||
|
static void PE_SNK_Transition_Sink_action(void);
|
||
|
static void PE_SNK_Ready_action(void);
|
||
|
static void PE_SNK_Give_Sink_Cap_action(void);
|
||
|
static void PE_SNK_Get_Source_Cap_action(void);
|
||
|
static void PE_SNK_Hard_Reset_action(void);
|
||
|
static void PE_SNK_Transition_to_default_action(void);
|
||
|
|
||
|
static void pd_reset_protocol_layer(void);
|
||
|
static void pd_init_timer(uint16_t* timer, uint8_t* mask);
|
||
|
static void pd_reset_timer(uint16_t* timer, uint8_t* mask);
|
||
|
static void pd_init_counter(uint8_t* counter);
|
||
|
static void pd_reset_counter(uint8_t* counter);
|
||
|
static void pd_send_hardreset(void);
|
||
|
|
||
|
|
||
|
static void pd_pwr_req_pkt_assmble(void);
|
||
|
static void pd_req_pwr_evaluate(void);
|
||
|
static void send_pd_pkt(uint8_t *pd_send_pkt, uint8_t length);
|
||
|
|
||
|
#endif
|