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

CLK update

parent e1cbbdbc
No related branches found
No related tags found
1 merge request!11Pypcc2
......@@ -6,40 +6,29 @@ drivers:
type: i2c
parameters: [1] #I2C port number
- name: I2C_CLK
type: i2c_array #I2C devices
type: i2c_dev #I2C devices
parent: I2C
parameters: [0,0] #number of RCUs
- name: SPIbb1
type: spibitbang2 #SPI bitbang via GPIO expander: CLK, SDI,SDO,CS
parent: I2C_CLK
devreg: [IO3.GPIO1,IO3.GPIO1,IO3.GPIO1,IO3.GPIO1]
devreg: [IO1.GPIO1,IO1.GPIO1,IO1.GPIO1,IO1.GPIO1]
parameters: [4,7,5,6]
#This is the I2C devices in the RCU
device_registers:
- name: IO
dim: 3
- name: IO1
description: IO-Expander
address: 0x20
device: TCA9539/TCA6416?
driver: I2C_CLK
registers:
- name: CONF1
description: Direction of port1
address: 6
store: True
- name: CONF2
description: Direction of port2
address: 7
store: True
- name: GPIO1
description: Input/Ouput port 1
address: [0,2] #Read / Write address different
store: True
- name: GPIO2
description: Input/Ouput port 2
address: [1,3]
store: True
- name: PLL
driver: SPIbb1
......@@ -47,14 +36,95 @@ device_registers:
- name: PLL_stat
description: PLL locked status
address: 0x0
- {name: r3, address: 0x03}
- {name: r5, address: 0x05}
- {name: r6, address: 0x06}
variables:
- name: CLK_IGNORE
description: Only masked RF chains are updated
- name: CLK_I2C_STATUS
driver: I2C_CLK
rw: variable #server RW variable, not linked to IO
dtype: boolean
debug: True
- name: CLK_Enable_PWR
description: Power enabled
rw: ro
dtype: boolean
driver: I2C_CLK
devreg: IO1.GPIO1
bitoffset: 1
width: 1
- name: CLK_PLL_locked
description: First status pin give lock status
rw: ro
dtype: boolean
monitor: true
driver: I2C_CLK
devreg: IO1.GPIO1
bitoffset: 2
width: 1
- name: CLK_PLL_error
description: Second status pin give error
rw: ro
dtype: boolean
driver: I2C_CLK
devreg: IO1.GPIO1
bitoffset: 3
width: 1
- name: CLK_PLL_locked_SPI
description: 0x81=locked
driver: I2C_CLK
devreg: PLL.PLL_stat
width: 8
rw: ro
dtype: uint8
debug: True
- name: [CLK_PLL_r3,CLK_PLL_r5,CLK_PLL_r6]
driver: I2C_CLK
devreg: [PLL.r3,PLL.r5,PLL.r6]
width: 8
rw: ro
dtype: uint8
debug: True
methods:
- name: CLK_on
driver: I2C_CLK
instructions:
- IO1.CONF1: 0x2C #0010 1100 PPS/PWR output, SCLK,CS,SDI
- IO1.GPIO1: 0x42 #0100 0010 high:PWR enable, CS
- CLK_Enable_PWR: Update
# - WAIT: 100 #ms to wait before checking lock
# - CLK_PLL_setup: 0
# - WAIT: 100 #ms to wait before checking lock
# - CLK_PLL_locked: Update
- name: CLK_PLL_setup
driver: I2C_CLK
instructions:
# - PLL.0x03: 0x08 #Set power, this is default
- PLL.0x05: 0x17 #was 97, set lock time
- PLL.0x06: 0x10
- PLL.0x07: 0x04 #Stop R divider
- PLL.0x08: 0x01 #Set R divider
- PLL.0x07: 0x00 #Start R divider
- PLL.0x09: 0x10 #Stop N divider
- PLL.0x0A: 0x14 #Set N divider=20, 200MHz/20=10MHz = input clock
- PLL.0x09: 0x00 #Start N divider
- PLL.0x0D: 0x01 #Divider output 1=1
- PLL.0x0F: 0x01 #Divider output 2=1
- PLL.0x11: 0x01 #Divider output 3=1
- PLL.0x13: 0x01 #Divider output 4=1
......@@ -3,87 +3,17 @@ import logging
from .spibitbang1 import spibitbang1
from queuetypes import *
from .hwdev import hwdev
def ApplyMask(value,width=8,bitoffset=0,previous=0):
mask=(1<<width)-1
if bitoffset>0:
value<<=bitoffset;
mask<<=bitoffset;
return (value & mask) + (previous - (previous & mask));
def UnMask(value,width=8,bitoffset=0):
mask=(1<<width)-1
if bitoffset>0:
value>>=bitoffset;
value=value&mask;
return value;
def int2bytes(i):
b=[];
while i>255:
b=[i%256]+b;
i>>=8;
return [i]+b;
def GetField(D,name,dev_number,default=None):
X=D.get(name,default)
return X[dev_number] if isinstance(X,list) else X;
def Find(L,name,value):
for x in L:
if x[name]==value:
return x;
return False;
class AttrDict(dict):
def __init__(self,*args,**kwargs):
super(AttrDict,self).__init__(*args,**kwargs)
self.__dict__=self
def DevRegList(D):
#todo only count the drivers registers!!
for i,dev in enumerate(D.drivers):
dev['drv_id']=i;
devreglist={}
store=0;
for dev in D.device_registers:
N=dev.get('dim',1)
name=dev['name']
for n in range(N):
addr=GetField(dev,'address',n,0)
devtype=GetField(dev,'driver',n)
# print(addr,devtype)
devid=0;
if devtype:
devid=Find(D.drivers,'name',devtype)['drv_id']
devtype=Find(D.drivers,'name',devtype)['type']
else: devtype=0;
if N>1: name2=name+str(n+1)
else: name2=name;
for reg in dev['registers']:
regR=GetField(reg,'address',0,0)
regW=GetField(reg,'address',1,0)
if reg.get('store',False):
store+=1;
storex=store
else:
storex=0
# hf.write("const devreg %s {%i,%i,%i,%i,%i};\n" % (name2+'_'+reg['name'],addr,regR,regW,storex,devtype) )
devregname=name2+'.'+reg['name'];
devreglist[devregname]=AttrDict({"Addr":addr,"Register_R":regR,"Register_W":regW,"store":storex,"devtype":devtype,"devid":devid});
# print(devregname,devreglist[devregname]);
# hf.write("inline const t_devreg %s {.address=%i,.register_R=%i,.register_W=%i,.store=%i,.driver=%i};\n" % (devregname,addr,regR,regW,storex,devtype) )
#hf.write("#define NumberStoreReg %i"%store)
# print(devreglist)
return devreglist,store
from .i2c_dev import *
def GetSteps(V1):
if isinstance(V1['devreg'],list): Step=len(V1['devreg'])
else: Step=1; #V1.nVars
Step2=V1['dim']*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars)
Step2=V1.get('dim',1)*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars)
logging.debug(str(("GetStep",Step,Step2)));
return Step,Step2
class i2c_array(hwdev):
class i2c_array(i2c_dev):
def __init__(self,config):
hwdev.__init__(self,config);
# self.Qout=Qout;
......@@ -98,57 +28,10 @@ class i2c_array(hwdev):
# print("Init",config['name'],'len=',len(self.RCU_Switch1),' stored reg=',RCU_storeReg)
# self.previous =np.zeros([self.N,RCU_storeReg],dtype='int')
def load(self):
print("TODO: load")
#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[]) #Read the current status of GPIO IOs
#self.SetVar(Inst1)
#Vars.RCU_mask.OPCW.get_data_value().Value.Value=[1,1,0,0]
#Vars.Ant_mask.OPCW.get_data_value().Value.Value=[1,1,0,0,0,0,0,0,0,0,1,0]
#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[]) #Read the current status of GPIO IOs
#RCU.SetVar(Inst1)
#Inst1=Vars.Instr(Vars.DevType.Var,Vars.RCU_att,12,[0,1,2,3,4,5,6,7,8,9,11])
#RCU.SetVar(Inst1)
#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_off,0,[])
#RCU.SetVar(Inst1)
#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_on,0,[])
#RCU.SetVar(Inst1)
#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.ADC1_on,0,[])
#RCU.SetVar(Inst1)
#print(Vars.RCU)
def OPCUASetVariable(self,varid,var1,data,mask):
if var1['rw']=='variable': return;
logging.info(str(("Set Var",var1['name'],data,mask)))
data,mask2=self.SetGetVarValueMask(var1,data,mask);
# if len(mask)==len(mask2): mask[:]=mask2[:];
# elif len(mask)==0: (mask.append(x) for x in mask2);
Data=OPCUAset(varid,InstType.varSet,data,mask2)
return [Data]
def OPCUAReadVariable(self,varid,var1,mask):
logging.info(str(("Read Var",var1['name'],mask)))
if len(mask)==0: mask=[True]*self.N;
#data=self.GetVarValueAll(var1)
#else:
data,mask2=self.GetVarValueMask(var1,mask);
# if len(mask)==len(mask2): mask[:]=mask2[:];
# elif len(mask)==0: (mask.append(x) for x in mask2);
Data=OPCUAset(varid,InstType.varSet,data,mask2)
return [Data]
# def OPCUAcallMethod(self,var1,data,mask):
# print("Call Method",var1)
return i2c_dev.OPCUAReadVariable(self,varid,var1,mask)
def i2csetget(self,*args,**kwargs):
return self.conf['parentcls'].i2csetget(*args,**kwargs)
def SetSwitch(self,RCUi):
self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]);
def SetSwitchMask(self,mask):
m=0;
......@@ -244,19 +127,15 @@ class i2c_array(hwdev):
def SetVarValue(self,devreg,width,bitoffset,value):
if devreg['register_W']==-1: return True; #We can not set it, only read it e.g. temperature
#logging.debug(str(("RCU1 Set ",self.RCUi,devreg['addr'],value)))
logging.debug(str(("RCU1 Set ",self.RCUi,devreg['addr'],value)))
#self.parentcls.SetChannel(1<<RCU_Switch[RCUi]);
if devreg['store']:
storearray=self.getstorearray(devreg,len(value));
storearray=self.getstorearray(devreg);
previous=storearray[self.RCUi];
if (len(value)>1) and (isinstance(previous,list)) and (len(previous)==len(value)):
for x in range(len(value)):
value[x]=ApplyMask(value[x],width,bitoffset,previous[x]);
storearray[self.RCUi]=value[:]
else:
value[0]=ApplyMask(value[0],width,bitoffset,previous);
value[x]=ApplyMask(value[x],width,bitoffset,previous);
storearray[self.RCUi]=value[0]
logging.debug(str(("Stored value:",value,"previous",previous)))
logging.debug("Stored value:"+str(value[0]))
# devreg['drivercls'].i2csetget
return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W'])
......@@ -281,9 +160,6 @@ class i2c_array(hwdev):
value[:]=value2[:];
if devreg['store']:
storearray=self.getstorearray(devreg,len(value));
if len(value)==1:
storearray[self.RCUi]=value[0]
else:
storearray[self.RCUi]=value[:]
logging.debug(str(("Store buffer",self.RCUi,value[0])))
# print("Stored values:",self.getstorearray(devreg))
......
import numpy as np
import logging
from .spibitbang1 import spibitbang1
from queuetypes import *
from .hwdev import hwdev
def ApplyMask(value,width=8,bitoffset=0,previous=0):
mask=(1<<width)-1
if bitoffset>0:
value<<=bitoffset;
mask<<=bitoffset;
return (value & mask) + (previous - (previous & mask));
def UnMask(value,width=8,bitoffset=0):
mask=(1<<width)-1
if bitoffset>0:
value>>=bitoffset;
value=value&mask;
return value;
def int2bytes(i):
b=[];
while i>255:
b=[i%256]+b;
i>>=8;
return [i]+b;
def GetField(D,name,dev_number,default=None):
X=D.get(name,default)
return X[dev_number] if isinstance(X,list) else X;
def Find(L,name,value):
for x in L:
if x[name]==value:
return x;
return False;
class AttrDict(dict):
def __init__(self,*args,**kwargs):
super(AttrDict,self).__init__(*args,**kwargs)
self.__dict__=self
def DevRegList(D):
#todo only count the drivers registers!!
for i,dev in enumerate(D.drivers):
dev['drv_id']=i;
devreglist={}
store=0;
for dev in D.device_registers:
N=dev.get('dim',1)
name=dev['name']
for n in range(N):
addr=GetField(dev,'address',n,0)
devtype=GetField(dev,'driver',n)
# print(addr,devtype)
devid=0;
if devtype:
devid=Find(D.drivers,'name',devtype)['drv_id']
devtype=Find(D.drivers,'name',devtype)['type']
else: devtype=0;
if N>1: name2=name+str(n+1)
else: name2=name;
for reg in dev['registers']:
regR=GetField(reg,'address',0,0)
regW=GetField(reg,'address',1,0)
if reg.get('store',False):
store+=1;
storex=store
else:
storex=0
# hf.write("const devreg %s {%i,%i,%i,%i,%i};\n" % (name2+'_'+reg['name'],addr,regR,regW,storex,devtype) )
devregname=name2+'.'+reg['name'];
devreglist[devregname]=AttrDict({"Addr":addr,"Register_R":regR,"Register_W":regW,"store":storex,"devtype":devtype,"devid":devid});
# print(devregname,devreglist[devregname]);
# hf.write("inline const t_devreg %s {.address=%i,.register_R=%i,.register_W=%i,.store=%i,.driver=%i};\n" % (devregname,addr,regR,regW,storex,devtype) )
#hf.write("#define NumberStoreReg %i"%store)
# print(devreglist)
return devreglist,store
def GetSteps(V1):
if isinstance(V1['devreg'],list): Step=len(V1['devreg'])
else: Step=1; #V1.nVars
Step2=V1.get('dim',1)*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars)
logging.debug(str(("GetStep",Step,Step2)));
return Step,Step2
class i2c_dev(hwdev):
def __init__(self,config):
hwdev.__init__(self,config);
def OPCUASetVariable(self,varid,var1,data,mask):
if var1['rw']=='variable': return;
logging.info(str(("Set Var",var1['name'],data,mask)))
data,mask2=self.SetGetVarValueMask(var1,data,mask);
# if len(mask)==len(mask2): mask[:]=mask2[:];
# elif len(mask)==0: (mask.append(x) for x in mask2);
Data=OPCUAset(varid,InstType.varSet,data,mask2)
return [Data]
def OPCUAReadVariable(self,varid,var1,mask):
logging.info(str(("Read Var",var1['name'],mask)))
#data=self.GetVarValueAll(var1)
#else:
data,mask2=self.GetVarValueMask(var1,mask);
# if len(mask)==len(mask2): mask[:]=mask2[:];
# elif len(mask)==0: (mask.append(x) for x in mask2);
Data=OPCUAset(varid,InstType.varSet,data,mask2)
return [Data]
# def OPCUAcallMethod(self,var1,data,mask):
# print("Call Method",var1)
def i2csetget(self,*args,**kwargs):
self.conf['parentcls'].i2csetget(*args,**kwargs)
def SetSwitch(self,RCUi):
self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]);
def SetGetVarValueMask(self,var1,data,mask):
Step=(len(var1['devreg']) if isinstance(var1['devreg'],list) else 1)
value1=[0]*Step
if not(len(data)==Step):
print("Check data length!");
return;
if (len(mask)==1):
mask=[mask[0] for x in range(Step)]
if (len(mask)==0):
mask=[True for x in range(Step)]
if not(len(mask)==Step):
print("Check mask length!");
return;
for Vari in range(Step):
if not(mask[Vari]): continue
i0=(Vari)*Step
i1=(Vari+1)*Step
devreg=var1['devreg'][Vari];
width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0)
mask[Vari]=self.SetVarValue(devreg,width,bitoffset,data[i0:i1])
if not(mask[Vari]): continue
value2=value1[i0:i1]
mask[Vari]=self.GetVarValue(devreg,width,bitoffset,value2)
value1[i0:i1]=value2
return value1,mask
def GetVarValueMask(self,var1,mask):
Step=(len(var1['devreg']) if isinstance(var1['devreg'],list) else 1)
value1=[0]*Step;
if (len(mask)==1):
mask=[mask[0] for x in range(Step)]
if (len(mask)==0):
mask=[True for x in range(Step)]
if not(len(mask)==Step):
print("Check mask length!");
return;
for Vari in range(Step):
if not(mask[Vari]): continue
i0=( Vari)*Step
i1=(Vari+1)*Step
devreg=var1['devreg'][Vari];
width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0)
value2=value1[i0:i1]
mask[Vari]=self.GetVarValue(devreg,width,bitoffset,value2)
value1[i0:i1]=value2
return value1,mask
def getstoreval(self,devreg):
storeval=devreg.get('storeval')
if not(storeval):
devreg['storeval']=0;
storeval=devreg.get('storeval');
return storeval;
def Setdevreg(self,devreg,value,mask=[]):
# if devreg.get('store'): logging.debug("Stored")
# print(devreg['store'])
if devreg.get('store'):
devreg['storeval']=value[0];
self.SetVarValue(devreg,8,0,value)
return True;
def SetVarValue(self,devreg,width,bitoffset,value):
if devreg['register_W']==-1: return True; #We can not set it, only read it e.g. temperature
logging.debug(str(("I2C Set ",devreg['addr'],value)))
#self.parentcls.SetChannel(1<<RCU_Switch[RCUi]);
if devreg['store']:
previous=self.getstoreval(devreg);
for x in range(len(value)):
value[x]=ApplyMask(value[x],width,bitoffset,previous);
devreg['storeval']=value[0];
logging.debug("Stored value:"+str(value[0]))
# devreg['drivercls'].i2csetget
return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W'])
def GetVarValue(self,devreg,width,bitoffset,value):
logging.debug(str(("RCU1 Get ",devreg['addr'],value)))
callback=devreg['drivercls'].i2csetget;
value2=value
reg=devreg['register_R']
if not(callback(devreg['addr'],value2,reg=reg,read=1)): return False;
if value2[0] is None: return False
value[:]=value2[:];
if devreg['store']:
devreg['storeval']=value[0];
l1=int(np.floor((width+bitoffset+7)/8))
if (width!=l1*8) or (bitoffset>0):
if (width<8):
for i in range(len(value)):
value[i]=UnMask(value[i],width,bitoffset)
else:
value[0]=UnMask(value[0],width-(l1-1)*8,bitoffset)
else: value[0]=value2[0]
return True;
from enum import Enum
import logging
import numpy as np
from .hwdev import hwdev
class SPIBB_pins(Enum):
CLK = 0
......@@ -8,64 +9,74 @@ class SPIBB_pins(Enum):
SDO = 2
CS = 3
def SetSPIbb(SetI2C,RCUi,dev,value):
ADC_address=dev.Register_W
CSdev=dev.Addr.devs[SPIBB_pins.CS.value]
CSpin=dev.Addr.pins[SPIBB_pins.CS.value]
SDOdev=dev.Addr.devs[SPIBB_pins.SDO.value]
SDOpin=dev.Addr.pins[SPIBB_pins.SDO.value]
SDIdev=dev.Addr.devs[SPIBB_pins.SDI.value]
SDIpin=dev.Addr.pins[SPIBB_pins.SDI.value]
CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value]
CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value]
logging.info(str(("SPIbb set",ADC_address,value)))
class spibitbang2(hwdev):
def __init__(self,config):
hwdev.__init__(self,config)
# dev_rw = 0x00 # 0 for write, 1 for read
# data2 = ( reg_address << 9 ) + ( dev_rw << 8 ) + value[0]
data2 = ( ADC_address << 9 ) + value[0]
def i2csetget(self,addr,data,reg=None,read=0):
if read==0: return self.SetSPIbb(reg,data)
elif read==1: return self.GetSPIbb(reg,data)
else: logging.warn("Not implemented!")
return False;
def SetSPIbb(self,address,value):
CSdev=self.conf['devreg'][SPIBB_pins.CS.value]
CSpin=self.conf['parameters'][SPIBB_pins.CS.value]
SDIdev=self.conf['devreg'][SPIBB_pins.SDI.value]
SDIpin=self.conf['parameters'][SPIBB_pins.SDI.value]
CLKdev=self.conf['devreg'][SPIBB_pins.CLK.value]
CLKpin=self.conf['parameters'][SPIBB_pins.CLK.value]
logging.info(str(("SPIbb2 set",address,value)))
data2 = ( address << 9 ) + value[0]
SetI2C=self.conf['parentcls'].SetVarValue
bit_array = "{0:{fill}16b}".format(data2, fill='0')
# print(bit_array)
SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
SetI2C(CSdev,1,CSpin,[1]) #disable
SetI2C(CSdev,1,CSpin,[0]) #enable
for bit in bit_array:
SetI2C(RCUi,CLKdev,1,CLKpin,[0])
SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)])
SetI2C(RCUi,CLKdev,1,CLKpin,[1])
SetI2C(RCUi,CLKdev,1,CLKpin,[0])#Why?
SetI2C(RCUi,CLKdev,1,CLKpin,[1])
SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(SDIdev,1,SDIpin,[int(bit)])
SetI2C(CLKdev,1,CLKpin,[1])
SetI2C(CLKdev,1,CLKpin,[0])#Why?
SetI2C(CLKdev,1,CLKpin,[1])
SetI2C(CSdev,1,CSpin,[1]) #disable
# SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished
return True;
def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value):
ADC_reg_address=dev.Register_R
CSdev=dev.Addr.devs[SPIBB_pins.CS.value]
CSpin=dev.Addr.pins[SPIBB_pins.CS.value]
SDOdev=dev.Addr.devs[SPIBB_pins.SDO.value]
SDOpin=dev.Addr.pins[SPIBB_pins.SDO.value]
SDIdev=dev.Addr.devs[SPIBB_pins.SDI.value]
SDIpin=dev.Addr.pins[SPIBB_pins.SDI.value]
CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value]
CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value]
logging.info(str(("SPIbb get",ADC_reg_address)))
def GetSPIbb(self,reg_address,value):
CSdev=self.conf['devreg'][SPIBB_pins.CS.value]
CSpin=self.conf['parameters'][SPIBB_pins.CS.value]
SDOdev=self.conf['devreg'][SPIBB_pins.SDO.value]
SDOpin=self.conf['parameters'][SPIBB_pins.SDO.value]
SDIdev=self.conf['devreg'][SPIBB_pins.SDI.value]
SDIpin=self.conf['parameters'][SPIBB_pins.SDI.value]
CLKdev=self.conf['devreg'][SPIBB_pins.CLK.value]
CLKpin=self.conf['parameters'][SPIBB_pins.CLK.value]
logging.info(str(("SPIbb2 get",reg_address)))
SetI2C=self.conf['parentcls'].SetVarValue
GetI2C=self.conf['parentcls'].GetVarValue
ADC_bytes = 0x00
# ADC_rw = 0x01 # 0 for write, 1 for read
data = (ADC_reg_address << 1) + 1 #was 7??
data = (reg_address << 1) + 1 #was 7??
SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
SetI2C(CSdev,1,CSpin,[1]) #disable
SetI2C(CSdev,1,CSpin,[0]) #enable
bit_array = "{0:{fill}8b}".format(data, fill='0')
for bit in bit_array:
SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)])
SetI2C(RCUi,CLKdev,1,CLKpin,[0])
SetI2C(RCUi,CLKdev,1,CLKpin,[1])
SetI2C(SDIdev,1,SDIpin,[int(bit)])
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(CLKdev,1,CLKpin,[1])
# SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished
# print("read byte")
a=[0]
......@@ -73,12 +84,12 @@ def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value):
ret_value=[0]
for i in range(N): value[i]=0
for cnt in range(8*(ADC_bytes+1)):
SetI2C(RCUi,CLKdev,1,CLKpin,[0])
SetI2C(RCUi,CLKdev,1,CLKpin,[1]) #read after rising
GetI2C(RCUi,SDOdev,1,SDOpin,ret_value)
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(CLKdev,1,CLKpin,[1]) #read after rising
GetI2C(SDOdev,1,SDOpin,ret_value)
for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
SetI2C(RCUi,CLKdev,1,CLKpin,[0])
SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(CSdev,1,CSpin,[1]) #disable
return True;
......@@ -59,7 +59,7 @@ def AddVar(name,value):
def AddVarR(vname,varvalue2,v,debug):
obj=(DEBUGobj if debug else PCCobj)
myvar = obj.add_variable(idx, vname, varvalue2)
logging.info(str(("Variable added: ",vname,len(varvalue2))))
logging.info(str(("Variable added: ",vname,(len(varvalue2) if isinstance(varvalue2,list) else ''))))
Vars_R[myvar.nodeid.Identifier]=[vname,myvar.get_data_value(),varvalue2,v]
return myvar
......
......@@ -41,6 +41,7 @@ class yamlreader(yamlconfig):
elif datatype=='double': varvalue2=dim1*[0.0]
elif datatype=='boolean': varvalue2=dim1*[False]
elif datatype=='string': varvalue2=dim1*[""]
if len(varvalue2)==1: varvalue2=varvalue2[0];
# print(len(varvalue2),varvalue2)
if v.get('rw') in ['ro','rw']:
var1=AddVarR(name+"_R",varvalue2,v['id'],v.get('debug'))
......@@ -93,6 +94,7 @@ class yamlreader(yamlconfig):
# print("M2:",mask)
dtype=v.get('dtype','integer');
width=(v.get('width',8)-1)//8+1
if not(isinstance(data,list)): data=[data];
if (dtype=="double"):
scale=v.get('scale',1.)
data=[int(d/scale) for d in data]
......@@ -181,6 +183,7 @@ class yamlreader(yamlconfig):
if mask[i//step]: data3[i]=data2[i]
else:
data3=data2;
if len(data3)==1: data3=data3[0];
logging.info(str(("OPCset",v['name'],data3)))
v['OPCR'].set_value(data3);
......
......@@ -11,7 +11,7 @@ import sys
import signal
from yamlconfig import Find;
logging.basicConfig(level="INFO",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
logging.basicConfig(level="DEBUG",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
RunTimer=True;
#def signal_handler(sig, frame):
......@@ -32,29 +32,16 @@ I2Cclients.append(RCU_I2C)
#Load yaml so that we know the variable names
RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name)
if True:
var1=RCU_conf.getvarid('RCU_LED0');
N=32;
mask=[i<2 for i in range(N)];
data=[0]*N;
elif True:
var1=RCU_conf.getvarid('RCU_attenuator');
N=32*3;
mask=[i<6 for i in range(N)];
data=[10]*N;
data[:6]=[0,1,2,3,4,5]
#print(var1)
print("mask=",mask);
print("data=",data);
RCU_I2C.setvar(var1,data,mask);
#def setvar(self,id1,data=[],mask=[]):
var1=RCU_conf.getvarid('CLK_PLL_locked_SPI')
var1=RCU_conf.getvarid('CLK_PLL_r3')
RCU_I2C.readvar(var1,[])
var1=RCU_conf.getmethodid('RCU_on');
N=32;
mask=[i<2 for i in range(N)];
RCU_I2C.callmethod(var1,mask)
#var1=RCU_conf.getmethodid('CLK_on');
var1=RCU_conf.getmethodid('CLK_PLL_setup');
#RCU_I2C.callmethod(var1,[])
time.sleep(2);
while RCU_I2C.data_waiting():
......
......@@ -67,19 +67,31 @@ class yamlconfig():
N-=1;
def getdevreg(self,name):
try:
# try:
dr=self.devreglist.get(name);
if dr: return dr;
if isinstance(name,int): return {"addr":name}
name2=name.split('.')
# print(name2,str2int(name2[0]),str2int(name2[1]))
logging.debug("New devreg!")
logging.debug("New devreg! %s",str((name2)))
if len(name2)==2:
return {"addr":str2int(name2[0]),"register_R":str2int(name2[1]),"register_W":str2int(name2[1])}
logging.error("Can not find device register "+str(name));
except:
dev1=Find(self.conf['device_registers'],'name',name2[0])
if dev1:
store=dev1.get('store',False)
devcls=dev1.get('driver');
if not(devcls): logging.error("Can not find driver for register "+name2[0]);
else:
devcls=Find(self.conf['drivers'],'name',devcls)
if not(devcls): logging.error("Can not find device for register "+name2[0]);
else:
devcls=devcls.get('obj')
# print(dev1)
return {"addr":dev1.get('address',0),"register_R":str2int(name2[1]),"register_W":str2int(name2[1]),"store":store,"drivercls":devcls};
else: return {"addr":str2int(name2[0]),"register_R":str2int(name2[1]),"register_W":str2int(name2[1])}
logging.error("Can not find device register "+str(name));
return None;
# except:
# logging.error("Can not find device register "+str(name));
# return None;
def linkdevices(self):
#replace devreg reference with (pointer to) devreg dict
devreglist={}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment