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.

726 lines
25 KiB

4 months ago
#ifndef TASK_SCP_PRL_H
#define TASK_SCP_PRL_H
#include "task_scp_phy.h"
#define REG_ATTR_RESV 0x00
#define REG_ATTR_R 0x01
#define REG_ATTR_W 0x02
#define REG_ATTR_M 0x04 /* Multibyte R/W register */
#define REG_ATTR_RW (REG_ATTR_R | REG_ATTR_W)
#define REG_ATTR_MR (REG_ATTR_M | REG_ATTR_R)
#define REG_ATTR_MW (REG_ATTR_M | REG_ATTR_W)
#define REG_ATTR_MRW (REG_ATTR_M | REG_ATTR_RW)
/******************?J???????*****************/
#define R 1
#define RW 2
#define RC 3
#define R_ATTRIBUTE (R|RW)
#define MULTIBYTE 0X04
#define SBRWR 0x0B //??????
#define SBRRD 0x0C //??????
#define MBRWR 0x1B //??????????
#define MBRRD 0x1C //??????????
#define SCP_CMD_ACK 0x08
#define SCP_CMD_NACK 0x03
#define SCP_CMD_ACK_MASK 0x0f
#define SCP_ACK_ERR_MASK 0x80
#define SCP_CMD_RW_MASK 0x0f
/*
* SCP message format
*
* Single byte register write
* host: SBRWR(1) + ADDR(1) + DATA(1) + CRC(1)
* device: ACK(1) + CRC(1)
*
* Single byte register read
* host: SBRRD(1) + ADDR(1 ) + CRC(1)
* device: ACK(1) + DATA(1) + CRC(1)
*
* Multibyte register write
* host: MBRWR(1) + ADDR(1) + LEN(1) + DATA(LEN) + CRC(1)
* device: ACK(1) + CRC(1)
*
* Multibyte register read
* host: MBRRD(1) + ADDR(1) + LEN(1)
* device: ACK(1) + DATA(LEN) + CRC(1)
*/
#define SCP_HOST_MSG_CMD_OFFSET 0x00
#define SCP_HOST_MSG_ADDR_OFFSET 0x01
#define SCP_HOST_MSG_LEN_OFFSET 0x02
#define SCP_HOST_MSG_SBRWR_DATA_OFFSET 0x02
#define SCP_HOST_MSG_MBRWR_DATA_OFFSET 0x03
#define SCP_DEV_MSG_ACK_OFFSET 0x00
#define SCP_DEV_MSG_DATA_OFFSET 0x01
#define SCP_MULTI_BYTE_DATA_MAX_LEN 16
/*
* Adapter type information
*/
#define SCP_ADP_TYPE0 0x7e
#define SCP_ADP_TYPE0_STANDARD_SCP_MASK BIT_SET(7)
#define SCP_ADP_TYPE0_UNDETACH_CABLE_MASK BIT_SET(6)
#define SCP_ADP_TYPE0_TYPE_A_MASK BIT_SET(5)
#define SCP_ADP_TYPE0_TYPE_B_MASK BIT_SET(4)
#define SCP_ADP_TYPE0_B_SC_MASK BIT_SET(3)
#define SCP_ADP_TYPE0_B_NON_LVC_MASK BIT_SET(2)
#define SCP_ADP_TYPE0_PORT_TYPE_MASK (BIT_SET(1) | BIT_SET(0))
#define SCP_ADP_TYPE0_PORT_A 0x00
#define SCP_ADP_TYPE0_PORT_C 0x01
#define SCP_ADP_TYPE1 0x80
#define SCP_ADP_TYPE1_STANDARD_SCP_MASK BIT_SET(7)
#define SCP_ADP_TYPE1_TYPE_B_MASK BIT_SET(4)
#define SCP_ADP_TYPE1_PORT_TYPE_MASK (BIT_SET(1) | BIT_SET(0))
#define SCP_ADP_TYPE1_PORT_A 0x00
#define SCP_ADP_TYPE1_PORT_C 0x01
/* Vendor defined version */
#define SCP_COMPILEDVER_H 0x7c
#define SCP_COMPILEDVER_L 0x7d
/* SCP version xx.yy.zz */
#define SCP_FWVER_H 0x8a
#define SCP_FWVER_L 0x8b
#define SCP_FWVER_L_YYZZ(yy, zz) (((yy) << 4) | (zz))
/*
* SCP A(FCP) device registers
*/
#define FCP_DVCTYPE 0x00
#define FCP_DVCTYPE_5V2A_9V1P67A_12V1P25A 0x00
#define FCP_DVCTYPE_5V2A_9V2A_12V2A 0x01
#define FCP_DVCTYPE_5P2V3A_9V3A_12V3A_15V2P66A_20V2A 0x06
#define FCP_DVCTYPE_5V2A_9V2A_12V2A_15V3A_20V3P25A 0x09
/* SCP specification version */
#define FCP_SPEC_VER 0x01
#define FCP_SPEC_VER_1_30 0x22 /* SCP1.30G */
#define FCP_SCNTL 0x02
#define FCP_SSTAT 0x03
#define FCP_SSTAT_CRCRX_MASK BIT_SET(1)
#define FCP_SSTAT_PARRX_MASK BIT_SET(0)
#define FCP_ID_OUI_0 0x04
#define FCP_ID_OUI_1 0x05
#define FCP_CAPABILITIES 0x20
#define FCP_CAPABILITIES_CONST_PWR_MASK BIT_SET(1)
#define FCP_CAPABILITIES_DISCRETE_VOLTAGE_MASK BIT_SET(0)
#define FCP_DISCRETE_CAPABILITIES0 0x21
#define FCP_DISCRETE_CAPABILITIES0_5V_9V 0x01
#define FCP_DISCRETE_CAPABILITIES0_5V_9V_12V 0x02
#define FCP_MAX_PWR 0x22
#define FCP_MAX_PWR_VAL(p) (p * 2) /* in unit of W */
#define FCP_ADAPTER_STATUS 0x28
#define FCP_ADAPTER_STATUS_UVP_MASK BIT_SET(3)
#define FCP_ADAPTER_STATUS_OVP_MASK BIT_SET(2)
#define FCP_ADAPTER_STATUS_OCP_MASK BIT_SET(1)
#define FCP_ADAPTER_STATUS_OTP_MASK BIT_SET(0)
#define FCP_VOUT_STATUS 0x29 /* in units of 100mV */
#define FCP_VOUT_STATUS_VAL(mv) ((mv) / 100)
#define FCP_OUTPUT_CONTROL 0x2b
#define FCP_OUTPUT_CONTROL_DP_DETECT_DIS_MASK BIT_SET(4)
#define FCP_OUTPUT_CONTROL_VI_CFG_ENBALE_MASK BIT_SET(0)
#define FCP_VOUT_CONFIG 0x2c /* in units of 100mV */
#define FCP_VOUT_CONFIG_VAL(mv) ((mv) / 100)
#define FCP_IOUT_CONFIG 0x2d /* in units of 100mA */
#define FCP_IOUT_CONFIG_VAL(ma) ((ma) / 100)
#define FCP_OUT_CONFIG_MAX_NUM 16
#define FCP_DISCRETE_CAPABILITIES 0x2f
#define FCP_DISCRETE_CAPABILITIES_V_MASK (BIT_SET(7) | BIT_SET(6) | BIT_SET(5) | BIT_SET(4))
#define FCP_DISCRETE_CAPABILITIES_V_SHIFT 4
#define FCP_DISCRETE_CAPABILITIES_I_MASK (BIT_SET(3) | BIT_SET(2) | BIT_SET(1) | BIT_SET(0))
#define FCP_DISCRETE_CAPABILITIES_I_SHIFT 0
#define FCP_DISCRETE_CAPABILITIES_VAL(n) (((n) << FCP_DISCRETE_CAPABILITIES_V_SHIFT) | (n))
#define FCP_OUTPUT_V0 0x30 /* through 0x3f, in units of 100mV */
#define FCP_OUTPUT_V(n) (FCP_OUTPUT_V0 + (n))
#define FCP_OUTPUT_V_STEP 100
#define FCP_OUTPUT_V_VAL(mv) ((mv) / FCP_OUTPUT_V_STEP)
#define FCP_OUTPUT_UVP0 0x40 /* through 0x4f, in units of 100mV */
#define FCP_OUTPUT_UVP(n) (FCP_OUTPUT_UVP0 + (n))
#define FCP_OUTPUT_UVP_STEP 100
#define FCP_OUTPUT_UVP_VAL(mv) ((mv) / FCP_OUTPUT_UVP_STEP)
#define FCP_OUTPUT_I0 0x50 /* through 0x5f, in units of 100mA */
#define FCP_OUTPUT_I(n) (FCP_OUTPUT_I0 + (n))
#define FCP_OUTPUT_I_STEP 100
#define FCP_OUTPUT_I_VAL(ma) ((ma) / FCP_OUTPUT_I_STEP)
/*
* SCP B device registers
*/
#define SCP_B_ADP_TYPE 0x81
#define SCP_B_ADP_TYPE_STD_B 0x10
#define SCP_VENDER_ID_H 0x82
#define SCP_VENDER_ID_L 0x83
#define SCP_MODULE_ID_H 0x84
#define SCP_MODULE_ID_L 0x85
#define SCP_SERIAL_NO_H 0x86 /* year: 2015 + value */
#define SCP_SERIAL_NO_L 0x87 /* week */
#define SCP_CHIP_ID 0x88
#define SCP_HWVER 0x89
#define SCP_ADP_B_TYPE1 0x8d
#define SCP_ADP_B_TYPE1_25W_IWATT 0x00 /* iwatt 5v5a, lvc */
#define SCP_ADP_B_TYPE1_25W_RICH1 0x01 /* richtek1 5v5a, lvc */
#define SCP_ADP_B_TYPE1_25W_RICH2 0x03 /* richtek2 5v5a, lvc */
#define SCP_ADP_B_TYPE1_40W 0x02 /* 10v4a 11v3a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_40W_1 0x07 /* 10v4a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_20W 0x03 /* 10v2a 10v1.8a, sc+hv */
#define SCP_ADP_B_TYPE1_65W_MAX 0x04 /* 20v3.25a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_65W 0x05 /* 20v3.25a, sc+hv */
#define SCP_ADP_B_TYPE1_65W_1 0x08 /* 20v3.25a, sc+hv */
#define SCP_ADP_B_TYPE1_40W_BANK 0x06 /* 10v4a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_40W_CAR 0x09 /* 10v4a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_22P5W 0x0a /* 10v2.25a, sc+hv */
#define SCP_ADP_B_TYPE1_22P5W_BANK 0x0b /* wifi pro 5v4.5a 10v2a */
#define SCP_ADP_B_TYPE1_22P5W_CAR 0x0c /* 10v2.25a, sc+hv */
#define SCP_ADP_B_TYPE1_66W 0x0d /* 11v6a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_66W_CAR 0x0e /* 11v6a */
/* Qiantang River double port adapter typeC+typeA */
#define SCP_ADP_B_TYPE1_QTR_C_60W 0x0f /* 10v4a, 20v3a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_QTR_C_40W 0x10 /* 10v4a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_QTR_A_40W 0x11 /* 10v4a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_QTR_A_22P5W 0x12 /* 10v2.25a, lvc+sc+hv */
#define SCP_ADP_B_TYPE1_66W_BANK 0x13 /* 11v6a */
/* Huangpu River 2.0 three port adapter typeC1+typeA1+typeA2 */
#define SCP_ADP_B_TYPE1_HPR_C_66W 0x14 /* 10v6.6a */
#define SCP_ADP_B_TYPE1_HPR_C_40W 0x15 /* 10v4a 20v2a */
#define SCP_ADP_B_TYPE1_HPR_A_66W 0x16 /* 10v6.6A */
#define SCP_ADP_B_TYPE1_HPR_A_40W 0x17 /* 10v4a 20v2a */
#define SCP_ADP_B_TYPE1_HPR_A_22P5W 0x18 /* 10v2.25a */
#define SCP_ADP_B_TYPE1_NR_40W 0x19 /* 10v4a */
#define SCP_ADP_B_TYPE1_NR_40W_1 0x1a /* 10v4a */
#define SCP_ADP_B_TYPE1_NR_40W_2 0x1b /* 10v4a */
#define SCP_ADP_B_TYPE1_HHR_90W 0x1c /* 20v4.5a */
#define SCP_ADP_B_TYPE1_MJR_66W 0x1d /* 11v6a */
#define SCP_ADP_B_TYPE1_66W_CAR_1 0x1e /* 11v6a */
#define SCP_ADP_B_TYPE1_HPR_C_66W_1 0x1f /* 20v3.2a */
#define SCP_ADP_B_TYPE1_HPR_C_40W_1 0x20 /* 20v2a */
#define SCP_ADP_B_TYPE1_HPR_A_66W_1 0x21 /* 20v3.2a */
#define SCP_ADP_B_TYPE1_HPR_A_40W_1 0x22 /* 20v2a */
#define SCP_ADP_B_TYPE1_HPR_A_22P5W_1 0x23 /* 10v2.25a */
#define SCP_ADP_B_TYPE1_65W_2 0x24 /* 20v3.25a */
#define SCP_ADP_B_TYPE1_NR_40W_3 0x25 /* 10v4a */
#define SCP_ADP_B_TYPE1_JLR_135W 0x26
#define SCP_ADP_B_TYPE1_22P5W_CAR_1 0x27 /* 10v2.25a */
#define SCP_ADP_B_TYPE1_40W_2 0x28 /* 10v4a */
#define SCP_ADP_B_TYPE1_MJR_66W_1 0x29 /* 11v6a */
#define SCP_ADP_B_TYPE1_YLR_100W_CAR 0x2a /* 20v5a */
#define SCP_ADP_B_TYPE1_22P5W_BANK_1 0x2b /* 10v2.25a */
#define SCP_ADP_B_TYPE1_XR_65W_PC 0x2c /* 20v3.25a */
#define SCP_ADP_B_TYPE1_FCR_66W 0x2d /* 20v2a 11V6A */
#define SCP_ADP_B_TYPE1_HHR_90W_1 0x2e /* 20v4.5a */
/* Power Strip three port adapter typeC1+typeC2+typeA */
#define SCP_ADP_B_TYPE1_PS_C_65W 0x2f /* 20v3.25a */
#define SCP_ADP_B_TYPE1_PS_C_40W 0x30 /* 10v4a */
#define SCP_ADP_B_TYPE1_PS_C_40W_1 0x31 /* 10v4a */
#define SCP_ADP_B_TYPE1_PS_C_22P5W 0x32 /* 10v2.25a */
#define SCP_ADP_B_TYPE1_PS_A_40W 0x33 /* 10v4a */
#define SCP_ADP_B_TYPE1_PS_A_22P5W 0x34 /* 10v2.25a */
#define SCP_ADP_B_TYPE1_YLR_100W 0x3a /* 20v5a version2.0 */
#define SCP_FACTORY_ID 0x8e
#define SCP_MAX_PWR 0x90 /* in units of 100mW */
#define SCP_MAX_PWR_A_SHIFT 7
#define SCP_MAX_PWR_VAL(a, b) ((b) | ((a) << SCP_MAX_PWR_A_SHIFT))
#define SCP_CNT_PWR 0x91
#define SCP_MIN_VOUT 0x92 /* in unit of mV */
#define SCP_MAX_VOUT 0x93 /* in unit of mV */
#define SCP_MIN_IOUT 0x94 /* in unit of mA */
#define SCP_MAX_IOUT 0x95 /* in unit of mA */
#define SCP_VI_RANGE_VAL(a, b) ((b) | ((a) << 6))
#define SCP_VSTEP 0x96
#define SCP_VSTEP_A_SHIFT 6
#define SCP_ISTEP 0x97
#define SCP_ISTEP_A_SHIFT 6
#define SCP_MAX_VERR 0x98
#define SCP_MAX_IERR 0x99
#define SCP_MAX_ERR_VAL(a, b) ((b) | ((a) << 7))
#define SCP_MAX_STTIME 0x9A
#define SCP_MAX_RSPTIME 0x9B
#define SCP_MAX_IOUT_EXTEND 0x9c
#define SCP_MAX_POWER_EXTEND 0x9d
#define SCP_CTRL_BYTE0 0xa0
#define SCP_CTRL_BYTE0_OUTPUT_EN_MASK BIT_SET(7)
#define SCP_CTRL_BYTE0_OUTPUT_MODE_MASK BIT_SET(6) /* OUTPUT_MODE has higher priority over RESET */
#define SCP_CTRL_BYTE0_RESET_MASK BIT_SET(5)
#define SCP_CTRL_BYTE0_HWP_MASK BIT_SET(4)
#define SCP_CTRL_BYTE0_ACK_MSG_MASK BIT_SET(3)
#define SCP_CTRL_BYTE0_COT_EN BIT_SET(0)
#define SCP_CTRL_BYTE1 0xa1
#define SCP_CTRL_BYTE1_DP_DEGLITCH_MASK (BIT_SET(4) | BIT_SET(3)) /* in unit of ms */
#define SCP_CTRL_BYTE1_DP_DEGLITCH_SHIFT 3
#define SCP_CTRL_BYTE1_CTIMER_MASK (BIT_SET(2) | BIT_SET(1) | BIT_SET(0)) /* in units of 500ms */
#define SCP_CTIMER_TIMEOUT(s) (s * 2)
#define SCP_STATUS_BYTE0 0xa2
#define SCP_STATUS_BYTE0_OUTPUT_STS_MASK BIT_SET(7)
#define SCP_STATUS_BYTE0_READY_STS_MASK BIT_SET(6)
#define SCP_STATUS_BYTE0_MSG_STS_MASK BIT_SET(5)
#define SCP_STATUS_BYTE0_CC_CV_STS_MASK BIT_SET(4) /* 0: CV, 1: CC */
#define SCP_STATUS_BYTE0_CABLE_STS_MASK BIT_SET(3) /* 1: standard cable */
#define SCP_STATUS_BYTE0_COM_STS_MASK BIT_SET(0) /* 1: CTIMER timeout */
#define SCP_STATUS_BYTE1 0xa3
#define SCP_STATUS_BYTE1_CRCRX_MASK BIT_SET(7)
#define SCP_STATUS_BYTE1_PARRX_MASK BIT_SET(6)
#define SCP_STATUS_BYTE1_VIN_DUMP_MASK BIT_SET(5)
#define SCP_STATUS_BYTE1_OT_MASK BIT_SET(4)
#define SCP_STATUS_BYTE1_COT_MASK BIT_SET(3)
#define SCP_STATUS_BYTE1_OC_MASK BIT_SET(2)
#define SCP_STATUS_BYTE1_OV_MASK BIT_SET(1)
#define SCP_STATUS_BYTE1_UV_MASK BIT_SET(0)
#define SCP_STATUS_BYTE2 0xa4
#define SCP_STATUS_BYTE2_RLAD_OK BIT_SET(7)
#define SCP_SSTS 0xa5
#define SCP_SSTS_DPA_RTO_MASK (BIT_SET(3) | BIT_SET(2) | BIT_SET(1)) /* step: 1/8 */
#define SCP_SSTS_DPA_RTO_MASK_SHIFT 1
#define SCP_SSTS_DERATE_MASK BIT_SET(0)
#define SCP_INSIDE_TMP 0xa6
#define SCP_PORT_TMP 0xa7
#define SCP_READ_VOUT_H 0xa8
#define SCP_READ_VOUT_L 0xa9
#define SCP_READ_IOUT_H 0xaa
#define SCP_READ_IOUT_L 0xab
#define SCP_SREAD_VOUT 0xc8 /* in units of 10mV */
#define SCP_SREAD_VOUT_STEP 10
#define SCP_SREAD_IOUT 0xc9 /* in units of 50mA */
#define SCP_SREAD_IOUT_STEP 50
#define SCP_DAC_VSET_H 0xac
#define SCP_DAC_VSET_L 0xad
#define SCP_DAC_ISET_H 0xae
#define SCP_DAC_ISET_L 0xaf
#define SCP_VSET_BOUNDARY_H 0xb0
#define SCP_VSET_BOUNDARY_L 0xb1
#define SCP_ISET_BOUNDARY_H 0xb2
#define SCP_ISET_BOUNDARY_L 0xb3
#define SCP_MAX_VSET_OFFSET 0xb4
#define SCP_MAX_VSET_OFFSET_A_SHIFT 6
#define SCP_MAX_ISET_OFFSET 0xb5
#define SCP_MAX_ISET_OFFSET_A_SHIFT 6
#define SCP_VSET_H 0xb8
#define SCP_VSET_L 0xb9
#define SCP_ISET_H 0xba
#define SCP_ISET_L 0xbb
#define SCP_VSSET 0xca
#define SCP_VSSET_OFFSET 3000 /* in unit of mV */
#define SCP_VSSET_STEP 10 /* in unit of mV */
#define SCP_VSSET_VAL(reg) (SCP_VSSET_OFFSET + (reg) * (uint16_t)SCP_VSSET_STEP)
#define SCP_ISSET 0xcb
#define SCP_ISSET_STEP 50 /* in unit of mA */
#define SCP_ISSET_VAL(reg) ((uint16_t)(reg) * SCP_ISSET_STEP)
#define SCP_VSET_OFFSET_H 0xbc
#define SCP_VSET_OFFSET_L 0xbd
#define SCP_VSET_OFFSET(h, l) ((((uint16_t)((h) & 0x7f)) << 8) | l)
#define SCP_VSET_OFFSET_NEGATIVE(h) (((h) & 0x80) != 0)
#define SCP_ISET_OFFSET_H 0xbe
#define SCP_ISET_OFFSET_L 0xbf
#define SCP_ISET_OFFSET(h, l) ((((uint16_t)((h) & 0x7f)) << 8) | l)
#define SCP_ISET_OFFSET_NEGATIVE(h) (((h) & 0x80) != 0)
#define SCP_STEP_VSET_OFFSET 0xcc
#define SCP_STEP_VSET_OFFSET_MASK 0x7f
#define SCP_STEP_VSET_OFFSET_NEG_MASK 0x80
#define SCP_STEP_ISET_OFFSET 0xcd
#define SCP_STEP_ISET_OFFSET_MASK 0x7f
#define SCP_STEP_ISET_OFFSET_NEG_MASK 0x80
#define SCP_S_FUN_1 0xce
#define SCP_KEY_IDX_PUBLIC 0x01
#define SCP_KEY_IDX_RELEASE 0xff
#define SCP_S_FUN_2 0xcf
#define SCP_ENCRYPT_ENABLE_MASK BIT_SET(7)
#define SCP_ENCRYPT_COMPLETED_MASK BIT_SET(6)
#define SCP_USBPD_DISABLE_MASK BIT_SET(0)
#define SCP_ENCRYPT_RANDOM_WR_BASE 0xa0
#define SCP_ENCRYPT_RANDOM_WR_SIZE 8
#define SCP_ENCRYPT_RANDOM_RD_BASE 0xa8
#define SCP_ENCRYPT_RANDOM_RD_SIZE 8
#define SCP_ENCRYPT_HASH_RD_BASE 0xb0
#define SCP_ENCRYPT_HASH_RD_SIZE 16
#define SCP_PWR_SEG_NUM 0x8f
#define SCP_PWR_SEG_NUM_MAX 15
#define SCP_PWR_SEG_BASE 0xd0 /* through 0xed */
#define SCP_PWR_VOUT_SEG(n) (SCP_PWR_SEG_BASE + (n - 1) * 2)
#define SCP_PWR_VOUT_SEG_STEP 500 /* in unit of mV */
#define SCP_PWR_IOUT_SEG(n) (SCP_PWR_SEG_BASE + (n - 1) * 2 + 1)
#define SCP_PWR_IOUT_SEG_STEP 100 /* in unit of mA */
struct scp_prl_s;
typedef struct scp_prl_s scp_prl_s;
typedef enum SCP_PROCESS_e
{
SCP_ENTRY_STATUS = 0,
SCP_EXIT_STATUS
} SCP_PROCESS_e;
typedef enum SCP_TX_STATES_e
{
SCP_TX_WAIT_REQUEST = 0,
SCP_TX_WAIT_PING_COMPLETE,
SCP_TX_WAIT_DATA_COMPLETE
} SCP_TX_STATES_e;
typedef enum SCP_RX_STATES_e
{
SCP_RX_WAIT_RECV_COMPLETE = 0,
SCP_RX_DATA_DISPOSE
} SCP_RX_STATES_e;
typedef struct
{
SCP_TX_STATES_e tx_state;
SCP_PROCESS_e tx_process;
} scp_tx_states_s;
typedef struct
{
SCP_RX_STATES_e rx_state;
SCP_PROCESS_e rx_process;
} scp_rx_states_s;
typedef enum SCP_COMM_DISPOSE_STATES_e
{
SCP_COMM_UNKNOWN = 0,
SCP_COMM_NCK,
SCP_COMM_MBRWR,
SCP_COMM_MBRRD,
SCP_COMM_SBRRD,
SCP_COMM_SBRWR
} SCP_COMM_DISPOSE_STATES_e;
typedef union
{
uint8_t byte[2];
struct
{
//byte0
uint8_t scp_int_flag_pkt_get : 1;
uint8_t scp_int_flag_reset_get: 1;
uint8_t scp_int_flag_rx_error: 1;
uint8_t scp_int_flag_crc_eeror: 1;
uint8_t scp_one_pkt_finish : 1;
uint8_t scp_commcationing: 1;
uint8_t scp_parity_error_flag: 1;
uint8_t scp_check_timeout_flag : 1;
//byte1
uint8_t scp_request_ping_sent: 1;
uint8_t scp_send_data_start: 1;
uint8_t scp_int_flag_tx_flag: 1;
uint8_t reserved0: 5;
} bf;
} u_scp_int_flags;
typedef union
{
uint16_t data16;
struct
{
//byte0
uint8_t scp_flag_parity_error: 4;
uint8_t scp_flag_crc_error : 4;
//byte1
uint8_t scp_request_data_sent : 1;/*NOT USED*/
uint8_t scp_afc_identify : 2;
uint8_t scp_encying_flag : 1;/*fix ot process flag*/
uint8_t scp_rcv_cmd_flag: 1;/*1:rcv scp mcn*/
uint8_t scp_rcv_cmd_rw_flag: 1;/*1:rd cmd;0:wr_cmd*/
uint8_t reserved : 2;
} bf;
} u_scp_process_flags;
typedef struct scp_prl_s_flags_s
{
volatile u_scp_int_flags scp_int_flags;
volatile u_scp_process_flags scp_process_flags;
} scp_prl_s_flags_s;
typedef struct scp_prl_callback_s
{
void (*scp_comm_dispose)(uint8_t port, scp_prl_s *scp_prl_passist);
uint8_t (*scp_comm_mbrwr)(uint8_t port, scp_prl_s *scp_prl_passist);
uint8_t (*scp_comm_mbrrd)(uint8_t port, scp_prl_s *scp_prl_passist);
uint8_t (*scp_comm_sbrrd)(uint8_t port, scp_prl_s *scp_prl_passist);
uint8_t (*scp_comm_sbrwr)(uint8_t port, scp_prl_s *scp_prl_passist);
} scp_prl_callback_s;
typedef struct scp_phy_callback_s
{
void (*scp_phy_logic_reset)(uint8_t port, bool enable);
void (*scp_send_pkt)(uint8_t port, uint8_t *buffer, uint8_t len);
void (*scp_phy_disable)(uint8_t port);
void (*scp_phy_reg_init)(uint8_t port);
void (*dpdn_dp_pull_down_resistor_set)(uint8_t port, uint8_t en);
uint8_t (*get_scp_rx_size)(uint8_t port);
uint8_t (*get_scp_phy_is_crc_ok)(uint8_t port);
bool (*scp_phy_afc_mode_check)(uint8_t port);
} scp_phy_callback_s;
struct scp_prl_s
{
scp_prl_s_flags_s scp_prl_flags;
/*add*/
uint8_t scp_rcv_addr;
uint8_t scp_rcv_len;
uint8_t scp_ping_get_cnt;
uint8_t tx_size;
uint8_t rx_size;
volatile uint8_t tx_sent_timeout;
volatile uint8_t tx_ping_sent_time_value;
volatile uint8_t tx_data_sent_time_value;
uint8_t afc_request_index;
uint8_t register_value[256];
uint8_t register_attribute[128];
uint8_t *tx_buffer;
uint8_t *rx_buffer;
const scp_prl_callback_s *scp_prl_callback;
const scp_phy_callback_s *scp_phy_callback;
};
/*
* @brief scp_phy_hook_init
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
*/
void scp_phy_hook_init(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_prl_hook_init
* @param port
* @param scp_prl_passist
* @note null
* @retval null
*/
void scp_prl_hook_init(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_tx_wait_requst
* @param port
* @param scp_prl_passist
* @note null
* @retval null
*/
void scp_tx_wait_requst(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_tx_wait_ping_complete
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
*/
void scp_tx_wait_ping_complete(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_tx_wait_data_complete
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
*/
void scp_tx_wait_data_complete(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_tx_run
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
*/
void scp_tx_run(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_rx_wait_recv_compelte
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
*/
void scp_rx_wait_recv_compelte(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_comm_dispose
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
* *for correct command as follows
*1. command of length is eeror ,just need to response ping
*2. when command of many byte , address len must even number. or else response nck
*3. wrong command ,just need to response ping
*/
void scp_comm_dispose(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_rx_data_dispose
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
*/
void scp_rx_data_dispose(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_rx_run
* @param port
* @param scp_prl_passist
* @note
* @retval NULL
*/
void scp_rx_run(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_comm_mbrwr
* @param port
* @param *scp_prl_passist
* @note //0x1b many_byte write
* @retval NULL
*/
uint8_t scp_comm_mbrwr(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_comm_mbrrd
* @param port
* @param *scp_prl_passist
* @note //0x1c many_byte read
* @retval NULL
*/
uint8_t scp_comm_mbrrd(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_comm_sbrrd
* @param port
* @param *scp_prl_passist
* @note //0x0c byte read
* @retval NULL
*/
uint8_t scp_comm_sbrrd(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_comm_sbrwr
* @param port
* @param *scp_prl_passist
* @note //0x0b byte write
* @retval NULL
*/
uint8_t scp_comm_sbrwr(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_prl_run scp_tx_rx
* @param port
* @param *scp_prl_passist
* @note
* @retval NULL
*/
void scp_prl_run(uint8_t port, scp_prl_s *scp_prl_passist);
/*
* @brief scp_prl_rx_handler
* @param port
* @param *scp_prl_passist
* @note
* @retval NULL
*/
void scp_prl_rx_handler(uint8_t port, scp_prl_s *scp_prl_passist);
#endif