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

APSCTTR points added

parent b2f0785e
No related branches found
No related tags found
No related merge requests found
......@@ -8,7 +8,7 @@ drivers:
- name: I2C_CLK
type: i2c_dev #I2C devices
parent: I2C
status: CLK_I2C_error
status: APSCT_I2C_error
- name: SPIbb1
type: spibitbang2 #SPI bitbang via GPIO expander: CLK, SDI,SDO,CS
parent: I2C_CLK
......@@ -17,19 +17,28 @@ drivers:
#This is the I2C devices in the RCU
device_registers:
- name: IO1
description: IO-Expander
address: 0x20
- name: IO
dim: 2
description: IO-Expander (TCA6416APWR)
address: [0x20,0x21]
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] #Read / Write address different
store: True
- name: PLL
driver: SPIbb1
......@@ -42,8 +51,9 @@ device_registers:
- {name: r6, address: 0x06}
- name: ROM
description: 24AA02UIDT
address: 0x50
driver: I2C_PU
driver: I2C_CLK
registers:
- name: ID
description: Random
......@@ -52,6 +62,37 @@ device_registers:
description: Set in production
address: 0
- name: VSENSE
description: Monitor ADC
address: 0x74
device: LTC2495
driver: I2C_CLK
registers:
- name: V_0
address: 0xB080
wait: 250
- name: V_1
address: 0xB880
wait: 250
- name: V_2
address: 0xB180
wait: 250
- name: V_3
address: 0xB980
wait: 250
- name: V_4
address: 0xB280
wait: 250
- name: V_5
address: 0xBA80
wait: 250
- name: V_6
address: 0xB380
wait: 250
- name: Temp
address: 0xA0C0
wait: 250
variables:
- name: APSCT_I2C_error
......@@ -83,37 +124,63 @@ variables:
dtype: string
- name: CLK_PWR_on
description: CLK power status. True=ON. Controlled by CLK_ON and CLK_OFF
- name: [APSCT_PLL_200MHz_PWR_on,APSCT_PLL_160MHz_PWR_on]
description: CLK power status. True=ON. Controlled by APSCT_ON and APSCT_OFF
rw: ro
dtype: boolean
driver: I2C_CLK
devreg: IO1.GPIO1
devreg: [IO1.GPIO1,IO2.GPIO1]
bitoffset: 1
width: 1
- name: APSCT_PWR_on
description: CLK power status. True=ON. Controlled by APSCT_ON and APSCT_OFF
rw: ro
dtype: boolean
driver: I2C_CLK
devreg: IO1.GPIO2
bitoffset: 3
width: 1
- name: APSCT_ignore_PPS
rw: rw
dtype: boolean
driver: I2C_CLK
devreg: IO1.GPIO2
bitoffset: 2
width: 1
- name: [APSCT_MON_10MHz_good,APSCT_MON_PPS_good]
rw: ro
dtype: boolean
driver: I2C_CLK
devreg: IO2.GPIO2
bitoffset: [0,1]
width: 1
monitor: true
- name: CLK_PLL_locked
- name: [APSCT_PLL_200MHz_locked,APSCT_PLL_160MHz_locked]
description: First status pin give lock status
rw: ro
dtype: boolean
monitor: true
driver: I2C_CLK
devreg: IO1.GPIO1
devreg: [IO1.GPIO1,IO2.GPIO1]
bitoffset: 2
width: 1
- name: CLK_PLL_error
- name: [APSCT_PLL_200MHz_error,APSCT_PLL_160MHz_error]
description: Second status pin give error
rw: ro
dtype: boolean
monitor: true
driver: I2C_CLK
devreg: IO1.GPIO1
devreg: [IO1.GPIO1,IO2.GPIO1]
bitoffset: 3
width: 1
- name: CLK_PLL_locked_SPI
- name: APSCT_PLL_200MHz_locked_SPI
description: 0x81=locked
driver: I2C_CLK
devreg: PLL.PLL_stat
......@@ -122,7 +189,7 @@ variables:
dtype: uint8
debug: True
- name: [CLK_PLL_r3,CLK_PLL_r5,CLK_PLL_r6]
- name: [APSCT_PLL_r3,APSCT_PLL_r5,APSCT_PLL_r6]
driver: I2C_CLK
devreg: [PLL.r3,PLL.r5,PLL.r6]
width: 8
......@@ -130,54 +197,92 @@ variables:
dtype: uint8
debug: True
- name: RCU_IO1_GPIO1
- name: [APSCT_IO1_GPIO1,APSCT_IO1_GPIO2,APSCT_IO2_GPIO1,APSCT_IO2_GPIO2]
driver: I2C_CLK
devreg: [IO1.GPIO1,IO1.GPIO2,IO2.GPIO1,IO2.GPIO2]
width: 8
rw: ro
dtype: uint8
debug: True
- name: APSCT_IO2_GPIO1
driver: I2C_CLK
devreg: IO1.GPIO1
devreg: IO2.GPIO1
width: 8
rw: ro
dtype: uint8
mask: RCU_mask
debug: True
- name: APSCT_temperature
description: Temperature sensor on RCU
driver: I2C_CLK
devreg: VSENSE.Temp
width: 23
scale: 3.8265e-3
rw: ro
dtype: double
monitor: true
- name: [APSCT_3V3_INPUT,APSCT_3V3_PLL_160MHz,APSCT_3V3_PLL_200MHz,APSCT_3V3_CLKDIST_A,APSCT_3V3_CLKDIST_B,APSCT_3V3_PPSDIST,APSCT_3V3_CTRL]
driver: I2C_CLK
devreg: [VSENSE.V_0,VSENSE.V_1,VSENSE.V_2,VSENSE.V_3,VSENSE.V_4,VSENSE.V_5,VSENSE.V_6]
width: 23
scale: 1.12165e-6
rw: ro
dtype: double
monitor: true
methods:
- name: APSCTTR_Init #Called after startup to load. Should have all stored registers
driver: I2C_CLK
debug: True
instructions:
- APSCT_I2C_error : 0
- RCU_IO1_GPIO1 : Update
- IO1.CONF1: Update
- CLK_PWR_on: Update
- CLK_PLL_locked: Update
- CLK_PLL_error: Update
- APSCT_ID : Update
- APSCT_version : Update
- APSCT_IO1_GPIO1 : Update
- APSCT_IO1_GPIO2 : Update
- APSCT_IO2_GPIO1 : Update
- APSCT_IO2_GPIO2 : Update
- IO1.CONF1: Update
- IO1.CONF2: Update
- IO2.CONF1: Update
- IO2.CONF2: Update
- APSCT_PWR_on: Update
- APSCT_PLL_200MHz_PWR_on: Update
- APSCT_PLL_200MHz_locked: Update
- APSCT_PLL_200MHz_error: Update
- APSCT_PLL_160MHz_PWR_on: Update
- APSCT_PLL_160MHz_locked: Update
- APSCT_PLL_160MHz_error: Update
- APSCT_ignore_PPS : Update
- name: CLK_on
- name: APSCT_on
driver: I2C_CLK
description: Configure clock. Monitored using CLK_PWR_on, CLK_PLL_error and CLK_PLL_locked
description: Configure clock. Monitored using APSCT_PWR_on, APSCT_PLL_error and APSCT_PLL_locked
instructions:
- APSCT_I2C_error : 0
- IO1.CONF1: 0x2C #0010 1100 PPS/PWR output, SCLK,CS,SDI
- IO1.GPIO1: 0x42 #0100 0010 high:PWR enable, CS
- CLK_PWR_on: Update
- WAIT: 200 #ms to wait before checking lock
- CLK_PLL_setup: 0
- WAIT: 100 #ms to wait before checking lock
- CLK_PLL_locked: Update
# - IO1.CONF1: 0x2C #0010 1100 PPS/PWR output, SCLK,CS,SDI
# - IO1.GPIO1: 0x42 #0100 0010 high:PWR enable, CS
# - APSCT_PWR_on: Update
# - WAIT: 200 #ms to wait before checking lock
# - APSCT_PLL_setup: 0
# - WAIT: 100 #ms to wait before checking lock
# - APSCT_PLL_locked: Update
- name: CLK_off
- name: APSCT_off
driver: I2C_CLK
description: Switch clock off. Monitored using CLK_PWR_on
description: Switch clock off. Monitored using APSCT_PWR_on
instructions:
- APSCT_I2C_error : 0
- IO1.CONF1: 0x2C #0010 1100 PPS/PWR output, SCLK,CS,SDI
- IO1.GPIO1: 0x00 #all low
- CLK_PWR_on: Update
- CLK_PLL_locked: Update
# - IO1.CONF1: 0x2C #0010 1100 PPS/PWR output, SCLK,CS,SDI
# - IO1.GPIO1: 0x00 #all low
# - APSCT_PWR_on: Update
# - APSCT_PLL_locked: Update
- name: CLK_PLL_setup
- name: APSCT_PLL_setup
driver: I2C_CLK
debug: true
instructions:
......
......@@ -95,6 +95,7 @@ class i2c_dev(hwdev):
self.I2Cmask=[0]
self.I2Cmaskid=config.get('maskid',None)
if self.I2Cmaskid is None: logging.warn(config['name']+" I2C mask not found!")
self.I2Ccut=3;
def OPCUASetVariable(self,varid,var1,data,mask):
logging.info(str(("Set Var",var1['name'],data[:32],mask)))
......@@ -159,7 +160,7 @@ class i2c_dev(hwdev):
return;
for Vari in range(Step):
if not(mask[Vari]): continue
if not(self.I2Cmask[0]==0):
if not(self.I2Cmask[0]<=self.I2Ccut):
mask[Vari]=False;
continue;
i0=(Vari)*Step2
......@@ -175,9 +176,10 @@ class i2c_dev(hwdev):
value2=value1[i0:i1]
res=self.GetVarValue(devreg,width,bitoffset,value2)
if not(res):
self.I2Cmask[0]=1;
mask[Vari]=False;
self.I2Cmask[0]+=1;
if self.I2Cmask[0]>self.I2Ccut: mask[Vari]=False;
continue;
self.I2Cmask[0]=0;
value1[i0:i1]=value2
return value1,mask
......@@ -196,7 +198,7 @@ class i2c_dev(hwdev):
return;
for Vari in range(Step):
if not(mask[Vari]): continue
if not(self.I2Cmask[0]==0):
if not(self.I2Cmask[0]<=self.I2Ccut):
mask[Vari]=False;
continue;
i0=( Vari)*Step2
......@@ -207,9 +209,10 @@ class i2c_dev(hwdev):
value2=value1[i0:i1]
res=self.GetVarValue(devreg,width,bitoffset,value2)
if not(res):
self.I2Cmask[0]=1;
mask[Vari]=False;
self.I2Cmask[0]+=1;
if self.I2Cmask[0]>self.I2Ccut: mask[Vari]=False;
continue;
self.I2Cmask[0]=0;
value1[i0:i1]=value2
return value1,mask
......@@ -263,6 +266,12 @@ class i2c_dev(hwdev):
callback=devreg['drivercls'].i2csetget;
value2=value
reg=devreg['register_R']
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
value[:]=value2[:];
......
......@@ -78,6 +78,7 @@ class yamlconfig():
dev1=Find(self.conf['device_registers'],'name',name2[0])
if dev1:
store=dev1.get('store',False)
wait=dev1.get('wait',0)
devcls=dev1.get('driver');
if not(devcls): logging.error("Can not find driver for register "+name2[0]);
else:
......@@ -86,7 +87,7 @@ class yamlconfig():
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};
return {"addr":dev1.get('address',0),"register_R":str2int(name2[1]),"register_W":str2int(name2[1]),"store":store,"drivercls":devcls,"wait":wait};
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));
# except:
......@@ -113,8 +114,9 @@ class yamlconfig():
regR=GetField(reg,'address',0,0)
regW=GetField(reg,'address',1,0)
store=reg.get('store',False)
wait=reg.get('wait',0)
devregname=name2+'.'+reg['name'];
devreglist[devregname]={"addr":addr,"register_R":regR,"register_W":regW,"store":store,"driver":devid};
devreglist[devregname]={"addr":addr,"register_R":regR,"register_W":regW,"store":store,"driver":devid,"wait":wait};
# print(devregname,devreglist[devregname]['addr'],devreglist[devregname]['register_R'],devreglist[devregname]['register_W']);
self.devreglist=devreglist;
for D in drivers:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment