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

parallel i2c readout

parent 754f061e
Branches
Tags
No related merge requests found
...@@ -319,6 +319,7 @@ variables: ...@@ -319,6 +319,7 @@ variables:
dtype: double dtype: double
dim: 32 dim: 32
monitor: true monitor: true
read_parallel: true
mask: RECVTR_I2C_error mask: RECVTR_I2C_error
- name: RCU_PWR_3V3 - name: RCU_PWR_3V3
...@@ -330,6 +331,7 @@ variables: ...@@ -330,6 +331,7 @@ variables:
rw: ro rw: ro
dtype: double dtype: double
dim: 32 dim: 32
read_parallel: true
monitor: true monitor: true
mask: RECVTR_I2C_error mask: RECVTR_I2C_error
...@@ -342,6 +344,7 @@ variables: ...@@ -342,6 +344,7 @@ variables:
rw: ro rw: ro
dtype: double dtype: double
dim: 32 dim: 32
read_parallel: true
monitor: true monitor: true
mask: RECVTR_I2C_error mask: RECVTR_I2C_error
...@@ -354,6 +357,7 @@ variables: ...@@ -354,6 +357,7 @@ variables:
rw: ro rw: ro
dtype: double dtype: double
dim: 32 dim: 32
read_parallel: true
monitor: true monitor: true
mask: RECVTR_I2C_error mask: RECVTR_I2C_error
...@@ -367,6 +371,7 @@ variables: ...@@ -367,6 +371,7 @@ variables:
dtype: double dtype: double
dim: 96 dim: 96
dim2: [3,32] dim2: [3,32]
read_parallel: true
monitor: true monitor: true
mask: RECVTR_I2C_error mask: RECVTR_I2C_error
...@@ -380,6 +385,7 @@ variables: ...@@ -380,6 +385,7 @@ variables:
dtype: double dtype: double
dim: 96 dim: 96
dim2: [3,32] dim2: [3,32]
read_parallel: true
monitor: true monitor: true
mask: RECVTR_I2C_error mask: RECVTR_I2C_error
...@@ -393,6 +399,7 @@ variables: ...@@ -393,6 +399,7 @@ variables:
dtype: double dtype: double
dim: 96 dim: 96
dim2: [3,32] dim2: [3,32]
read_parallel: true
monitor: true monitor: true
mask: RECVTR_I2C_error mask: RECVTR_I2C_error
......
...@@ -97,8 +97,23 @@ class i2c_array(i2c_dev): ...@@ -97,8 +97,23 @@ class i2c_array(i2c_dev):
# if (len(value1)==V1.nVars) and (self.N>1): value1=(value1*self.N); # if (len(value1)==V1.nVars) and (self.N>1): value1=(value1*self.N);
i2c=self.conf['parentcls']; i2c=self.conf['parentcls'];
# logging.debug(str(("Step=",Step,"Mask=",mask))) # logging.debug(str(("Step=",Step,"Mask=",mask)))
for RCUi in range(self.N): mode=(1 if var1.get('read_parallel') else 0)
for Vari in range(Step): for Vari in range(Step):
if mode==1:
# logging.debug("parallel write register for read")
# print(mask2);
devreg=var1['devreg'][Vari];
width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0)
mask2=[mask[RCUi*Step+Vari] & (self.I2Cmask[RCUi]<=self.I2Ccut) for RCUi in range(self.N)]
self.SetSwitchMask(mask2);
res=self.GetVarValue(devreg,width,bitoffset,[],mode=3) #wait if needed
res=self.GetVarValue(devreg,width,bitoffset,[],mode=2) #only set register
res=self.GetVarValue(devreg,width,bitoffset,[],mode=3) #wait if needed
# for Vari in range(Step):
# else:
for RCUi in range(self.N):
# for Vari in range(Step):
if not(mask[RCUi*Step+Vari]): continue if not(mask[RCUi*Step+Vari]): continue
i0=(RCUi*Step+ Vari)*Step2 i0=(RCUi*Step+ Vari)*Step2
i1=(RCUi*Step+(Vari+1))*Step2 i1=(RCUi*Step+(Vari+1))*Step2
...@@ -112,7 +127,7 @@ class i2c_array(i2c_dev): ...@@ -112,7 +127,7 @@ class i2c_array(i2c_dev):
self.SetSwitch(RCUi); self.SetSwitch(RCUi);
value2=value1[i0:i1] value2=value1[i0:i1]
self.RCUi=RCUi; self.RCUi=RCUi;
res=self.GetVarValue(devreg,width,bitoffset,value2) res=self.GetVarValue(devreg,width,bitoffset,value2,mode=mode)
if not(res): if not(res):
if self.disableI2ConError: self.I2Cmask[RCUi]+=1; if self.disableI2ConError: self.I2Cmask[RCUi]+=1;
if self.I2Cmask[RCUi]>self.I2Ccut: mask[RCUi*Step+Vari]=False; if self.I2Cmask[RCUi]>self.I2Ccut: mask[RCUi*Step+Vari]=False;
...@@ -185,18 +200,29 @@ class i2c_array(i2c_dev): ...@@ -185,18 +200,29 @@ class i2c_array(i2c_dev):
# devreg['drivercls'].i2csetget # devreg['drivercls'].i2csetget
return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W']) return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W'])
def GetVarValue(self,devreg,width,bitoffset,value): def GetVarValue(self,devreg,width,bitoffset,value,mode=0):
logging.debug(str(("RCU1 Get ",self.RCUi,devreg['addr'],value))) logging.debug(str(("RCU1 Get ",self.RCUi,devreg['addr'],value)))
# self.GetI2C(RCUi,devreg,width,bitoffset,value) # self.GetI2C(RCUi,devreg,width,bitoffset,value)
# if dev.store>0: # if dev.store>0:
# value[0]=self.previous[RCUi,dev.store-1] # value[0]=self.previous[RCUi,dev.store-1]
# return True # return True
callback=devreg['drivercls'].i2csetget; callback=devreg['drivercls'].i2csetget;
reg=devreg['register_R']
if mode==2:
return callback(devreg['addr'],int2bytes(reg),read=2)
elif mode==3:
if devreg.get('wait',0)>0: callback(0,[devreg['wait']],read=3)
elif reg>255: callback(0,[250],read=3)
return True;
l1=int(np.floor((width+bitoffset+7)/8)) l1=int(np.floor((width+bitoffset+7)/8))
# print(width,bitoffset,l1) # print(width,bitoffset,l1)
value2=value value2=value
reg=devreg['register_R']
value2[0]=None; #default value2[0]=None; #default
if mode==1:
if not(callback(devreg['addr'],value2,read=1)): return False;
else:
if reg>255: #This is for the monitor ADC (+ DTH) if reg>255: #This is for the monitor ADC (+ DTH)
callback(0,[250],read=3) callback(0,[250],read=3)
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False; if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
......
...@@ -267,11 +267,23 @@ class i2c_dev(hwdev): ...@@ -267,11 +267,23 @@ class i2c_dev(hwdev):
# devreg['drivercls'].i2csetget # devreg['drivercls'].i2csetget
return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W']) return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W'])
def GetVarValue(self,devreg,width,bitoffset,value): def GetVarValue(self,devreg,width,bitoffset,value,mode=0):
#mode=0: Set register, wait, read
#mode=1: only read
#mode=2: only set register
#mode=3: only wait
logging.debug(str(("i2c_dev Get ",devreg['addr'],value))) logging.debug(str(("i2c_dev Get ",devreg['addr'],value)))
callback=devreg['drivercls'].i2csetget; callback=devreg['drivercls'].i2csetget;
value2=value
reg=devreg['register_R'] reg=devreg['register_R']
if mode==2:
return callback(devreg['addr'],int2bytes(reg),read=2)
elif mode==3:
if devreg.get('wait',0)>0: callback(0,[devreg['wait']],read=3)
return True;
value2=value
if mode==1:
if not(callback(devreg['addr'],value2,read=1)): return False;
else:
if devreg.get('wait',0)>0: if devreg.get('wait',0)>0:
callback(0,[devreg['wait']],read=3) callback(0,[devreg['wait']],read=3)
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False; if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment