#/bin/bash # # SFP28(25GbE) Retimer(DS250DF230) Setup(I2C) CDR Bypass # # check paramter if [ $# -ne 1 ]; then echo "Usage: sfp28_retimer_setup_cdr_bypass [port]" echo " [port] --> (0:SFP28_0, 1:SFP28_1) $1 " exit 1 fi # command tmp CMD_RT='/tmp/.ess_cmd_rt' # ************************************************************************************************** sfp28_port=$1 # ************************************************************************************************** # 25G Retimer I2C Address # ************************************************************************************************** # i2c-15 i2c i2c-1-mux (chan_id 2) I2C adapter I2C3_CH2 25G Retimer #1 # i2c-16 i2c i2c-1-mux (chan_id 3) I2C adapter I2C3_CH3 25G Retimer #2 # Retimer I2C Address 0x18 if [ $sfp28_port -eq 0 ]; then I2C_ADR="15" echo " *** 25G Retimer 0 Setup (CDR Bypass) *** " fi if [ $sfp28_port -eq 1 ]; then I2C_ADR="16" echo " *** 25G Retimer 1 Setup (CDR Bypass) *** " fi # ************************************************************************************************** # ********************************************************** # Device ID # ********************************************************** # ------------------------------------------------------ # Read the Device ID # ------------------------------------------------------ i2cget -f -y $I2C_ADR 0x18 0xF1 > $CMD_RT # Device ID DS250DF230: 0x15 DATA_TMP="$(cat $CMD_RT)" echo " Device ID : $DATA_TMP" # ********************************************************** # CPU --> Retimer --> SFP28 : CH0 # ********************************************************** # ------------------------------------------------------ # CH0 # ------------------------------------------------------ echo " CH0" i2cset -f -y -m 0x03 $I2C_ADR 0x18 0xFC 0x01 # Select channel 0 i2cset -f -y -m 0x03 $I2C_ADR 0x18 0xFF 0x01 # Select channel mode i2cset -f -y -m 0x0C $I2C_ADR 0x18 0x0A 0x0C # Assert CDR reset # ------------------------------------------------------ # Set Receiver Adapt Mode # ------------------------------------------------------ echo " Set Receiver Adapt Mode 0" i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x00 # Set Adapt Mode = 0 # i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x20 # Set Adapt Mode = 1 # i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x40 # Set Adapt Mode = 2 # i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x40 # Set Adapt Mode = 3 # ------------------------------------------------------ # Select Output Mode When CDR is Not Locked # Select Output Mode When CDR is Locked # ------------------------------------------------------ # echo " Select Output Mode When CDR is Not Locked" # echo " Select Output Mode When CDR is Locked" echo " CDR Bypass, Pre-LOCK = Raw Data, Post-LOCK = Raw Data" i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0x1E 0x00 # PFD_SEL_DATA_PRELCK=3'b000: Raw, un-retimed data i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0xA5 0x00 # PFD_SEL_DATA_PSTLCK=3'b000: Raw, un-retimed data # echo " CDR Bypass, Pre-LOCK = Raw Data, Post = Retimed Data" # i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0x1E 0x00 # PFD_SEL_DATA_PRELCK=3'b000: Raw, un-retimed data # echo " CDR Bypass, Pre-LOCK = Mute, Post = Retimed Data" # i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0x1E 0xE0 # PFD_SEL_DATA_PRELCK=3'b111: Mute (Default) # i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0xA5 0x20 # PFD_SEL_DATA_PSTLCK=3'b001: Retimed data (default) # ------------------------------------------------------ # Set CTLE Boost Value # ------------------------------------------------------ echo " Set CTLE Boost Value" i2cset -f -y -m 0x08 $I2C_ADR 0x18 0x2D 0x08 # REG_EQ_BST_OV=1'b1: Enable EQ boost override i2cset -f -y -m 0xFF $I2C_ADR 0x18 0x03 0x00 # EQ_BST0-3[1:0]=8'h00: Set EQ boost value as 0 # ------------------------------------------------------ # Set Variable Gain Amplifier (VGA) and CTLE DC Gain Mode # ------------------------------------------------------ # | SOURCE TX LAUNCH AMPLITUDE RANGE | RECOMMENDED EQ GAIN SETTING | RECOMMENDED VGA GAIN SETTING | # | < 600 mVppd | 1 | 1 | # | 600 - 1000 mVppd | 1 | 0 | # | > 1000 mVppd | 0 | 0 | echo " Set Variable Gain Amplifier (VGA) and CTLE DC Gain Mode = 11" i2cset -f -y -m 0x20 $I2C_ADR 0x18 0x13 0x20 # Set EQ gain to 1 i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x8E 0x01 # Set VGA Gain to 1 # echo " Set Variable Gain Amplifier (VGA) and CTLE DC Gain Mode = 00" # i2cset -f -y -m 0x20 $I2C_ADR 0x18 0x13 0x00 # Set EQ gain to 0 # i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x8E 0x00 # Set VGA Gain to 0 # ------------------------------------------------------ # Adjustable Output Swing Under Raw Mode # ------------------------------------------------------ # | RPH(REG_0x1A[7:6]) | Low Swing Mode(REG_0xD[0]=0) | High Swing Mode(REG_0xD[0]=1) | # | 0 | 602 mV | 733 mV | # | 1 | 640 mV (Default Setting) | 782 mV | # | 2 | 692 mV | 846 mV | # | 3 | 749 mV | 919 mV | # echo " Adjustable Output Swing Under Raw Mode" # i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x0D 0x00 # 0: Low Swing(Default) # i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x0D 0x01 # 1: High Swing # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0x00 # BG_SEL_RPH_LV[1]=1'b0, BG_SEL_RPH_LV[0]=1'b0 # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0x40 # BG_SEL_RPH_LV[1]=1'b0, BG_SEL_RPH_LV[0]=1'b1(Default) # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0x80 # BG_SEL_RPH_LV[1]=1'b1, BG_SEL_RPH_LV[0]=1'b0 # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0xC0 # BG_SEL_RPH_LV[1]=1'b1, BG_SEL_RPH_LV[0]=1'b1 # ------------------------------------------------------ i2cset -f -y -m 0x0C $I2C_ADR 0x18 0x0A 0x00 # Release CDR Reset i2cset -f -y -m 0xFF $I2C_ADR 0x18 0xFC 0x00 # Select channel X i2cset -f -y -m 0x03 $I2C_ADR 0x18 0xFF 0x00 # Select shared mode sleep 0.5 # ********************************************************** # SFP28 --> Retimer --> CPU : CH1 # ********************************************************** # ------------------------------------------------------ # CH1 # ------------------------------------------------------ echo " CH1" i2cset -f -y -m 0x03 $I2C_ADR 0x18 0xFC 0x02 # Select channel 1 i2cset -f -y -m 0x03 $I2C_ADR 0x18 0xFF 0x01 # Select channel mode i2cset -f -y -m 0x0C $I2C_ADR 0x18 0x0A 0x0C # Assert CDR reset # ------------------------------------------------------ # Set Receiver Adapt Mode # ------------------------------------------------------ echo " Set Receiver Adapt Mode 0" i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x00 # Set Adapt Mode = 0 # i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x20 # Set Adapt Mode = 1 # i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x40 # Set Adapt Mode = 2 # i2cset -f -y -m 0x60 $I2C_ADR 0x18 0x31 0x40 # Set Adapt Mode = 3 # ------------------------------------------------------ # Select Output Mode When CDR is Not Locked # Select Output Mode When CDR is Locked # ------------------------------------------------------ # echo " Select Output Mode When CDR is Not Locked" # echo " Select Output Mode When CDR is Locked" # echo " CDR Bypass, Pre-LOCK = Raw Data, Post-LOCK = Raw Data" # i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0x1E 0x00 # PFD_SEL_DATA_PRELCK=3'b000: Raw, un-retimed data # i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0xA5 0x00 # PFD_SEL_DATA_PSTLCK=3'b000: Raw, un-retimed data # echo " CDR Bypass, Pre-LOCK = Raw Data, Post = Retimed Data" # i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0x1E 0x00 # PFD_SEL_DATA_PRELCK=3'b000: Raw, un-retimed data echo " CDR Bypass, Pre-LOCK = Mute, Post = Retimed Data" i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0x1E 0xE0 # PFD_SEL_DATA_PRELCK=3'b111: Mute (Default) i2cset -f -y -m 0xE0 $I2C_ADR 0x18 0xA5 0x20 # PFD_SEL_DATA_PSTLCK=3'b001: Retimed data (default) # ------------------------------------------------------ # Set CTLE Boost Value # ------------------------------------------------------ echo " Set CTLE Boost Value" i2cset -f -y -m 0x08 $I2C_ADR 0x18 0x2D 0x08 # REG_EQ_BST_OV=1'b1: Enable EQ boost override i2cset -f -y -m 0xFF $I2C_ADR 0x18 0x03 0x00 # EQ_BST0-3[1:0]=8'h00: Set EQ boost value as 0 # ------------------------------------------------------ # Set Variable Gain Amplifier (VGA) and CTLE DC Gain Mode # ------------------------------------------------------ # | SOURCE TX LAUNCH AMPLITUDE RANGE | RECOMMENDED EQ GAIN SETTING | RECOMMENDED VGA GAIN SETTING | # | < 600 mVppd | 1 | 1 | # | 600 - 1000 mVppd | 1 | 0 | # | > 1000 mVppd | 0 | 0 | echo " Set Variable Gain Amplifier (VGA) and CTLE DC Gain Mode = 11" i2cset -f -y -m 0x20 $I2C_ADR 0x18 0x13 0x20 # Set EQ gain to 1 i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x8E 0x01 # Set VGA Gain to 1 # echo " Set Variable Gain Amplifier (VGA) and CTLE DC Gain Mode = 00" # i2cset -f -y -m 0x20 $I2C_ADR 0x18 0x13 0x00 # Set EQ gain to 0 # i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x8E 0x00 # Set VGA Gain to 0 # ------------------------------------------------------ # Adjustable Output Swing Under Raw Mode # ------------------------------------------------------ # | RPH(REG_0x1A[7:6]) | Low Swing Mode(REG_0xD[0]=0) | High Swing Mode(REG_0xD[0]=1) | # | 0 | 602 mV | 733 mV | # | 1 | 640 mV (Default Setting) | 782 mV | # | 2 | 692 mV | 846 mV | # | 3 | 749 mV | 919 mV | # echo " Adjustable Output Swing Under Raw Mode" # i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x0D 0x00 # 0: Low Swing(Default) # i2cset -f -y -m 0x01 $I2C_ADR 0x18 0x0D 0x01 # 1: High Swing # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0x00 # BG_SEL_RPH_LV[1]=1'b0, BG_SEL_RPH_LV[0]=1'b0 # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0x40 # BG_SEL_RPH_LV[1]=1'b0, BG_SEL_RPH_LV[0]=1'b1(Default) # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0x80 # BG_SEL_RPH_LV[1]=1'b1, BG_SEL_RPH_LV[0]=1'b0 # i2cset -f -y -m 0xC0 $I2C_ADR 0x18 0x1A 0xC0 # BG_SEL_RPH_LV[1]=1'b1, BG_SEL_RPH_LV[0]=1'b1 # ------------------------------------------------------ i2cset -f -y -m 0x0C $I2C_ADR 0x18 0x0A 0x00 # Release CDR Reset i2cset -f -y -m 0xFF $I2C_ADR 0x18 0xFC 0x00 # Select channel X i2cset -f -y -m 0x03 $I2C_ADR 0x18 0xFF 0x00 # Select shared mode sleep 0.5 # ************************************************************************************************** echo " *** 25G Retimer Setup END *** " # ************************************************************************************************** exit 0