sonic-buildimage/platform/nephos/sonic-platform-modules-ingrasys/s9130-32x/utils/i2c_utils.sh
Feng Lee ac2be9d99a [platform] update Ingrassy platform to support stretch (#2322)
* remove nephos sonic-platform-modules-ingrasys module

* [Ingrasys]Add platform drivers and device to support Debian Stretch

* fix gpio init issue
2018-11-30 20:46:36 -08:00

1721 lines
60 KiB
Bash
Executable File

#!/bin/bash
# Copyright (C) 2016 Ingrasys, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# trun on for more debug output
#DEBUG="on"
VERSION="1.1.0"
TRUE=200
FALSE=404
EXEC_FUNC=${1}
COLOR_LED=${2}
QSFP_PORT=${2}
QSFP_ACTION=${2}
MB_EEPROM_ACTION=${2}
ONOFF_LED=${3}
FAN_TRAY=${4}
############################################################
# Distributor ID: Debian
# Description: Debian GNU/Linux 8.6 (jessie)
# Release: 8.6
# Codename: jessie
# Linux debian 3.16.0-4-amd64 #1
# SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux
############################################################
# Color Definition
COLOR_TITLE="\e[1;32m" ### Green ###
COLOR_WARNING="\e[1;33m" ### Yellow ###
COLOR_ERROR="\e[1;31m" ### Red ###
COLOR_END="\e[0m" ### END ###
NUM_I801_DEVICE=0
# MAIN MUX PCA9548#0 0x73
NUM_MUX_9548_0_CH0=$(( ${NUM_I801_DEVICE} + 1 )) # ucd9090 0x34
NUM_MUX_9548_0_CH1=$(( ${NUM_I801_DEVICE} + 2 )) # PCA9539 0x76 for fp LED & HW ID
NUM_MUX_9548_0_CH7=$(( ${NUM_I801_DEVICE} + 8 )) # W83795 0x2F
# FRU MUX PCA9545#1 0x72
NUM_MUX_9545_1_CH0=$(( ${NUM_I801_DEVICE} + 9 )) # PSU2 0x50
NUM_MUX_9545_1_CH1=$(( ${NUM_I801_DEVICE} + 10 )) # PSU1 0x50
NUM_MUX_9545_1_CH2=$(( ${NUM_I801_DEVICE} + 11 )) # FAN board IO exander 0x20
NUM_MUX_9545_1_CH3=$(( ${NUM_I801_DEVICE} + 12 )) # TMP75#0 0x4C TMP75#1 0x49
# HOST MUX PCA9548#2 0X70
NUM_MUX_9548_2_CH0=$(( ${NUM_I801_DEVICE} + 13 )) # PCA9548#3 0x71
NUM_MUX_9548_2_CH1=$(( ${NUM_I801_DEVICE} + 14 )) # PCA9548#4 0x71
NUM_MUX_9548_2_CH2=$(( ${NUM_I801_DEVICE} + 15 )) # PCA9548#5 0x71
NUM_MUX_9548_2_CH3=$(( ${NUM_I801_DEVICE} + 16 )) # PCA9548#6 0x71
NUM_MUX_9548_2_CH4=$(( ${NUM_I801_DEVICE} + 17 )) # PCA9535#3~6 0x20~0x23 ZQSFP ABS/INT
NUM_MUX_9548_2_CH5=$(( ${NUM_I801_DEVICE} + 18 )) # PCA9535#7~10 0x20~0x23 ZQSFP LPMODE/RST
NUM_MUX_9548_3_CH0=$(( ${NUM_I801_DEVICE} + 21 )) # QSFP 0 EEPROM
NUM_MUX_9548_4_CH0=$(( ${NUM_I801_DEVICE} + 29 )) # QSFP 8 EEPROM
NUM_MUX_9548_5_CH0=$(( ${NUM_I801_DEVICE} + 37 )) # QSFP 16 EEPROM
NUM_MUX_9548_6_CH0=$(( ${NUM_I801_DEVICE} + 45 )) # QSFP 24 EEPROM
# MUX Alias
I2C_BUS_MAIN=${NUM_I801_DEVICE}
I2C_BUS_HWM=${NUM_MUX_9548_0_CH7}
I2C_BUS_FAN_STATUS=${NUM_MUX_9545_1_CH2}
I2C_BUS_SYS_LED=${NUM_MUX_9548_0_CH1}
I2C_BUS_HW_ID=${NUM_MUX_9548_0_CH1}
I2C_BUS_BMC_HW_ID=${I2C_BUS_MAIN}
I2C_BUS_PSU_STAT=${I2C_BUS_MAIN}
I2C_BUS_FANTRAY_LED=${NUM_MUX_9545_1_CH2}
I2C_BUS_MB_EEPROM=${I2C_BUS_MAIN}
I2C_BUS_CB_EEPROM=${I2C_BUS_MAIN}
I2C_BUS_PSU1_EEPROM=${NUM_MUX_9545_1_CH1}
I2C_BUS_PSU2_EEPROM=${NUM_MUX_9545_1_CH0}
PATH_SYS_I2C_DEVICES="/sys/bus/i2c/devices"
PATH_SYS_GPIO="/sys/class/gpio"
PATH_HWMON_ROOT_DEVICES="/sys/class/hwmon"
PATH_HWMON_W83795_DEVICE="${PATH_HWMON_ROOT_DEVICES}/hwmon5"
PATH_I801_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_I801_DEVICE}"
PATH_MUX_9548_0_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH0}"
PATH_MUX_9548_0_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH1}"
PATH_MUX_9548_0_CH7="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH7}"
PATH_MUX_9545_1_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9545_1_CH0}"
PATH_MUX_9545_1_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9545_1_CH1}"
PATH_MUX_9545_1_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9545_1_CH2}"
PATH_MUX_9545_1_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9545_1_CH3}"
PATH_MUX_9548_2_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH0}"
PATH_MUX_9548_2_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH1}"
PATH_MUX_9548_2_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH2}"
PATH_MUX_9548_2_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH3}"
PATH_MUX_9548_2_CH4="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH4}"
PATH_MUX_9548_2_CH5="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH5}"
PATH_MUX_9548_3_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_3_CH0}"
PATH_MUX_9548_4_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_4_CH0}"
PATH_MUX_9548_5_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_5_CH0}"
PATH_MUX_9548_6_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_6_CH0}"
# I2C Address
### I2C MUX
I2C_ADDR_MUX_9548_0=0x73 # MAIN MUX
I2C_ADDR_MUX_9545_1=0x72 # FRU MUX
I2C_ADDR_MUX_9548_2=0x70 # HOST MUX
I2C_ADDR_MUX_9548_3=0x71 # ZQSFP MUX #1 EEPROM
I2C_ADDR_MUX_9548_4=0x71 # ZQSFP MUX #2 EEPROM
I2C_ADDR_MUX_9548_5=0x71 # ZQSFP MUX #3 EEPROM
I2C_ADDR_MUX_9548_6=0x71 # ZQSFP MUX #4 EEPROM
### GPIO Expander
I2C_ADDR_MUX_9539_0=0x76 # LED & HW ID
I2C_ADDR_MUX_9539_1=0x75 # BMC PRSNT & HWM reset
I2C_ADDR_MUX_9539_2=0x74 # SYS SEL & RST
I2C_ADDR_MUX_9535_3=0x20 # ZQSFP0~15 ABS
I2C_ADDR_MUX_9535_4=0x21 # ZQSFP16~31 ABS
I2C_ADDR_MUX_9535_5=0x22 # ZQSFP0~15 INT
I2C_ADDR_MUX_9535_6=0x23 # ZQSFP16~31 INT
I2C_ADDR_MUX_9535_7=0x20 # ZQSFP0~15 LPMODE
I2C_ADDR_MUX_9535_8=0x21 # ZQSFP16~31 LPMODE
I2C_ADDR_MUX_9535_9=0x22 # ZQSFP0~15 RST
I2C_ADDR_MUX_9535_10=0x23 # ZQSFP16~31 RST
I2C_ADDR_MUX_9535_11=0x20 # on FAN board, fan status and led config
I2C_ADDR_MUX_9555_12=0x24 # on BMC board, INT and HW ID
I2C_ADDR_MUX_9555_13=0x25 # on BMC board, PSU status
I2C_ADDR_MUX_9555_14=0x26 # on BMC board, RST and SEL
I2C_ADDR_MUX_9539_15=0x77 # on CPU board, STATUS and ERR from CPLD
### peripheral
I2C_ADDR_MB_EEPROM=0x55 # on main board
I2C_ADDR_CB_EEPROM=0x51 # on cpu board
I2C_ADDR_UCD9090=0x34
I2C_ADDR_W83795=0x2F
I2C_ADDR_PSU1_EEPROM=0x50
I2C_ADDR_PSU2_EEPROM=0x50
I2C_ADDR_TMP75_REAR=0x4C
I2C_ADDR_TMP75_FRONT=0x49
I2C_ADDR_TMP75_CB=0x4F # on cpu board
I2C_ADDR_TMP75_BB=0x4A # on bmc board
I2C_ADDR_QSFP_EEPROM=0x50
#sysfs
PATH_SYSFS_PSU1="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_PSU1_EEPROM}-$(printf "%04x" $I2C_ADDR_PSU1_EEPROM)"
PATH_SYSFS_PSU2="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_PSU2_EEPROM}-$(printf "%04x" $I2C_ADDR_PSU2_EEPROM)"
#ACTIVE LOW enable flag
ACTIVE_LOW_EN=1
ACTIVE_HIGH_EN=0
#GPIO Direction In/Out
DIR_IN=in
DIR_OUT=out
#Power Supply Status
PSU_DC_ON=1
PSU_DC_OFF=0
PSU_EXIST=1
PSU_NOT_EXIST=0
# IO expander register
# direction
REG_PORT0_DIR=6
REG_PORT1_DIR=7
# polarity
REG_PORT0_POL=4
REG_PORT1_POL=5
# output
REG_PORT0_OUT=2
REG_PORT1_OUT=3
# input
REG_PORT0_IN=0
REG_PORT1_IN=1
#ZQSFP GPIO sysfs index
ZQSFP_PORT0_ABS_GPIO_IDX=240 # 240~255
ZQSFP_PORT16_ABS_GPIO_IDX=224 # 224~239
# switch port number range
MIN_PORT_NUM=1
MAX_PORT_NUM=32
#GPIO Offset
GPIO_OFFSET=0
# Help usage function
function _help {
echo "========================================================="
echo "# Description: Help Function"
echo "# Version : ${VERSION}"
echo "========================================================="
echo "----------------------------------------------------"
echo "EX : ${0} help"
echo " : ${0} i2c_init"
echo " : ${0} i2c_deinit"
echo " : ${0} i2c_fan_speed_init"
echo " : ${0} i2c_io_exp_init"
echo " : ${0} i2c_gpio_init"
echo " : ${0} i2c_gpio_deinit"
echo " : ${0} i2c_led_test"
echo " : ${0} i2c_psu_eeprom_get"
echo " : ${0} i2c_mb_eeprom_get"
echo " : ${0} i2c_cb_eeprom_get"
echo " : ${0} i2c_eeprom_sync"
echo " : ${0} i2c_qsfp_eeprom_get [1-32]"
echo " : ${0} i2c_qsfp_eeprom_init new|delete"
echo " : ${0} i2c_mb_eeprom_init new|delete"
echo " : ${0} i2c_cb_eeprom_init new|delete"
echo " : ${0} i2c_qsfp_status_get [1-32]"
echo " : ${0} i2c_qsfp_type_get [1-32]"
echo " : ${0} i2c_board_type_get"
echo " : ${0} i2c_bmc_board_type_get"
echo " : ${0} i2c_psu_status"
echo " : ${0} i2c_led_psu_status_set"
echo " : ${0} i2c_led_fan_status_set"
echo " : ${0} i2c_led_fan_tray_status_set"
echo " : ${0} i2c_test_all"
echo " : ${0} i2c_sys_led green|amber"
echo " : ${0} i2c_fan_led green|amber on|off"
echo " : ${0} i2c_psu1_led green|amber on|off"
echo " : ${0} i2c_psu2_led green|amber on|off"
echo " : ${0} i2c_fan_tray_led green|amber on|off [1-4]"
echo "----------------------------------------------------"
}
#Pause function
function _pause {
read -p "$*"
}
#Retry command function
function _retry {
local i
for i in {1..5};
do
eval "${*}" && break || echo "retry"; sleep 1;
done
}
#I2C Init
function _i2c_init {
echo "========================================================="
echo "# Description: I2C Init"
echo "========================================================="
#rmmod i2c_ismt
_util_rmmod i2c_i801
modprobe i2c_i801 disable_features=0x10
modprobe i2c_dev
modprobe i2c_mux_pca954x force_deselect_on_exit=1
# add MUX PCA9548#0 on I801, assume to be i2c-1~8
if [ ! -e ${PATH_MUX_9548_0_CH0} ]; then
_retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_0}' > ${PATH_I801_DEVICE}/new_device"
else
echo "pca9548 ${I2C_ADDR_MUX_9548_0} already init."
fi
# add MUX PCA9545#1 on I801, assume to be i2c-9~12
if [ ! -e ${PATH_MUX_9545_1_CH0} ]; then
_retry "echo 'pca9545 ${I2C_ADDR_MUX_9545_1}' > ${PATH_I801_DEVICE}/new_device"
else
echo "pca9545 ${I2C_ADDR_MUX_9545_1} already init."
fi
# add MUX PCA9548#2 on I801, assume to be i2c-13~20
if [ ! -e ${PATH_MUX_9548_2_CH0} ]; then
_retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_2}' > ${PATH_I801_DEVICE}/new_device"
else
echo "pca9548 ${I2C_ADDR_MUX_9548_2} already init."
fi
# add MUX PCA9548#3 on PCA9548#2 CH0, assume to be i2c-21~28
if [ ! -e ${PATH_MUX_9548_3_CH0} ]; then
_retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_3}' > ${PATH_MUX_9548_2_CH0}/new_device"
else
echo "pca9548 ${I2C_ADDR_MUX_9548_3} already init."
fi
# add MUX PCA9548#4 on PCA9548#2 CH1, assume to be i2c-29~36
if [ ! -e ${PATH_MUX_9548_4_CH0} ]; then
_retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_4}' > ${PATH_MUX_9548_2_CH1}/new_device"
else
echo "pca9548 ${I2C_ADDR_MUX_9548_4} already init."
fi
# add MUX PCA9548#5 on PCA9548#2 CH2, assume to be i2c-37~44
if [ ! -e ${PATH_MUX_9548_5_CH0} ]; then
_retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_5}' > ${PATH_MUX_9548_2_CH2}/new_device"
else
echo "pca9548 ${I2C_ADDR_MUX_9548_5} already init."
fi
# add MUX PCA9548#6 on PCA9548#2 CH3, assume to be i2c-45~52
if [ ! -e ${PATH_MUX_9548_6_CH0} ]; then
_retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_6}' > ${PATH_MUX_9548_2_CH3}/new_device"
else
echo "pca9548 ${I2C_ADDR_MUX_9548_6} already init."
fi
_i2c_hwm_init
_util_rmmod eeprom
modprobe eeprom_mb
modprobe gpio-pca953x
_i2c_io_exp_init
rmmod gpio_ich
_i2c_gpio_init
modprobe gpio_ich
_i2c_sensors_init
_i2c_psu_init
# Init LED_CLR register (pull shift register out of reset), should be after io exp init
_port_led_clr_init
_i2c_qsfp_eeprom_init "new"
_i2c_mb_eeprom_init "new"
_i2c_cb_eeprom_init "new"
_i2c_fan_speed_init
_i2c_led_psu_status_set
_i2c_led_fan_status_set
# sync eeprom content
_i2c_eeprom_sync
# trun on sys led
echo "led_sys setup..."
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_sys_led
_config_rmem
}
#I2C Deinit
function _i2c_deinit {
echo "i2c deinit..."
_i2c_gpio_deinit
for mod in coretemp jc42 w83795 eeprom eeprom_mb gpio-pca953x i2c_mux_pca954x i2c_i801 ingrasys_s9130_32x_psu;
do
_util_rmmod $mod
done
echo "Done"
}
function _i2c_sensors_init {
echo "SENSORS init..."
local dev_path
# to make sure hwmon index in sysfs as expected,
# need to remove kernel module and then probe them in expected order
# remove all sensors kernel module
_util_rmmod coretemp
_util_rmmod jc42
_util_rmmod w83795
# probe coretemp kernel module
modprobe coretemp
# probe hwmon kernel module
modprobe w83795
# add tmp75 to sysfs
####Main board thermal
dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9545_1_CH3}-$(printf "%04x" ${I2C_ADDR_TMP75_REAR})"
if ! [ -L ${dev_path} ]; then
echo "tmp75 ${I2C_ADDR_TMP75_REAR}" > ${PATH_MUX_9545_1_CH3}/new_device # hwmon1
else
echo "${dev_path} already exist"
fi
sleep 0.5
dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9545_1_CH3}-$(printf "%04x" ${I2C_ADDR_TMP75_FRONT})"
if ! [ -L ${dev_path} ]; then
echo "tmp75 ${I2C_ADDR_TMP75_FRONT}" > ${PATH_MUX_9545_1_CH3}/new_device #hwmon2
else
echo "${dev_path} already exist"
fi
sleep 0.5
####BMC board thermal
dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_0_CH7}-$(printf "%04x" ${I2C_ADDR_TMP75_BB})"
if ! [ -L ${dev_path} ]; then
echo "tmp75 ${I2C_ADDR_TMP75_BB}" > ${PATH_MUX_9548_0_CH7}/new_device #hwmon3
else
echo "${dev_path} already exist"
fi
sleep 0.5
####CPU board thermal
dev_path="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MAIN}-$(printf "%04x" ${I2C_ADDR_TMP75_CB})"
if ! [ -L ${dev_path} ]; then
echo "tmp75 ${I2C_ADDR_TMP75_CB}" > ${PATH_I801_DEVICE}/new_device #hwmon4
else
echo "${dev_path} already exist"
fi
sleep 0.5
# add w83795 to sysfs
dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_0_CH7}-$(printf "%04x" ${I2C_ADDR_W83795})"
if ! [ -L ${dev_path} ]; then
echo "w83795adg ${I2C_ADDR_W83795}" > ${PATH_MUX_9548_0_CH7}/new_device #hwmon5
else
echo "${dev_path} already exist"
fi
sleep 0.5
# probe jc42 kernel module
modprobe jc42
echo "Done"
}
function _port_led_clr_init {
echo "port led init..."
# gpio pin on GPIO MUX PCA9539#2 I/O 0.2
# pull high to out of reset
output_reg=${REG_PORT0_OUT}
mask=0x04
value=0x04
_util_i2cset -m ${mask} -y ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_2} ${output_reg} ${value}
echo "Done"
}
#FAN Speed Init
function _i2c_fan_speed_init {
echo -n "FAN SPEED INIT..."
if [ -e "${PATH_HWMON_W83795_DEVICE}" ]; then
# init fan speed
echo 120 > ${PATH_HWMON_W83795_DEVICE}/device/pwm1
echo 120 > ${PATH_HWMON_W83795_DEVICE}/device/pwm2
echo "SUCCESS"
else
echo "FAIL"
fi
}
# HWM init
function _i2c_hwm_init {
echo "HWM INIT..."
# select bank0
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x80
# SW reset, Disable monitor
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x01 0x9C
# disable TR5/TR6 DTS
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x04 0x0
# enable FANIN1~8
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x06 0xFF
# disable FANIN9~14
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x07 0x00
# CLKIN clock frequency set as 48Mhz
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x01 0x1C
# select bank 2
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x82
# set PWM mode in FOMC
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x0F 0x00
# set 25KHz fan output frequency in F1OPFP&F2OPFP
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x18 0x84
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x19 0x84
}
#Temperature sensor Init
function _i2c_temp_init {
echo "TEMP INIT..."
# enable temp monitor on w83795
# select bank0
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x80
# enable TR4 temperature monitoring
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x05 0x40
# disable TR5/TR6 DTS
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x04 0x0
echo "Done"
}
#VOLMON Init
function _i2c_volmon_init {
echo "VOLMON INIT..."
# enable voltage monitor on w83795
# VSEN1 P0V9
# VSEN2 VDD
# VSEN3 P1V2
# VSEN4 P1V8
# select bank0
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x80
# enable vsen1~4, disable vsen5~8
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x02 0x0F
# enable 3VDD,VBAT
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x03 0x50
echo "Done"
}
#FANIN Init
function _i2c_fan_init {
echo "FANIN INIT..."
# enable fan monitor on w83795
# 4 fantray with 8 FANIN
# select bank0
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x80
# enable FANIN1~8
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x06 0xFF
# disable FANIN9~14
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x07 0x00
# select bank 2
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x82
# set PWM mode in FOMC
_util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x0F 0x00
echo "Done"
}
#IO Expander Init
function _i2c_io_exp_init {
echo "========================================================="
echo "# Description: I2C IO Expender Init"
echo "========================================================="
# need to init BMC io expander first due to some io expander are reset default
echo "Init BMC INT & HW ID IO Expander"
# all input
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_12} ${REG_PORT0_DIR} 0xFF
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_12} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_12} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_12} ${REG_PORT1_POL} 0x00
echo "Init BMC PSU status IO Expander"
# PWRON default 0 (ACTIVE_LOW)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_13} ${REG_PORT0_OUT} 0x00
# default 0 (ACTIVE_LOW)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_13} ${REG_PORT1_OUT} 0x00
# I/O 0.2 0.5 output(PWRON), rest input
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_13} ${REG_PORT0_DIR} 0xDB
# I/O 1.0~1.1 input, 1.2~1.4 output (1.5~1.7 not enable)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_13} ${REG_PORT1_DIR} 0xE3
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_13} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_13} ${REG_PORT1_POL} 0x00
echo "Init BMC RST and SEL IO Expander"
# RST default is 1 (ACTIVE_LOW)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_14} ${REG_PORT0_OUT} 0x3F
# SEL default is 0 (HOST), EN default is 1 (ACTIVE_HIGH)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_14} ${REG_PORT1_OUT} 0x1F
# I/O 0.0~0.5 output, 0.6~0.7 not use
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_14} ${REG_PORT0_DIR} 0xC0
# all output
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_14} ${REG_PORT1_DIR} 0x00
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_14} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_14} ${REG_PORT1_POL} 0x00
echo "Init System LED & HW ID IO Expander"
# I/O_0.x for System LED default 0, I/O_1.x for HW ID
_util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT0_OUT} 0x00
# System LED => all output
_util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT0_DIR} 0x00
# HW ID => all input
_util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT1_POL} 0x00
echo "Init System PRSNT and HWM RST IO Expander"
# HWM_RST_L default 1 (ACTIVE_LOW)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_1} ${REG_PORT0_OUT} 0x04
# all input expect HWM_RST_L (0.2)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_1} ${REG_PORT0_DIR} 0xFB
# port1 not used
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_1} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_1} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_1} ${REG_PORT1_POL} 0x00
echo "Init System SEL and RST IO Expander"
# RST 0.0~0.3 default 1 (ACTIVE low), rest default 0
# SEL set to value 0 (host)
# LED_CLR also do init in _port_led_clr_init
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_OUT} 0x0F
# RST 1.6~1.7 default 1 (ACTIVE low), INT 1.0~1.4 default 1 (ACTIVE low)
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_OUT} 0xDF
# all output, but MAC_RST_L 0.0 need to set as input to prevent reboot issue
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_DIR} 0x09
# RST 1.5 !~ 1.7 output, rest are input
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_DIR} 0x1F
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_POL} 0x00
echo "Init FAN Board Status IO Expander"
# LED_G_L set to 0, LED_Y_L set to 1 (ACTIVE_LOW)
_util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9535_11} ${REG_PORT0_OUT} 0x22
_util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9535_11} ${REG_PORT1_OUT} 0x22
# DIR/ABS is input, LED_Y/LED_G is output
_util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9535_11} ${REG_PORT0_DIR} 0xCC
_util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9535_11} ${REG_PORT1_DIR} 0xCC
_util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9535_11} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9535_11} ${REG_PORT1_POL} 0x00
echo "Init CPU CPLD IO Expander"
# all input
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_15} ${REG_PORT0_DIR} 0xFF
# all input
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_15} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_15} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9539_15} ${REG_PORT1_POL} 0x00
echo "Init ZQSFP IO Expender"
echo "set ZQSFP ABS"
#zQSFP 0-15 ABS
# all input
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_3} ${REG_PORT0_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_3} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_3} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_3} ${REG_PORT1_POL} 0x00
#zQSFP 16-31 ABS
# all input
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_4} ${REG_PORT0_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_4} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_4} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_4} ${REG_PORT1_POL} 0x00
echo "set ZQSFP INT"
#zQSFP 0-15 INT
# all input
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_5} ${REG_PORT0_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_5} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_5} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_5} ${REG_PORT1_POL} 0x00
#zQSFP 16-31 INT
# all input
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_6} ${REG_PORT0_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_6} ${REG_PORT1_DIR} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_6} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH4} ${I2C_ADDR_MUX_9535_6} ${REG_PORT1_POL} 0x00
echo "set ZQSFP LP_MODE = 0"
#ZQSFP 0-15 LP_MODE
# default is 0
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_7} ${REG_PORT0_OUT} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_7} ${REG_PORT1_OUT} 0x00
# all output
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_7} ${REG_PORT0_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_7} ${REG_PORT1_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_7} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_7} ${REG_PORT1_POL} 0x00
#ZQSFP 16-31 LP_MODE
# default is 0
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_8} ${REG_PORT0_OUT} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_8} ${REG_PORT1_OUT} 0x00
# all output
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_8} ${REG_PORT0_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_8} ${REG_PORT1_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_8} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_8} ${REG_PORT1_POL} 0x00
echo "set ZQSFP RST = 1"
#ZQSFP 0-15 RST
# default is 1 (ACTIVE_LOW)
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_9} ${REG_PORT0_OUT} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_9} ${REG_PORT1_OUT} 0xFF
# all output
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_9} ${REG_PORT0_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_9} ${REG_PORT1_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_9} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_9} ${REG_PORT1_POL} 0x00
#ZQSFP 16-31 RST
# default is 1 (ACTIVE_LOW)
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_10} ${REG_PORT0_OUT} 0xFF
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_10} ${REG_PORT1_OUT} 0xFF
# all output
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_10} ${REG_PORT0_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_10} ${REG_PORT1_DIR} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_10} ${REG_PORT0_POL} 0x00
_util_i2cset -y -r ${NUM_MUX_9548_2_CH5} ${I2C_ADDR_MUX_9535_10} ${REG_PORT1_POL} 0x00
}
# To set the global variable GPIO_OFFSET
function _set_gpio_offset {
GPIO_OFFSET=0
for d in `ls /sys/class/gpio/ | grep gpiochip`
do
gpiochip_no=${d##gpiochip}
if [ $gpiochip_no -gt 255 ]; then
GPIO_OFFSET=256
break
fi
done
#echo "set GPIO_OFFSET=${GPIO_OFFSET}"
}
#GPIO Init
function _i2c_gpio_init {
local i=0
local start=255
local end=255
local ch_num=16
#ABS Port 0-15
echo "pca9535 ${I2C_ADDR_MUX_9535_3}" > ${PATH_MUX_9548_2_CH4}/new_device
_set_gpio_offset
start=$[ ${start}+${GPIO_OFFSET} ]
end=$[ ${end}+${GPIO_OFFSET} ]
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
_util_gpio_export ${i} ${DIR_IN} ${ACTIVE_LOW_EN}
done
#ABS Port 16-31
end=$[ ${start}-1]
echo "pca9535 ${I2C_ADDR_MUX_9535_4}" > ${PATH_MUX_9548_2_CH4}/new_device
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
_util_gpio_export ${i} ${DIR_IN} ${ACTIVE_LOW_EN}
done
#INT Port 0-15
end=$[ ${start}-1]
echo "pca9535 ${I2C_ADDR_MUX_9535_5}" > ${PATH_MUX_9548_2_CH4}/new_device
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
_util_gpio_export ${i} ${DIR_IN} ${ACTIVE_LOW_EN}
done
#INT Port 16-31
end=$[ ${start}-1]
echo "pca9535 ${I2C_ADDR_MUX_9535_6}" > ${PATH_MUX_9548_2_CH4}/new_device
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
_util_gpio_export ${i} ${DIR_IN} ${ACTIVE_LOW_EN}
done
#LP Mode Port 0-15
end=$[ ${start}-1]
echo "pca9535 ${I2C_ADDR_MUX_9535_7}" > ${PATH_MUX_9548_2_CH5}/new_device
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
_util_gpio_export ${i} ${DIR_OUT} ${ACTIVE_HIGH_EN}
done
#LP Mode Port 16-31
end=$[ ${start}-1]
echo "pca9535 ${I2C_ADDR_MUX_9535_8}" > ${PATH_MUX_9548_2_CH5}/new_device
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
_util_gpio_export ${i} ${DIR_OUT} ${ACTIVE_HIGH_EN}
done
#RESET Port 0-15
end=$[ ${start}-1]
echo "pca9535 ${I2C_ADDR_MUX_9535_9}" > ${PATH_MUX_9548_2_CH5}/new_device
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
# need to set value to low (became ACTIVE_HIGH) to take port out of reset
_util_gpio_export ${i} ${DIR_OUT} ${ACTIVE_LOW_EN} 0
done
#RESET Port 16-31
end=$[ ${start}-1]
echo "pca9535 ${I2C_ADDR_MUX_9535_10}" > ${PATH_MUX_9548_2_CH5}/new_device
start=$[ ${end}-${ch_num}+1]
for (( i=$start; i<=$end; i++ ))
do
# need to set value to low (became ACTIVE_HIGH) to take port out of reset
_util_gpio_export ${i} ${DIR_OUT} ${ACTIVE_LOW_EN} 0
done
}
#GPIO DeInit
function _i2c_gpio_deinit {
echo ${I2C_ADDR_MUX_9535_3} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH4}/delete_device
echo ${I2C_ADDR_MUX_9535_4} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH4}/delete_device
echo ${I2C_ADDR_MUX_9535_5} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH4}/delete_device
echo ${I2C_ADDR_MUX_9535_6} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH4}/delete_device
echo ${I2C_ADDR_MUX_9535_7} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH5}/delete_device
echo ${I2C_ADDR_MUX_9535_8} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH5}/delete_device
echo ${I2C_ADDR_MUX_9535_9} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH5}/delete_device
echo ${I2C_ADDR_MUX_9535_10} > /sys/bus/i2c/devices/i2c-${NUM_MUX_9548_2_CH5}/delete_device
}
#Set FAN Tray LED
function _i2c_led_fan_tray_status_set {
echo "FAN Tray Status Setup"
#FAN Status get
FAN1_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan8_alarm`
FAN2_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan7_alarm`
FAN3_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan6_alarm`
FAN4_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan5_alarm`
FAN5_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan4_alarm`
FAN6_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan3_alarm`
FAN7_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan2_alarm`
FAN8_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan1_alarm`
# check if io expander for fan tray exist
result=`i2cget -y ${I2C_BUS_FANTRAY_LED} ${I2C_ADDR_MUX_9535_11} ${REG_PORT0_IN} 2>/dev/null`
err_code=$?
if [ "$err_code" != "0" ]; then
echo "fan tray not exist!"
return
fi
if [ "${FAN1_ALARM}" == "0" ] && [ "${FAN2_ALARM}" == "0" ]; then
FAN_TRAY=1
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
else
FAN_TRAY=1
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
fi
if [ "${FAN3_ALARM}" == "0" ] && [ "${FAN4_ALARM}" == "0" ]; then
FAN_TRAY=2
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
else
FAN_TRAY=2
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
fi
if [ "${FAN5_ALARM}" == "0" ] && [ "${FAN6_ALARM}" == "0" ]; then
FAN_TRAY=3
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
else
FAN_TRAY=3
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
fi
if [ "${FAN7_ALARM}" == "0" ] && [ "${FAN8_ALARM}" == "0" ]; then
FAN_TRAY=4
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
else
FAN_TRAY=4
echo "FAN_TRAY${FAN_TRAY}..."
COLOR_LED="green"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
COLOR_LED="amber"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_tray_led
fi
}
#Set FAN LED
function _i2c_led_fan_status_set {
echo "FAN Status Setup"
#PSU Status set
FAN1_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan1_alarm`
FAN2_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan2_alarm`
FAN3_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan3_alarm`
FAN4_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan4_alarm`
FAN5_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan5_alarm`
FAN6_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan6_alarm`
FAN7_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan7_alarm`
FAN8_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan8_alarm`
echo "led_fan setup..."
# all fan ok
if [ "${FAN1_ALARM}" == "0" ] && [ "${FAN2_ALARM}" == "0" ] \
&& [ "${FAN3_ALARM}" == "0" ] && [ "${FAN4_ALARM}" == "0" ] \
&& [ "${FAN5_ALARM}" == "0" ] && [ "${FAN6_ALARM}" == "0" ] \
&& [ "${FAN7_ALARM}" == "0" ] && [ "${FAN8_ALARM}" == "0" ]; then
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_led
# all fan fail
elif [ "${FAN1_ALARM}" == "1" ] && [ "${FAN2_ALARM}" == "1" ] \
&& [ "${FAN3_ALARM}" == "1" ] && [ "${FAN4_ALARM}" == "1" ] \
&& [ "${FAN5_ALARM}" == "1" ] && [ "${FAN6_ALARM}" == "1" ] \
&& [ "${FAN7_ALARM}" == "1" ] && [ "${FAN8_ALARM}" == "1" ]; then
COLOR_LED="green"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_led
# partial fan fail
else
COLOR_LED="amber"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_fan_led
fi
}
#Set Power Supply LED
function _i2c_led_psu_status_set {
echo "PSU LED Status Setup"
#PSU Status set
_i2c_psu_status
#PSU1 Status
echo "led_psu1 setup..."
if [ "${psu1Exist}" == ${PSU_EXIST} ]; then
if [ "${psu1PwGood}" == ${PSU_DC_ON} ]; then
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_psu1_led
else
COLOR_LED="amber"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_psu1_led
fi
else
COLOR_LED="green"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_psu1_led
fi
#PSU2 Status
echo "led_psu2 setup..."
if [ "${psu2Exist}" == ${PSU_EXIST} ]; then
if [ "${psu2PwGood}" == ${PSU_DC_ON} ]; then
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_psu2_led
else
COLOR_LED="amber"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_psu2_led
fi
else
COLOR_LED="green"
ONOFF_LED="off"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_psu2_led
fi
}
#LED Test
function _i2c_led_test {
echo "========================================================="
echo "# Description: I2C SYSTEM LED TEST..."
echo "========================================================="
local output_reg=${REG_PORT0_OUT}
local mask=0xFF
local value=0xFF
#sys led (green)
# set sys_led_g (0.7) = 1
mask=0x80
value=0x80
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check SYS LED green light and Press [Enter] key to continue...'
#sys led (amber)
# set sys_led_g (0.7) = 0
mask=0x80
value=0x00
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check SYS LED amber light and Press [Enter] key to continue...'
#FAN led (green)
# set fan_led_en (0.6) = 1 & fan_led_y (0.5) = 0
mask=0x60
value=0x40
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check FAN LED green light and Press [Enter] key to continue...'
#FAN led (amber)
# set fan_led_en (0.6) = 1 & fan_led_y (0.5) = 1
mask=0x60
value=0x60
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check FAN LED amber light and Press [Enter] key to continue...'
#PSU1 led (green)
# set psu1_pwr_ok_oe (0.4) = 1 & psu1_led_y (0.3) = 0
mask=0x18
value=0x10
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check PSU1 LED green light and Press [Enter] key to continue...'
#PSU1 led (amber)
# set psu1_pwr_ok_oe (0.4) = 1 & psu1_led_y (0.3) = 1
mask=0x18
value=0x18
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check PSU1 LED amber light and Press [Enter] key to continue...'
#PSU2 led (green)
# set psu0_pwr_ok_oe (0.2) = 1 & psu0_led_y (0.1) = 0
mask=0x06
value=0x04
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check PSU2 LED green light and Press [Enter] key to continue...'
#PSU2 led (amber)
# set psu0_pwr_ok_oe (0.2) = 1 & psu0_led_y (0.1) = 1
mask=0x06
value=0x06
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check PSU2 LED amber light and Press [Enter] key to continue...'
#Turn OFF All LED (can't trun off system led)
# set set fan_led_en (0.6), psu1_pwr_ok_oe (0.4), psu0_pwr_ok_oe (0.2) = 0
mask=0x54
value=0x00
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
_pause 'Check turn off all LEDs (exclude SYS LED) and Press [Enter] key to continue...'
# restore sys led
COLOR_LED="green"
ONOFF_LED="on"
echo "${COLOR_LED} ${ONOFF_LED}"
_i2c_sys_led
echo "Done"
}
#Set QSFP Port variable
function _qsfp_port_i2c_var_set {
local port=$1
case ${port} in
1|2|3|4|5|6|7|8)
i2cbus=${NUM_MUX_9548_2_CH4}
eeprombusbase=${NUM_MUX_9548_3_CH0}
gpioBase=$((${GPIO_OFFSET}+${ZQSFP_PORT0_ABS_GPIO_IDX}))
#gpioBase=${ZQSFP_PORT0_ABS_GPIO_IDX}
;;
9|10|11|12|13|14|15|16)
i2cbus=${NUM_MUX_9548_2_CH4}
eeprombusbase=${NUM_MUX_9548_4_CH0}
gpioBase=$((${GPIO_OFFSET}+${ZQSFP_PORT0_ABS_GPIO_IDX}))
#gpioBase=${ZQSFP_PORT0_ABS_GPIO_IDX}
;;
17|18|19|20|21|22|23|24)
i2cbus=${NUM_MUX_9548_2_CH4}
eeprombusbase=${NUM_MUX_9548_5_CH0}
gpioBase=$((${GPIO_OFFSET}+${ZQSFP_PORT16_ABS_GPIO_IDX}))
#gpioBase=${ZQSFP_PORT16_ABS_GPIO_IDX}
;;
25|26|27|28|29|30|31|32)
i2cbus=${NUM_MUX_9548_2_CH4}
eeprombusbase=${NUM_MUX_9548_6_CH0}
gpioBase=$((${GPIO_OFFSET}+${ZQSFP_PORT16_ABS_GPIO_IDX}))
#gpioBase=${ZQSFP_PORT16_ABS_GPIO_IDX}
;;
*)
echo "Please input 1~32"
exit
;;
esac
}
#Set QSFP Port variable
function _qsfp_eeprom_var_set {
local port=$1
# port 1 => zqsfp0
# port 2 => zqsfp1
# ...
eeprombusidx=$(( (${port} - 1) % 8))
eeprombus=$(( ${eeprombusbase} + ${eeprombusidx} ))
eepromAddr=${I2C_ADDR_QSFP_EEPROM}
}
#Get QSFP EEPROM Information
function _i2c_qsfp_eeprom_get {
# input parameter validation
_util_input_check "${QSFP_PORT}" "${MIN_PORT_NUM}" "${MAX_PORT_NUM}"
_util_get_qsfp_abs
if [ $status = 0 ]; then
exit
fi
_qsfp_eeprom_var_set ${QSFP_PORT}
cat ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr)/eeprom | hexdump -C
}
#Init QSFP EEPROM
function _i2c_qsfp_eeprom_init {
echo "QSFP EEPROM INIT..."
#Action check
action=$1
if [ -z "${action}" ]; then
echo "No action, skip"
return
elif [ "${action}" != "new" ] && [ "${action}" != "delete" ]; then
echo "Error action, skip"
return
fi
#Init 1-32 ports EEPROM
local i
for i in {1..32};
do
_qsfp_port_i2c_var_set ${i}
_qsfp_eeprom_var_set ${i}
if [ "${action}" == "new" ] && \
! [ -L ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr) ]; then
echo "sff8436 $eepromAddr" > ${PATH_SYS_I2C_DEVICES}/i2c-$eeprombus/new_device
elif [ "${action}" == "delete" ] && \
[ -L ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr) ]; then
echo "$eepromAddr" > ${PATH_SYS_I2C_DEVICES}/i2c-$eeprombus/delete_device
fi
done
echo "Done"
}
#Init Main Board EEPROM
function _i2c_mb_eeprom_init {
echo -n "Main Board EEPROM INIT..."
#Action check
action=$1
if [ -z "${action}" ]; then
echo "No action, skip"
return
elif [ "${action}" != "new" ] && [ "${action}" != "delete" ]; then
echo "Error action, skip"
return
fi
#Init mb EEPROM
if [ "${action}" == "new" ] && \
! [ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM) ]; then
echo "mb_eeprom ${I2C_ADDR_MB_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_MB_EEPROM}/new_device
elif [ "${action}" == "delete" ] && \
[ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM) ]; then
echo "$I2C_ADDR_MB_EEPROM" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_MB_EEPROM}/delete_device
fi
echo "Done"
}
#Init CPU Board EEPROM
function _i2c_cb_eeprom_init {
echo -n "CPU Board EEPROM INIT..."
#Action check
action=$1
if [ -z "${action}" ]; then
echo "No action, skip"
return
elif [ "${action}" != "new" ] && [ "${action}" != "delete" ]; then
echo "Error action, skip"
return
fi
#Init cpu EEPROM
if [ "${action}" == "new" ] && \
! [ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM) ]; then
echo "mb_eeprom ${I2C_ADDR_CB_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CB_EEPROM}/new_device
elif [ "${action}" == "delete" ] && \
[ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM) ]; then
echo "$I2C_ADDR_CB_EEPROM" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CB_EEPROM}/delete_device
fi
echo "Done"
}
#get QSFP Status
function _i2c_qsfp_status_get {
# input parameter validation
_util_input_check "${QSFP_PORT}" "${MIN_PORT_NUM}" "${MAX_PORT_NUM}"
local stat
_util_get_qsfp_abs
echo "status=$status"
}
#get QSFP Type
function _i2c_qsfp_type_get {
# input parameter validation
_util_input_check "${QSFP_PORT}" "${MIN_PORT_NUM}" "${MAX_PORT_NUM}"
_qsfp_port_i2c_var_set ${QSFP_PORT}
_qsfp_eeprom_var_set ${QSFP_PORT}
#Get QSFP EEPROM info
qsfp_info=$(base64 ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr)/eeprom)
identifier=$(echo $qsfp_info | base64 -d -i | hexdump -s 128 -n 1 -e '"%x"')
connector=$(echo $qsfp_info | base64 -d -i | hexdump -s 130 -n 1 -e '"%x"')
transceiver=$(echo $qsfp_info | base64 -d -i | hexdump -s 131 -n 1 -e '"%x"')
echo "identifier=$identifier"
echo "connector=$connector"
echo "transceiver=$transceiver"
}
#Init PSU Kernel Module
function _i2c_psu_init {
echo "========================================================="
echo "# Description: I2C PSU Init"
echo "========================================================="
modprobe ingrasys_s9130_32x_psu
echo "psu1 ${I2C_ADDR_PSU1_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU1_EEPROM}/new_device
echo "psu2 ${I2C_ADDR_PSU2_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU2_EEPROM}/new_device
}
#Get PSU EEPROM Information
function _i2c_psu_eeprom_get {
local eeprom_psu1=""
local eeprom_psu2=""
echo "========================================================="
echo "# Description: I2C PSU EEPROM Get..."
echo "========================================================="
eeprom_psu1="${PATH_SYSFS_PSU1}/psu_eeprom"
cat ${eeprom_psu1} | hexdump -C
eeprom_psu2="${PATH_SYSFS_PSU2}/psu_eeprom"
cat ${eeprom_psu2} | hexdump -C
}
#Get Main Board EEPROM Information
function _i2c_mb_eeprom_get {
echo "========================================================="
echo "# Description: I2C MB EEPROM Get..."
echo "========================================================="
_i2c_sys_eeprom_get mb
}
#Get CPU Board EEPROM Information
function _i2c_cb_eeprom_get {
echo "========================================================="
echo "# Description: I2C CB EEPROM Get..."
echo "========================================================="
_i2c_sys_eeprom_get cb
}
#Get system EEPROM Information
##input: "cb" for cpu board, "mb" for main board
function _i2c_sys_eeprom_get {
local eeprom_dev
if [ "$1" == "cb" ]; then
eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM)/eeprom"
elif [ "$1" == "mb" ]; then
eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM)/eeprom"
else
echo "wrong eeprom type"
return
fi
# check if eeprom device exist in sysfs
if [ ! -f ${eeprom_dev} ]; then
echo "eeprom device not init"
return
fi
cat ${eeprom_dev} | hexdump -C
echo "Done"
}
#sync eeprom content between mb and cb eeprom
function _i2c_eeprom_sync {
echo "========================================================="
echo "# Description: EEPROM sync..."
echo "========================================================="
local mb_eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM)/eeprom"
local cb_eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM)/eeprom"
# check if eeprom device exist in sysfs
if [[ ! -f ${mb_eeprom_dev} || ! -f ${cb_eeprom_dev} ]]; then
echo "eeprom device not init"
return
fi
## check if MB eeprom is empty
if [ ! -z "$(cat ${mb_eeprom_dev} | hexdump -n2 | grep ffff)" ]; then
echo "copy cb eeprom to mb eeprom..."
cat ${cb_eeprom_dev} > ${mb_eeprom_dev}
else
echo "no need to sync"
fi
echo "Done"
}
#Set System Status LED
function _i2c_sys_led {
# only green/amber, on/off can't control
if [ "${COLOR_LED}" == "green" ]; then
# set sys_led_g (0.7) = 1
output_reg=${REG_PORT0_OUT}
mask=0x80
value=0x80
elif [ "${COLOR_LED}" == "amber" ]; then
# set sys_led_g (0.7) = 0
output_reg=${REG_PORT0_OUT}
mask=0x80
value=0x00
else
echo "Invalid Parameters, Exit!!!"
_help
exit ${FALSE}
fi
#apply to io expander
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
echo "Done"
}
#Set FAN LED
function _i2c_fan_led {
if [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "on" ]; then
# set fan_led_en (0.6) = 1 & fan_led_y (0.5) = 0
output_reg=${REG_PORT0_OUT}
mask=0x60
value=0x40
elif [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "off" ]; then
# set fan_led_en (0.6) = 0 & fan_led_y (0.5) = 0
output_reg=${REG_PORT0_OUT}
mask=0x60
value=0x00
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "on" ]; then
# set fan_led_en (0.6) = 1 & fan_led_y (0.5) = 1
output_reg=${REG_PORT0_OUT}
mask=0x60
value=0x60
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "off" ]; then
# set fan_led_en (0.6) = 0 & fan_led_y (0.5) = 1
output_reg=${REG_PORT0_OUT}
mask=0x60
value=0x20
else
echo "Invalid Parameters, Exit!!!"
_help
exit ${FALSE}
fi
#apply to io expander
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
echo "Done"
}
#Set PSU1 LED
function _i2c_psu1_led {
if [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "on" ]; then
# set psu1_pwr_ok_oe (0.4) = 1 & psu1_led_y (0.3) = 0
output_reg=${REG_PORT0_OUT}
mask=0x18
value=0x10
elif [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "off" ]; then
# set psu1_pwr_ok_oe (0.4) = 0 & psu1_led_y (0.3) = 0
output_reg=${REG_PORT0_OUT}
mask=0x18
value=0x00
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "on" ]; then
# set psu1_pwr_ok_oe (0.4) = 1 & psu1_led_y (0.3) = 1
output_reg=${REG_PORT0_OUT}
mask=0x18
value=0x18
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "off" ]; then
# set psu1_pwr_ok_oe (0.4) = 0 & psu1_led_y (0.3) = 1
output_reg=${REG_PORT0_OUT}
mask=0x18
value=0x08
else
echo "Invalid Parameters, Exit!!!"
_help
exit ${FALSE}
fi
#apply to io expander
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
echo "Done"
}
#Set PSU2 LED
function _i2c_psu2_led {
if [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "on" ]; then
# set psu0_pwr_ok_oe (0.2) = 1 & psu0_led_y (0.1) = 0
output_reg=${REG_PORT0_OUT}
mask=0x06
value=0x04
elif [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "off" ]; then
# set psu0_pwr_ok_oe (0.2) = 0 & psu0_led_y (0.1) = 0
output_reg=${REG_PORT0_OUT}
mask=0x06
value=0x00
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "on" ]; then
# set psu0_pwr_ok_oe (0.2) = 1 & psu0_led_y (0.1) = 1
output_reg=${REG_PORT0_OUT}
mask=0x06
value=0x06
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "off" ]; then
# set psu0_pwr_ok_oe (0.2) = 0 & psu0_led_y (0.1) = 1
output_reg=${REG_PORT0_OUT}
mask=0x06
value=0x02
else
echo "Invalid Parameters, Exit!!!"
_help
exit ${FALSE}
fi
#apply to io expander
_util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value}
echo "Done"
}
#Set FAN Tray LED
function _i2c_fan_tray_led {
i2cAddr=${I2C_ADDR_MUX_9535_11}
output_reg=${REG_PORT0_OUT}
case ${FAN_TRAY} in
4)
output_reg=${REG_PORT0_OUT}
if [ "${COLOR_LED}" == "green" ]; then
mask=0x01
elif [ "${COLOR_LED}" == "amber" ]; then
mask=0x02
fi
;;
3)
output_reg=${REG_PORT0_OUT}
if [ "${COLOR_LED}" == "green" ]; then
mask=0x10
elif [ "${COLOR_LED}" == "amber" ]; then
mask=0x20
fi
;;
2)
output_reg=${REG_PORT1_OUT}
if [ "${COLOR_LED}" == "green" ]; then
mask=0x01
elif [ "${COLOR_LED}" == "amber" ]; then
mask=0x02
fi
;;
1)
output_reg=${REG_PORT1_OUT}
if [ "${COLOR_LED}" == "green" ]; then
mask=0x10
elif [ "${COLOR_LED}" == "amber" ]; then
mask=0x20
fi
;;
*)
echo "Please input 1~4"
exit
;;
esac
if [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "on" ]; then
_util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0x00
elif [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "off" ]; then
_util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0x33
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "on" ]; then
_util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0x00
elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "off" ]; then
_util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0x33
else
echo "Invalid Parameters, Exit!!!"
_help
exit ${FALSE}
fi
echo "Done"
}
#Get Board Version and Type
function _i2c_board_type_get {
# read input port 1 value from io expander
input_reg=${REG_PORT1_IN}
boardType=`i2cget -y ${I2C_BUS_HW_ID} ${I2C_ADDR_MUX_9539_0} ${input_reg}`
boardBuildRev=$((($boardType) & 0x03))
boardHwRev=$((($boardType) >> 2 & 0x03))
boardId=$((($boardType) >> 4))
printf "MAIN_BOARD BOARD_ID is 0x%02x, HW Rev %d, Build Rev %d\n" $boardId $boardHwRev $boardBuildRev
}
#Get BMC Board Version and Type
function _i2c_bmc_board_type_get {
# read input port 1 value from io expander
input_reg=${REG_PORT1_IN}
boardType=`i2cget -y ${I2C_BUS_BMC_HW_ID} ${I2C_ADDR_MUX_9555_12} ${input_reg}`
boardBuildRev=$((($boardType) & 0x03))
boardHwRev=$((($boardType) >> 2 & 0x03))
boardId=$((($boardType) >> 4))
printf "BMC_BOARD BOARD_ID is 0x%02x, HW Rev %d, Build Rev %d\n" $boardId $boardHwRev $boardBuildRev
}
#Get PSU Status
function _i2c_psu_status {
local psu_abs=""
psu1PwGood=`cat ${PATH_SYSFS_PSU1}/psu_pg`
psu_abs=`cat ${PATH_SYSFS_PSU1}/psu_abs`
if [ "$psu_abs" == "0" ]; then
psu1Exist=1
else
psu1Exist=0
fi
psu2PwGood=`cat ${PATH_SYSFS_PSU2}/psu_pg`
psu_abs=`cat ${PATH_SYSFS_PSU2}/psu_abs`
if [ "$psu_abs" == "0" ]; then
psu2Exist=1
else
psu2Exist=0
fi
printf "PSU1 Exist:%x PSU1 PW Good:%d\n" $psu1Exist $psu1PwGood
printf "PSU2 Exist:%d PSU2 PW Good:%d\n" $psu2Exist $psu2PwGood
}
#util functions
function _util_i2cset {
if [ "$DEBUG" == "on" ]; then
i2cset $@
else
i2cset $@ 1>/dev/null
fi
}
function _util_rmmod {
local mod=$1
[ "$(lsmod | grep "^$mod ")" != "" ] && rmmod $mod
}
# get qsfp presence
function _util_get_qsfp_abs {
_qsfp_port_i2c_var_set ${QSFP_PORT}
#status: 0 -> Down, 1 -> Up (ACTIVE_LOW_EN)
status=`cat /sys/class/gpio/gpio$(( $(($gpioBase + (${QSFP_PORT} - 1) % 16 )) ))/value`
}
# gpio init util function
function _util_gpio_export {
local gpio_n=$1
local direction=$2
local active_low=$3
local value=$4
if [ -z "${gpio_n}" ]; then
echo "[gpio_init] gpio_n(${gpio_n}) is not provided"
return
fi
if [[ ${gpio_n} < 0 || ${gpio_n} > $(( 255+${GPIO_OFFSET} )) ]]; then
echo "[gpio_init] gpio_n(${gpio_n}) is invalid value"
return
fi
#export gpio
echo ${gpio_n} > /sys/class/gpio/export
#set gpio direction
echo ${direction} > /sys/class/gpio/gpio${gpio_n}/direction
#set gpio active_low
echo ${active_low} > /sys/class/gpio/gpio${gpio_n}/active_low
#set value
if [ ! -z "${value}" ]; then
echo ${value} > /sys/class/gpio/gpio${gpio_n}/value
fi
}
# valid input number
function _util_input_check {
# input parameter validation
if [[ $1 -lt $2 || $1 -gt $3 ]]; then
echo "Please input number $2~$3"
exit
fi
}
#Increase read socket buffer for CoPP Test
function _config_rmem {
echo "109430400" > /proc/sys/net/core/rmem_max
}
#Main Function
function _main {
tart_time_str=`date`
start_time_sec=$(date +%s)
_set_gpio_offset
if [ "${EXEC_FUNC}" == "help" ]; then
_help
elif [ "${EXEC_FUNC}" == "i2c_init" ]; then
_i2c_init
elif [ "${EXEC_FUNC}" == "i2c_deinit" ]; then
_i2c_deinit
elif [ "${EXEC_FUNC}" == "i2c_fan_speed_init" ]; then
_i2c_fan_speed_init
elif [ "${EXEC_FUNC}" == "i2c_io_exp_init" ]; then
_i2c_io_exp_init
elif [ "${EXEC_FUNC}" == "i2c_gpio_init" ]; then
_i2c_gpio_init
elif [ "${EXEC_FUNC}" == "i2c_gpio_deinit" ]; then
_i2c_gpio_deinit
elif [ "${EXEC_FUNC}" == "i2c_led_test" ]; then
_i2c_led_test
elif [ "${EXEC_FUNC}" == "i2c_mb_eeprom_get" ]; then
_i2c_mb_eeprom_get
elif [ "${EXEC_FUNC}" == "i2c_cb_eeprom_get" ]; then
_i2c_cb_eeprom_get
elif [ "${EXEC_FUNC}" == "i2c_eeprom_sync" ]; then
_i2c_eeprom_sync
elif [ "${EXEC_FUNC}" == "i2c_psu_eeprom_get" ]; then
_i2c_psu_eeprom_get
elif [ "${EXEC_FUNC}" == "i2c_qsfp_eeprom_get" ]; then
_i2c_qsfp_eeprom_get
elif [ "${EXEC_FUNC}" == "i2c_qsfp_eeprom_init" ]; then
_i2c_qsfp_eeprom_init ${QSFP_ACTION}
elif [ "${EXEC_FUNC}" == "i2c_mb_eeprom_init" ]; then
_i2c_mb_eeprom_init ${MB_EEPROM_ACTION}
elif [ "${EXEC_FUNC}" == "i2c_cb_eeprom_init" ]; then
_i2c_cb_eeprom_init ${MB_EEPROM_ACTION}
elif [ "${EXEC_FUNC}" == "i2c_qsfp_status_get" ]; then
_i2c_qsfp_status_get
elif [ "${EXEC_FUNC}" == "i2c_qsfp_type_get" ]; then
_i2c_qsfp_type_get
elif [ "${EXEC_FUNC}" == "i2c_led_psu_status_set" ]; then
_i2c_led_psu_status_set
elif [ "${EXEC_FUNC}" == "i2c_led_fan_status_set" ]; then
_i2c_led_fan_status_set
elif [ "${EXEC_FUNC}" == "i2c_led_fan_tray_status_set" ]; then
_i2c_led_fan_tray_status_set
elif [ "${EXEC_FUNC}" == "i2c_sys_led" ]; then
_i2c_sys_led
elif [ "${EXEC_FUNC}" == "i2c_fan_led" ]; then
_i2c_fan_led
elif [ "${EXEC_FUNC}" == "i2c_fan_tray_led" ]; then
_i2c_fan_tray_led
elif [ "${EXEC_FUNC}" == "i2c_psu1_led" ]; then
_i2c_psu1_led
elif [ "${EXEC_FUNC}" == "i2c_psu2_led" ]; then
_i2c_psu2_led
elif [ "${EXEC_FUNC}" == "i2c_board_type_get" ]; then
_i2c_board_type_get
elif [ "${EXEC_FUNC}" == "i2c_bmc_board_type_get" ]; then
_i2c_bmc_board_type_get
elif [ "${EXEC_FUNC}" == "i2c_psu_status" ]; then
_i2c_psu_status
elif [ "${EXEC_FUNC}" == "i2c_test_all" ]; then
_i2c_init
_i2c_led_test
_i2c_psu_eeprom_get
_i2c_mb_eeprom_get
_i2c_cb_eeprom_get
_i2c_board_type_get
_i2c_bmc_board_type_get
_i2c_psu_status
else
echo "Invalid Parameters, Exit!!!"
_help
exit ${FALSE}
fi
if [ "$DEBUG" == "on" ]; then
echo "-----------------------------------------------------"
end_time_str=`date`
end_time_sec=$(date +%s)
diff_time=$[ ${end_time_sec} - ${start_time_sec} ]
echo "Start Time: ${start_time_str} (${start_time_sec})"
echo "End Time : ${end_time_str} (${end_time_sec})"
echo "Total Execution Time: ${diff_time} sec"
echo "done!!!"
fi
}
_main