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

parallel i2c readout

parent 754f061e
No related branches found
No related tags found
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,25 +200,36 @@ class i2c_array(i2c_dev): ...@@ -185,25 +200,36 @@ 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 reg>255: #This is for the monitor ADC (+ DTH) if mode==1:
callback(0,[250],read=3) if not(callback(devreg['addr'],value2,read=1)): return False;
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
callback(0,[250],read=3)
if not(callback(devreg['addr'],value2,read=1)): return False;
else: else:
if not(callback(devreg['addr'],value2,reg=reg,read=1)): return False; if reg>255: #This is for the monitor ADC (+ DTH)
callback(0,[250],read=3)
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
callback(0,[250],read=3)
if not(callback(devreg['addr'],value2,read=1)): return False;
else:
if not(callback(devreg['addr'],value2,reg=reg,read=1)): return False;
if value2[0] is None: return False if value2[0] is None: return False
value[:]=value2[:]; value[:]=value2[:];
if devreg.get('store'): if devreg.get('store'):
......
...@@ -267,18 +267,30 @@ class i2c_dev(hwdev): ...@@ -267,18 +267,30 @@ 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 devreg.get('wait',0)>0: if mode==2:
callback(0,[devreg['wait']],read=3) return callback(devreg['addr'],int2bytes(reg),read=2)
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False; elif mode==3:
callback(0,[devreg['wait']],read=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; if not(callback(devreg['addr'],value2,read=1)): return False;
else: else:
if not(callback(devreg['addr'],value2,reg=reg,read=1)): return False; if devreg.get('wait',0)>0:
callback(0,[devreg['wait']],read=3)
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
callback(0,[devreg['wait']],read=3)
if not(callback(devreg['addr'],value2,read=1)): return False;
else:
if not(callback(devreg['addr'],value2,reg=reg,read=1)): return False;
if value2[0] is None: return False if value2[0] is None: return False
value[:]=value2[:]; value[:]=value2[:];
if devreg.get('store'): if devreg.get('store'):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment