meta-bf/meta-mavericks/recipes-utils/openbmc-utils/files/btools.py (1,253 lines of code) (raw):

#!/usr/bin/python # # File is the tool for bringup of tofino chipset on Mavericks and Montara. # import sys import os import getopt import subprocess import os.path from time import sleep # # btool usage for modules. Individual module usage is printed separately # def usage(): print " " print "USAGE: " print "./btools.py --<[device]/help>" print "[device]" print " PSU => PFE1100 power supply unit" print " UCD => UCD90120A power supply sequencer" print " IR => Multiphase Controller" print " TMP => Temperature Sensors" print "Eg:" print "./btools.py --PSU help" print "./btools.py --UCD help" print "./btools.py --IR help" print "./btools.py --help" return # # Usage for PSU related arguments # def error_psu_usage(): print " " print "USAGE: " print "./btools.py --PSU <power supply number> r v => input voltage" print " <1 - 2> r vo => output voltage" print " r i => current" print " r p => power" print " r ld => load sharing" print " r fspeed => fan speed" print " r ffault => fan fault" print " r presence => power supply presence" print " r sts_in_power => power input status" print " r sts_op_power => power output status" print " " print "./btools.py --PSU 1 r v => Read input voltage for power supply 1" # # Presence and power status is read from CPLD # def psu_cpld_features(power_supply, feature): cpld_dev = "/sys/class/i2c-adapter/i2c-12/12-0031/" cmd = "cat" if feature == "presence": if power_supply == 1: path = cpld_dev + "psu1_present" elif power_supply == 2: path = cpld_dev + "psu2_present" else: error_psu_usage() return elif feature == "sts_in_power": if power_supply == 1: path = cpld_dev + "psu1_in_pwr_sts" elif power_supply == 2: path = cpld_dev + "psu2_in_pwr_sts" else: error_psu_usage() return elif feature == "sts_op_power": if power_supply == 1: path = cpld_dev + "psu1_output_pwr_sts" elif power_supply == 2: path = cpld_dev + "psu2_output_pwr_sts" else: error_psu_usage() return else: error_psu_usage() return try: output = subprocess.check_output([cmd, path]) except subprocess.CalledProcessError as e: print e print "Error while executing psu cpld feature commands" return if feature == "presence": res = int(output, 16) if res == 0: print "Power supply %s present" % power_supply return 0 else: print "Power supply %s not present" % power_supply return 1 elif feature == "sts_in_power" or feature == "sts_op_power": # catching only first 3 characters of output res = int(output[:3], 16) if res == 0: print "Power supply status: BAD" elif res == 1: print "Power supply status: OK" else: print "Error while reading power supply status" return # # Function reads power supplies output voltage # def psu_read_output_voltage(power_supply): PSU_I2C_BUS = "7" PSU_I2C_READ_VOUT = "0x8b" if power_supply == 1: PSU_I2C_ADDR = "0x59" else: PSU_I2C_ADDR = "0x5a" try: get_cmd = "i2cget" output = subprocess.check_output([get_cmd, "-f", "-y", PSU_I2C_BUS, PSU_I2C_ADDR, PSU_I2C_READ_VOUT, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing output for PSU %d " % power_supply return # From PFE specs READ_VOUT1 PSU_VOLTAGE_LN_FMT = 0x1 << 6 # 11 bits are usable output = int(output, 16) & 0x7ff output = float(output) / PSU_VOLTAGE_LN_FMT print "Output Voltage %.1fV" % output return # # Function is retrive current withdrawn on both power supplies # def psu_read_load_sharing(): PSU_I2C_BUS = "7" PSU_I2C_READ_IOUT = "0x8C" try: #Read 1st power supply PSU_I2C_ADDR = "0x59" get_cmd = "i2cget" output1 = subprocess.check_output([get_cmd, "-f", "-y", PSU_I2C_BUS, PSU_I2C_ADDR, PSU_I2C_READ_IOUT, "w"]) PSU_I2C_ADDR = "0x5a" output2 = subprocess.check_output([get_cmd, "-f", "-y", PSU_I2C_BUS, PSU_I2C_ADDR, PSU_I2C_READ_IOUT, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing load sharing for PSU" return # From PFE specs READ_IOUT1 PSU_CURRENT_LN_FMT = 0x1 << 3 # 11 bits are usable output1 = int(output1, 16) & 0x7ff output1 = float(output1) / PSU_CURRENT_LN_FMT output2 = int(output2, 16) & 0x7ff output2 = float(output2) / PSU_CURRENT_LN_FMT print "Power Supply 1 output current %.3f amp" % output1 print "Power Supply 2 output current %.3f amp" % output2 return # #open I2C sw before pfe devices and then load drivers # def psu_init(): #check if pfe1100 driver is loaded properly if os.path.isfile("/sys/class/i2c-adapter/i2c-7/7-0059/in1_input") \ and os.path.isfile("/sys/class/i2c-adapter/i2c-7/7-005a/in1_input"): return try: cmd = "i2cset" I2C_ADDR = "0x70" I2C_BUS = "7" OPCODE = "0x3" # Open I2C swtich for PFE devices #i2cset -f -y 7 0x70 0x3 subprocess.check_output([cmd, "-f", "-y", I2C_BUS, I2C_ADDR, OPCODE]) # load driver for both devices o = subprocess.check_output(["lsmod", "pfe1100"]) if len(o) != 0: # load driver for both devices subprocess.check_output(["rmmod", "pfe1100"]) # load driver for both devices subprocess.check_output(["modprobe", "pfe1100"]) except subprocess.CalledProcessError as e: print e print "Error occured while initializing PSU" return #function just for power supply check def psu_check_pwr_presence(power_supply): psu_init() r = psu_cpld_features(power_supply, "presence") return r # # Function to handle PSU related requests # def psu(argv): i2c_dev = "/sys/class/i2c-adapter/i2c-7/7-00" arg_psu = argv[2:] if arg_psu[0] == "help" or arg_psu[0] == "h": error_psu_usage() return if arg_psu[0] != "1" and arg_psu[0] != "2": error_psu_usage() return psu_init() # Mapping i2c bus address according to power supply number if arg_psu[0] == "1": power_supply = 1 ps = "59/" elif arg_psu[0] == "2": power_supply = 2 ps = "5a/" if arg_psu[1] == "r": cmd = "cat" else: error_psu_usage() return if arg_psu[2] == "v": val = "in1_input" s = "V" elif arg_psu[2] == "i": val = "curr1_input" s = "mA" elif arg_psu[2] == "p": val = "power1_input" s = "mW" elif arg_psu[2] == "fspeed": val = "fan1_input" s = "rpm" elif arg_psu[2] == "ffault": val = "fan1_fault" s = "ffault" elif arg_psu[2] == "presence": psu_cpld_features(power_supply, "presence") return elif arg_psu[2] == "sts_in_power": psu_cpld_features(power_supply, "sts_in_power") return elif arg_psu[2] == "sts_op_power": psu_cpld_features(power_supply, "sts_op_power") return elif arg_psu[2] == "vo": psu_read_output_voltage(power_supply) return elif arg_psu[2] == "ld": psu_read_load_sharing() return elif arg_psu[2] == "psmodel": val = "mfr_model_label" s = "model" elif arg_psu[2] == "psserial": val = "mfr_serial_label" s = "serial" elif arg_psu[2] == "psrev": val = "mfr_revision_label" s = "rev" else: error_psu_usage() return path = i2c_dev + ps + val try: I2C_ADDR = "0x70" I2C_BUS = "7" OPCODE = "0x3" # Force Open I2C swtich for PFE devices. Facebook psu mon messes up i2c mux #i2cset -f -y 7 0x70 0x3 subprocess.check_output(["i2cset", "-f", "-y", I2C_BUS, I2C_ADDR, OPCODE]) output = subprocess.check_output([cmd, path]) except subprocess.CalledProcessError as e: print e print "Error while executing psu i2c command " return if s == "V": print "{}{}".format(float(output) / 1000, "V") # convert milli volts to volts elif s == "mA": print "{}{}".format(float(output), "mA") # current is in milli Amperes elif s == "mW": print "{}{}".format(float(output) / 1000 , "mW") # Power in milli watts elif s == "rpm": print "{}{}".format(int(output), "rpm") # Speed of FAN elif s == "ffault": print "{}".format(int(output)) elif s == "model": print "{}".format(output) elif s == "serial": print "{}".format(output) elif s == "rev": print "{}".format(output) return # # Usage for UCD device # def error_ucd_usage(): print " " print "Usage:" print "./btools.py --UCD sh v <mavericks/mavericks-p0c/montara> => Show Voltage of all rails" print " fault => Show Voltage fault/warnings of all rails" print " set_margin <rail number> <margin> <mavericks/montara>" print " <1 - 12> l /h /n" print " l => low" print " h => high" print " n => none" print "./btools.py --UCD sh v mavericks" print "./btools.py --UCD sh v mavericks-p0c" print "./btools.py --UCD set_margin 5 l montara" print " " # # Reads voltage faults on all rails # def ucd_rail_voltage_fault(): i = 1 UCD_I2C_BUS = "2" UCD_I2C_ADDR = "0x34" UCD_STATUS_VOUT_OP = "0x7A" UCD_PAGE_OP = "0x00" print " " print " RAIL Voltage Warnings" # Parse 1 to 12 voltage rails for i in range(0, 12): try: # i2cset -f -y 2 0x34 0x00 i set_cmd = "i2cset" output = subprocess.check_output([set_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_PAGE_OP, str(hex(i))]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cset for rail %.2d " % i continue try: # i2cget -f -y 2 0x34 w get_cmd = "i2cget" output = subprocess.check_output([get_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_STATUS_VOUT_OP]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for rail %.2d " % i continue o = int(output, 16) fault_warnings = "" if o == 0: fault_warnings = "No fault/warning" else: if o & 0x10: fault_warnings = fault_warnings + "Under Voltage Fault," if o & 0x20: fault_warnings = fault_warnings + "Under Voltage Warning," if o & 0x40: fault_warnings = fault_warnings + "Over Voltage Warning," if o & 0x80: fault_warnings = fault_warnings + "Over Voltage Fault," print " %.2d %s" % (i + 1, fault_warnings) print " " return # # Displays all rails voltages mavericks # def ucd_rail_voltage_mavericks(poc): i = 1 UCD_I2C_BUS = "2" UCD_I2C_ADDR = "0x34" UCD_READ_OP = "0x8b" UCD_PAGE_OP = "0x00" UCD_VOUT_MODE_OP = "0x20" print " " print " RAIL Voltage(V)" if (poc == 0): string = {1: "01** - VDD12V", 2: "02** - VDD5V_IR", 3: "03 - VDD5V_stby", 4: "04 - VDD3_3V_iso", 5: "05 - VDD3_3V_stby", 6: "06*- VDD3_3V_lower", 7: "07*- VDD3_3V_upper", 8: "08- VDD2_5V_stby", 9: "09*- VDD2_5V_rptr", 10: "10- VDD2_5V_tf", 11: "11- VDD1_8V_stby", 12: "12- VDD1_5V_stby", 13: "13- VDD1_2V_stby", 14: "14*- VDD0_9V_anlg", 15: "15*- VDD_core"} index = 15 else: string = {1: "01** - VDD12V", 2: "02** - VDD5V_IR", 3: "03 - VDD5V_stby", 4: "04 - VDD3_3V_iso", 5: "05 - VDD3_3V_stby", 6: "06*- VDD3_3V_lower", 7: "07*- VDD3_3V_upper", 8: "08- VDD2_5V_stby", 9: "09*- VDD1_8V_rt", 10: "10- VDD2_5V_tf", 11: "11- VDD1_8V_stby", 12: "12- VDD1_5V_stby", 13: "13- VDD1_2V_stby", 14: "14*- VDD0_9V_anlg", 15: "15*- VDD_core", 16: "16- VDD1_0V_rt"} index = 16 # Parse 1 to 15 voltage rails for i in range(0, index): try: # i2cset -f -y 2 0x34 0x00 i set_cmd = "i2cset" output = subprocess.check_output([set_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_PAGE_OP, str(hex(i))]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cset for rail %.2d " % i continue try: # i2cget -f -y 2 0x34 w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_READ_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for rail %.2d " % i continue try: # i2cget -f -y 2 0x34 0x20 get_cmd = "i2cget" exponent = subprocess.check_output([get_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_VOUT_MODE_OP]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for rail %.2d " % i continue # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. # It is based on UCD90120A device spec section 2.2 exp = int(exponent, 16) | ~0x1f exp = ~exp + 1 div = 1 << exp mantissa = int(mantissa, 16) print " %-*s %.3f" % (20, string.get(i + 1), float(mantissa) / float(div)) print " " print "* voltages can be margined by IR CLI only " print "** voltages cannot be margined " print " " return # # Displays all rails voltages montara # def ucd_rail_voltage_montara(): i = 1 UCD_I2C_BUS = "2" UCD_I2C_ADDR = "0x34" UCD_READ_OP = "0x8b" UCD_PAGE_OP = "0x00" UCD_VOUT_MODE_OP = "0x20" print " " print " RAIL Voltage(V)" string = {1: "01- VDD12V", 2: "02- VDD5V_stby", 3: "03- VDD3_3V_iso", 4: "04*- VDD3_3V", 5: "05- VDD3_3V_stby", 6: "06- VDD2_5V_stby", 7: "07- VDD2_5V_tf", 8: "08- VDD1_8V_stby", 9: "09- VDD1_5V_stby", 10: "10- VDD1_2V_stby", 11: "11*- VDD0_9V_anlg", 12: "12*- VDD_core"} # Parse 1 to 12 voltage rails for i in range(0, 12): try: # i2cset -f -y 2 0x34 0x00 i set_cmd = "i2cset" output = subprocess.check_output([set_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_PAGE_OP, str(hex(i))]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cset for rail %.2d " % i continue try: # i2cget -f -y 2 0x34 w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_READ_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for rail %.2d " % i continue try: # i2cget -f -y 2 0x34 0x20 get_cmd = "i2cget" exponent = subprocess.check_output([get_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_VOUT_MODE_OP]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for rail %.2d " % i continue # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. # It is based on UCD90120A device spec section 2.2 exp = int(exponent, 16) | ~0x1f exp = ~exp + 1 div = 1 << exp mantissa = int(mantissa, 16) print " %-*s %.3f" % (20, string.get(i + 1), float(mantissa) / float(div)) print " " print "* voltages can be margined by IR CLI only " print " " return # # Functions set the voltage margins # def ucd_voltage_margin(arg): UCD_I2C_BUS = "2" UCD_I2C_ADDR = "0x34" UCD_LOW_MARGIN_OP = "0x18" UCD_HIGH_MARGIN_OP = "0x28" UCD_NONE_MARGIN_OP = "0x08" UCD_PAGE_OP = "0x00" UCD_MARGIN_OP = "0x01" if len(arg) is not 4: error_ucd_usage() return if arg[3] == "mavericks": if not 1 <= int(arg[1]) <= 15: error_ucd_usage() return elif arg[3] == "montara": if not 1 <= int(arg[1]) <= 12: error_ucd_usage() return else: error_ucd_usage() return if arg[2] == "l": opcode = str(UCD_LOW_MARGIN_OP) elif arg[2] == "h": opcode = str(UCD_HIGH_MARGIN_OP) elif arg[2] == "n": opcode = str(UCD_NONE_MARGIN_OP) else: error_ucd_usage() return # Rail number mapping starts from 1 # But UCD understand from 0. Thus reducing 1 rail_number = int(arg[1]) - 1 try: set_cmd = "i2cset" output = subprocess.check_output([set_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_PAGE_OP, str(rail_number)]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cset for rail %.2d " % (rail_number + 1) return try: set_cmd = "i2cset" output = subprocess.check_output([set_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_MARGIN_OP, opcode]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cset for rail %.2d " % (rail_number + 1) return try: set_cmd = "i2cget" output = subprocess.check_output([set_cmd, "-f", "-y", UCD_I2C_BUS, UCD_I2C_ADDR, UCD_MARGIN_OP]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cset for rail %.2d " % (rail_number + 1) return print "Voltage margining done" return # # Dispatches UCD requests # def ucd(argv): arg_ucd = argv[2:] if arg_ucd[0] == "help" or arg_ucd[0] == "h" or len(arg_ucd) < 3: error_ucd_usage() return if arg_ucd[0] == "sh": if arg_ucd[2] == "Mavericks" or arg_ucd[2] == "mavericks" : ucd_rail_voltage_mavericks(0) elif arg_ucd[2] == "Mavericks-p0c" or arg_ucd[2] == "mavericks-p0c" : ucd_rail_voltage_mavericks(1) elif arg_ucd[2] == "Montara" or arg_ucd[2] == "montara" : ucd_rail_voltage_montara() else : error_ucd_usage() return elif arg_ucd[0] == "set_margin": ucd_voltage_margin(arg_ucd) #ucd_ir_voltage_margin(argv) elif arg_ucd[0] == "fault": ucd_rail_voltage_fault() else: error_ucd_usage() return return def ir_voltage_show_montara(): IR_I2C_BUS = "0x1" IR_PMBUS_ADDR = {1: "0x70", 2: "0x72", 3: "0x75"} IR_VOUT_MODE_OP = "0x20" IR_READ_VOUT_OP = "0x8b" IR_READ_IOUT_OP = "0x8c" string ={1: "VDD_CORE", 2: "AVDD", 3: "QSFP"} for i in range(1, 4): try: # i2cget -f -y 1 0x70 0x8b w get_cmd = "i2cget" exponent = subprocess.check_output([get_cmd, "-f", "-y", IR_I2C_BUS, IR_PMBUS_ADDR.get(i), IR_VOUT_MODE_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing VOUT_MODE for IR " continue try: # i2cget -f -y 1 0x70 0x8b w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", IR_I2C_BUS, IR_PMBUS_ADDR.get(i), IR_READ_VOUT_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for IR " continue # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. exp = int(exponent, 16) | ~0x1f exp = ~exp + 1 div = 1 << exp mantissa = int(mantissa, 16) v = (float(mantissa)/float(div)) # As referred by hardware spec QSFP voltage need to be * 2 if i == 3: v = v * 2 # find current try: # i2cget -f -y 1 0x70 0x8c w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", IR_I2C_BUS, IR_PMBUS_ADDR.get(i), IR_READ_IOUT_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for IR " continue m = int(mantissa, 16) & 0x07ff # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. exp = int(mantissa, 16) & 0xf800 exp = exp >> 11 exp = ~exp + 1 exp = exp & 0x1f div = 1 << exp amp = (float(m)/float(div)) print "IR %-*s %.3f V %.3f A %.3f W" % (15, string.get(i), v, amp, (v * amp)) return # # Mavericks need i2c switch to be opened for reading IR # def ir_open_i2c_switch(): IR_I2C_SW_BUS = "9" IR_I2C_SW_ADDR = "0x70" try: get_cmd = "i2cget" output = subprocess.check_output([get_cmd, "-f", "-y", IR_I2C_SW_BUS, IR_I2C_SW_ADDR]) output = int(output, 16) # opening i2c switch for 0x08, 0x09, 0x0c res = output | 0x7 set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", IR_I2C_SW_BUS, IR_I2C_SW_ADDR, str(res)]) except subprocess.CalledProcessError as e: print e print "Error occured while processing opening i2c switch" \ " on mavericks upper board" return output # # Restoring the i2c switch state # def ir_restore_i2c_switch(res): IR_I2C_SW_BUS = "9" IR_I2C_SW_ADDR = "0x70" try: set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", IR_I2C_SW_BUS, IR_I2C_SW_ADDR, str(res)]) except subprocess.CalledProcessError as e: print e print "Error occured while processing restoring i2c switch" \ " on mavericks upper board" return def ir_voltage_show_mavericks(poc): a = ir_open_i2c_switch() UPPER_IR_I2C_BUS = "0x9" UPPER_IR_PMBUS_ADDR = {1: "0x40", 2: "0x74", 3: "0x71"} IR_VOUT_MODE_OP = "0x20" IR_READ_VOUT_OP = "0x8b" IR_READ_IOUT_OP = "0x8c" string = {1: "VDD_CORE", 2: "AVDD", 3: "QSFP_UPPER"} for i in range(1, 4): try: # i2cget -f -y 1 0x70 0x20 w get_cmd = "i2cget" exponent = subprocess.check_output([get_cmd, "-f", "-y", UPPER_IR_I2C_BUS, UPPER_IR_PMBUS_ADDR.get(i), IR_VOUT_MODE_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing VOUT_MODE for UPPER IR " continue try: # i2cget -f -y 1 0x70 0x8b w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", UPPER_IR_I2C_BUS, UPPER_IR_PMBUS_ADDR.get(i), IR_READ_VOUT_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for UPPER IR " continue # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. exp = int(exponent, 16) | ~0x1f exp = ~exp + 1 div = 1 << exp mantissa = int(mantissa, 16) v = (float(mantissa)/float(div)) # As referred by hardware spec QSFP voltage need to be * 2 if i == 3: v = v * 2 # find current try: # i2cget -f -y 1 0x70 0x8c w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", UPPER_IR_I2C_BUS, UPPER_IR_PMBUS_ADDR.get(i), IR_READ_IOUT_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for IR " continue m = int(mantissa, 16) & 0x07ff # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. exp = int(mantissa, 16) & 0xf800 exp = exp >> 11 exp = ~exp + 1 exp = exp & 0x1f div = 1 << exp amp = (float(m)/float(div)) print "IR %-*s %.3f V %.3f A %.3f W" % (15, string.get(i), v, amp, (v * amp)) ir_restore_i2c_switch(a) LOWER_IR_I2C_BUS = "0x1" # for Mavericks-P0C if (poc == 1): LOWER_IR_PMBUS_ADDR = {1: "0x71", 2: "0x72", 3: "0x70"} lower_string = {1: "QSFP_LOWER", 2: "RETIMER_VDDA", 3:"RETIMER_VDD"} range_p0c = 4; #for MAvericks-P0A/P0B else: LOWER_IR_PMBUS_ADDR = {1: "0x71", 2: "0x72"} lower_string = {1: "QSFP_LOWER", 2: "REPEATER"} range_p0c = 3; for i in range(1, range_p0c): try: # i2cget -f -y 1 0x70 0x8b w get_cmd = "i2cget" exponent = subprocess.check_output([get_cmd, "-f", "-y", LOWER_IR_I2C_BUS, LOWER_IR_PMBUS_ADDR.get(i), IR_VOUT_MODE_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing VOUT_MODE for LOWER IR " continue try: # i2cget -f -y 1 0x70 0x8b w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", LOWER_IR_I2C_BUS, LOWER_IR_PMBUS_ADDR.get(i), IR_READ_VOUT_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for LOWER IR " continue # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. exp = int(exponent, 16) | ~0x1f exp = ~exp + 1 div = 1 << exp mantissa = int(mantissa, 16) if (poc == 1): v = (float(mantissa)/float(div)) if (i == 1): v = v * 2 else: v = (float(mantissa)/float(div)) * 2 # find current try: # i2cget -f -y 1 0x70 0x8c w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", LOWER_IR_I2C_BUS, LOWER_IR_PMBUS_ADDR.get(i), IR_READ_IOUT_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for LOWER IR " continue m = int(mantissa, 16) & 0x07ff # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. exp = int(mantissa, 16) & 0xf800 exp = exp >> 11 exp = ~exp + 1 exp = exp & 0x1f div = 1 << exp amp = (float(m)/float(div)) print "IR %-*s %.3f V %.3f A %.3f W" % (15, lower_string.get(i), v, amp, (v * amp)) return # IR utility usage def error_ir_usage(): print "" print "Usage:" print "./btools.py --IR sh v <mavericks/mavericks-p0c/montara> => Show IR voltages " print "./btools.py --IR set <mavericks-p0c/mavericks/montara> <margin> <voltage rail> => Set IR voltages margin" print " l = low margin AVDD " print " h = high margin VDD_CORE " print " n = normal QSFP_UPPER (QSFP for Montara)" print " QSFP_LOWER " print " RETIMER_VDD (mav p0c only) " print " RETIMER_VDDA (mav p0c only) " print " REPEATER " print "" # Commenting this part as nobody other than Barefoot Hardware team should touch this functionality #print "./btools.py --IR set_vdd_core <mavericks> <voltage> <= Set IR voltages margin for VDD_CORE" #print " <voltage> must be in range of .65-.95V else discarded" #print " eg: ./btools.py --IR set_vdd_core mavericks .80 " return def read_vout(rail, I2C_BUS, I2C_ADDR): IR_VOUT_MODE_OP = "0x20" IR_READ_VOUT_OP = "0x8b" try: # i2cget -f -y 1 0x70 0x20 w get_cmd = "i2cget" exponent = subprocess.check_output([get_cmd, "-f", "-y", I2C_BUS, I2C_ADDR, IR_VOUT_MODE_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing VOUT_MODE " try: # i2cget -f -y 1 0x70 0x8b w get_cmd = "i2cget" mantissa = subprocess.check_output([get_cmd, "-f", "-y", I2C_BUS, I2C_ADDR, IR_READ_VOUT_OP, "w"]) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget " # 2 ^ exponent # exponent is 5 bit signed value. Thus calculating first exponent. exp = int(exponent, 16) | ~0x1f exp = ~exp + 1 div = 1 << exp mantissa = int(mantissa, 16) v = (float(mantissa)/float(div)) if not (rail == "VDD_CORE" or rail == "AVDD" or rail == "RETIMER_VDD" or rail == "RETIMER_VDDA"): v = v * 2 print ("IR %s %.3f V" % (rail, v)) return def set_ir_voltage(mod, i2c_bus, i2c_addr, margin_cmd, margin_apply, voltage): IR_OPERATION = "0x1" try: # set voltage margin value in register set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", i2c_bus, i2c_addr, margin_cmd, voltage, 'w']) # execute operation 0x1 with voltage margin AOF set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", i2c_bus, i2c_addr, IR_OPERATION, margin_apply]) except subprocess.CalledProcessError as e: print e print "Error occured while setting %s voltage" % mod read_vout(mod, i2c_bus, i2c_addr) return def fix_montara_vdd_core_ir_pmbus(): try: # Fix VDD CORE to pmbus set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", "1", "0x8", "0x2B", "0x80"]) except subprocess.CalledProcessError as e: print e print "Error occured while shifting baxter/IR to PMBUS" return def fix_montara_avdd_ir_pmbus(): try: # Fix AVDD to pmbus set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", "1", "0xA", "0x2B", "0x80"]) except subprocess.CalledProcessError as e: print e print "Error occured while shifting baxter/IR to PMBUS" return def ir_voltage_set_montara(arg_ir): IR_I2C_BUS = "0x1" IR_PMBUS_ADDR = {1: "0x70", 2: "0x72", 3: "0x75"} string_upper = {1: "VDD_CORE", 2: "AVDD", 3: "QSFP"} IR_MARGIN_LOW_AOF_OP = "0x98" IR_MARGIN_HIGH_AOF_OP = "0xA8" IR_MARGIN_OFF = "0x80" IR_OPERATION = "0x1" IR_VOUT_MARGIN_HIGH = "0x25" IR_VOUT_MARGIN_LOW = "0x26" IR_VOUT_CMD = "0x21" if arg_ir[3] == "AVDD": # keep this command for few boards #fix_montara_avdd_ir_pmbus() # voltage +3% -3% VOLT_MARGIN_HIGH = "0x1DB" VOLT_MARGIN_LOW = "0x1BF" VOLT_NORMAL = "0x1CE" i2c_addr = IR_PMBUS_ADDR.get(2) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) elif arg_ir[3] == "VDD_CORE": # keep this command for few boards #fix_montara_vdd_core_ir_pmbus() # voltage +2% -2% VOLT_MARGIN_HIGH = "0x1B6" VOLT_MARGIN_LOW = "0x1A5" VOLT_NORMAL = "0x1AE" i2c_addr = IR_PMBUS_ADDR.get(1) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) elif arg_ir[3] == "QSFP": VOLT_MARGIN_HIGH = "0x361" VOLT_MARGIN_LOW = "0x323" VOLT_NORMAL = "0x34D" i2c_addr = IR_PMBUS_ADDR.get(3) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) else: error_ir_usage() return # Only available for Part SKEW Need by hardware def ir_set_vdd_core_dynamic_range_montara(arg_ir): VDD_CORE_IR_I2C_BUS = "0x1" VDD_CORE_IR_PMBUS_ADDR = "0x70" IR_MARGIN_OFF = "0x80" IR_VOUT_CMD = "0x21" if len(arg_ir) != 3: error_ir_usage() return v = float(arg_ir[2]) if v < 0.65 or v > 0.95: print "Voltage value not in range .65 - .95" return voltage_scale = {0: "0x14D", 10: "0x152", 20: "0x157", 30: "0x15C", 40: "0x161", 50: "0x166", 60: "0x16c", 70: "0x171", 80: "0x176", 85: "0x178", 90: "0x17B", 100: "0x180", 105: "0x182", 110: "0x185", 120: "0x18A", 125: "0x18D", 130: "0x18F", 135: "0x191", 140: "0x194", 150: "0x19A", 155: "0x19C", 160: "0x19F", 170: "0x1A4", 175: "0x1A6", 180: "0x1A9", 185: "0x1AB", 190: "0x1AE", 200: "0x1B3", 205: "0x1B5", 210: "0x1B8", 220: "0x1BD", 225: "0x1C0", 230: "0x1C3", 235: "0x1C5", 240: "0x1C8", 250: "0x1CD", 255: "0x1CF", 260: "0x1D2", 270: "0x1D7", 280: "0x1DC", 290: "0x1E1", 300: "0x1E6"} # Convert to mv with -9 exponent i = (v * 1000) % 650 voltage = voltage_scale.get(i) if voltage == None: error_ir_usage() return margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF set_ir_voltage("VDD_CORE", VDD_CORE_IR_I2C_BUS, VDD_CORE_IR_PMBUS_ADDR, margin_cmd, margin_apply, voltage) return # Only available for Part SKEW Need by hardware def ir_set_vdd_core_dynamic_range_mavericks(arg_ir): a = ir_open_i2c_switch() VDD_CORE_IR_I2C_BUS = "0x9" VDD_CORE_IR_PMBUS_ADDR = "0x40" IR_MARGIN_OFF = "0x80" IR_VOUT_CMD = "0x21" if len(arg_ir) != 3: error_ir_usage() return v = float(arg_ir[2]) if v < 0.65 or v > 0.95: print "Voltage value not in range .65 - .95" return voltage_scale = {0: "0xA6", 10: "0xA9", 20: "0xAC", 30: "0xAE", 40: "0xB1", 50: "0xB3", 60: "0xB6", 70: "0xB8", 80: "0xBB", 85: "0xBC", 90: "0xBD", 100: "0xC0", 105: "0xC1", 110: "0xC2", 120: "0xC5", 125: "0xC6", 130: "0xC8", 135: "0xC9", 140: "0xCA", 150: "0xCD", 155: "0xCE", 160: "0xCF", 170: "0xD2", 175: "0xD3", 180: "0xD4", 185: "0xD5", 190: "0xD7", 200: "0xD9", 205: "0xDA", 210: "0xDC", 220: "0xDF", 225: "0xE0", 230: "0xE1", 235: "0xE2", 240: "0xE4", 250: "0xE6", 255: "0xE7", 260: "0xE9", 270: "0xEC", 280: "0xEE", 290: "0xF1", 300: "0xF3"} # Convert to mv with -8 exponent i = (v * 1000) % 650 voltage = voltage_scale.get(i) if voltage == None: error_ir_usage() return margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF set_ir_voltage("VDD_CORE", VDD_CORE_IR_I2C_BUS, VDD_CORE_IR_PMBUS_ADDR, margin_cmd, margin_apply, voltage) ir_restore_i2c_switch(a) return def ir_voltage_set_mavericks(arg_ir, p0c): a = ir_open_i2c_switch() UPPER_IR_I2C_BUS = "0x9" UPPER_IR_PMBUS_ADDR = {1: "0x40", 2: "0x74", 3: "0x71"} string_upper = {1: "VDD_CORE", 2: "AVDD", 3: "QSFP_UPPER"} LOWER_IR_I2C_BUS = "0x1" if (p0c == 1): LOWER_IR_PMBUS_ADDR = {1: "0x71", 2: "0x72", 3: "0x70"} lower_string = {1: "QSFP_LOWER", 2: "RETIMER_VDDA", 3: "RETIMER_VDD"} else : LOWER_IR_PMBUS_ADDR = {1: "0x71", 2: "0x72"} lower_string = {1: "QSFP_LOWER", 2: "REPEATER"} IR_MARGIN_LOW_AOF_OP = "0x98" IR_MARGIN_HIGH_AOF_OP = "0xA8" IR_MARGIN_OFF = "0x80" IR_OPERATION = "0x1" IR_VOUT_MARGIN_HIGH = "0x25" IR_VOUT_MARGIN_LOW = "0x26" IR_VOUT_CMD = "0x21" if arg_ir[3] == "AVDD": # voltage +3% -3% 0x1b6=>438 VOLT_MARGIN_HIGH = "0x1DB" VOLT_MARGIN_LOW = "0x1BF" VOLT_NORMAL = "0x1CE" i2c_addr = UPPER_IR_PMBUS_ADDR.get(2) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], UPPER_IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) elif arg_ir[3] == "VDD_CORE": # voltage +2% -2% 0x1AE=>430 VOLT_MARGIN_HIGH = "0x0DB" VOLT_MARGIN_LOW = "0x0D3" VOLT_NORMAL = "0x0D7" i2c_addr = UPPER_IR_PMBUS_ADDR.get(1) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], UPPER_IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) elif arg_ir[3] == "QSFP_UPPER": VOLT_MARGIN_HIGH = "0x361" VOLT_MARGIN_LOW = "0x323" VOLT_NORMAL = "0x34D" i2c_addr = UPPER_IR_PMBUS_ADDR.get(3) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], UPPER_IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) elif arg_ir[3] == "QSFP_LOWER": VOLT_MARGIN_HIGH = "0x361" VOLT_MARGIN_LOW = "0x323" VOLT_NORMAL = "0x34D" i2c_addr = LOWER_IR_PMBUS_ADDR.get(1) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], LOWER_IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) elif arg_ir[3] == "RETIMER_VDD": if (p0c != 1): error_ir_usage() VOLT_MARGIN_HIGH = "0x20F" VOLT_MARGIN_LOW = "0x1F1" VOLT_NORMAL = "0x200" #set VDD i2c_addr = LOWER_IR_PMBUS_ADDR.get(3) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], LOWER_IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) #set VDDA elif arg_ir[3] == "RETIMER_VDDA": if (p0c != 1): error_ir_usage() i2c_addr = LOWER_IR_PMBUS_ADDR.get(2) VOLT_A_MARGIN_HIGH = "0x3B5" VOLT_A_MARGIN_LOW = "0x37E" VOLT_A_NORMAL = "0x39A" if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_A_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_A_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_A_NORMAL set_ir_voltage(arg_ir[3], LOWER_IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) elif arg_ir[3] == "REPEATER": if (p0c != 0): error_ir_usage() VOLT_MARGIN_HIGH = "0x2A0" VOLT_MARGIN_LOW = "0x260" VOLT_NORMAL = "0x280" i2c_addr = LOWER_IR_PMBUS_ADDR.get(2) if arg_ir[2] == "l": margin_cmd = IR_VOUT_MARGIN_LOW margin_apply = IR_MARGIN_LOW_AOF_OP voltage = VOLT_MARGIN_LOW elif arg_ir[2] == "h": margin_cmd = IR_VOUT_MARGIN_HIGH margin_apply = IR_MARGIN_HIGH_AOF_OP voltage = VOLT_MARGIN_HIGH else: margin_cmd = IR_VOUT_CMD margin_apply = IR_MARGIN_OFF voltage = VOLT_NORMAL set_ir_voltage(arg_ir[3], LOWER_IR_I2C_BUS, i2c_addr, margin_cmd, margin_apply, voltage) else: error_ir_usage() ir_restore_i2c_switch(a) return def ir(argv): arg_ir = argv[2:] if arg_ir[0] == "help" or arg_ir[0] == "h" or (len(arg_ir) != 3 and len(arg_ir) != 4): error_ir_usage() return if arg_ir[0] == "sh": if arg_ir[2] == "Mavericks" or arg_ir[2] == "mavericks" : ir_voltage_show_mavericks(0) elif arg_ir[2] == "Mavericks-P0C" or arg_ir[2] == "mavericks-p0c" : ir_voltage_show_mavericks(1) elif arg_ir[2] == "Montara" or arg_ir[2] == "montara" : ir_voltage_show_montara() else : error_ir_usage() return elif arg_ir[0] == "set": if arg_ir[1] == "Mavericks-P0C" or arg_ir[1] == "mavericks-p0c" : ir_voltage_set_mavericks(arg_ir, 1) elif arg_ir[1] == "Mavericks" or arg_ir[1] == "mavericks" : ir_voltage_set_mavericks(arg_ir, 0) elif arg_ir[1] == "Montara" or arg_ir[1] == "montara" : ir_voltage_set_montara(arg_ir) else : error_ir_usage() return elif arg_ir[0] == "set_vdd_core": if arg_ir[1] == "Mavericks" or arg_ir[1] == "mavericks" : ir_set_vdd_core_dynamic_range_mavericks(arg_ir) elif arg_ir[1] == "Montara" or arg_ir[1] == "montara" : ir_set_vdd_core_dynamic_range_montara(arg_ir) else : error_ir_usage() return else: error_ir_usage() return return def ucd_ir_voltage_margin(argv): return # # Temperature utility usage # def error_tmp_usage(): print " " print "Usage:" print "./btools.py --TMP <board type> sh => Show Temp" print " <board type> Montara or Mavericks" print "Eg." print "./btools.py --TMP Montara sh Show Temp sensors values on Montara" return # # Lower board temperature sensors. Board exists on Montara and Mavericks # def tmp_lower(board): i2c_dev = "/sys/class/i2c-adapter/i2c-3/3-00" tmp_sensor = {1: "48/temp1_input", 2: "49/temp1_input", 3: "4a/temp1_input", 4: "4b/temp1_input", 5: "4c/temp1_input"} cmd = "cat" if board == "Mavericks": x = 6 else: x = 5 for i in range(1, x): path = i2c_dev + tmp_sensor.get(i) try: output = subprocess.check_output([cmd, path]) print " TMP SENSOR %.2d %.3f C" % (i, float(output) / 1000) except subprocess.CalledProcessError as e: print e print "Error occured while reading Temperature sensor %d " % i if board == "Montara": cmd = "i2cget" try: output = subprocess.check_output([cmd, "-f", "-y", "3", "0x4d", "0x00", "w"]) output = int(output, 16) t = output & 0xff d = output & 0xfff00 # if d is 0x80 means .0625 * 8(consider only fourth nibble 2 ^ 3) if d == 0x8000: t = float(t) + .500 print " TMP SENSOR %.2d %.3f C" % (5, t) output = subprocess.check_output([cmd, "-f", "-y", "3", "0x4c", "0x00"]) output = int(output, 16) print " TMP SENSOR MAX LOCAL %.3f C" % output output = subprocess.check_output([cmd, "-f", "-y", "3", "0x4c", "0x01"]) output = int(output, 16) print " TMP SENSOR MAX Tofino %.3f C" % (output) except subprocess.CalledProcessError as e: print e print "Error occured while reading Temperature sensor %d " % i return # # Upper board temperature sensors. It only exists in Mavericks # def tmp_upper(): TMP75_I2C_BUS = "9" TMP75_I2C_ADDR = {1: "0x48", 2: "0x49", 3: "0x4a", 4: "0x4b"} TMP75_READ_OP = "0x00" for i in range(1, 5): try: get_cmd = "i2cget" output = subprocess.check_output([get_cmd, "-f", "-y", TMP75_I2C_BUS, TMP75_I2C_ADDR.get(i), TMP75_READ_OP, "w"]) output = int(output, 16) t = output & 0xff d = output & 0xfff00 # if d is 0x80 means .0625 * 8(consider only fourth nibble 2 ^ 3) if d == 0x8000: t = float(t) + .500 print " TMP SENSOR UPPER %.2d %.3f C" % (i, t) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for Tmp75 %.2d " % (i) TMP_MAX_I2C_BUS = "9" TMP_MAX_I2C_ADDR = "0x4c" TMP_MAX_READ_OP = "0x00" TMP_MAX_READ_EXT_OP = "0x01" try: get_cmd = "i2cget" output = subprocess.check_output([get_cmd, "-f", "-y", TMP_MAX_I2C_BUS, TMP_MAX_I2C_ADDR, TMP_MAX_READ_OP]) output = int(output, 16) print " TMP SENSOR UPPER MAX LOCAL %.2d.000 C" % (output) output = subprocess.check_output([get_cmd, "-f", "-y", TMP_MAX_I2C_BUS, TMP_MAX_I2C_ADDR, TMP_MAX_READ_EXT_OP]) output = int(output, 16) print " TMP SENSOR UPPER MAX TOFINO %.2d.000 C" % (output) except subprocess.CalledProcessError as e: print e print "Error occured while processing i2cget for Tmp MAX sensor" return # # Mavericks need i2c switch to be opened for reading temp sensors # def tmp_open_i2c_switch(): TMP_I2C_SW_BUS = "9" TMP_I2C_SW_ADDR = "0x70" try: get_cmd = "i2cget" output = subprocess.check_output([get_cmd, "-f", "-y", TMP_I2C_SW_BUS, TMP_I2C_SW_ADDR]) output = int(output, 16) # opening i2c switch for 0x4a, 0x4b, 0x4c res = output | 0x10 set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", TMP_I2C_SW_BUS, TMP_I2C_SW_ADDR, str(res)]) except subprocess.CalledProcessError as e: print e print "Error occured while processing opening i2c switch" \ " on mavericks upper board" return output # # Restoring the i2c switch state # def tmp_restore_i2c_switch(res): TMP_I2C_SW_BUS = "9" TMP_I2C_SW_ADDR = "0x70" try: set_cmd = "i2cset" o = subprocess.check_output([set_cmd, "-f", "-y", TMP_I2C_SW_BUS, TMP_I2C_SW_ADDR, str(res)]) except subprocess.CalledProcessError as e: print e print "Error occured while processing restoring i2c switch" \ " on mavericks upper board" return # # Dispatching temperature sensor requests # def tmp(argv): if argv[2] == "help" or argv[2] == "h": error_tmp_usage() return if len(argv) != 4: error_tmp_usage() return if argv[3] != "sh": error_tmp_usage() return if argv[2] == "Montara" or argv[2] =="montara": tmp_lower("Montara") elif argv[2] == "Mavericks" or argv[2] == "mavericks": a = tmp_open_i2c_switch() tmp_lower("Mavericks") tmp_upper() tmp_restore_i2c_switch(a) else: error_tmp_usage() return return def error_usage(): print "Error in arguments passed. Please look at usage." usage() return # Main function parses command line argument and call appropiate tool def main(argv): lock_file = "/tmp/btools_lock" timeout_counter = 0 try: opts, args = getopt.getopt(argv[1:], "hP:U:I:T:", ["help", "PSU=", "UCD=", "IR=", "TMP="]) # No standard identifier.print the usage if len(opts) == 0: print "Number of invalid arguments %d " % len(args) error_usage() return except getopt.GetoptError: error_usage() return while os.path.isfile(lock_file): timeout_counter = timeout_counter + 1 if timeout_counter >= 10: # It's possible that the other process using the lock might have # malfunctioned. Hence explicitly delete the file and proceed print "Some process didn't clean up the lock file. Hence explicitly cleaning it up and proceeding" os.remove(lock_file) break sleep(0.5) open(lock_file, "w+") for opt, arg in opts: if opt in ("-h", "--help"): usage() elif opt in ("-P", "--PSU"): psu(argv) elif opt in ("-U", "--UCD"): ucd(argv) elif opt in ("-I", "--IR"): ir(argv) elif opt in ("-T", "--TMP"): tmp(argv) else: error_usage() try: os.remove(lock_file) except OSError: pass return if __name__ == '__main__': sys.exit(main(sys.argv))