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