diff --git a/i2c/I2C.py b/i2c/I2C.py index 1abf950ecc4c569dd746cbee4ab8b467a9ab822c..301eda80276f841c937b9b081463a40b119113b2 100644 --- a/i2c/I2C.py +++ b/i2c/I2C.py @@ -17,7 +17,7 @@ def I2C1server(addr,data,reg=None,read=0): # print("I2C",addr,reg,data,read) # return True; - bus=pylibi2c.I2CDevice('/dev/i2c-1',addr) + bus=pylibi2c.I2CDevice('/dev/i2c-2',addr) if read==1: length=len(data) bus.iaddr_bytes=0 @@ -33,6 +33,6 @@ def I2C1server(addr,data,reg=None,read=0): return True; except: if bus: bus.close() -# data[0]=0 +# data[0]=0xff return False; diff --git a/i2c/test.py b/i2c/test.py new file mode 100644 index 0000000000000000000000000000000000000000..92ee093a8b833322558341cd664855f643f57dd1 --- /dev/null +++ b/i2c/test.py @@ -0,0 +1,37 @@ +from I2C import * +import time +RCU=1 +Ver="RCU2H v0.2" +R1=0 +ROM=0x50 + +ID=[0]*7 +I2C1server(0x20,ID,reg=2,read=1) +print(ID) +I2C1server(0x20,ID,reg=2,read=1) +print(ID) +exit() +#0=0 +#1=0 #debug? +#2=21 #spd1 +#3=7 #spd2 +#4=175 #TXspeed +#5=0 +#6=0 + +#Upload version +Ver2=[(c.encode('utf-8')[0]) for c in Ver] +print(len(Ver),Ver,Ver2) +V2=[0] +for i,v in enumerate(Ver2): + time.sleep(0.1) + I2C1server(ROM,[v],reg=R1+i,read=0) #select RCU +# I2C1server(ROM,[v],reg=None,read=0) #select RCU + time.sleep(0.1) + I2C1server(ROM,V2,reg=R1+i,read=1) #select RCU + print(i,v,V2) + +#Download version +Ver2=[0]*10 +I2C1server(ROM,Ver2,reg=R1,read=1) #select RCU +print(Ver2) diff --git a/pcctypes.py b/pcctypes.py index 1450ec4701ec6f76d6a96a1141b592e874666fc2..e25c0b7079abc39ed6a8de2022ce86cb04585801 100644 --- a/pcctypes.py +++ b/pcctypes.py @@ -46,6 +46,7 @@ class datatype(Enum): dInt = 0 dfloat = 1 dstring = 2 + dbool = 3 #Variable two device link Var2dev=namedtuple("Var2dev","name module type devreg width bitoffset Scale") diff --git a/pypcc2.py b/pypcc2.py index 7d7b53ec12842885482d182d89dd585a05290016..2774dfb80a6ef6a5208f7908fee785a4f5be74a0 100644 --- a/pypcc2.py +++ b/pypcc2.py @@ -14,6 +14,8 @@ import time import logging import argparse +NRCU=32 + parser = argparse.ArgumentParser() parser.add_argument("-s", "--simulator", help="Do not connect to I2c, but simulate behaviour.", action="store_true") parser.add_argument("-p", "--port", help="Port number to listen on [%(default)s].", type=int, default=4842) @@ -42,7 +44,7 @@ logging.info("OPC-UA Server started") SW1=I2Cswitch1.I2Cswitch1(I2C.I2C1server) -RCU=RCU.RCU1(32,I2C.I2C1server,SW1.SetChannel) +RCU=RCU.RCU1(NRCU,I2C.I2C1server,SW1.SetChannel) RCU.AddVars(Q1,opcuaserv.AddVarR,opcuaserv.AddVarW) RCU.AddMethod(Q1,opcuaserv.Addmethod) RCU.load() #Load current register values from HW @@ -75,7 +77,7 @@ def TimerThread(Q1,RCU): if Q1.qsize()>3: continue; cnt=0; logging.debug(str(("I2C bytes=",I2C.I2Ccounter," Qlength=",Q1.qsize()))) - RCU.Queue_Monitor(Q1) + RCU.Queue_Monitor(Q1,NRCU) logging.info("End Timer thread") diff --git a/rcu/HWconf.py b/rcu/HWconf.py index 8f9323da309bfa5e3fc21896738e93c3592e4240..38fa6597468691b490413f5a8086cecedb73977d 100644 --- a/rcu/HWconf.py +++ b/rcu/HWconf.py @@ -4,6 +4,8 @@ from pcctypes import * #Mid plane address #MPaddr=namedtuple("MPaddr","nI2C I2C nSwitch Switch"); RCU_MPaddr=MPaddr(1,[1],32,[0,1,2,3,4,5,6,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) +#RCU_MPaddr=MPaddr(1,[1],2,[0,1]) +#RCU_MPaddr=MPaddr(1,[1],1,[0]) #CLK_MPaddr=MPaddr(1,[1],1,[7]) #DevReg=namedtuple("DevReg","Addr Register_R Register_W store"); @@ -25,10 +27,10 @@ RCU_IO2_OUT2=DevReg(0x76,1,3,6) RCU_IO2_CONF1=DevReg(0x76,6,6,7) RCU_IO2_CONF2=DevReg(0x76,7,7,8) #Device: TCA6416 -RCU_IO3_OUT1=DevReg(0x20,0,2,9) -RCU_IO3_OUT2=DevReg(0x20,1,3,10) -RCU_IO3_CONF1=DevReg(0x20,6,6,11) -RCU_IO3_CONF2=DevReg(0x20,7,7,12) +RCU_IO3_OUT1=DevReg(0x2F,0,2,9) +RCU_IO3_OUT2=DevReg(0x2F,1,3,10) +RCU_IO3_CONF1=DevReg(0x2F,6,6,11) +RCU_IO3_CONF2=DevReg(0x2F,7,7,12) RCU_storeReg=13; #Number of stored registers @@ -40,9 +42,10 @@ RCU_AN_Ch2=DevReg(0x14,0xB180,-1,0) RCU_AN_Temp=DevReg(0x14,0xA0C0,-1,0) #HBA1 -RCU_HBA1=DevReg(0x41,0,0,1) -RCU_HBA2=DevReg(0x42,0,0,2) -RCU_HBA3=DevReg(0x43,0,0,3) +RCU_HBA1=DevReg(0x41,0x10,0x10,1) +RCU_HBA2=DevReg(0x42,0x10,0x10,2) +RCU_HBA3=DevReg(0x43,0x10,0x10,3) + RCU_ROM_ID =DevReg(0x50,0xfc,0xfc,0) #32 bit ID=4 bytes diff --git a/rcu/RCU.py b/rcu/RCU.py index 2c0511a932f9d4796f9cf18ec2c8d1a41ca56d9d..6f9fc17d0856d40755daaa16c526591bd2f7d55b 100644 --- a/rcu/RCU.py +++ b/rcu/RCU.py @@ -49,7 +49,8 @@ class RCU1(): self.N=number; self.I2Ccallback=I2Ccallback self.SWcallback=Switchcallback - self.previous=np.zeros([number,Vars.RCU_storeReg],dtype='int') + self.previous =np.zeros([number,Vars.RCU_storeReg],dtype='int') + self.previousHBA=np.zeros([number,3,32],dtype='int') def load(self): Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[]) #Read the current status of GPIO IOs @@ -79,13 +80,13 @@ class RCU1(): if Instr.type==Vars.DevType.Instr: #Execute instructions Iset=Instr.dev; - if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value + if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_value() for i in Iset.instr: logging.debug(str(("Inst",i))) self.SetVar(i,Mask=Mask) return; if Instr.type in [Vars.DevType.I2C,Vars.DevType.SPIbb,Vars.DevType.I2Cbb]: - if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value + if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_value() mask=0; RCU0=-1; for RCUi in range(self.N): @@ -111,15 +112,15 @@ class RCU1(): logging.error("Wrong size of value") return False if V1.Vars[0].type==Vars.DevType.Internal: - Instr.dev.OPCW.get_data_value().Value.Value=Instr.value + Instr.dev.OPCW.set_value(Instr.value) logging.debug("Update internal variable") return # if V1.Vars[0].type==Vars.DevType.Internal: return; Step=V1.nVars Step2=int(V1.size/V1.nVars) Mask=(Vars.RCU_mask if Step==1 else Vars.Ant_mask) - Mask=Mask.OPCW.get_data_value().Value.Value - value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(V1.OPCR.get_data_value().Value.Value) + Mask=Mask.OPCW.get_value() + value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(V1.OPCR.get_value()) if (len(value1)==V1.nVars) and (self.N>1): value1=(value1*self.N); if Instr.type==Vars.DevType.Var: logging.info(str(('** Set Var:',V1.name,value1))) @@ -132,11 +133,12 @@ class RCU1(): value2=value1[i0:i1] self.GetVarValue(RCUi,V1.Vars[Vari],value2) value1[i0:i1]=value2 - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) + if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type)) elif Instr.type==Vars.DevType.VarUpdate: self.GetVarValueAll(V1,value1) - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) +# if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) + if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type)) # V1.OPCR.get_data_value().Value.Value=value1 logging.info(str(('** Readback:',V1.name,value1))) @@ -146,6 +148,9 @@ class RCU1(): if var.type==Vars.DevType.I2C: self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) self.GetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) + elif var.type==Vars.DevType.HBA1: + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value) elif var.type==Vars.DevType.I2Cbb: logging.error("I2Cbb Implemented") elif var.type==Vars.DevType.SPIbb: @@ -179,6 +184,22 @@ class RCU1(): elif V1.Vars[0].type==Vars.DevType.SPIbb: self.GetBBValueAll(V1,value1,mask) # logging.info("SPIbb all not implemented yet") + elif V1.Vars[0].type==Vars.DevType.HBA1: + for Vari in range(Step): + var=V1.Vars[Vari] + for RCUi in range(self.N): + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) +# print(Step,Step2,len(value1),V1.size) + i0=(RCUi*Step+ Vari)*Step2 + i1=(RCUi*Step+(Vari+1))*Step2 + value2=value1[i0:i1] + self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value2) + value1[i0:i1]=value2 +# i0=(RCUi*Step+ Vari)*Step2+16 +# i1=(RCUi*Step+(Vari+1))*Step2 +# value2=value1[i0:i1] +# self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2) +# value1[i0:i1]=value2 else: logging.error("Type not implemented") # print(value1) @@ -213,6 +234,10 @@ class RCU1(): if var.type==Vars.DevType.I2C: self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) self.SetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) + elif var.type==Vars.DevType.HBA1: + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + self.SetHBA1I2C(RCUi,var.devreg,var.width,var.bitoffset,value) +# print("RCU1 Set",RCUi,var,value) elif var.type==Vars.DevType.I2Cbb: logging.error("I2Cbb Implemented") elif var.type==Vars.DevType.SPIbb: @@ -230,6 +255,20 @@ class RCU1(): if buffer: return True; return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W) + def SetHBA1I2C(self,RCUi,dev,width,bitoffset,value,buffer=False): +# if dev.store>0: + previous=self.previousHBA[RCUi,dev.store-1]; + L=len(value) + for i in range(L): + value[i]=ApplyMask(value[i],width,bitoffset,previous[i]); + self.previousHBA[RCUi,dev.store-1]=value +# if buffer: return True; + self.I2Ccallback(dev.Addr,value[:16],reg=dev.Register_W) + if L>16: self.I2Ccallback(dev.Addr,value[16:],reg=dev.Register_W+16) + self.I2Ccallback(dev.Addr,[500],reg=dev.Register_W,read=3) #Wait 500ms + return True +# return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W) + def GetI2Cbuffer(self,RCUi,dev,width,bitoffset,value): if not(dev.store>0): return False; value[0]=self.previous[RCUi,dev.store-1]; @@ -301,6 +340,20 @@ class RCU1(): #if (len(value)>1) and (width<8): print value return True; + def GetI2CHBA1(self,RCUi,dev,width,bitoffset,value): + #print(width,len(value)) + value2=value + reg=dev.Register_R + if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False; + if value2[0] is None: return False + value[:]=value2[:]; + if dev.store>0: + self.previousHBA[RCUi,dev.store-1]=value + for i in range(len(value)): + value[i]=UnMask(value[i],width,bitoffset) + return True; + + def start(self,Q1): def RCUthread(Q1): while True: @@ -314,12 +367,12 @@ class RCU1(): return RCUthread1 - def Queue_Monitor(self,Q1): - Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,32,[0]*32) - Q1.put(Inst1) + def Queue_Monitor(self,Q1,NRCU): + Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,NRCU,[0]*NRCU) + Q1.put(Inst1) # Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96) # Q1.put(Inst1) - + return def AddVars(self,Q1,AddVarR,AddVarW): for v in Vars.OPC_devvars: dim1=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars @@ -328,6 +381,7 @@ class RCU1(): #print(v.name,dim) varvalue2=0 if v.type==Vars.datatype.dInt: varvalue2=dim2*[0] + elif v.type==Vars.datatype.dbool: varvalue2=dim2*[False] elif v.type==Vars.datatype.dfloat: varvalue2=dim2*[0.0] elif v.type==Vars.datatype.dstring: varvalue2=dim1*[" "*dim3] print(len(varvalue2),varvalue2) diff --git a/rcu/Vars.py b/rcu/Vars.py index 32ad2346108388fea36cf617818049cca5989b64..5617ec07cd1f1519fd49d6fabb08a8724bab0824 100644 --- a/rcu/Vars.py +++ b/rcu/Vars.py @@ -21,11 +21,11 @@ RCU_temp1=Var2dev("RCU_temp1",RCUmod,DevType.I2C,RCU_AN_Temp ,23,0,4.21e-3) dummy=Var2dev("Dummy",RCUmod,DevType.Internal,None,8,0,1) -Ant_mask=VarArray("Ant_mask" ,3,[dummy,dummy,dummy] ,RW.WriteOnly,datatype.dInt,3,None,None) +Ant_mask=VarArray("Ant_mask" ,3,[dummy,dummy,dummy] ,RW.WriteOnly,datatype.dbool,3,None,None) RCU_att =VarArray("RCU_attenuator" ,3,[RCU_att1 ,RCU_att2 ,RCU_att3] ,RW.ReadWrite,datatype.dInt,3,None,None) RCU_band=VarArray("RCU_band" ,3,[RCU_band1,RCU_band2,RCU_band3],RW.ReadWrite,datatype.dInt,3,None,None) -RCU_mask=VarArray("RCU_mask" ,1,[dummy] ,RW.WriteOnly,datatype.dInt ,1,None,None) +RCU_mask=VarArray("RCU_mask" ,1,[dummy] ,RW.WriteOnly,datatype.dbool ,1,None,None) RCU_temp=VarArray("RCU_temperature",1,[RCU_temp1],RW.ReadOnly ,datatype.dfloat,1,None,None) RCU_pwrd=VarArray("RCU_Pwr_dig" ,1,[RCU_pwrd1],RW.ReadOnly ,datatype.dInt ,1,None,None) RCU_LED =VarArray("RCU_LED0" ,1,[RCU_led0] ,RW.ReadWrite,datatype.dInt ,1,None,None) @@ -36,13 +36,13 @@ RCU_Dth1_freq=Var2dev("RCU_dth1_freq",RCUmod,DevType.I2Cbb,RCU_Dth1_Freq,32,0,1e RCU_dth_freq=VarArray("RCU_dither_freq",3,[RCU_Dth1_freq,RCU_Dth2_freq,RCU_Dth3_freq],RW.ReadWrite,datatype.dfloat,3,None,None) HBA1_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,5,2,1) -HBA1_Pwr =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,1,1,1) +HBA1_led =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,1,0,1) HBA2_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,5,2,1) -HBA2_Pwr =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,1,1,1) +HBA2_led =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,1,0,1) HBA3_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,5,2,1) -HBA3_Pwr =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,1,1,1) -HBA1_Delay=VarArray("HBA_element_beamformer_delays",3,[HBA1_Delay,HBA2_Delay,HBA3_Delay],RW.ReadWrite,datatype.dInt,96,None,None) -HBA1_Pwr =VarArray("HBA_element_pwr" ,3,[HBA1_Pwr ,HBA2_Pwr ,HBA3_Pwr ],RW.ReadWrite,datatype.dInt,96,None,None) +HBA3_led =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,1,0,1) +HBA_Delay=VarArray("HBA_element_beamformer_delays",3,[HBA1_Delay,HBA2_Delay,HBA3_Delay],RW.ReadWrite,datatype.dInt,96,None,None) +HBA_led =VarArray("HBA_element_led" ,3,[HBA1_led ,HBA2_led ,HBA3_led ],RW.ReadWrite,datatype.dInt,96,None,None) #RCU_ID0=Var2dev("",RCUmod,DevType.I2C,RCU_ROM,8,0,1) #RCU_ID=VarArray("RCU_ID",1,[RCU_ID0],RW.ReadOnly,datatype.dInt,4,None,None) @@ -53,6 +53,14 @@ RCU_Ver0=Var2dev("",RCUmod,DevType.I2C,RCU_ROM_Ver,7,0,1) RCU_VER=VarArray("RCU_version",1,[RCU_Ver0],RW.ReadOnly,datatype.dstring,10,None,None) +RCU_uCV_ID =VarArray("uC_ID " ,1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,0,0,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) +RCU_uCV_spd0 =VarArray("uC_spd0" ,1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,1,1,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) +RCU_uCV_debug =VarArray("uC_debug" ,1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,2,2,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) +RCU_uCV_RXspd1=VarArray("uC_RXspd1",1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,3,3,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) +RCU_uCV_RXspd2=VarArray("uC_RXspd2",1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,4,4,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) +RCU_uCV_TXspd1=VarArray("uC_TXspd1",1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,6,6,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) + + RCU_ADC1_lock=Var2dev("RCU_ADC1_lock",RCUmod,DevType.SPIbb,RCU_ADC1_PLL_stat,8,0,1) RCU_ADC2_lock=Var2dev("RCU_ADC2_lock",RCUmod,DevType.SPIbb,RCU_ADC2_PLL_stat,8,0,1) RCU_ADC3_lock=Var2dev("RCU_ADC3_lock",RCUmod,DevType.SPIbb,RCU_ADC3_PLL_stat,8,0,1) @@ -95,15 +103,8 @@ RCU_OUT2=VarArray("RCU_OUT2",3,[RCU_IO1_2,RCU_IO2_2,RCU_IO3_2],RW.ReadOnly,datat #RCU_CNF1=VarArray("RCU_CONF1",3,[RCU_IO1_3,RCU_IO2_3,RCU_IO3_3],RW.ReadOnly,datatype.dInt,None,None) #RCU_CNF2=VarArray("RCU_CONF2",3,[RCU_IO1_4,RCU_IO2_4,RCU_IO3_4],RW.ReadOnly,datatype.dInt,None,None) - - -OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_ADC_lock,RCU_ADC_SYNC,RCU_ADC_JESD,RCU_ADC_CML,RCU_OUT1,RCU_OUT2,RCU_ID,RCU_VER]#,HBA1_Delay,HBA1_Pwr]#,RCU_CNF1,RCU_CNF2] - - - - - - +OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_ADC_lock,RCU_ADC_SYNC,RCU_ADC_JESD,RCU_ADC_CML,RCU_OUT1,RCU_OUT2,RCU_ID,RCU_VER,HBA_Delay,HBA_led] +#OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_uCV_ID,RCU_uCV_spd0,RCU_uCV_RXspd1,RCU_uCV_RXspd2,RCU_uCV_TXspd1,RCU_uCV_debug ]#,HBA1_Pwr]#,RCU_CNF1,RCU_CNF2] #Instr=namedtuple("DevInstr","type dev nvalue value") #Instrs=namedtuple("Instr","name ninstr instr")