#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