#ifndef __PD_APP_H__ #define __PD_APP_H__ #include "task_pd_sys_app_define.h" #include "task_typec_define.h" #include "task_pd_prl_define.h" #include "task_pd_pe_define.h" #include "pd_chunk_define.h" #define PD_EXT_PKT_MAX_SIZE 60/*PD DMA is 60 byte*/ #define PD_EXT_PKT_RX_MAX_SIZE 32/*PD DMA is 60 byte*/ #define PD_CHUNK_RX_MAX_SIZE 264 #define PD_SRC_CAP_MAX_NUM 7 #define PD_EPR_SRC_CAP_MAX_NUM 6 #define PD_MSG_HDR_L_OFFSET 0 #define PD_MSG_HDR_H_OFFSET 1 #define PD_MSG_PAYLOAD_OFFSET 2 #define PD_MSG_EXT_HDR_L_OFFSET 2 #define PD_MSG_EXT_HDR_H_OFFSET 3 #define PD_MSG_EXT_PAYLOAD_OFFSET 4 #define PD_VDM_HDR_OFFSET 2 #define PD_VDM_VDO_OFFSET 6 #define PD_OBJ_MAX_NUM 7 #define PD_VDO_MAX_NUM 6 #define PD_HDR_SIZE 2 #define PD_PAYLOAD_MAX_SIZE 28 #define PD_EXT_HDR_SIZE 2 #define PD_EXT_PAYLOAD_MAX_SIZE (PD_PAYLOAD_MAX_SIZE - PD_EXT_HDR_SIZE) #define PD_VDM_HDR_SIZE 4 #define PD_BIST_CARRIER_MODE 0x05 #define PD_BIST_TEST_DATA 0x08 #define PD_SVID 0xFF00 typedef enum { SVDM_CMD_TYPE_REQ = 0, SVDM_CMD_TYPE_ACK = 1, SVDM_CMD_TYPE_NAK = 2, SVDM_CMD_TYPE_BUSY = 3, } svdm_cmd_type_e; typedef enum { PWR_REQ_REJCT = 0, PWR_REQ_HARD_RST = 1, PWR_REQ_ACCEPT = 2, } pwr_req_resp_e; typedef enum { VDM_UNKNOWN = 0, VDM_IDENTITY_REQ_SUCESS = 1, VDM_SVID_REQ_SUCESS = 2, VDM_DIS_MODE_REQ_SUCESS = 3, VDM_DIS_ENTRY_MODE_REQ_SUCESS = 4, VDM_NAK = 5, } APPLE_VDM_STATE; struct pd_param_s; typedef struct pd_param_s pd_param_s; typedef struct { uint16_t tNoResponse; uint16_t tSrcRecover; uint16_t tPPSTimeout; uint16_t tTypeCSendSourceCap; uint8_t tSenderResponse; uint8_t tHardResetComplete; uint8_t tBISTContMode; uint8_t tChunkingNotSupported; uint8_t tSourcePowerSupplyReady; uint8_t tVDMSenderResponse; uint8_t tDiscoverIdentity; uint8_t tSinkTx; uint8_t tPSHardReset; uint8_t tVCONNSourceTimeout; uint8_t tWaitSendSrcCap; uint8_t tCCDebounce; } pd_time_maccor_s; typedef uint16_t (*hal_adc_get_vbus_t)(void); typedef uint16_t (*hal_adc_get_current_t)(void); typedef void (*hal_power_state_set_t)(uint8_t state); typedef void (*pd_power_shut_down_t)(void); typedef uint32_t (*pd_hw_get_soft_ver_t)(void); typedef struct hw_system_info_s { uint8_t power_mode; uint16_t adc_vbus_vol; uint16_t adc_current; uint16_t soft_ver; } hw_system_info_s; typedef struct { pd_sop_type_e sent_pkt_sop_type; pd_sop_type_e rcv_pkt_sop_type; int8_t rcv_msg_id[3]; uint8_t pd_spec_rev; uint8_t get_manu_info_type; uint8_t pd_bist_mode; uint8_t pd_power_role; //0:SNK, 1:SRC uint8_t pd_data_role; //0:UFP, 1:DFP uint8_t ccdis_delay; uint8_t tccdis_timer; uint8_t vconn_src; typec_attrs_s typec_attrs; pd_counters_s pd_counters; alert_flags_u alert_flags; u_task_pd_app_power_info recv_req_pdo; pd_rdos_raw_u recv_rdo; pd_sent_pkt_s pd_sent_pkt; pd_rcv_pkt_s pd_rcv_pkt; uint16_t vdm_req_svid; uint16_t vdm_svid; pd_timer_s pd_timers[PD_TIMER_COUNT]; pd_msg_header_s pd_msg_header; pd_ext_msg_header_s pd_ext_msg_header; pd_svdm_header_u rcv_svdm_header; pd_svdm_header_u snt_svdm_header; pd_ID_Header_u rcv_svdm_id_header; pd_Cert_Stat_u rcv_svdm_cert_stat; pd_Product_u rcv_svdm_product; pd_usvdm_header_u rcv_usvdm_header; packet_attr_u pkt_attr; pd_Product_Type_u rcv_svdm_product_type; usvdm_frame_u usvdm_frame; // src_cap_s src_cap; src_cap_s snk_cap; // pd_pdos_s snk_cap_pdo;//remove no use src_send_cap_s src_cap_send; pd_MIDB_u pd_midb; pd_ppssdb_u pd_ppssdb; pd_sdb_u pd_sdb; pd_scedb_u pd_scedb; pd_skedb_u pd_skedb; pd_ado_u pd_alart_pdo; //#ifdef APPLE_UVMD_SUPPORT uint8_t apple_uvdm_state; pd_apple_uvmd_u pd_apple_uvmd;/*add apple----20byte*/ //#endif // pd_GMIDB_u pd_get_manu_info; //remove no use hw_system_info_s hw_system_info; //hw pd_hw_uvdm_header_u hw_uvdm_header; PD_RMDO_u pd_revision_info; // uint16_t timeout[PD_TIMER_COUNT]; const uint16_t *timeout; //#ifdef CFG_PD_LONG_PKT // uint8_t recv_ext_msg[PD_EXT_PKT_RX_MAX_SIZE];/*recv packet buf*/ /*TODO reduce recv_ext_msg buf size to 36 */ uint8_t ext_msg[PD_EXT_PKT_MAX_SIZE];/*send packet buf*/ //#endif #ifdef CFG_PD_CHUNKED_EXT_MSG uint8_t expected_chunk; uint16_t received_size; #endif #ifdef CFG_PD_SRC_EPR uint8_t eprmd_enter_failed_data; src_send_cap_s epr_source_cap; #endif pd_sido_u sido; uint8_t apple_vdm_state; uint8_t apple_charge_status; uint8_t enter_mode_vdo_index; uint8_t applemode_uvdm_loss_cnt; uint8_t EPR_Mode_Entry_Ack_cnt; uint8_t EPR_Mode_Entry_Ack_max; } pd_assist_s; typedef struct { typec_status_s pd_typec_status; pd_prl_status_s pd_prl_status; pd_pe_status_s pd_pe_status; } s_pd_status; typedef struct { volatile typec_flags_u pd_typec_flags; volatile pd_prl_flags_u pd_prl_flag; volatile pd_prl_chunk_u pd_prl_chunk_flag; volatile pd_pe_event_flags_u pd_pe_event_flag; volatile pd_process_flags_u pd_process_flag; volatile u_task_pd_app_flags sys_app_pd_flag;/*Can be optimized*/ volatile pd_timer_flags_u pd_timer_flags; } pd_flags_s; typedef struct pd_callback_s { void (*pd_phy_open_vconn)(uint8_t port, pd_param_s* pd_param); void (*pd_phy_close_vconn)(uint8_t port, pd_param_s* pd_param); void (*pd_phy_set_SinkTxOk)(uint8_t port); void (*pd_phy_set_SinkTxNG)(uint8_t port); void (*pd_phy_init_pd)(uint8_t port, pd_param_s* pd_param); void (*pd_phy_set_data_role)(uint8_t port, bool role); void (*pd_phy_close_SOP12)(uint8_t port, bool en); void (*pd_prl_analyze_header)(uint8_t port, pd_param_s* pd_param); void (*pd_prl_analyze_msg)(uint8_t port, pd_param_s* pd_param); void (*pd_prl_ext_msg_header)(uint8_t port, pd_param_s* pd_param); //not uset void (*pd_prl_req_cap_msg)(uint8_t port, pd_assist_s* pd_assist); void (*send_pd_pkt)(uint8_t port, pd_param_s* pd_param); void (*enter_bist_carrier_mode)(uint8_t port); bool (*request_handler)(uint8_t port, pd_param_s* pd_param); void (*pd_get_manufacturer_info_msg_assemble)(uint8_t port, pd_param_s* pd_param); void (*pd_manufacturer_info_msg_assemble)(uint8_t port, pd_param_s* pd_param); void (*pd_src_status_msg_assemble)(uint8_t port, pd_param_s* pd_param); void (*pd_src_alart_msg_assemble)(uint8_t port, pd_param_s* pd_param); uint8_t (*pd_pwr_snk_req_evaluate)(uint8_t port, pd_param_s* pd_param); bool (*pe_reset_handler_ext)(uint8_t port, pd_param_s* pd_param); void (*pd_svdm_req_msg_assemble_ext)(pd_param_s* pd_param, uint8_t obj_pos, uint8_t cmd_typ, uint8_t cmd, uint16_t svid); void (*pd_pe_reset_ext)(uint8_t port, pd_param_s* pd_param); void (*pd_src_cap_ext_msg_assemble)(uint8_t port, pd_param_s* pd_param); void (*pd_ctrl_msg_assemble_ext)(pd_ctrl_msg_type_e ctrl_msg_type, pd_param_s* pd_param); void (*PE_SRC_Ready_packet_deal)(uint8_t port, pd_param_s* pd_param); void (*pd_vswap_check)(uint8_t port, pd_param_s* pd_param); void (*PE_VDM_Request_deal)(uint8_t port, pd_param_s* pd_param, svdm_cmd_e request_type, uint16_t svid); } pd_callback_s; typedef struct pd_callback2_s { void (*pd_phy_open_vbus)(uint8_t port); void (*pd_phy_close_vbus)(uint8_t port); bool (*pd_phy_get_cc_status)(uint8_t port, pd_param_s* pd_param); void (*pd_phy_typec_disconnect_check)(uint8_t port, pd_param_s* pd_param); //pe void (*pd_resp_svdm_msg_assemble)(uint8_t port, vdm_cmd_type_e cmd_type, pd_param_s* pd_param); void (*pd_resp_hw_uvdm)(uint8_t port, pd_param_s* pd_param); void (*pd_prl_req_cap_msg)(uint8_t port, pd_assist_s* pd_assist); void (*pd_src_cap_msg_assemble)(uint8_t port, pd_param_s* pd_param); bool (*app_src_power_handler)(uint8_t port, pd_param_s* pd_param); bool (*app_src_power_check)(uint8_t port, pd_param_s* pd_param); void (*PE_VDM_Attention_Request)(uint8_t port, pd_param_s* pd_param); void (*PE_OTHER_UVDM_call)(uint8_t port, pd_param_s* pd_param); void (*PE_RESVERD0_Info_call)(uint8_t port, pd_param_s* pd_param); void (*PE_APPLE_UVDM_call)(uint8_t port, pd_param_s* pd_param); void (*PE_DFP_VDM_Mode_Exit_Request_call)(uint8_t port, pd_param_s* pd_param); bool (*pd_epr_cable_check)(uint8_t port, pd_param_s* pd_param); void (*pd_epr_src_cap_msg_assemble)(uint8_t port, pd_param_s* pd_param); void (*pd_prl_epr_req_msg)(uint8_t port, pd_param_s* pd_param); void (*RCH_Processing_Extended_Message_callback)(uint8_t port, pd_param_s *pd_param); void (*TCH_Construct_Chunked_Message_callback)(uint8_t port, pd_param_s *pd_param); void (*TCH_Sending_Chunked_Message_callback)(uint8_t port, pd_param_s *pd_param); void (*TCH_Wait_Chunk_Request_callback)(uint8_t port, pd_param_s *pd_param); void (*PE_SRC_Evaluate_EPR_Mode_Entry_callback)(uint8_t port, pd_param_s* pd_param); void (*PE_SRC_EPR_Mode_Entry_Ack_callback)(uint8_t port, pd_param_s* pd_param); void (*PE_SRC_EPR_Mode_Discover_Cable_callback)(uint8_t port, pd_param_s* pd_param); void (*PE_DFP_VCS_CBL_Send_Cable_Reset_callback)(uint8_t port, pd_param_s* pd_param); void (*pe_src_cable_check_callback)(uint8_t port, pd_param_s* pd_param); void (*pd_hard_reset_update_time)(uint8_t port, pd_param_s* pd_param); void (*pd_typec_status_real_time_check)(uint8_t port, pd_param_s* pd_param); void (*pd_pe_soft_reset_recev_error_packet)(uint8_t port, pd_param_s* pd_param); } pd_callback2_s; struct pd_param_s { pd_flags_s pd_flags; typec_status_s typec_status; pd_prl_status_s pd_prl_status; #ifdef CFG_PD_CHUNKED_EXT_MSG pd_chunk_state_s chunk_state; #endif pd_pe_status_s pd_pe_status; pd_assist_s pd_assist; const pd_callback_s *pd_callback; const pd_callback2_s *pd_callback2; }; #endif