00001 #!/usr/local/bin/python 00002 # 00003 # Copyright 2004 00004 # by 00005 # The Board of Trustees of the 00006 # Leland Stanford Junior University. 00007 # All rights reserved. 00008 # 00009 00010 00011 __facility__ = "Online" 00012 __abstract__ = "Power and LCB initialization (plumbing) class" 00013 __author__ = "A. Perazzo <perazzo@slac.stanford.edu> SLAC - GLAST LAT I&T/Online" 00014 __date__ = ("$Date: 2005/09/23 01:44:13 $").split(' ')[1] 00015 __version__ = "$Revision: 2.13 $" 00016 __release__ = "$Name: R04-12-00 $" 00017 __credits__ = "SLAC" 00018 00019 import LATTE.copyright_SLAC 00020 import logging 00021 import gFabrics 00022 import gLCB 00023 00024 import LATTE.client.gException as gException 00025 00026 class Plumber(object): 00027 __lcbred = 8 00028 __lcbbit = 9 00029 __lcbiclk = 10 00030 __lcboclk = 11 00031 00032 __cmdtem = 0 00033 __cmdgem = 16 00034 __cmdaem = 17 00035 __cmdebm = 18 00036 __cmdpdu = 19 00037 __cmdsiu = 24 00038 __cmdepu = 27 00039 00040 __evtgem = 0 00041 __evttem = 1 00042 __evtaem = 17 00043 __evtsiu = 18 00044 __evtepu = 21 00045 00046 __siumfs = 0 00047 __siupd0 = 1 00048 __siupd1 = 2 00049 __siuda0 = 3 00050 __siuda1 = 4 00051 00052 __ocsmsglevel = 0x0f 00053 __ocsverbose = 0x10 00054 __ocsinitforce = 0x20 00055 __ocsinitxbrd = 0x40 00056 __ocsusexbrd = 0x80 00057 00058 def __init__(self, lat, xbrd): 00059 self.__ocsopts=0 00060 self.__pwrmask=0 00061 self.__lcbmask=0 00062 00063 self.__cmdmask=0 00064 self.__pdumask=0 00065 self.__secmask=0 00066 self.__evtmask=0 00067 00068 integer = True 00069 self.__lat = lat 00070 self.__lcb = lat.LCB 00071 00072 ignore_missing_nodes = self.__lcb.getFlag('IgnoreMissingNodes', integer) 00073 if ignore_missing_nodes: 00074 self.__evtmset=0 00075 self.__cmdmset=0 00076 else: 00077 self.__evtmset=0xffffffffL 00078 self.__cmdmset=0xffffffffL 00079 00080 self.__lcbmask = self.__lcb.getFlag('BoardId', integer) 00081 if self.__lcb.getFlag('UseRedundant', integer): 00082 self.__lcbmask |= 1<<Plumber.__lcbred 00083 if self.__lcb.getFlag('UseBitWide', integer): 00084 self.__lcbmask |= 1<<Plumber.__lcbbit 00085 if self.__lcb.getFlag('UseTrailingIclock', integer): 00086 self.__lcbmask |= 1<<Plumber.__lcbiclk 00087 if self.__lcb.getFlag('UseTrailingOclock', integer): 00088 self.__lcbmask |= 1<<Plumber.__lcboclk 00089 00090 if xbrd is not None: 00091 self.__ocsopts |= Plumber.__ocsinitxbrd 00092 if xbrd.GLT is not None: 00093 self.__ocsopts |= Plumber.__ocsusexbrd 00094 00095 if lat.existsGEM(): 00096 self.__setcmd(lat.GEM, Plumber.__cmdgem) 00097 self.__setevt(lat.GEM, Plumber.__evtgem) 00098 00099 if lat.existsAEM(): 00100 self.__setcmd(lat.AEM, Plumber.__cmdaem) 00101 self.__setevt(lat.AEM, Plumber.__evtaem) 00102 if lat.AEM.getFlag('UsePdu1', integer): 00103 self.__pdumask |= (1<<(Plumber.__cmdaem)) 00104 if lat.AEM.getFlag('UseRedundantConv', integer): 00105 self.__secmask |= (1<<(Plumber.__cmdaem)) 00106 00107 if lat.existsEBM(): 00108 self.__setcmd(lat.EBM, Plumber.__cmdebm) 00109 00110 for pdu in lat.PDU.values(): 00111 self.__setcmd(pdu, Plumber.__cmdpdu+pdu.id()) 00112 00113 for tem in lat.TEM.values(): 00114 self.__setcmd(tem, Plumber.__cmdtem+tem.id()) 00115 self.__setevt(tem, Plumber.__evttem+tem.id()) 00116 if tem.getFlag('UsePdu1', integer): 00117 self.__pdumask |= (1<<(Plumber.__cmdtem+tem.id())) 00118 00119 for siu in lat.SIU.values(): 00120 self.__setcmd(siu, Plumber.__cmdsiu+siu.id()) 00121 self.__setevt(siu, Plumber.__evtsiu+siu.id()) 00122 if siu.getFlag('UseSecMainFeed', integer): 00123 self.__pwrmask |= 1<<Plumber.__siumfs 00124 if siu.getFlag('PowerPdu0', integer): 00125 self.__pwrmask |= 1<<Plumber.__siupd0 00126 if siu.getFlag('PowerPdu1', integer): 00127 self.__pwrmask |= 1<<Plumber.__siupd1 00128 if siu.getFlag('PowerPrimDab', integer): 00129 self.__pwrmask |= 1<<Plumber.__siuda0 00130 if siu.getFlag('PowerSecDab', integer): 00131 self.__pwrmask |= 1<<Plumber.__siuda1 00132 break 00133 00134 for epu in lat.EPU.values(): 00135 self.__setcmd(epu, Plumber.__cmdepu+epu.id()) 00136 self.__setevt(epu, Plumber.__evtepu+epu.id()) 00137 if epu.getFlag('UsePdu1', integer): 00138 self.__pdumask |= 1<<(Plumber.__cmdepu+epu.id()) 00139 if epu.getFlag('UseRedundantConv', integer): 00140 self.__secmask |= 1<<(Plumber.__cmdepu+epu.id()) 00141 00142 # Backward comp with schemas with no SIUs/EPUs: add SIU0 to EBM dest mask 00143 if len(lat.SIU.items()) == 0 and len(lat.EPU.items()) == 0: 00144 self.__evtmset |= 1<<(Plumber.__evtsiu+1) 00145 self.__evtmask |= 1<<(Plumber.__evtsiu+1) 00146 00147 def __setcmd(self, node, position): 00148 flag = node.getFlag('CmdrspFabric') 00149 if flag == 'On': 00150 self.__cmdmset |= 1<<position 00151 self.__cmdmask |= 1<<position 00152 elif flag == 'Off': 00153 self.__cmdmset |= 1<<position 00154 elif flag == 'Ignore': 00155 pass 00156 else: 00157 raise RuntimeError, "Node %s has invalid CmdrspFabric flag %s" \ 00158 %(node.__class__.__name__, flag) 00159 00160 def __setevt(self, node, position): 00161 flag = node.getFlag('EventFabric') 00162 if flag == 'On': 00163 self.__evtmset |= 1<<position 00164 self.__evtmask |= 1<<position 00165 elif flag == 'Off': 00166 self.__evtmset |= 1<<position 00167 elif flag == 'Ignore': 00168 pass 00169 else: 00170 raise RuntimeError, "Node %s has invalid EventFabric flag %s" \ 00171 %(node.__class__.__name__, flag) 00172 00173 def __init_ocs(self, fswmsglevel, ocsverbose, force): 00174 self.__ocsopts &= ~Plumber.__ocsmsglevel 00175 self.__ocsopts |= (fswmsglevel & Plumber.__ocsmsglevel) 00176 if ocsverbose: 00177 self.__ocsopts |= Plumber.__ocsverbose 00178 else: 00179 self.__ocsopts &= ~Plumber.__ocsverbose 00180 if force: 00181 logging.info('forcing fabric initialization') 00182 self.__ocsopts |= Plumber.__ocsinitforce 00183 else: 00184 self.__ocsopts &= ~Plumber.__ocsinitforce 00185 rsp = self.__lcb.cmdrsp('init_ocs', self.__ocsopts) 00186 if rsp.status() & 0x3: 00187 raise gException.LATInterfaceException(rsp.status()) 00188 00189 def __init_oes(self): 00190 rsp = self.__lcb.cmdrsp('init_oes', self.__ocsopts) 00191 if rsp.status() & 0x3: 00192 raise gException.LATInterfaceException(rsp.status()) 00193 00194 def __init_power(self): 00195 rsp = self.__lcb.cmdrsp('init_power', self.__pwrmask) 00196 if rsp.status() & 0x3: 00197 raise gException.LATInterfaceException(rsp.status()) 00198 00199 def __start_lcb(self): 00200 status = self.__lcb.start(self.__lcbmask) 00201 timeout = None 00202 if status == gException.LATInterfaceStatus.status('LCBD_NOCLK'): 00203 logging.error('waiting for the 20 MHz clock') 00204 timeout = 60 00205 elif status & 0x3: 00206 raise gException.LATInterfaceException(status) 00207 status = self.__lcb.start_wait(self.__lcbmask, timeout) 00208 if status & 0x3: 00209 raise gException.LATInterfaceException(status) 00210 logging.info('LCB state is now %s' %(gLCB.GLCB.State[self.__lcb.state()])) 00211 00212 def __switch_lcb(self): 00213 state = self.__lcb.switch(self.__lcbmask) 00214 timeout = None 00215 if state == gLCB.GLCB.Offline: 00216 logging.error('waiting for the 20 MHz clock') 00217 timeout = 60 00218 state = self.__lcb.switch_wait(timeout) 00219 logging.info('LCB state is now %s' %(gLCB.GLCB.State[state])) 00220 00221 def __setInternal1PPS(self, cru): 00222 internal1PPS = cru.getFlag('EnableInternal1PPS', integer=True) 00223 cruConfig = cru.configuration 00224 if cruConfig & 0x1 == 0x1 and internal1PPS == 0: 00225 cruConfig &= 0xFFFE 00226 cru.configuration = cruConfig 00227 elif cruConfig & 0x1 == 0x0 and internal1PPS == 1: 00228 cruConfig |= 0x1 00229 cru.configuration = cruConfig 00230 logging.info("Enabling internal 1-PPS") 00231 00232 def initialize(self, fswmsglevel, ocsverbose, force, commander=True): 00233 self.__init_ocs(fswmsglevel, ocsverbose, force) 00234 state = self.__lcb.state() 00235 if state == gLCB.GLCB.Uninitialized: 00236 logging.info('LCB state is uninitialized, will load LCB') 00237 self.__init_power() 00238 self.__start_lcb() 00239 else: 00240 logging.info('LCB state is initialized, checking for clock') 00241 self.__switch_lcb() 00242 self.__init_oes() 00243 if commander: 00244 fabrics = gFabrics.Fabrics(self.__lcb) 00245 fabrics.init_cmdrsp(self.__cmdmask, self.__cmdmset, 00246 self.__pdumask, self.__secmask) 00247 fabrics.init_event(self.__evtmask, self.__evtmset) 00248 if self.__lat.existsCRU(): 00249 self.__setInternal1PPS(self.__lat.CRU) 00250