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.
725 lines
25 KiB
725 lines
25 KiB
#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
|
|
|