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.
 
 
 
 

316 lines
7.4 KiB

#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