Skip to content
Snippets Groups Projects
Commit d8d2b0a8 authored by Paulus Kruger's avatar Paulus Kruger
Browse files

I2C status added

parent 0bbd543c
No related branches found
No related tags found
1 merge request!11Pypcc2
......@@ -10,7 +10,7 @@ drivers:
type: i2c_array #An array of similar devices connected to an I2C switch
parent: I2C1
parameters: [0,31] #start,number of RCUs
mask: RCU_I2C_OK
status: RCU_I2C_STATUS
- name: I2C_HBAT
type: hba1 #Special driver to manage HBAT1s.
parent: I2C_RCU
......@@ -200,18 +200,18 @@ variables:
dtype: boolean
dim: 32
- name: RCU_I2C_OK
description: Only OK RCUs are monitored
- name: RCU_I2C_STATUS
description: 0=Good, 1=No communication, 2=error
driver: I2C_RCU
rw: variable #server RW variable, not linked to IO
dtype: boolean
rw: ro #server RW variable, not linked to IO
dtype: uint8
mask: RCU_mask
dim: 32
- name: RCU_state
description: State of RCUs 0=unknown, 1=ready, 2=busy, 3= wait PPS, 4=error
driver: I2C_RCU
rw: variable #server variable, not linked to IO
rw: ro #server variable, not linked to IO
dtype: uint8
dim: 1
......@@ -279,7 +279,7 @@ variables:
dtype: double
dim: 32
monitor: true
mask: RCU_I2C_OK
mask: RCU_I2C_STATUS
- name: RCU_Pwr_dig
description: Enable LDOs
......@@ -344,24 +344,23 @@ variables:
rw: ro
dtype: uint8
dim: 96
mask: RCU_I2C_OK
mask: RCU_I2C_STATUS
monitor: true
- name: RCU_dth1_freq
driver: I2C_RCU
devreg: [DTH1.Freq,DTH2.Freq,DTH3.Freq]
width: 32
rw: rw
dtype: uint32
dim: 96
mask: Ant_mask
# - name: RCU_dth1_freq
# driver: I2C_RCU
# devreg: [DTH1.Freq,DTH2.Freq,DTH3.Freq]
# width: 32
# rw: rw
# dtype: uint32
# dim: 96
# mask: Ant_mask
methods:
- name: RCU_Init #Called after startup to load. Should have all stored registers
driver: I2C_RCU
debug: True
instructions:
- RCU_state: 2
- RCU_IO1_GPIO1: Update
- RCU_IO1_GPIO2: Update
- RCU_IO2_GPIO1: Update
......@@ -375,13 +374,11 @@ methods:
# - IO3.GPIO2: Update
- IO3.CONF1: Update
- RCU_update: 0
- RCU_state: 1
- name: RCU_on
driver: I2C_RCU
mask: RCU_mask
instructions:
- RCU_state: 2
- IO2.CONF1: 0 #Set device register, can also specify a register adress direction e.g. OIO2.0: 0
- IO2.GPIO1: 0x4A
- IO2.GPIO2: 0x55
......@@ -402,7 +399,6 @@ methods:
# - ADC2_on: 0
# - WAIT: 500 #ms to wait
- RCU_update: 0
- RCU_state: 1
- name: RCU_update
driver: I2C_RCU
......@@ -445,6 +441,7 @@ methods:
- name: RCU_HBAT_WAIT_PPS
driver: I2C_RCU
mask: RCU_mask
debug: True
instructions:
- RCU_state: 3
- HB_UC_update.wait_pps : 1
......
......@@ -11,37 +11,37 @@ drivers:
type: i2c_array
parent: I2C1
parameters: [0,1]
mask: UNB2_I2C_bus_OK
status: UNB2_I2C_bus_STATUS
- name: switch_PS
type: i2c_array2
parent: I2C1
parameters: [0,1, 4,4]
mask: UNB2_I2C_bus_PS_OK
status: UNB2_I2C_bus_PS_STATUS
- name: switch_FP
type: i2c_array2
parent: I2C1
parameters: [0,1, 5,5]
mask: UNB2_I2C_bus_FP_OK
status: UNB2_I2C_bus_FP_STATUS
- name: switch_QSFP
type: i2c_array2 #An array of similar devices connected to an I2C switch
parent: I2C1
parameters: [0,1, 0,3, 0,3, 6,7] #Parameters: APSCT_Switch, main switch, 2nd switch, 2nd switch
mask: UNB2_I2C_bus_QSFP_OK
status: UNB2_I2C_bus_QSFP_STATUS
- name: switch_DDR4
type: i2c_array2
parent: I2C1
parameters: [0,1, 0,3, 4,4]
mask: UNB2_I2C_bus_DDR4_OK
status: UNB2_I2C_bus_DDR4_STATUS
- name: switch_FPGA_PS
type: i2c_array2
parent: I2C1
parameters: [0,1, 0,3, 5,5]
mask: UNB2_I2C_bus_FPGA_PS_OK
status: UNB2_I2C_bus_FPGA_PS_STATUS
- name: GPIO
type: gpio
......@@ -87,36 +87,36 @@ device_registers:
variables:
#When I2C bus timeout, bus_OK set to False. Can we set to True again to retry.
- name: UNB2_I2C_bus_OK
#When I2C bus timeout, bus_STATUS set to False. Can we set to True again to retry.
- name: UNB2_I2C_bus_STATUS
driver: switch_UNB2
rw: variable
dtype: boolean
rw: ro
dtype: uint8
dim: 2
- name: UNB2_I2C_bus_FP_OK
- name: UNB2_I2C_bus_FP_STATUS
driver: switch_UNB2
rw: hidden
dtype: boolean
dtype: uint8
dim: 2
- name: UNB2_I2C_bus_QSFP_OK
- name: UNB2_I2C_bus_QSFP_STATUS
driver: switch_QSFP
rw: variable
dtype: boolean
rw: ro
dtype: uint8
dim: 48
- name: UNB2_I2C_bus_DDR4_OK
- name: UNB2_I2C_bus_DDR4_STATUS
driver: switch_QSFP
rw: variable
dtype: boolean
rw: ro
dtype: uint8
dim: 8
- name: UNB2_I2C_bus_FPGA_PS_OK
- name: UNB2_I2C_bus_FPGA_PS_STATUS
driver: switch_FPGA_PS
rw: variable
dtype: boolean
rw: ro
dtype: uint8
dim: 8
- name: UNB2_I2C_bus_PS_OK
- name: UNB2_I2C_bus_PS_STATUS
driver: switch_PS
rw: variable
dtype: boolean
rw: ro
dtype: uint8
dim: 2
##Central MP for whole Uniboard2
......@@ -154,7 +154,6 @@ variables:
- name: UNB2_EEPROM_Unique_ID
driver: switch_UNB2
mask: UNB2_I2C_bus_OK
devreg: 0x50.0xFC
width: 32
rw: ro
......@@ -163,7 +162,6 @@ variables:
- name: [UNB2_DC_DC_48V_12V_VIN,UNB2_DC_DC_48V_12V_VOUT,UNB2_DC_DC_48V_12V_IOUT,UNB2_DC_DC_48V_12V_TEMP]
driver: switch_PS
mask: UNB2_I2C_bus_PS_OK
devreg: [0x2C.0x88,0x2C.0x8B,0x2C.0x8C,0x2C.0x8D]
width: 16
rw: ro
......@@ -174,7 +172,6 @@ variables:
- name: [UNB2_POL_QSFP_N01_VOUT,UNB2_POL_QSFP_N01_IOUT,UNB2_POL_QSFP_N01_TEMP,UNB2_POL_QSFP_N23_VOUT,UNB2_POL_QSFP_N23_IOUT,UNB2_POL_QSFP_N23_TEMP]
driver: switch_PS
mask: UNB2_I2C_bus_PS_OK
devreg: [0x2.0x8B,0x2.0x8C,0x2.0x8D,0x1.0x8B,0x1.0x8C,0x1.0x8D]
width: 16
rw: ro
......@@ -185,7 +182,6 @@ variables:
- name: [UNB2_POL_SWITCH_1V2_VOUT,UNB2_POL_SWITCH_1V2_IOUT,UNB2_POL_SWITCH_1V2_TEMP,UNB2_POL_SWITCH_PHY_VOUT,UNB2_POL_SWITCH_PHY_IOUT,UNB2_POL_SWITCH_PHY_TEMP]
driver: switch_PS
mask: UNB2_I2C_bus_PS_OK
devreg: [0xF.0x8B,0xF.0x8C,0xF.0x8D,0xE.0x8B,0xE.0x8C,0xE.0x8D]
width: 16
rw: ro
......@@ -196,7 +192,6 @@ variables:
- name: [UNB2_POL_CLOCK_VOUT,UNB2_POL_CLOCK_IOUT,UNB2_POL_CLOCK_TEMP]
driver: switch_PS
mask: UNB2_I2C_bus_PS_OK
devreg: [0xD.0x8B,0xD.0x8C,0xD.0x8D]
width: 16
rw: ro
......@@ -209,7 +204,6 @@ variables:
- name: UNB2_FPGA_DDR4_SLOT_TEMP
description: Signed I2C!
driver: switch_DDR4
mask: UNB2_I2C_bus_DDR4_OK
devreg: [0x18.0x5,0x19.0x5]
width: 13
rw: ro
......@@ -220,7 +214,6 @@ variables:
- name: UNB2_FPGA_DDR4_SLOT_PART_NUMBER
driver: switch_DDR4
mask: UNB2_I2C_bus_DDR4_OK
devreg: [0x18.0x149,0x19.0x149]
width: 160
rw: ro
......@@ -230,7 +223,6 @@ variables:
- name: [UNB2_POL_FPGA_CORE_VOUT,UNB2_FPGA_POL_CORE_IOUT,UNB2_FPGA_POL_CORE_TEMP,UNB2_FPGA_POL_ERAM_VOUT,UNB2_FPGA_POL_ERAM_IOUT,UNB2_FPGA_POL_ERAM_TEMP]
driver: switch_FPGA_PS
mask: UNB2_I2C_bus_FGPA_PS_OK
devreg: [0x1.0x8B,0x1.0x8C,0x1.0x8D,0xD.0x8B,0xD.0x8C,0xD.0x8D]
width: 16
rw: ro
......@@ -241,7 +233,6 @@ variables:
- name: [UNB2_FPGA_POL_RXGXB_VOUT,UNB2_FPGA_POL_RXGXB_IOUT,UNB2_FPGA_POL_RXGXB_TEMP,UNB2_FPGA_POL_TXGXB_VOUT,UNB2_FPGA_POL_TXGXB_IOUT,UNB2_POL_FPGA_TXGXB_TEMP]
driver: switch_FPGA_PS
mask: UNB2_I2C_bus_FGPA_PS_OK
devreg: [0xE.0x8B,0xE.0x8C,0xE.0x8D,0xF.0x8B,0xF.0x8C,0xF.0x8D]
width: 16
rw: ro
......@@ -252,7 +243,6 @@ variables:
- name: [UNB2_FPGA_POL_HGXB_VOUT,UNB2_FPGA_POL_HGXB_IOUT,UNB2_FPGA_POL_HGXB_TEMP,UNB2_FPGA_POL_PGM_VOUT,UNB2_FPGA_POL_PGM_IOUT,UNB2_FPGA_POL_PGM_TEMP]
driver: switch_FPGA_PS
mask: UNB2_I2C_bus_FGPA_PS_OK
devreg: [0x10.0x8B,0x10.0x8C,0x10.0x8D,0x11.0x8B,0x11.0x8C,0x11.0x8D]
width: 16
rw: ro
......@@ -267,7 +257,6 @@ variables:
- name: UNB2_FPGA_QSFP_CAGE_TEMP
description: Signed I2C!
driver: switch_QSFP
mask: UNB2_I2C_bus_QSFP_OK
devreg: 0x50.0x16
width: 16
rw: ro
......@@ -279,7 +268,6 @@ variables:
- name: UNB2_FPGA_QSFP_CAGE_LOS
description: Bits for 4 TX, 4 RX channels
driver: switch_QSFP
mask: UNB2_I2C_bus_QSFP_OK
devreg: 0x50.0x03
width: 8
rw: ro
......
......@@ -23,7 +23,7 @@ class i2c_array(i2c_dev):
pars=config['parameters'];
self.RCU_Switch1=range(pars[0],pars[1]+1);
self.N=len(self.RCU_Switch1);
self.I2Cmask=[True]*self.N
self.I2Cmask=[0]*self.N
# self.devregs,RCU_storeReg=DevRegList(yaml)
# print("Init",config['name'],'len=',len(self.RCU_Switch1),' stored reg=',RCU_storeReg)
......@@ -39,7 +39,7 @@ class i2c_array(i2c_dev):
def SetSwitchMask(self,mask):
m=0;
for RCUi in range(self.N):
if (mask[RCUi]) and (self.I2Cmask[RCUi]):
if (mask[RCUi]) and (self.I2Cmask[RCUi]==0):
m|=1<<self.RCU_Switch1[RCUi];
self.conf['parentcls'].SetChannel(m);
......@@ -62,7 +62,7 @@ class i2c_array(i2c_dev):
for RCUi in range(self.N):
for Vari in range(Step):
if not(mask[RCUi*Step+Vari]): continue
if not(self.I2Cmask[RCUi]):
if not(self.I2Cmask[RCUi]==0):
mask[RCUi*Step+Vari]=False;
continue;
i0=(RCUi*Step+ Vari)*Step2
......@@ -74,14 +74,14 @@ class i2c_array(i2c_dev):
self.RCUi=RCUi;
res=self.SetVarValue(devreg,width,bitoffset,data[i0:i1])
if not(res):
self.I2Cmask[RCUi]=res;
self.I2Cmask[RCUi]=1;
mask[RCUi*Step+Vari]=False;
continue;
if getalso:
value2=value1[i0:i1]
res=self.GetVarValue(devreg,width,bitoffset,value2)
if not(res):
self.I2Cmask[RCUi]=False;
self.I2Cmask[RCUi]=1;
mask[RCUi*Step+Vari]=False;
continue;
value1[i0:i1]=value2
......@@ -103,7 +103,7 @@ class i2c_array(i2c_dev):
for RCUi in range(self.N):
for Vari in range(Step):
if not(mask[RCUi*Step+Vari]): continue
if not(self.I2Cmask[RCUi]):
if not(self.I2Cmask[RCUi]==0):
mask[RCUi*Step+Vari]=False;
continue;
i0=(RCUi*Step+ Vari)*Step2
......@@ -116,7 +116,7 @@ class i2c_array(i2c_dev):
self.RCUi=RCUi;
res=self.GetVarValue(devreg,width,bitoffset,value2)
if not(res):
self.I2Cmask[RCUi]=False;
self.I2Cmask[RCUi]=1;
mask[RCUi*Step+Vari]=False;
continue;
value1[i0:i1]=value2
......@@ -137,7 +137,7 @@ class i2c_array(i2c_dev):
if devreg.get('store'):
storearray=self.getstorearray(devreg);
for RCUi in range(self.N):
if (mask[RCUi]) and (self.I2Cmask[RCUi]):
if (mask[RCUi]) and (self.I2Cmask[RCUi]==0):
storearray[RCUi]=value[0]
self.RCUi=RCUi;
logging.debug(str(("Stored values:",self.getstorearray(devreg))))
......@@ -152,7 +152,7 @@ class i2c_array(i2c_dev):
i2c=self.conf['parentcls'];
for RCUi in range(self.N):
if not(mask[RCUi]): continue
if not(self.I2Cmask[RCUi]): continue
if not(self.I2Cmask[RCUi]==0): continue
self.SetSwitch(RCUi);
value2=[value1[RCUi]]
self.RCUi=RCUi;
......
import logging
from .i2c_array import i2c_array;
from .hwdev import hwdev
from .i2c_dev import i2c_dev
class i2c_array2(i2c_array):
def __init__(self,config):
hwdev.__init__(self,config);
i2c_dev.__init__(self,config);
# Make array of switch states
pars=config['parameters'];
......@@ -20,6 +21,7 @@ class i2c_array2(i2c_array):
self.N=len(sw1)
if len(sw2)>0: self.N*=len(sw2)
if len(sw3)>0: self.N*=len(sw3)
self.I2Cmask=[0]*self.N
self.sw1=[x for x in sw1 for i in range(self.N//len(sw1))]
self.sw2=[x for x in sw2 for i in range(self.N//len(sw1)//len(sw2))]*len(sw1)
self.sw3=[x for x in sw3]*len(sw1)*len(sw2)
......
......@@ -84,12 +84,13 @@ def list_different(A,B):
class i2c_dev(hwdev):
def __init__(self,config):
hwdev.__init__(self,config);
self.I2Cmask=[True]
self.I2Cmask=[0]
self.I2Cmaskid=config.get('maskid',None)
if self.I2Cmaskid is None: logging.warn(config['name']+" I2C mask not found!")
def OPCUASetVariable(self,varid,var1,data,mask):
if var1['rw']=='variable':
logging.info(str(("Set Var",var1['name'],data,mask)))
if (var1['rw']=='variable') or not(var1.get('devreg')):
if varid==self.I2Cmaskid:
if len(mask)==0: mask=[True]*len(data);
if len(data)!=len(mask):
......@@ -99,7 +100,6 @@ class i2c_dev(hwdev):
if m: self.I2Cmask[x]=data[x];
return [OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask.copy(),[])]
return [OPCUAset(varid,InstType.varSet,data,mask)];
logging.info(str(("Set Var",var1['name'],data,mask)))
oldmask=self.I2Cmask.copy()
data,mask2=self.SetGetVarValueMask(var1,data,mask);
# if len(mask)==len(mask2): mask[:]=mask2[:];
......@@ -112,6 +112,7 @@ class i2c_dev(hwdev):
def OPCUAReadVariable(self,varid,var1,mask):
logging.info(str(("Read Var",var1['name'],mask)))
if not(var1.get('devreg')): return []
#data=self.GetVarValueAll(var1)
#else:
oldmask=self.I2Cmask.copy()
......
......@@ -135,8 +135,8 @@ class yamlconfig():
D['devreg']=[self.getdevreg(devreg)]
for D in drivers:
mask=D.get('mask');
if not(mask): continue;
mask=D.get('status');
if mask is None: continue;
mask=self.getvarid(mask)
if mask is None:
logging.warn("Variable %s not found",mask)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment