From d2c8d3013b53b47a29da1b5fb4c9248f5437443c Mon Sep 17 00:00:00 2001 From: GijsSchoonderbeek <schoonderbeek@astron.nl> Date: Thu, 6 May 2021 13:40:16 +0200 Subject: [PATCH] Added scripts for testing UniBoard2 (rd_unb2c and updated UniBoard2_I2C.py) --- UniBoard2_I2C.py | 3 -- rd_unb2c.py | 126 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 rd_unb2c.py diff --git a/UniBoard2_I2C.py b/UniBoard2_I2C.py index 4beef56..3d13d89 100644 --- a/UniBoard2_I2C.py +++ b/UniBoard2_I2C.py @@ -1,15 +1,12 @@ EEPROM_I2C_ADDR = 0x50 #"1010000" - - LOC_POWER_CORE = 0x01 #"0000001" # 0x01 LOC_POWER_ERAM = 0x0D #"0001101" # 0x0D LOC_POWER_TR_R = 0x0E #"0001110" # 0x0E LOC_POWER_TR_T = 0x0F #"0001111" # 0x0F LOC_POWER_BAT = 0x10 #"0010000" # 0x10 LOC_POWER_IO = 0x11 #"0010001" # 0x11 -LOC_POWER_SUPPLIES = [LOC_POWER_CORE,LOC_POWER_ERAM,LOC_POWER_TR_R,LOC_POWER_TR_T,LOC_POWER_BAT,LOC_POWER_IO] SWI_POWER_CORE = 0x0F #"0001111" # 0x0F diff --git a/rd_unb2c.py b/rd_unb2c.py new file mode 100644 index 0000000..48fff63 --- /dev/null +++ b/rd_unb2c.py @@ -0,0 +1,126 @@ +''' +Read Hardware info form UNB2C +''' + +import sys +import time +sys.path.insert(0,'.') +from UniBoard2_I2C import * +if os.name =="posix": + from I2C_serial_pi import * +else: + from I2C_serial import * +I2CBUSNR=1 + +QSFP_PORT=[] +QSFP_PORT.append(0x08) +QSFP_PORT.append(0x04) +QSFP_PORT.append(0x02) +QSFP_PORT.append(0x01) +QSFP_PORT.append(0x40) +QSFP_PORT.append(0x80) + +def rw_eeprom(value=0xAB): + I2C_eeprom = I2C(0x53) + I2C_eeprom.bus = I2CBUSNR + I2C_eeprom.write_bytes(0x00, value) + I2C_eeprom.write_pointer(0x00) + ret_ack, ret_value = I2C_eeprom.read_last_reg(1) + if ret_ack: + stri = "EEPROM readback : {0} ".format(ret_value) + print(stri) + else: + print("ACK nok") + +def front_led(value=0xFF): + main_switch = I2C(0x71) + main_switch.bus = I2CBUSNR + main_switch.write_pointer(0x20) #select LED + front = I2C(0x41) + front.bus = I2CBUSNR + front.write_bytes(0x03, 0) + front.write_bytes(0x01, value) + sleep(0.5) + for cnt in range(6): + front.write_bytes(0x01, (1 << cnt%3)^0xff) + sleep(0.2) + front.write_bytes(0x01, 0) + sleep(0.2) + front.write_bytes(0x01, 0xf) + + + +def read_pol(i2c_addr): + LOC_PWR = I2C(i2c_addr) + LOC_PWR.bus = I2CBUSNR + value=[] +# ret_ack,vout_mod = LOC_PWR.read_bytes(LP_VOUT_MODE, 1) +# ret_ack,ret_value = LOC_PWR.read_bytes(LP_VOUT, 2) +# stri = "POL readback {0} : ".format(ret_value) +# print(stri) +# vout = calc_lin_3bytes(ret_value, vout_mod) +# print("vout = ", vout) +# ret_ack,ret_value = LOC_PWR.read_bytes(LP_IOUT, 2) +# iout = calc_lin_2bytes(ret_value) +# print("Output Current :",iout) + ret_ack,ret_value = LOC_PWR.read_bytes(LP_temp, 2) + temp = calc_lin_2bytes(ret_value) + print("temperature :",temp) + +def read_ddr(node_nr = 0, module=0): + main_switch.write_pointer(0x01<<node_nr) #select Node + node_switch.write_pointer(0x10) #select DDR4 + if module==0: + ddr_module = I2C(MB_I_TEMP_I2C_ADDR) + else: + ddr_module = I2C(MB_II_TEMP_I2C_ADDR) + ddr_module.bus = I2CBUSNR + ret_ack,raw_ret = ddr_module.read_bytes(MB_TEMP_REG, 2) + if len(raw_ret) < 1: + stri = "No DDR moduel in slot {0} node {1}".format(module, node_nr) + else: + ret_value=[] + ret_value.append(int(raw_ret[0:2],16)) + ret_value.append(int(raw_ret[2:4],16)) + temp = (((ret_value[0] & 0x1F) * 0x100) + (ret_value[1] & 0xFC)) * 0.0625 + stri = "Temperature DDR4 in slot {0} node {1} is {2:3.2f} °C".format(module, node_nr, temp) + print(stri) + +def read_qsfp(node_nr = 0, module=0): + main_switch.write_pointer(0x01<<node_nr) #select Node + node_switch.write_pointer(QSFP_PORT[module]) #select QSFP cage 1 + QSFP_cage = I2C(QSFP_I2C_ADDR) + QSFP_cage.bus = I2CBUSNR + ret_ack, raw_ret = QSFP_cage.read_bytes(QSFP_TEMP, 2) + if len(raw_ret) < 1: + stri = "No QSFP module in slot {0} node {1}".format(module, node_nr) + else: + ret_value=[] + ret_value.append(int(raw_ret[0:2],16)) + ret_value.append(int(raw_ret[2:4],16)) + temp_in_mod = (ret_value[0] * 256 + ret_value[1]) / 256 + stri = "Temperature QSFP in slot {0} node {1} is {2:3.2f} gr. C".format(module, node_nr, temp_in_mod) + print(stri) + ret_ack, raw_ret = QSFP_cage.read_bytes(QSFP_VOLT, 2) + ret_value.append(int(raw_ret[0:2],16)) + ret_value.append(int(raw_ret[2:4],16)) + Power_in_mod = (ret_value[0] * 256 + ret_value[1]) * 0.0001 + stri = "Voltage QSFP in slot {0} node {1} is {2:3.2f} V".format(module, node_nr, Power_in_mod) + print(stri) + + +if 0: + rw_eeprom(0xCD) +main_switch = I2C(0x71) +main_switch.bus = I2CBUSNR +node_switch = I2C(0x72) +node_switch.bus = I2CBUSNR +main_switch.write_pointer(0x20) #select LED +front_led() +if 1: + for node_cnt in range(4): + for module_cnt in range(2): + read_ddr(node_nr=node_cnt,module=module_cnt) + for qsfp_cnt in range(6): + read_qsfp(node_nr = node_cnt, module=qsfp_cnt) + -- GitLab