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

Merge branch 'master' of https://git.astron.nl/lofar2.0/pypcc

parents 8755a0cc 063a6f4e
No related branches found
No related tags found
No related merge requests found
version: "1.0"
description: "1234"
drivers:
- name: I2C
type: i2c_smbus
parameters: [5] #I2C port number
- name: I2C_PU
type: i2c_dev #I2C devices
parent: I2C
status: APSPU_I2C_STATUS
#This is the I2C devices in the RCU
device_registers:
- name: ROM
address: 0x50
driver: I2C_PU
registers:
- name: ID
description: Random
address: 0xfc
- name: Version
description: Set in production
address: 0
- name: MAX
description: MAX6620 fan speed controller
address: 0x29
driver: I2C_PU
registers:
- name: GLOBAL
address: 0x00
- name: TACH1
address: 0x10
- name: TACH2
address: 0x12
- name: TACH3
address: 0x14
variables:
- name: APSPU_I2C_STATUS
driver: I2C_PU
rw: ro #server RW variable, not linked to IO
dtype: uint8
- name: APSPUTL_translator_busy
description: False when idle
rw: ro #server variable, not linked to IO
dtype: boolean
- name: APSPU_ID
description: Unique PCB ID
driver: I2C_PU
devreg: ROM.ID
width: 32
rw: ro
dtype: uint32
- name: APSPU_version
description: Version number
driver: I2C_PU
devreg: ROM.Version
width: 80 #10 characters
rw: ro
dtype: string
- name: [APSPU_LBA_VOUT,APSPU_RCU2A_VOUT,APSPU_RCU2D_VOUT]
driver: I2C_PU
devreg: [0x3C.0x8B,0x3D.0x8B,0x3E.0x8B]
width: 16
rw: ro
dtype: double
endian: "<"
scale: 4.8828e-4 #2^-11
monitor: true
- name: [APSPU_LBA_IOUT,APSPU_RCU2A_IOUT,APSPU_RCU2D_IOUT]
driver: I2C_PU
devreg: [0x3C.0x8C,0x3D.0x8C,0x3E.0x8C]
width: 16
rw: ro
dtype: double
scale: smbus_2bytes_to_float
monitor: true
- name: [APSPU_LBA_TEMP,APSPU_RCU2A_TEMP,APSPU_RCU2D_TEMP]
driver: I2C_PU
devreg: [0x3C.0x8D,0x3D.0x8D,0x3E.0x8D]
width: 16
rw: ro
dtype: double
scale: smbus_2bytes_to_float
monitor: true
- name: [APSPU_FAN_period1,APSPU_FAN_period2,APSPU_FAN_period3]
driver: I2C_PU
devreg: [MAX.TACH1,MAX.TACH2,MAX.TACH3]
bitoffset: 5
width: 11
rw: ro
dtype: double
scale: 1.52588e-5 #FAN_TACHS/TACH_COUNT_FREQ/TACH_PERIODS = 1/8192/16 *2
monitor: true
methods:
- name: APSPUTL_Init #Called after startup to load. Should have all stored registers
driver: I2C_PU
debug: True
instructions:
- APSPU_ID : Update
- APSPU_version : Update
- name: APSPU_FanOn
driver: I2C_PU
instructions:
- MAX.GLOBAL : 0x02; #Run monitor
- MAX.0x02 : 0x88;
- MAX.0x06 : 0x80; # int((math.log(TACH_PERIODS{16}) / math.log(2))) << 5,
- MAX.0x03 : 0x88;
- MAX.0x07 : 0x80;
- MAX.0x04 : 0x88;
- MAX.0x08 : 0x80;
......@@ -5,12 +5,6 @@ from queuetypes import *
from .hwdev import hwdev
from .i2c_dev import *
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_array(i2c_dev):
def __init__(self,config):
......
......@@ -81,6 +81,14 @@ def list_different(A,B):
if not(m==A[i]): return True
return False
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);
......@@ -111,6 +119,7 @@ class i2c_dev(hwdev):
return Data
def OPCUAReadVariable(self,varid,var1,mask):
if len(mask)==0: mask=[True];
logging.info(str(("Read Var",var1['name'],mask)))
if not(var1.get('devreg')): return []
#data=self.GetVarValueAll(var1)
......@@ -132,9 +141,13 @@ class i2c_dev(hwdev):
return self.conf['parentcls'].i2csetget(*args,**kwargs)
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):
Step,Step2=GetSteps(var1);
value1=[0]*Step*Step2;
# Step=(len(var1['devreg']) if isinstance(var1['devreg'],list) else 1)
# value1=[0]*Step;
if not(len(data)==Step*Step2):
# if not(len(data)==Step):
print("Check data length!");
return;
if (len(mask)==1):
......@@ -149,8 +162,8 @@ class i2c_dev(hwdev):
if not(self.I2Cmask[0]==0):
mask[Vari]=False;
continue;
i0=(Vari)*Step
i1=(Vari+1)*Step
i0=(Vari)*Step2
i1=(Vari+1)*Step2
devreg=var1['devreg'][Vari];
width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0)
......@@ -170,8 +183,10 @@ class i2c_dev(hwdev):
def GetVarValueMask(self,var1,mask):
Step=(len(var1['devreg']) if isinstance(var1['devreg'],list) else 1)
value1=[0]*Step;
Step,Step2=GetSteps(var1);
value1=[0]*Step*Step2;
# 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):
......@@ -184,8 +199,8 @@ class i2c_dev(hwdev):
if not(self.I2Cmask[0]==0):
mask[Vari]=False;
continue;
i0=( Vari)*Step
i1=(Vari+1)*Step
i0=( Vari)*Step2
i1=(Vari+1)*Step2
devreg=var1['devreg'][Vari];
width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0)
......@@ -234,7 +249,7 @@ class i2c_dev(hwdev):
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']:
if devreg.get('store'):
previous=self.getstoreval(devreg);
for x in range(len(value)):
value[x]=ApplyMask(value[x],width,bitoffset,previous);
......@@ -244,14 +259,14 @@ class i2c_dev(hwdev):
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)))
logging.debug(str(("i2c_dev 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']:
if devreg.get('store'):
devreg['storeval']=value[0];
l1=int(np.floor((width+bitoffset+7)/8))
#print(value[0],width,bitoffset,l1)
......
def smbus_2bytes_to_float(data):
expo = ((data & 0xf8)>>3)
if expo == 1:
expo = -7
if expo > 2**4:
expo = expo-2**5
mantisse = ((data & 0x7)<<8) + ((data & 0xff00) >> 8)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment