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

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
from hwdev import hwdev;
import numpy as np
def Find(L,name,value):
for x in L:
if x[name]==value:
return x;
return False;
def GetField(D,name,dev_number):
X=D.get(name)
return X[dev_number] if isinstance(X,list) else X;
def bytes2int(bts):
x=0;
for b in bts:
x=x*256+b;
return x;
def int2bytes(i):
b=[];
while i>255:
b=[i%256]+b;
i>>=8;
return [i]+b;
def I2CName2pin(s):
dev,reg,pin=s.split('.')
return dev,reg,int(pin)
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;
class I2Cdevices(hwdev):
def GetVarValues(names,value,I2Ccallback):
return True
def CallMethod(self,name,params,I2Ccallback):
# print("RCU1 call method",name)
for Mth in self.D['Methods']:
if Mth['method_name']==name:
print("RCU1 Run method",name)
for regs in Mth['registers']:
for key,value in regs.items():
self.SetVarValue(key,value,I2Ccallback)
return True
return hwdev.CallMethod(self,name,params,I2Ccallback)
def SetChildValue(self,D,child,name,value,I2Ccallback):
Pins={}
for p in D['child_GPIO']:
for key,regvalue in p.items():
Pins[key]=I2CName2pin(regvalue)
def SetGetPin(pin,value,Get=False):
Pin=Pins[pin]
if not(Get): return self.I2CSet(Pin[0],Pin[1],[value],I2Ccallback,1,Pin[2])
a=[0]
self.I2CGet(Pin[0],Pin[1],a,I2Ccallback,1,Pin[2])
return a[0];
return child.SetVarValue(name,value,SetGetPin)
def GetChildValue(self,D,child,name,value,I2Ccallback):
Pins={}
for p in D['child_GPIO']:
for key,regvalue in p.items():
Pins[key]=I2CName2pin(regvalue)
def SetGetPin(pin,value,Get=False):
Pin=Pins[pin]
if not(Get): return self.I2CSet(Pin[0],Pin[1],[value],I2Ccallback,1,Pin[2])
a=[0]
self.I2CGet(Pin[0],Pin[1],a,I2Ccallback,1,Pin[2])
return a[0];
print("Set Child",child)
return child.GetVarValue(name,value,SetGetPin)
def SetVarValue(self,name,value,I2Ccallback):
print("RCU1 Set ",name,value)
D=self.D
Var1=Find(D['Variables'],'var_name',name)
if (Var1):
dev_number=0
Dev=GetField(Var1,'var_dev',dev_number)
Dev=Dev.split('.')
vmax=GetField(Var1,'var_max',dev_number)
if vmax:
if value[0]>vmax: value[0]=vmax;
vmin=GetField(Var1,'var_min',dev_number)
if vmin:
if value[0]<vmin: value[0]=vmin;
value[0]=value-vmin;
width=GetField(Var1,'var_width',dev_number)
bitoffset=GetField(Var1,'var_bitoffset',dev_number)
scale=GetField(Var1,'var_scale',dev_number)
elif (Find(D['Methods'],'method_name',name)):
return self.CallMethod(name,value,I2Ccallback)
elif len(name.split('.'))==2:
Dev=name.split('.');
width=False;
bitoffset=False;
scale=False;
else:
childname=name.split('_')[0]
for c in self.D['dev_children']:
if childname==c['child_name']:
return self.SetChildValue(c,c['obj'],name[len(childname)+1:],value,I2Ccallback)
# return hwdev.SetVarValue(self,name,value,I2Ccallback)
print("Unknown variable",name);
return False;
print(Dev)
if scale: value=int2bytes(int(value[0]/float(scale)))
if Find(D['I2C_devices'],'dev_name',Dev[0]):
if not(width): width=8
if not(bitoffset): bitoffset=0
print('SetVar ',name,'I2C',Dev,value,'(width=',width,'bitoffset=',bitoffset,')')
return self.I2CSet(Dev[0],Dev[1],value,I2Ccallback,width,bitoffset)
if Find(D['SPI_devices'],'dev_name',Dev[0]):
print('SetVar ',name,'SPI',Dev,value)
return SPIset(D,Dev[0],Dev[1],value,I2Ccallback,dev_number)
hwdev.SetVarValue(self,name,value,I2Ccallback)
# return SetVar(self.D,name,value,I2Ccallback)
def GetVarValue(self,name,value,I2Ccallback):
#def GetVar(D,name,value,I2Ccallback,dev_number=0):
dev_number=0;D=self.D
print("RCU1 Get ",name,value)
Var1=Find(D['Variables'],'var_name',name)
if (Var1):
Dev=GetField(Var1,'var_dev',dev_number)
Dev=Dev.split('.')
width=GetField(Var1,'var_width',dev_number)
bitoffset=GetField(Var1,'var_bitoffset',dev_number)
scale=GetField(Var1,'var_scale',dev_number)
elif len(name.split('.'))==2:
Dev=name.split('.');
width=False;
bitoffset=False;
scale=False;
else:
childname=name.split('_')[0]
for c in self.D['dev_children']:
if childname==c['child_name']:
return self.GetChildValue(c,c['obj'],name[len(childname)+1:],value,I2Ccallback)
# return hwdev.SetVarValue(self,name,value,I2Ccallback)
print("Unknown variable",name);
return False
print(Dev)
if not(width): width=8
if not(bitoffset): bitoffset=0
if Find(D['I2C_devices'],'dev_name',Dev[0]):
print('GetVar ',name,'I2C',Dev,value,'(width=',width,'bitoffset=',bitoffset,')')
result=self.I2CGet(Dev[0],Dev[1],value,I2Ccallback,width,bitoffset)
if not(result): return False;
if scale: value[0]=float(value[0])*float(scale);
return True
if Find(D['SPI_devices'],'dev_name',Dev[0]):
print('GetVar ',name,'SPI',Dev,value)
return SPIget(D,Dev[0],Dev[1],value,I2Ccallback,dev_number)
if Find(D['I2C_bitbang'],'dev_name',Dev[0]):
print('GetVar ',name,'I2C bb',Dev,value)
if not(I2Cbbget(D,Dev[0],Dev[1],value,I2Ccallback,dev_number,width,bitoffset)): return False
if scale: value[0]=float(value[0])*float(scale);
return True;
print("Unknown variable",name)
return False;
# return GetVar(self.D,name,value,I2Ccallback)
def GetVarNames(self,parentname,callback):
for V in self.D['Variables']:
dtype=(1 if V.get('var_scale') else 0)
RWs={'RO' : 1,'WO' : 2,'RW' : 3}
RW=(RWs[V.get('var_R/W')] if V.get('var_R/W') else 0)
callback(parentname+V['var_name'],dtype,RW)
return hwdev.GetVarNames(self,parentname,callback);
def GetMethodNames(self,parentname,callback):
for V in self.D['Methods']:
if not(V.get('method_invisible')): callback(parentname+V['method_name'])
return hwdev.GetMethodNames(self,parentname,callback);
def I2CSet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
#remember of values, add new ones with mask
# print('I2CSet:',dev,'=',value,'(mask=',mask,')')
Dev=Find(self.D['I2C_devices'],'dev_name',dev)
Addr=Dev['dev_address']
Reg=Find(Dev['dev_registers'],'reg_name',reg)
# print(dev,reg,value)
if (width<8) or (bitoffset>0):
previous=Reg.get('previous')
if not(previous):
previous=Reg.get('reg_default')
if not(previous):
previous=0;
value[0]=ApplyMask(value[0],width,bitoffset,previous);
# print('masked to',value)
# print("Set",dev,reg,"to",value)
result=I2Ccallback(Addr,value,reg=Reg['reg_addr'],)
#if result:
Reg['previous']=value[0]
return result
def I2CGet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
Dev=Find(self.D['I2C_devices'],'dev_name',dev)
Addr=Dev['dev_address']
Reg=Find(Dev['dev_registers'],'reg_name',reg)
l1=int(np.floor((width+bitoffset+7)/8))
# print(width,bitoffset,l1)
makesinglevalue=((len(value)==1) and (l1>1));
if makesinglevalue: value2=[0 for x in range(l1)]
else: value2=value
if not(I2Ccallback(Addr,value2,reg=Reg['reg_addr'],read=l1)): return False;
if value2[0] is None: return False
if makesinglevalue: value[0]=bytes2int(value2)
else: value[:]=value2[:];
Reg['previous']=value[0]
if (width!=l1*8) or (bitoffset>0):
value[0]=UnMask(value[0],width,bitoffset)
else: value[0]=value2[0]
return True;
#def I2CGetBuff(D,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
# Dev=Find(D['I2C_devices'],'dev_name',dev)
# Addr=Dev['dev_address']
# Reg=Find(Dev['dev_registers'],'reg_name',reg)
# value[0]=Reg.get('previous')
# print("Get Value=",value[0])
# if (width<8) or (bitoffset>0):
# value[0]=UnMask(value[0],width,bitoffset)
# return True;
File added
from hwdev import hwdev;
import numpy as np
class I2Cswitch(hwdev):
def SetChannel(self,channel,I2Ccallback):
if not(hasattr(self,'CurrentChannel')): self.CurrentChannel=0
if (1<<channel)==self.CurrentChannel: return True;
self.CurrentChannel=(1<<channel)
return I2Ccallback(self.D['dev_address'],[self.CurrentChannel])
# def GetVarNames(self,parentname,callback):
# for c in self.D['dev_children']:
# c['obj'].GetVarNames(parentname+c['name']+'_',callback)
# return True;
# def GetMethodNames(self,parentname,callback):
# for c in self.D['dev_children']:
# c['obj'].GetMethodNames(parentname+c['name']+'_',callback)
# return True;
def GetVarValue(self,name,value,I2Ccallback):
childname=name.split('_')[0]
for c in self.D['dev_children']:
if childname==c['child_name']:
if not(self.SetChannel(c['child_addr'],I2Ccallback)): return False;
return c['obj'].GetVarValue(name[len(childname)+1:],value,I2Ccallback)
return False
def SetVarValue(self,name,value,I2Ccallback):
childname=name.split('_')[0]
for c in self.D['dev_children']:
if childname==c['child_name']:
if not(self.SetChannel(c['child_addr'],I2Ccallback)): return False;
return c['obj'].SetVarValue(name[len(childname)+1:],value,I2Ccallback)
return False
def CallMethod(self,name,params,I2Ccallback):
childname=name.split('_')[0]
for c in self.D['dev_children']:
if not(self.SetChannel(c['child_addr'],I2Ccallback)): return False;
if childname==c['child_name']: return c['obj'].CallMethod(name[len(childname)+1:],params,I2Ccallback)
return False
File added
dev_children:
- child_name: Dither3
child_dev : RCUdither
child_conf: LTS_RCU2_dither
child_GPIO:
- SCL : IO1.OUT1.6
- SDO : IO2.OUT2.3
- SDI : IO2.IN2.3
- SDIOdir : IO2.CONF2.3
- child_name: Dither2
child_dev : RCUdither
child_conf: LTS_RCU2_dither
child_GPIO:
- SCL : IO1.OUT2.7
- SDO : IO1.OUT1.7
- SDI : IO1.IN1.7
- SDIOdir : IO1.CONF1.7
- child_name: ADC1
child_dev : RCUADC
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.1
- SDO : IO3.OUT1.0
- SDI : IO3.IN1.0
- SDIOdir: IO3.CONF1.0
- CS : IO3.OUT2.0
- child_name: ADC2
child_dev : RCUADC
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.3
- SDO : IO3.OUT1.2
- SDI : IO3.IN1.2
- SDIOdir: IO3.CONF1.2
- CS : IO3.OUT2.1
- child_name: ADC3
child_dev : RCUADC
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.5
- SDO : IO3.OUT1.4
- SDI : IO3.IN1.4
- SDIOdir: IO3.CONF1.4
- CS : IO3.OUT2.2
#This is the I2C devices in the RCU
I2C_devices:
- dev_name: IO1
dev_description: IO-Expander for filter selection
dev_address: 0x75
dev_device: TCA9539
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: OUT1
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_addr: 3
ref_default: 0
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- dev_name: IO3
dev_description: IO-Expander for ADC control
dev_address: 0x20
dev_device: TCA6416
dev_registers:
- reg_name: CONF1
reg_description: Direction of IO pins 0..7
reg_addr: 6
- reg_name: CONF2
reg_description: Direction of IO pints 8..15
reg_addr: 7
- reg_name: IN1
reg_description: Ouput port register 0..7
reg_addr: 0
- reg_name: IN2
reg_description: Ouput port register 0..7
reg_addr: 1
- reg_name: OUT1
reg_description: Ouput port register 0..7
reg_addr: 2
reg_default: 0x0F
- reg_name: OUT2
reg_description: Ouput port register 8..15
reg_addr: 3
reg_default: 0x0F
- dev_name: IO2
dev_description: IO-Expander for ON/OFF, Band, BUFx2
dev_address: 0x76
dev_device: TCA9539
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: OUT1
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_addr: 3
ref_default: 0
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- dev_name: UC
dev_description: RCU microcontroller
dev_address: 0x40
dev_registers:
- reg_name: ID
reg_description: Device ID
reg_addr: 0
- dev_name: ROM
dev_description: EEPROM memory
dev_address: 0x53
dev_registers:
- reg_name: ctr_len
reg_description: Length of control data
reg_addr: 0
- reg_name: ctr_dat
reg_description: Control data (protocol buffers)
reg_addr: 2
- dev_name: AN
dev_description: Monitor ADC on RCU
dev_address: 0x14
dev_device: LTC2495
dev_registers:
- reg_name: Ch0
reg_addr: 0xB080
- reg_name: Ch1
reg_addr: 0xB8
- reg_name: Ch2
reg_addr: 0xB1
- reg_name: Ch3
reg_addr: 0xB9
- reg_name: Ch4
reg_addr: 0xB2
- reg_name: Ch5
reg_addr: 0xBA
- reg_name: Ch6
reg_addr: 0xB3
- reg_name: Ch7
reg_addr: 0xBB
- reg_name: Temp
reg_addr: 0xA0C0
Variables:
- var_name: Attenuator1
var_dev: IO1.OUT1
var_width: 5
var_max: 21
var_R/W: RW
- var_name: Attenuator2
var_dev: IO1.OUT2
var_width: 5
var_max: 21
var_R/W: RW
- var_name: Attenuator3
var_dev: IO2.OUT1
var_width: 5
var_max: 24
var_R/W: RW
- var_name: Pwr_dig
var_description: Enable LDOs
var_dict: {0 : Off, 1 : On}
var_dev: IO2.OUT1
var_width: 1
var_bitoffset: 6
var_R/W: RO
- var_name: Band3
var_dev: IO2.OUT2
var_dict: {0 : 10MHz, 1 : 30MHz}
var_width: 1
var_bitoffset: 0
var_R/W: RW
- var_name: Band1
var_dev: IO2.OUT2
var_dict: {0 : 10MHz, 1 : 30MHz}
var_width: 1
var_bitoffset: 1
var_R/W: RW
- var_name: Band2
var_dev: IO2.OUT2
var_dict: {0 : 10MHz, 1 : 30MHz}
var_width: 1
var_bitoffset: 4
var_R/W: RW
- var_name: LED0
var_description: Front panel LEDs, 0=On
var_dict: {0 : Off, 1 : Yellow, 2: Red, 3: Orange}
var_dev: IO2.OUT2
var_width: 2
var_bitoffset: 6
var_R/W: RW
- var_name: Temperature
var_dev: AN.Temp
var_width: 23
var_scale: 4.21e-3
var_R/W: RO
- var_name: Dth3_Pwr
var_dev: IO2.OUT2
var_width: 1
var_bitoffset: 2
- var_name: Dth2_Pwr
var_dev: IO1.OUT2
var_width: 1
var_bitoffset: 6
Methods:
- method_name: RCU_on
registers:
- IO2.CONF1: [0] #Setup IO expanders to output with default values
- IO2.OUT1: [0x4A]
- IO2.OUT2: [0x55]
- IO3.OUT1: [0x7f]
- IO3.OUT2: [0x47]
- IO1.OUT1: [0xCA]
- IO1.OUT2: [0xCA]
- IO2.CONF2: [0]
- IO3.CONF1: [0]
- IO3.CONF2: [0]
- IO1.CONF1: [0]
- IO1.CONF2: [0]
- ADC1_Setup: 1
- ADC2_Setup: 1
- ADC3_Setup: 1
- method_name: RCU_off
registers:
- IO2.OUT1: [0x00] #Switch all off
- IO2.OUT2: [0x00]
- IO3.OUT1: [0x00]
- IO3.OUT2: [0x00]
- IO1.OUT1: [0x00]
- IO1.OUT2: [0x00]
- method_name: Dither_on
method_invisible: 1
registers:
- Dth3_Pwr: [1]
- Dth2_Pwr: [1]
- Dither3_Setup: 1
- Dither2_Setup: 1
- method_name: Dither_off
method_invisible: 1
registers:
- Dth3_Pwr: [0]
- Dth2_Pwr: [0]
I2C_devices:
- dev_name: ADC1
dev_description: I2C-SPI bridge to ADC
dev_device: AD9683
dev_registers:
- reg_name: PLL_stat
reg_description: PLL locked status
reg_addr: 0x0A
- reg_name: JESD_control1
reg_description: JESD link control, ILAS mode
reg_addr: 0x5F
- reg_name: CML_level
reg_description: CML output adjust
reg_addr: 0x15
- reg_name: SYNC_control
reg_description: SYNC / SYSREF control
reg_addr: 0x3A
- reg_name: Update
reg_description: Global device update
reg_addr: 0xFF
Variables:
- var_name: locked
var_dev: ADC1.PLL_stat
var_width: 8
- var_name: SYNC
var_dev: ADC1.SYNC_control
var_width: 8
- var_name: CML
var_dev: ADC1.CML_level
var_width: 8
- var_name: JESD
var_dev: ADC1.JESD_control1
var_width: 8
Methods:
- method_name: Setup
method_invisible: 1
registers:
- ADC1.JESD_control1: [14] #Setup ADCs
- ADC1.SYNC_control: [1] #Setup ADCs
- ADC1.CML_level: [0x7]
- ADC1.Update: [1] #Needed to update ADC registers
I2C_devices:
- dev_name: DS1
dev_description: Dither Source, SI4010
dev_address: 0x70
dev_registers:
- reg_name: TX_Stop
reg_addr: 0x67
- reg_name: TX_Start
reg_addr: 0x62
- reg_name: property
reg_addr: 0x11
- reg_name: TX_FREQ
reg_addr: 0x1140
Variables:
- var_name: Frequency
var_dev: DS1.TX_FREQ
var_width: 32
var_scale: 1e-6
var_bitoffset: 0
Methods:
- method_name: Setup
method_invisible: 1
registers:
- DS1.property: [0x60,1,0,0,0,125,127] #Power level (1,0)
- DS1.property: [0x40,0x06,0x0c,0xc4,0x60] #Frequency 101.5MHz
- DS1.property: [0x21,0,0] #tuning off
- DS1.TX_Start: [0,0,0,0,1]
dev_children:
- child_name: PLL
child_dev : clkPLL
child_conf: LTS_clkPLL
child_GPIO:
- CLK : IO3.OUT1.4
- SDO : IO3.IN1.5
- SDI : IO3.OUT1.7
- CS : IO3.OUT1.6
#This is the I2C devices in the RCU
I2C_devices:
- dev_name: IO3
dev_description: IO-Expander
dev_address: 0x20
dev_device: TCA6416
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- reg_name: OUT1
reg_addr: 2
reg_default: 0x0F
- reg_name: OUT2
reg_addr: 3
reg_default: 0x0F
Variables:
- var_name: IGNORE_PPS
var_dev: IO3.OUT1
var_width: 1
var_bitoffset: 6
# var_R/W: RW
- var_name: ENABLE_PWR
var_dev: IO3.OUT1
var_width: 1
var_bitoffset: 7
# var_R/W: RW
- var_name: STAT1
var_dev: IO3.OUT1
var_width: 1
var_bitoffset: 4
# var_R/W: RO
# - var_name: STAT2
# var_dev: IO3.OUT1
# var_width: 1
# var_bitoffset: 5
# var_R/W: RO
# - var_name: CONF
# var_dev: IO3.CONF1
# var_width: 8
# var_R/W: RO
# - var_name: OUT
# var_dev: IO3.OUT1
# var_width: 8
# var_R/W: RO
# - var_name: IN
# var_dev: IO3.IN1
# var_width: 8
# var_R/W: RO
Methods:
- method_name: on1
registers:
- IO3.CONF1: [0x2C]
- IO3.OUT1: [0x42]
- method_name: off1
method_invisible: 1
registers:
- IO3.CONF1: [0x2C]
- IO3.OUT1: [0x40]
#Output High=SDI(x2), PPS (0x40) #Read 0x42,
# IN=0x46: High: SDI, CLK, Enable_PWR
I2C_devices:
- dev_name: PLL1
dev_description: I2C-SPI bridge to PLL
dev_device: LTC6950
dev_registers:
- reg_name: a0
reg_addr: 0x00
- reg_name: a3
reg_addr: 0x03
- reg_name: a5
reg_addr: 0x05
- reg_name: a6
reg_addr: 0x06
- reg_name: a7
reg_addr: 0x07
- reg_name: a8
reg_addr: 0x08
- reg_name: a9
reg_addr: 0x09
- reg_name: aA
reg_addr: 0x0A
- reg_name: aD
reg_addr: 0x0D
- reg_name: aF
reg_addr: 0x0F
- reg_name: a11
reg_addr: 0x11
- reg_name: a13
reg_addr: 0x13
Variables:
- var_name: locked
var_dev: PLL1.a0
var_R/W: RO
var_width: 23
Methods:
- method_name: Power_off
method_invisible: 1
registers:
- PLL1.a3: [0x88]
- method_name: Power_on
method_invisible: 1
registers:
- PLL1.a3: [0x08]
- method_name: Reset
method_invisible: 1
registers:
- PLL1.a3: [0x0C]
- method_name: Setup
method_invisible: 1
registers:
- PLL1.a3: [0x08]
- PLL1.a5: [0x97]
- PLL1.a6: [0x10]
- PLL1.a7: [0x04]
- PLL1.a8: [0x01]
- PLL1.a7: [0x00]
- PLL1.a9: [0x10]
- PLL1.aA: [0x14]
- PLL1.a9: [0x00]
- PLL1.aD: [0x01] #02?
- PLL1.aF: [0x01]
- PLL1.a11: [0x01]
- PLL1.a13: [0x01]
dev_name: PCC_I2C
dev_children:
# - child_name: Switch1
- child_dev : I2Cswitch
child_conf: LTS_switch
child_addr: 1
\ No newline at end of file
dev_name: Switch1
dev_address: 0x70 #A0,1,2=0
#dev_device: TCA9548
# LTS midplane: I2C 0-5 = RCU 0-5, I2C 6 = UNB2_N0, I2C 7 = UNB2
# Todo: change RCU-5 to Clock board
dev_children:
- child_name: RCU01
child_dev: I2Cdevices
child_conf: LTS_RCU2L
child_addr: 1
- child_name: RCU02
child_dev: I2Cdevices
child_conf: LTS_RCU2L
child_addr: 2
- child_name: RCU03
child_dev: I2Cdevices
child_conf: LTS_RCU2L
child_addr: 3
- child_name: CLK
child_dev: I2Cdevices
child_conf: LTS_clk
child_addr: 7
from I2Cdevices import *;
import numpy as np
class RCUADC(I2Cdevices):
def I2CSet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
SPI=Find(self.D['I2C_devices'],'dev_name',dev)
Reg=Find(SPI['dev_registers'],'reg_name',reg)
ADC_address=Reg['reg_addr']
SetBit=I2Ccallback
ADC_bytes = 0x00
ADC_rw = 0x00 # 0 for write, 1 for read
data2 = ( ADC_rw << 23 ) + ( ADC_bytes << 21 ) + ( ADC_address << 8 ) + value[0]
bit_array = "{0:{fill}24b}".format(data2, fill='0')
# print(bit_array)
SetBit('CS',0) #enable
for bit in bit_array:
SetBit('SDO',int(bit))
SetBit('CLK',1)
SetBit('CLK',0)
SetBit('CS',1)
return True;
def I2CGet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
SPI=Find(self.D['I2C_devices'],'dev_name',dev)
Reg=Find(SPI['dev_registers'],'reg_name',reg)
ADC_reg_address=Reg['reg_addr']
# print(ADC_reg_address,CS,SDIOdir,SDI,SDO,CLK)
SetBit=I2Ccallback
ADC_bytes = 0x00
ADC_rw = 0x01 # 0 for write, 1 for read
data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address
SetBit('CS',0) #enable
bit_array = "{0:{fill}16b}".format(data, fill='0')
for bit in bit_array:
SetBit('SDO',int(bit))
SetBit('CLK',1)
SetBit('CLK',0)
SetBit('CS',1) #disable
# print("read byte")
SetBit('SDIOdir',1) #inpute
SetBit('CS',0) #enable
a=[0]
read_bit = ''
for cnt in range(8*(ADC_bytes+1)):
ret_value=SetBit('SDI',0,True)
read_bit += str(ret_value)
SetBit('CLK',1)
SetBit('CLK',0) #read after falling edge
SetBit('CS',1) #disable
SetBit('SDIOdir',0) #output
# SetBit(SDO,1)
# SetBit(CLK,1)
# print(read_bit)
# stri = "Read back data is: {0:2x} ".format(int(read_bit, 2))
# print(stri)
value[0]=int(read_bit, 2)
return True;
\ No newline at end of file
File added
from I2Cdevices import *;
import numpy as np
class RCUdither(I2Cdevices):
def I2CSet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
# def I2Cset(self,D,name,reg,data,I2Ccallback,dev_number=0):
Dev=Find(self.D['I2C_devices'],'dev_name',dev)
Reg=Find(Dev['dev_registers'],'reg_name',reg)
regnr=Reg['reg_addr']
Addr=Dev['dev_address'];
# data2=[Addr<<1,regnr]+data;
data2=[Addr<<1]+int2bytes(regnr)+value
# print(data2)
I2Ccallback('SDO',0)
I2Ccallback('SCL',1)
if not(I2CbbTX(data2,I2Ccallback)): return False;
data2=[(Addr<<1)+1];
data3=[0]
if not(I2CbbRX(data2,data3,I2Ccallback)): return False;
if data3[0]!=0x80:
print("Expected Ack 0x80, received:",data3);
return False;
print("Si4012 TX success!")
return True;
def I2CGet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
SPI=Find(self.D['I2C_devices'],'dev_name',dev)
dev_number=0;
Reg=Find(SPI['dev_registers'],'reg_name',reg)
Addr=SPI['dev_address'];
regnr=Reg['reg_addr']
data2=[Addr<<1]+int2bytes(regnr)
if (len(data2)==3) and (data2[1]==17):
data2[1]=18; #SI4012 hack as get is one higher than set
width+=1; #hack to ignore first ack byte
# while regnr>255:
# data2=[regnr%256]+data2;
# regnr=int(regnr/256);
# data2=[Addr<<1,regnr]+data2;
# print(data2,Addr,Reg['reg_addr']);
if not(I2CbbTX(data2,I2Ccallback)): return False;
# return False;
data2=[(Addr<<1)+1];
l1=int(np.floor((width+bitoffset+7)/8))
makesinglevalue=((len(value)==1) and (l1>1));
if makesinglevalue: data3=[0 for x in range(l1)]
else: data3=value
if not(I2CbbRX(data2,data3,I2Ccallback)): return False;
if makesinglevalue: value[0]=bytes2int(data3)
else: value[:]=data3[:];
if (width!=l1*8) or (bitoffset>0):
value[0]=UnMask(value[0],width,bitoffset)
#print("Received:",data3);
return True;
def I2CbbTX(data2,SetBit):
SetBit('SDIOdir',1) #Input, should be high
if SetBit('SDI',0,True)==0:
print("I2C line low!")
return False;
#Start
SetBit('SDIOdir',0) #Output = low
SetBit('SCL',0)
for b in data2:
bit_array = "{0:{fill}8b}".format(b, fill='0')
#print(bit_array)
for bit in bit_array:
SetBit('SDIOdir',int(bit)) #input=high, output=low
SetBit('SCL',1)
SetBit('SCL',0)
SetBit('SDIOdir',1) #Input
#print(GetBit(SDI))
if SetBit('SDI',0,True)==1:
print("I2C: Not ACK")
return False;
SetBit('SCL',1)
#print(GetBit(SDI))
SetBit('SCL',0)
# SetBit(SDIOdir,0) #Output
#Stop
SetBit('SDIOdir',0) #Low
SetBit('SCL',1)
SetBit('SDIOdir',1) #High
return True
def I2CbbRX(data1,data2,SetBit):
SetBit('SDIOdir',1) #Input, should be high
if SetBit('SDI',0,True)==0:
print("I2C ack: line low!")
return False;
#Start
SetBit('SDIOdir',0) #Output = low
SetBit('SCL',0)
for b in data1:
bit_array = "{0:{fill}8b}".format(b, fill='0')
#print(bit_array)
for bit in bit_array:
SetBit('SDIOdir',int(bit)) #input=high, output=low
SetBit('SCL',1)
SetBit('SCL',0)
SetBit('SDIOdir',1) #Input
#print(GetBit(SDI))
if SetBit('SDI',0,True)==1:
print("I2C: Not ACK")
return False;
SetBit('SCL',1)
#print(GetBit(SDI))
SetBit('SCL',0)
for x in range(len(data2)):
readbit='';
SetBit('SDIOdir',1) #Input
for bit in range(8):
SetBit('SCL',1)
readbit+=str(SetBit('SDI',0,True))
SetBit('SCL',0)
if x<len(data2)-1:
SetBit('SDIOdir',0) #Output
else: #last one = not-ack
SetBit('SDIOdir',1) #Output
SetBit('SCL',1)
SetBit('SCL',0)
data2[x]=int(readbit,2)
#Stop
SetBit('SDIOdir',0) #Output = low
SetBit('SCL',1)
SetBit('SDIOdir',1) #Input = high
return True;
File added
File added
File added
from I2Cdevices import *;
import numpy as np
class clkPLL(I2Cdevices):
def I2CSet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
SPI=Find(self.D['I2C_devices'],'dev_name',dev)
Reg=Find(SPI['dev_registers'],'reg_name',reg)
reg_address=Reg['reg_addr']
SetBit=I2Ccallback
# dev_rw = 0x00 # 0 for write, 1 for read
# data2 = ( reg_address << 9 ) + ( dev_rw << 8 ) + value[0]
data2 = ( reg_address << 9 ) + value[0]
bit_array = "{0:{fill}16b}".format(data2, fill='0')
# print(bit_array)
SetBit('CS',0) #enable
for bit in bit_array:
SetBit('SDI',int(bit))
SetBit('CLK',1)
SetBit('CLK',0)
SetBit('CS',1)
return True;
def I2CGet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
SPI=Find(self.D['I2C_devices'],'dev_name',dev)
Reg=Find(SPI['dev_registers'],'reg_name',reg)
reg_address=Reg['reg_addr']
# print(ADC_reg_address,CS,SDIOdir,SDI,SDO,CLK)
SetBit=I2Ccallback
ADC_bytes = 0x00
# ADC_rw = 0x01 # 0 for write, 1 for read
data = ( reg_address << 7 ) + 1
SetBit('CS',0) #enable
bit_array = "{0:{fill}8b}".format(data, fill='0')
for bit in bit_array:
SetBit('SDI',int(bit))
SetBit('CLK',1)
SetBit('CLK',0)
# SetBit('CS',1) #disable
# print("read byte")
# SetBit('SDIOdir',1) #inpute
# SetBit('CS',0) #enable
a=[0]
read_bit = ''
for cnt in range(8*(ADC_bytes+1)):
ret_value=SetBit('SDO',0,True)
read_bit += str(ret_value)
SetBit('CLK',1)
SetBit('CLK',0) #read after falling edge
SetBit('CS',1) #disable
# SetBit(SDO,1)
# SetBit(CLK,1)
# print(read_bit)
stri = "Read back data is: {0:2x} ".format(int(read_bit, 2))
print(stri)
value[0]=int(read_bit, 2)
return True;
\ No newline at end of file
File added
hwdev.py 0 → 100644
import yaml;
import importlib
import sys, inspect
class hwdev:
def __init__(self,configfile):
print("Loading:",configfile)
self.D=yaml.load(open(configfile))
self.loadchildren(self.D)
def loadchildren(self,D):
self.children=[]
self.childnames=[]
if "dev_children" in D:
for c in D['dev_children']:
childname=(c['child_name']+"_" if c.get('child_name') else '');
objnm=c['child_dev']
yamlname=c['child_conf']
print("Add child:",childname,objnm,yamlname)
i = importlib.import_module(objnm)
for name, obj in inspect.getmembers(i,inspect.isclass):
if name==objnm:
# yamlname=(c['conf_name'] if c.get('conf_name') else nm)
# print(" Load child:",childname," conf=",yamlname+".yaml")
c['obj']=obj(yamlname+".yaml")
self.children.append([childname,c['obj']])
def GetVarNames(self,parentname,callback):
for name,child in self.children:
child.GetVarNames(parentname+name,callback)
return True;
def GetMethodNames(self,parentname,callback):
for name,child in self.children:
child.GetMethodNames(parentname+name,callback)
return True;
def GetVarValue(self,name,value,I2Ccallback):
return False
def SetVarValue(self,name,value,I2Ccallback):
return False
# def CallMethod(self,name,params,I2Ccallback):
# for name,child in self.children:
# child.CallMethod(name,params,I2Ccallback)
# return True;
def CallMethod(self,name,params,I2Ccallback):
childname=name.split('_')[0]
for cname,child in self.children:
# print("hwdev callmethod",cname,childname)
if cname=="": child.CallMethod(name,params,I2Ccallback)
elif cname[:-1]==childname: return child.CallMethod(name[len(childname)+1:],params,I2Ccallback)
return False
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment