From 7a74ff0c0153274cea37950e7e8894570fa4fadb Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Thu, 6 Dec 2018 16:38:53 +0800 Subject: [PATCH] [devices]: Add support as7326 thermal plan. Monitor fan/psu (#2344) * Add support as7326 thermal plan. Monitor fan/psu * Fix incorrect kernel version for idt init * fix error parsing --- .../as7326-56x/classes/fanutil.py | 10 +- .../as7326-56x/classes/thermalutil.py | 118 ++++-- .../as7326-platform-handle_mac.service | 16 + .../as7326-platform-monitor-fan.service | 16 + .../as7326-platform-monitor-psu.service | 16 + .../service/as7326-platform-monitor.service | 2 +- .../as7326-56x/utils/accton_as7326_monitor.py | 344 ++++++++++++------ .../utils/accton_as7326_monitor_fan.py | 200 ++++++++++ .../utils/accton_as7326_monitor_psu.py | 190 ++++++++++ .../as7326-56x/utils/accton_as7326_util.py | 6 +- .../as7326-56x/utils/accton_handle_idt.sh | 19 + .../as7326-56x/utils/idt_init.sh | 150 ++++++++ 12 files changed, 943 insertions(+), 144 deletions(-) create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-fan.service create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-psu.service create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_fan.py create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_psu.py create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_handle_idt.sh create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/idt_init.sh diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py index 06ebbb7779..91ca21aa52 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py @@ -18,9 +18,9 @@ # ------------------------------------------------------------------ # HISTORY: # mm/dd/yyyy (A.D.) -# 11/13/2017: Polly Hsu, Create -# 1/10/2018: Jostar modify for as7716_32 -# 3/32/2018: Roy Lee modify for as7326_56x +# 3/23/2018: Roy Lee modify for as7326_56x +# 6/26/2018: Jostar implement by new thermal policy from HW RD +# ------------------------------------------------------------------ # ------------------------------------------------------------------ try: @@ -44,7 +44,6 @@ class FanUtil(object): FAN_NODE_NUM_OF_MAP = 2 FAN_NODE_FAULT_IDX_OF_MAP = 1 - #FAN_NODE_SPEED_IDX_OF_MAP = 2 FAN_NODE_DIR_IDX_OF_MAP = 2 #FAN_NODE_DUTY_IDX_OF_MAP = 4 #FANR_NODE_FAULT_IDX_OF_MAP = 5 @@ -215,7 +214,6 @@ class FanUtil(object): except IOError as e: print "Error: unable to open file: %s" % str(e) return False - #val = ((val + 1 ) * 625 +75 ) / 100 fan_file.write(str(val)) fan_file.close() return True @@ -232,7 +230,7 @@ class FanUtil(object): return None if self.get_fan_fault(fan_num) is not None and self.get_fan_fault(fan_num) > 0: - logging.debug('GET. FAN fault. fan_num, %d', fan_num) + #logging.debug('GET. FAN fault. fan_num, %d', fan_num) return False #if self.get_fanr_fault(fan_num) is not None and self.get_fanr_fault(fan_num) > 0: diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/thermalutil.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/thermalutil.py index e4329b8b97..2060bc19d9 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/thermalutil.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/thermalutil.py @@ -18,79 +18,133 @@ # ------------------------------------------------------------------ # HISTORY: # mm/dd/yyyy (A.D.) -# 11/13/2017: Polly Hsu, Create -# 1/10/2018:Jostar modify for as7716_32x # 3/23/2018: Roy Lee modify for as7326_56x +# 6/26/2018: Jostar implement by new thermal policy from HW RD # ------------------------------------------------------------------ try: + import os import time import logging import glob + import commands from collections import namedtuple except ImportError as e: raise ImportError('%s - required module not found' % str(e)) +def log_os_system(cmd, show): + logging.info('Run :'+cmd) + status = 1 + output = "" + status, output = commands.getstatusoutput(cmd) + if show: + print "ACC: " + str(cmd) + " , result:"+ str(status) + + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + + class ThermalUtil(object): """Platform-specific ThermalUtil class""" - THERMAL_NUM_ON_MAIN_BROAD = 3 - THERMAL_NUM_1_IDX = 1 # 1_ON_MAIN_BROAD - THERMAL_NUM_2_IDX = 2 # 2_ON_MAIN_BROAD - THERMAL_NUM_3_IDX = 3 # 3_ON_MAIN_BROAD - - BASE_VAL_PATH = '/sys/bus/i2c/devices/{0}-00{1}/hwmon/hwmon*/temp1_input' + THERMAL_NUM_MAX = 6 + THERMAL_NUM_1_IDX = 1 # 1_ON_MAIN_BROAD. LM75 + THERMAL_NUM_2_IDX = 2 # 2_ON_MAIN_BROAD. LM75 + THERMAL_NUM_3_IDX = 3 # 3_ON_MAIN_BROAD. LM75 + THERMAL_NUM_4_IDX = 4 # CPU board. LM75 + THERMAL_NUM_5_IDX = 5 # CPU core thermal + THERMAL_NUM_6_IDX = 6 # BCM thermal + BCM_thermal_cmd = 'bcmcmd "show temp" > /tmp/bcm_thermal' + BCM_thermal_path = '/tmp/bcm_thermal' + #BCM_thermal_path = '/tmp/bcm_debug' """ Dictionary where key1 = thermal id index (integer) starting from 1 value = path to fan device file (string) """ - _thermal_to_device_path_mapping = {} + #_thermal_to_device_path_mapping = {} _thermal_to_device_node_mapping = { THERMAL_NUM_1_IDX: ['15', '48'], THERMAL_NUM_2_IDX: ['15', '49'], THERMAL_NUM_3_IDX: ['15', '4a'], + THERMAL_NUM_4_IDX: ['15', '4b'], + } + thermal_sysfspath ={ + THERMAL_NUM_1_IDX: ["/sys/bus/i2c/drivers/lm75/15-0048/hwmon/hwmon2/temp1_input"], + THERMAL_NUM_2_IDX: ["/sys/bus/i2c/drivers/lm75/15-0049/hwmon/hwmon3/temp1_input"], + THERMAL_NUM_3_IDX: ["/sys/bus/i2c/drivers/lm75/15-004a/hwmon/hwmon4/temp1_input"], + THERMAL_NUM_4_IDX: ["/sys/bus/i2c/drivers/lm75/15-004b/hwmon/hwmon5/temp1_input"], + THERMAL_NUM_5_IDX: ["/sys/class/hwmon/hwmon0/temp1_input"], } - def __init__(self): - thermal_path = self.BASE_VAL_PATH + #def __init__(self): - for x in range(self.THERMAL_NUM_1_IDX, self.THERMAL_NUM_ON_MAIN_BROAD+1): - self._thermal_to_device_path_mapping[x] = thermal_path.format( - self._thermal_to_device_node_mapping[x][0], - self._thermal_to_device_node_mapping[x][1]) - - def _get_thermal_node_val(self, thermal_num): - if thermal_num < self.THERMAL_NUM_1_IDX or thermal_num > self.THERMAL_NUM_ON_MAIN_BROAD: + def _get_thermal_val(self, thermal_num): + if thermal_num < self.THERMAL_NUM_1_IDX or thermal_num > self.THERMAL_NUM_MAX: logging.debug('GET. Parameter error. thermal_num, %d', thermal_num) return None + if thermal_num < self.THERMAL_NUM_6_IDX: device_path = self.get_thermal_to_device_path(thermal_num) + if(os.path.isfile(device_path)): for filename in glob.glob(device_path): try: val_file = open(filename, 'r') except IOError as e: logging.error('GET. unable to open file: %s', str(e)) return None - content = val_file.readline().rstrip() - if content == '': logging.debug('GET. content is NULL. device_path:%s', device_path) return None - try: val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None + return int(content) - return int(content) + else: + print "No such device_path=%s"%device_path + return 0 + else: + log_os_system(self.BCM_thermal_cmd,0) + file_path = self.BCM_thermal_path + check_file = open(file_path) + try: + check_file = open(file_path) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return 0 + file_str = check_file.read() + search_str="average current temperature is" + print "file_str.find=%s"%file_str.find(search_str) + str_len = len(search_str) + idx=file_str.find(search_str) + if idx==-1: + print "bcm sdk is not ready ,retrun 0" + return 0 + else: + #print "file_str[idx]=%c"%file_str[idx+str_len+1] + #print "file_str[idx]=%c"%file_str[idx+str_len+2] + #print "file_str[idx]=%c"%file_str[idx+str_len+2+1] + #print "file_str[idx]=%c"%file_str[idx+str_len+2+2] + #print "file_str[idx]=%c"%file_str[idx+str_len+2+3] + #print "file_str[idx]=%c"%file_str[idx+str_len+2+4] + #print "file_str[idx]=%c"%file_str[idx+str_len+2+5] + #print "file_str[idx]=%c"%file_str[idx+str_len+2+6] + temp_str=file_str[idx+str_len+1] + file_str[idx+str_len+2] + file_str[idx+str_len+3]+file_str[idx+str_len+4] +file_str[idx+str_len+5] + print "bcm temp_str=%s"%temp_str + check_file.close() + return float(temp_str)*1000 def get_num_thermals(self): - return self.THERMAL_NUM_ON_MAIN_BROAD + return self.THERMAL_NUM_MAX def get_idx_thermal_start(self): return self.THERMAL_NUM_1_IDX @@ -99,10 +153,10 @@ class ThermalUtil(object): return len(self._thermal_to_device_node_mapping) def get_size_path_map(self): - return len(self._thermal_to_device_path_mapping) + return len(self.thermal_sysfspath) def get_thermal_to_device_path(self, thermal_num): - return self._thermal_to_device_path_mapping[thermal_num] + return self.thermal_sysfspath[thermal_num][0] def get_thermal_1_val(self): return self._get_thermal_node_val(self.THERMAL_NUM_1_IDX) @@ -112,13 +166,19 @@ class ThermalUtil(object): def get_thermal_temp(self): return (self._get_thermal_node_val(self.THERMAL_NUM_1_IDX) + self._get_thermal_node_val(self.THERMAL_NUM_2_IDX) +self._get_thermal_node_val(self.THERMAL_NUM_3_IDX)) -#def main(): -# thermal = ThermalUtil() +def main(): + thermal = ThermalUtil() + print "termal1=%d" %thermal._get_thermal_val(1) + print "termal2=%d" %thermal._get_thermal_val(2) + print "termal3=%d" %thermal._get_thermal_val(3) + print "termal4=%d" %thermal._get_thermal_val(4) + print "termal5=%d" %thermal._get_thermal_val(5) + print "termal6=%d" %thermal._get_thermal_val(6) # # print 'get_size_node_map : %d' % thermal.get_size_node_map() # print 'get_size_path_map : %d' % thermal.get_size_path_map() # for x in range(thermal.get_idx_thermal_start(), thermal.get_num_thermals()+1): # print thermal.get_thermal_to_device_path(x) # -#if __name__ == '__main__': -# main() +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service new file mode 100755 index 0000000000..0e35d5929e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service @@ -0,0 +1,16 @@ +[Unit] +Description=Accton AS7326-56X Platform MAC hnadle service +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +ExecStart=/usr/local/bin/accton_handle_idt.sh +KillSignal=SIGKILL +SuccessExitStatus=SIGKILL + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-fan.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-fan.service new file mode 100755 index 0000000000..e714561bdf --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-fan.service @@ -0,0 +1,16 @@ +[Unit] +Description=Accton AS7326-56X Platform Monitoring FAN service +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +ExecStart=/usr/local/bin/accton_as7326_monitor_fan.py +KillSignal=SIGKILL +SuccessExitStatus=SIGKILL + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-psu.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-psu.service new file mode 100755 index 0000000000..77fa1fd5c1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor-psu.service @@ -0,0 +1,16 @@ +[Unit] +Description=Accton AS7326-56X Platform Monitoring PSU service +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +ExecStart=/usr/local/bin/accton_as7326_monitor_psu.py +KillSignal=SIGKILL +SuccessExitStatus=SIGKILL + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor.service index 3af4405fb4..9da8370471 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor.service +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-monitor.service @@ -1,7 +1,7 @@ [Unit] Description=Accton AS7326-56X Platform Monitoring service Before=pmon.service -After=sysinit.target +After=as7326-platform-handle_mac.service DefaultDependencies=no [Service] diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py index 856f194c5e..1cbcf5b4cf 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py @@ -18,9 +18,8 @@ # ------------------------------------------------------------------ # HISTORY: # mm/dd/yyyy (A.D.) -# 11/13/2017: Polly Hsu, Create -# 1/10/2018: Jostar modify for as7716_32 # 3/23/2018: Roy Lee modify for as7326_56x +# 6/26/2018: Jostar implement by new thermal policy from HW RD # ------------------------------------------------------------------ try: @@ -31,6 +30,7 @@ try: import imp import logging import logging.config + import logging.handlers import types import time # this is only being used as part of the example import traceback @@ -42,39 +42,63 @@ except ImportError as e: # Deafults VERSION = '1.0' -FUNCTION_NAME = 'accton_as7326_monitor' +FUNCTION_NAME = '/usr/local/bin/accton_as7326_monitor' global log_file global log_level -# (LM75_1+ LM75_2+ LM75_3) is LM75 at i2c addresses 0x48, 0x49, and 0x4A. -# TMP = (LM75_1+ LM75_2+ LM75_3)/3 -#1. If TMP < 35, All fans run with duty 31.25%. -#2. If TMP>=35 or the temperature of any one of fan is higher than 40, -# All fans run with duty 50% -#3. If TMP >= 40 or the temperature of any one of fan is higher than 45, -# All fans run with duty 62.5%. -#4. If TMP >= 45 or the temperature of any one of fan is higher than 50, -# All fans run with duty 100%. -#5. Any one of 6 fans is fault, set duty = 100%. -#6. Direction factor. If it is B2F direction, duty + 12%. - - # MISC: - # 1.Check single LM75 before applied average. - # 2.If no matched fan speed is found from the policy, - # use FAN_DUTY_CYCLE_MIN as default speed - # Get current temperature - # 4.Decision 3: Decide new fan speed depend on fan direction/current fan speed/temperature +#Default FAN speed: 37.5%(0x05) +#Ori is that detect: (U45_BCM56873 + Thermal sensor_LM75_CPU:0x4B) /2 +#New Detect: (sensor_LM75_49 + Thermal sensor_LM75_CPU_4B) /2 +#Thermal policy: Both F2B and B2F +#1. (sensor_LM75_49 + Thermal sensor_LM75_CPU) /2 =< 39C , Keep 37.5%(0x05) Fan speed +#2. (sensor_LM75_49 + Thermal sensor_LM75_CPU) /2 > 39C , Change Fan speed from 37.5%(0x05) to % 75%(0x0B) +#3. (sensor_LM75_49 + Thermal sensor_LM75_CPU) /2 > 45C , Change Fan speed from 75%(0x0B) to 100%(0x0F) +#4. (sensor_LM75_49 + Thermal sensor_LM75_CPU) /2 > 61C , Send alarm message +#5. (sensor_LM75_49 + Thermal sensor_LM75_CPU) /2 > 66C , Shutdown system +#6. One Fan fail , Change Fan speed to 100%(0x0F) + +#fan-dev 0-11 speed 0x05 Setup fan speed 37.50% +#fan-dev 0-11 speed 0xB Setup fan speed 75% +#fan-dev 0-11 speed 0xF Setup fan speed 100.00% +class switch(object): + def __init__(self, value): + self.value = value + self.fall = False + + def __iter__(self): + """Return the match method once, then stop""" + yield self.match + raise StopIteration + def match(self, *args): + """Indicate whether or not to enter a case suite""" + if self.fall or not args: + return True + elif self.value in args: # changed for v1.5, see below + self.fall = True + return True + else: + return False + + +fan_policy_state=1 +fan_fail=0 +alarm_state = 0 #0->default or clear, 1-->alarm detect +test_temp = 0 +test_temp_list = [0, 0, 0, 0, 0, 0] + # Make a class we can use to capture stdout and sterr in the log -class accton_as7326_monitor(object): +class device_monitor(object): # static temp var - _ori_temp = 0 - _new_perc = 0 - _ori_perc = 0 + temp = 0 + new_pwm = 0 + pwm=0 + ori_pwm = 0 + default_pwm=0x4 def __init__(self, log_file, log_level): """Needs a logger and a logger level.""" @@ -86,7 +110,6 @@ class accton_as7326_monitor(object): format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', datefmt='%H:%M:%S' ) - # set up logging to console if log_level == logging.DEBUG: console = logging.StreamHandler() @@ -95,96 +118,189 @@ class accton_as7326_monitor(object): console.setFormatter(formatter) logging.getLogger('').addHandler(console) - logging.debug('SET. logfile:%s / loglevel:%d', log_file, log_level) + sys_handler = handler = logging.handlers.SysLogHandler(address = '/dev/log') + sys_handler.setLevel(logging.WARNING) + logging.getLogger('').addHandler(sys_handler) + #logging.debug('SET. logfile:%s / loglevel:%d', log_file, log_level) + + def get_state_from_fan_policy(self, temp, policy): + state=0 + + #if temp >= 75000: + # state=LEVEL_TEMP_CRITICAL + # return state + logging.debug('temp=%d', temp) + for i in range(0, len(policy)): + #logging.debug('policy[%d][0]=%d, policy[%d][1]=%d', i,policy[i][0],i, policy[i][1]) + if temp > policy[i][0]: + if temp <= policy[i][1]: + state =policy[i][2] + logging.debug ('temp=%d >= policy[%d][0]=%d, temp=%d < policy[%d][1]=%d' , temp, i, policy[i][0], temp, i, policy[i][1]) + logging.debug ('fan_state=%d', state) + if state==0: + state=policy[0][2] #below fan_min, set to default pwm + logging.debug('set default state') + return state + def manage_fans(self): - max_duty = 100 - fan_policy_f2b = { - 0: [32, 0, 105000], - 1: [50, 105000, 120000], - 2: [63, 120000, 135000], - 3: [max_duty, 135000, sys.maxsize], + + thermal_pwm_list = {} #Ori sort is lm75_48, 49, 4a, 4b, cpu, bcm + # After get pwm, do sort to get max pwm. + LEVEL_FAN_DEF=1 + LEVEL_FAN_MID=2 + LEVEL_FAN_MAX=3 + LEVEL_TEMP_HIGH=4 + LEVEL_TEMP_CRITICAL=5 + + fan_policy_state_pwm_tlb = { + LEVEL_FAN_DEF: [38, 0x4], + LEVEL_FAN_MID: [75, 0xB], + LEVEL_FAN_MAX: [100, 0xE], + LEVEL_TEMP_HIGH: [100, 0xE], + LEVEL_TEMP_CRITICAL: [100, 0xE], } - fan_policy_b2f = { - 0: [44, 0, 105000], - 1: [63, 105000, 120000], - 2: [75, 120000, 135000], - 3: [max_duty, 135000, sys.maxsize], + global fan_policy_state + global fan_fail + global test_temp + global test_temp_list + global alarm_state + fan_policy ={ + 0: [0, 39000, LEVEL_FAN_DEF], #F2B_policy, B2F_plicy, PWM, reg_val + 1: [39000, 45000, LEVEL_FAN_MID], + 2: [45000, 61000, LEVEL_FAN_MAX], + 3: [61000, 66000, LEVEL_TEMP_HIGH], + 4: [66000, 200000, LEVEL_TEMP_CRITICAL], } - fan_policy_single = { - 0: 40000, - 1: 45000, - 2: 50000, - } - + thermal = ThermalUtil() fan = FanUtil() - for x in range(fan.get_idx_fan_start(), fan.get_num_fans()+1): - fan_status = fan.get_fan_status(x) - if fan_status is None: - logging.debug('INFO. SET new_perc to %d (FAN stauts is None. fan_num:%d)', max_duty, x) - return False - if fan_status is False: - logging.debug('INFO. SET new_perc to %d (FAN fault. fan_num:%d)', max_duty, x) - fan.set_fan_duty_cycle(max_duty) - return True - #logging.debug('INFO. fan_status is True (fan_num:%d)', x) - - fan_dir=fan.get_fan_dir(1) - if fan_dir == 1: - fan_policy = fan_policy_f2b + fan_dir=fan.get_fan_dir(1) + if fan_dir > 1: + fan_dri=1 #something wrong, set fan_dir to default val + if fan_dir < 0: + fan_dri=1 #something wrong, set fan_dir to default val + ori_pwm=fan.get_fan_duty_cycle() + new_pwm=0 + logging.debug('fan_dir=%d, ori_pwm=%d', fan_dir, ori_pwm) + logging.debug('test_temp=%d', test_temp) + if test_temp==0: + temp1 = thermal._get_thermal_val(1) + temp2 = thermal._get_thermal_val(2) + temp3 = thermal._get_thermal_val(3) + temp4 = thermal._get_thermal_val(4) + temp5 = thermal._get_thermal_val(5) + #temp6 = thermal._get_thermal_val(6) + temp6=0 else: - fan_policy = fan_policy_b2f + temp1 = test_temp_list[0] + temp2 = test_temp_list[1] + temp3 = test_temp_list[2] + temp4 = test_temp_list[3] + temp5 = test_temp_list[4] + #temp6 = test_temp_list[5] + temp6=0 + fan_fail=0 - #Decide fan duty by if any of sensors > fan_policy_single. - new_duty_cycle = fan_policy[0][0] - for x in range(thermal.get_idx_thermal_start(), thermal.get_num_thermals()+1): - single_thm = thermal._get_thermal_node_val(x) - for y in range(0, len(fan_policy_single)): - if single_thm > fan_policy_single[y]: - if fan_policy[y+1][0] > new_duty_cycle: - new_duty_cycle = fan_policy[y+1][0] - logging.debug('INFO. Single thermal sensor %d with temp %d > %d , new_duty_cycle=%d', - x, single_thm, fan_policy_single[y], new_duty_cycle) - single_result = new_duty_cycle - - - #Find if current duty matched any of define duty. - #If not, set it to highest one. - cur_duty_cycle = fan.get_fan_duty_cycle() - for x in range(0, len(fan_policy)): - if cur_duty_cycle == fan_policy[x][0]: - break - if x == len(fan_policy) : - fan.set_fan_duty_cycle(fan_policy[0][0]) - cur_duty_cycle = max_duty - - #Decide fan duty by if sum of sensors falls into any of fan_policy{} - get_temp = thermal.get_thermal_temp() - new_duty_cycle = cur_duty_cycle - for x in range(0, len(fan_policy)): - y = len(fan_policy) - x -1 #checked from highest - if get_temp > fan_policy[y][1] and get_temp < fan_policy[y][2] : - new_duty_cycle= fan_policy[y][0] - logging.debug('INFO. Sum of temp %d > %d , new_duty_cycle=%d', get_temp, fan_policy[y][1], new_duty_cycle) - - sum_result = new_duty_cycle - if (sum_result>single_result): - new_duty_cycle = sum_result; - else: - new_duty_cycle = single_result - - logging.debug('INFO. Final duty_cycle=%d', new_duty_cycle) - if(new_duty_cycle != cur_duty_cycle): - fan.set_fan_duty_cycle(new_duty_cycle) + if temp2==0: + temp_get=50000 # if one detect sensor is fail or zero, assign temp=50000, let fan to 75% + logging.debug('lm75_49 detect fail, so set temp_get=50000, let fan to 75%') + elif temp2==0: + temp_get=50000 # if one detect sensor is fail or zero, assign temp=50000, let fan to 75% + logging.debug('lm75_4b detect fail, so set temp_get=50000, let fan to 75%') + else: + temp_get= (temp2 + temp4)/2 # Use (sensor_LM75_49 + Thermal sensor_LM75_CPU_4B) /2 + ori_state=fan_policy_state + fan_policy_state=self.get_state_from_fan_policy(temp_get, fan_policy) + print "temp2=%d"%temp2 + print "temp4=%d"%temp4 + print "temp_get=%d"%temp_get + #print "temp4=%d"%temp4 + #print "temp6=%d"%temp6 + logging.debug('lm75_48=%d, lm75_49=%d, lm75_4a=%d, lm_4b=%d, cpu=%d, bcm=%d', temp1,temp2,temp3,temp4,temp5,temp6) + logging.debug('ori_state=%d, fan_policy_state=%d', ori_state, fan_policy_state) + new_pwm = fan_policy_state_pwm_tlb[fan_policy_state][0] + if fan_fail==0: + logging.debug('new_pwm=%d', new_pwm) + + if fan_fail==0: + if new_pwm!=ori_pwm: + fan.set_fan_duty_cycle(new_pwm) + logging.info('Set fan speed from %d to %d', ori_pwm, new_pwm) + + for i in range (fan.FAN_NUM_1_IDX, fan.FAN_NUM_ON_MAIN_BROAD+1): + if fan.get_fan_status(i)==0: + new_pwm=100 + logging.debug('fan_%d fail, set pwm to 100',i) + if test_temp==0: + fan_fail=1 + fan.set_fan_duty_cycle(new_pwm) + break + else: + fan_fail=0 + + #if fan_policy_state == ori_state: + # return True + #else: + new_state = fan_policy_state + + #logging.warning('Temperature high alarm testing') + if ori_state==LEVEL_FAN_DEF: + if new_state==LEVEL_TEMP_HIGH: + if alarm_state==0: + logging.warning('Alarm for temperature high is detected') + alarm_state=1 + if new_state==LEVEL_TEMP_CRITICAL: + logging.critical('Alarm for temperature critical is detected, reboot DUT') + time.sleep(2) + os.system('reboot') + if ori_state==LEVEL_FAN_MID: + if new_state==LEVEL_TEMP_HIGH: + if alarm_state==0: + logging.warning('Alarm for temperature high is detected') + alarm_state=1 + if new_state==LEVEL_TEMP_CRITICAL: + logging.critical('Alarm for temperature critical is detected') + time.sleep(2) + os.system('reboot') + if ori_state==LEVEL_FAN_MAX: + if new_state==LEVEL_TEMP_HIGH: + if alarm_state==0: + logging.warning('Alarm for temperature high is detected') + alarm_state=1 + if new_state==LEVEL_TEMP_CRITICAL: + logging.critical('Alarm for temperature critical is detected') + time.sleep(2) + os.system('reboot') + if alarm_state==1: + if temp_get < (fan_policy[3][0] - 5000): #below 65 C, clear alarm + logging.warning('Alarm for temperature high is cleared') + alarm_state=0 + if ori_state==LEVEL_TEMP_HIGH: + if new_state==LEVEL_TEMP_CRITICAL: + logging.critical('Alarm for temperature critical is detected') + time.sleep(2) + os.system('reboot') + if new_state <= LEVEL_FAN_MID: + logging.warning('Alarm for temperature high is cleared') + alarm_state=0 + if new_state <= LEVEL_FAN_MAX: + if temp_get < (fan_policy[3][0] - 5000): #below 65 C, clear alarm + logging.warning('Alarm for temperature high is cleared') + alarm_state=0 + if ori_state==LEVEL_TEMP_CRITICAL: + if new_state <= LEVEL_FAN_MAX: + logging.warning('Alarm for temperature critical is cleared') + return True def main(argv): log_file = '%s.log' % FUNCTION_NAME log_level = logging.INFO + global test_temp if len(sys.argv) != 1: try: - opts, args = getopt.getopt(argv,'hdl:',['lfile=']) + opts, args = getopt.getopt(argv,'hdlt:',['lfile=']) except getopt.GetoptError: print 'Usage: %s [-d] [-l ]' % sys.argv[0] return 0 @@ -195,14 +311,30 @@ def main(argv): elif opt in ('-d', '--debug'): log_level = logging.DEBUG elif opt in ('-l', '--lfile'): - log_file = arg - - monitor = accton_as7326_monitor(log_file, log_level) - + log_file = arg + + if sys.argv[1]== '-t': + if len(sys.argv)!=8: + print "temp test, need input six temp" + return 0 + + i=0 + for x in range(2, 8): + test_temp_list[i]= int(sys.argv[x])*1000 + i=i+1 + test_temp = 1 + log_level = logging.DEBUG + print test_temp_list + + fan = FanUtil() + fan.set_fan_duty_cycle(38) + print "set default fan speed to 37.5%" + monitor = device_monitor(log_file, log_level) # Loop forever, doing something useful hopefully: while True: monitor.manage_fans() - time.sleep(10) + time.sleep(5) if __name__ == '__main__': main(sys.argv[1:]) + \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_fan.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_fan.py new file mode 100755 index 0000000000..6fa429d013 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_fan.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python +# +# Copyright (C) 2018 Accton Technology Corporation +# +# 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 . + +# ------------------------------------------------------------------ +# HISTORY: +# mm/dd/yyyy (A.D.) +# 7/2/2018: Jostar create for as7326-56x +# ------------------------------------------------------------------ + +try: + import os + import sys, getopt + import subprocess + import click + import imp + import logging + import logging.config + import logging.handlers + import types + import time # this is only being used as part of the example + import traceback + from tabulate import tabulate + +except ImportError as e: + raise ImportError('%s - required module not found' % str(e)) + +# Deafults +VERSION = '1.0' +FUNCTION_NAME = '/usr/local/bin/accton_as7326_monitor_fan' + +global log_file +global log_level + + +class switch(object): + def __init__(self, value): + self.value = value + self.fall = False + + def __iter__(self): + """Return the match method once, then stop""" + yield self.match + raise StopIteration + + def match(self, *args): + """Indicate whether or not to enter a case suite""" + if self.fall or not args: + return True + elif self.value in args: # changed for v1.5, see below + self.fall = True + return True + else: + return False + + +fan_state=[2, 2, 2, 2, 2, 2, 2] #init state=2, insert=1, remove=0 +fan_status_state=[2, 2, 2, 2, 2, 2, 2] #init state=2, fault=1, normal=0 +# Make a class we can use to capture stdout and sterr in the log +class device_monitor(object): + + #/sys/bus/i2c/devices/11-0066 + #fan1_present, fan6_present + + def __init__(self, log_file, log_level): + + self.fan_num = 6 + self.fan_path = "/sys/bus/i2c/devices/11-0066/" + self.present = { + 0: "fan1_present", + 1: "fan2_present", + 2: "fan3_present", + 3: "fan4_present", + 4: "fan5_present", + 5: "fan6_present", + } + + self.fault = { + 0: "fan1_fault", + 1: "fan2_fault", + 2: "fan3_fault", + 3: "fan4_fault", + 4: "fan5_fault", + 5: "fan6_fault", + } + + + """Needs a logger and a logger level.""" + # set up logging to file + logging.basicConfig( + filename=log_file, + filemode='w', + level=log_level, + format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', + datefmt='%H:%M:%S' + ) + + # set up logging to console + if log_level == logging.DEBUG: + console = logging.StreamHandler() + console.setLevel(logging.DEBUG) + formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') + console.setFormatter(formatter) + logging.getLogger('').addHandler(console) + + sys_handler = logging.handlers.SysLogHandler(address = '/dev/log') + #sys_handler.setLevel(logging.WARNING) + sys_handler.setLevel(logging.INFO) + logging.getLogger('').addHandler(sys_handler) + + + #logging.debug('SET. logfile:%s / loglevel:%d', log_file, log_level) + + def manage_fan(self): + + FAN_STATE_REMOVE = 0 + FAN_STATE_INSERT = 1 + + FAN_STATUS_FAULT = 1 + FAN_STATUS_NORMAL = 0 + + global fan_state + global fan_status_state + + for idx in range (0, self.fan_num): + node = self.fan_path + self.present[idx] + try: + val_file = open(node) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + content = val_file.readline().rstrip() + val_file.close() + # content is a string, either "0" or "1" + if content == "1": + if fan_state[idx]!=1: + fan_state[idx]=FAN_STATE_INSERT + logging.info("FAN-%d present is detected", idx+1); + else: + if fan_state[idx]!=0: + fan_state[idx]=FAN_STATE_REMOVE + logging.warning("Alarm for FAN-%d absent is detected", idx+1) + + for idx in range (0, self.fan_num): + node = self.fan_path + self.fault[idx] + try: + val_file = open(node) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + content = val_file.readline().rstrip() + val_file.close() + # content is a string, either "0" or "1" + if content == "1": + if fan_status_state[idx]!=FAN_STATUS_FAULT: + if fan_state[idx] == FAN_STATE_INSERT: + logging.warning("Alarm for FAN-%d failed is detected", idx+1); + fan_status_state[idx]=FAN_STATUS_FAULT + else: + fan_status_state[idx]=FAN_STATUS_NORMAL + + return True + +def main(argv): + log_file = '%s.log' % FUNCTION_NAME + log_level = logging.INFO + if len(sys.argv) != 1: + try: + opts, args = getopt.getopt(argv,'hdl:',['lfile=']) + except getopt.GetoptError: + print 'Usage: %s [-d] [-l ]' % sys.argv[0] + return 0 + for opt, arg in opts: + if opt == '-h': + print 'Usage: %s [-d] [-l ]' % sys.argv[0] + return 0 + elif opt in ('-d', '--debug'): + log_level = logging.DEBUG + elif opt in ('-l', '--lfile'): + log_file = arg + monitor = device_monitor(log_file, log_level) + while True: + monitor.manage_fan() + time.sleep(3) + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_psu.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_psu.py new file mode 100755 index 0000000000..d76c20bd5a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor_psu.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# +# Copyright (C) 2018 Accton Technology Corporation +# +# 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 . + +# ------------------------------------------------------------------ +# HISTORY: +# mm/dd/yyyy (A.D.) +# 7/2/2018: Jostar create for as7326-56x +# ------------------------------------------------------------------ + +try: + import os + import sys, getopt + import subprocess + import click + import imp + import logging + import logging.config + import logging.handlers + import types + import time # this is only being used as part of the example + import traceback + from tabulate import tabulate +except ImportError as e: + raise ImportError('%s - required module not found' % str(e)) + +# Deafults +VERSION = '1.0' +FUNCTION_NAME = '/usr/local/bin/accton_as7326_monitor_psu' + +global log_file +global log_level + + +class switch(object): + def __init__(self, value): + self.value = value + self.fall = False + + def __iter__(self): + """Return the match method once, then stop""" + yield self.match + raise StopIteration + + def match(self, *args): + """Indicate whether or not to enter a case suite""" + if self.fall or not args: + return True + elif self.value in args: # changed for v1.5, see below + self.fall = True + return True + else: + return False + + +psu_state=[2, 2] +psu_power_status=[2, 2] +# Make a class we can use to capture stdout and sterr in the log +class device_monitor(object): + + def __init__(self, log_file, log_level): + + self.psu_num = 2 + self.psu_path = "/sys/bus/i2c/devices/" + self.presence = "/psu_present" + self.oper_status = "/psu_power_good" + self.mapping = { + 0: "17-0051", + 1: "13-0053", + } + + """Needs a logger and a logger level.""" + # set up logging to file + logging.basicConfig( + filename=log_file, + filemode='w', + level=log_level, + format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', + datefmt='%H:%M:%S' + ) + # set up logging to console + + if log_level == logging.DEBUG: + console = logging.StreamHandler() + console.setLevel(log_level) + formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') + console.setFormatter(formatter) + logging.getLogger('').addHandler(console) + + sys_handler = logging.handlers.SysLogHandler(address = '/dev/log') + #sys_handler.setLevel(logging.WARNING) + sys_handler.setLevel(logging.INFO) + logging.getLogger('').addHandler(sys_handler) + + #logging.debug('SET. logfile:%s / loglevel:%d', log_file, log_level) + + def manage_psu(self): + + PSU_STATE_REMOVE = 0 + PSU_STATE_INSERT = 1 + + PSU_STATUS_NO_POWER = 0 + PSU_STATUS_POWER_GOOD = 1 + + global psu_state + global psu_power_status + + for idx in range (0, self.psu_num): + node = self.psu_path + self.mapping[idx] + self.presence + try: + val_file = open(node) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + content = val_file.readline().rstrip() + val_file.close() + # content is a string, either "0" or "1" + if content == "1": + if psu_state[idx]!=PSU_STATE_INSERT: + psu_state[idx]=PSU_STATE_INSERT + logging.info("PSU-%d present is detected", idx+1); + #psu_power_status[idx]=PSU_STATUS_POWER_GOOD #when insert, assume power is good. If no_power, next code will find it. + else: + if psu_state[idx]!=PSU_STATE_REMOVE: + psu_state[idx]=PSU_STATE_REMOVE + logging.warning("Alarm for PSU-%d absent is detected", idx+1); + psu_power_status[idx]=PSU_STATUS_NO_POWER + + for idx in range (0, self.psu_num): + node = self.psu_path + self.mapping[idx] + self.oper_status + try: + val_file = open(node) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + content = val_file.readline().rstrip() + val_file.close() + # content is a string, either "0" or "1" + #logging.info("content=%s, psu_power_status[%d]=%d", content, idx, psu_power_status[idx]); + if content == "0": + if psu_power_status[idx]!=PSU_STATUS_NO_POWER: + if psu_state[idx]==PSU_STATE_INSERT: + logging.warning("Alarm for PSU-%d fault is detected", idx+1); + psu_power_status[idx]=PSU_STATUS_NO_POWER + else: + if psu_power_status[idx] !=PSU_STATUS_POWER_GOOD: + logging.info("PSU-%d power_good is detected", idx+1); + psu_power_status[idx]=PSU_STATUS_POWER_GOOD + + + return True + +def main(argv): + log_file = '%s.log' % FUNCTION_NAME + log_level = logging.INFO + if len(sys.argv) != 1: + try: + opts, args = getopt.getopt(argv,'hdl:',['lfile=']) + except getopt.GetoptError: + print 'Usage: %s [-d] [-l ]' % sys.argv[0] + return 0 + for opt, arg in opts: + if opt == '-h': + print 'Usage: %s [-d] [-l ]' % sys.argv[0] + return 0 + elif opt in ('-d', '--debug'): + log_level = logging.DEBUG + elif opt in ('-l', '--lfile'): + log_file = arg + monitor = device_monitor(log_file, log_level) + # Loop forever, doing something useful hopefully: + while True: + monitor.manage_psu() + time.sleep(3) + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py index 900bfa805a..02f98a4667 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py @@ -175,6 +175,8 @@ kos = [ def driver_install(): global FORCE + + status, output = log_os_system('modprobe i2c_dev', 1) status, output = log_os_system("depmod", 1) for i in range(0,len(kos)): status, output = log_os_system(kos[i], 1) @@ -215,8 +217,8 @@ i2c_nodes = {'fan': ['present', 'front_speed_rpm', 'rear_speed_rpm'] , sfp_map = [ 42,41,44,43,47,45,46,50, - 48,49,51,52,53,56,55,54, - 58,57,59,60,61,63,62,64, + 48,49,52,51,53,56,55,54, + 58,57,60,59,61,63,62,64, 66,68,65,67,69,71,72,70, 74,73,76,75,77,79,78,80, 81,82,84,85,83,87,88,86, #port 41~48 diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_handle_idt.sh b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_handle_idt.sh new file mode 100755 index 0000000000..60ec158b72 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_handle_idt.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [ -s /usr/local/bin/done_idt_init ];then + echo "There is a done_idt_init file" +else + + cat /etc/init.d/opennsl-modules-4.9.0-7-amd64|grep idt_init.sh + if [ $? -ne 0 ];then + echo "Add idt_init.sh to opennsl-modules for TD3 MAC" + sed -i '/modprobe linux-kernel-bde/i sleep 1' /etc/init.d/opennsl-modules-4.9.0-7-amd64 + sed -i '/sleep/i /usr/local/bin/idt_init.sh' /etc/init.d/opennsl-modules-4.9.0-7-amd64 + sed -i '/idt_init/i echo "IDT init" ' /etc/init.d/opennsl-modules-4.9.0-7-amd64 + sed -i '/IDT init/i echo 1 > /usr/local/bin/done_idt_init' /etc/init.d/opennsl-modules-4.9.0-7-amd64 + + fi + +fi + + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/idt_init.sh b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/idt_init.sh new file mode 100755 index 0000000000..7c1f1fcf3a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/idt_init.sh @@ -0,0 +1,150 @@ +#!/bin/bash +test_log=/usr/local/bin/check_idt_status.txt +modprobe i2c-i801 +modprobe i2c-dev +i2cset -y 0 0x77 0x1 +i2cset -y 0 0x70 0x1 +i2cget -y 0 0x54 0 b > /dev/null +if [ $? -ne 0 ];then + printf "Device 8v89307(0x54) not found\n" + exit 1 +fi +echo "IDT 82V89307 " +echo "idt init 1" +# Title = --- IDT 82V89307 Registers --- +#Select to Page 0 +i2cset -y 0 0x54 0x2D 0x00 +i2cset -y 0 0x54 0x7F 0x05 +i2cset -y 0 0x54 0x7E 0x85 +i2cset -y 0 0x54 0x7B 0x00 +i2cset -y 0 0x54 0x7A 0x00 +i2cset -y 0 0x54 0x79 0x40 +i2cset -y 0 0x54 0x78 0x06 +i2cset -y 0 0x54 0x73 0x40 +i2cset -y 0 0x54 0x72 0x40 + +# OUT3:25MHz +i2cset -y 0 0x54 0x71 0x0A +i2cset -y 0 0x54 0x70 0x00 + +# OUT1:1pps +i2cset -y 0 0x54 0x6B 0x4E +i2cset -y 0 0x54 0x69 0x00 +i2cset -y 0 0x54 0x68 0x00 +i2cset -y 0 0x54 0x67 0x19 +i2cset -y 0 0x54 0x66 0xAB +i2cset -y 0 0x54 0x65 0x8C +i2cset -y 0 0x54 0x64 0x00 +i2cset -y 0 0x54 0x63 0x00 +i2cset -y 0 0x54 0x62 0x00 +i2cset -y 0 0x54 0x5F 0x00 +i2cset -y 0 0x54 0x5E 0x00 +i2cset -y 0 0x54 0x5D 0x00 +i2cset -y 0 0x54 0x5C 0x78 +i2cset -y 0 0x54 0x5B 0x02 +i2cset -y 0 0x54 0x5A 0xE5 +i2cset -y 0 0x54 0x59 0x88 +i2cset -y 0 0x54 0x58 0x4B +i2cset -y 0 0x54 0x57 0x6C +i2cset -y 0 0x54 0x56 0x6C + +# Lock to DPLL, output 625MHz +i2cset -y 0 0x54 0x55 0x80 +i2cset -y 0 0x54 0x53 0x00 +i2cset -y 0 0x54 0x52 0x81 +i2cset -y 0 0x54 0x50 0x00 +i2cset -y 0 0x54 0x4F 0x00 +i2cset -y 0 0x54 0x4E 0x00 +i2cset -y 0 0x54 0x4C 0xCB +i2cset -y 0 0x54 0x4A 0x00 +i2cset -y 0 0x54 0x45 0x66 +i2cset -y 0 0x54 0x44 0x66 +i2cset -y 0 0x54 0x42 0x80 +i2cset -y 0 0x54 0x41 0x03 +i2cset -y 0 0x54 0x40 0x01 +i2cset -y 0 0x54 0x3F 0x08 +i2cset -y 0 0x54 0x3E 0x04 +i2cset -y 0 0x54 0x3D 0x20 +i2cset -y 0 0x54 0x3C 0x13 +i2cset -y 0 0x54 0x3B 0x00 +i2cset -y 0 0x54 0x3A 0x98 +i2cset -y 0 0x54 0x39 0x01 +i2cset -y 0 0x54 0x38 0xE6 +i2cset -y 0 0x54 0x37 0x04 +i2cset -y 0 0x54 0x36 0xCE +i2cset -y 0 0x54 0x35 0x7C +i2cset -y 0 0x54 0x34 0x01 +i2cset -y 0 0x54 0x33 0x08 +i2cset -y 0 0x54 0x32 0x08 +i2cset -y 0 0x54 0x31 0x08 +i2cset -y 0 0x54 0x30 0x03 +i2cset -y 0 0x54 0x2F 0x23 +i2cset -y 0 0x54 0x2E 0x0B +i2cset -y 0 0x54 0x2D 0x00 +i2cset -y 0 0x54 0x28 0x76 +i2cset -y 0 0x54 0x27 0x54 +i2cset -y 0 0x54 0x25 0x00 +i2cset -y 0 0x54 0x24 0x03 +i2cset -y 0 0x54 0x23 0x06 +i2cset -y 0 0x54 0x1A 0x8C +i2cset -y 0 0x54 0x19 0x8C +i2cset -y 0 0x54 0x18 0x00 +i2cset -y 0 0x54 0x16 0x0D +i2cset -y 0 0x54 0x11 0x00 +i2cset -y 0 0x54 0x10 0x00 +i2cset -y 0 0x54 0x0E 0x3F +i2cset -y 0 0x54 0x0D 0xFF +i2cset -y 0 0x54 0x0C 0x02 +i2cset -y 0 0x54 0x0B 0xA1 +i2cset -y 0 0x54 0x0A 0x89 +i2cset -y 0 0x54 0x09 0xA2 +i2cset -y 0 0x54 0x08 0x32 +i2cset -y 0 0x54 0x06 0x00 +i2cset -y 0 0x54 0x05 0x00 +i2cset -y 0 0x54 0x04 0x00 +i2cset -y 0 0x54 0x03 0x00 +i2cset -y 0 0x54 0x02 0x05 +i2cset -y 0 0x54 0x01 0x33 +i2cset -y 0 0x54 0x00 0x91 + +echo "idt init 2" +# PreDivider_Parameters +#IN1 +i2cset -y 0 0x54 0x23 0x05 +i2cset -y 0 0x54 0x24 0x03 +i2cset -y 0 0x54 0x25 0x00 +#IN2 +i2cset -y 0 0x54 0x23 0x06 +i2cset -y 0 0x54 0x24 0x03 +i2cset -y 0 0x54 0x25 0x00 +#IN3 +i2cset -y 0 0x54 0x23 0x03 +i2cset -y 0 0x54 0x24 0x00 +i2cset -y 0 0x54 0x25 0x00 + +echo "idt init 3" +# Page1_Parameters +#Select to Page 1 +i2cset -y 0 0x54 0x2D 0x01 +i2cset -y 0 0x54 0x30 0x03 +i2cset -y 0 0x54 0x31 0x08 +i2cset -y 0 0x54 0x32 0x08 +i2cset -y 0 0x54 0x33 0x08 +i2cset -y 0 0x54 0x35 0x7C +i2cset -y 0 0x54 0x36 0xCE +i2cset -y 0 0x54 0x37 0x04 +i2cset -y 0 0x54 0x38 0xE6 +i2cset -y 0 0x54 0x39 0x01 +i2cset -y 0 0x54 0x3A 0x98 +i2cset -y 0 0x54 0x3B 0x00 +i2cset -y 0 0x54 0x3C 0x13 +i2cset -y 0 0x54 0x3D 0x20 +#Return to Page 0 +i2cset -y 0 0x54 0x2D 0x00 + +echo "idt init 4" +#reset the in-path mux +i2cset -y 0 0x70 0x0 +i2cset -y 0 0x77 0x0 + +