19from timing.common.definitions import kBoardSim, kBoardFMC, kBoardPC059, kBoardMicrozed, kBoardTLU, kBoardMIB, kBoardGIB, kBoardPC069, kBoardFIB
28def debug(obj, device):
30 Timing master commands.
32 DEVICE: uhal device identifier
34 lDevice = obj.mConnectionManager.getDevice(str(device))
36 lDevice.setTimeoutPeriod(obj.mTimeout)
38 echo(
'Created device ' + click.style(lDevice.id(), fg=
'blue'))
40 lBoardInfo = toolbox.readSubNodes(lDevice.getNode(
'io.config'),
False)
46 echo(
"Design '{}' on board '{}' on carrier '{}'".format(
47 style(kDesignNameMap[lBoardInfo[
'design_type'].value()], fg=
'blue'),
48 style(kBoardNameMap[lBoardInfo[
'board_type'].value()], fg=
'blue'),
49 style(kCarrierNameMap[lBoardInfo[
'carrier_type'].value()], fg=
'blue')
53 obj.mBoardType = lBoardInfo[
'board_type'].value()
54 obj.mCarrierType = lBoardInfo[
'carrier_type'].value()
55 obj.mDesignType = lBoardInfo[
'design_type'].value()
60@debug.command('inspect')
61@click.argument('nodes')
97 lBoardType = obj.mBoardType
98 lIO = lDevice.getNode(
'io')
101 if lBoardType
in [kBoardPC059, kBoardTLU, kBoardMIB, kBoardGIB]:
102 lUID = lDevice.getNode(
'io.i2c')
104 lUID = lDevice.getNode(
'io.uid_i2c')
106 lPROMSlave =
'UID_PROM' if lBoardType
in [kBoardTLU,kBoardMIB,kBoardGIB]
else 'FMC_UID_PROM'
108 if lBoardType == kBoardGIB:
109 lDevice.getNode(
"io.csr.ctrl.i2c_sw_rst").write(0x0)
111 lDevice.getNode(
"io.csr.ctrl.i2c_sw_rst").write(0x1)
113 print(
"switch reset")
116 lValues = lUID.get_slave(lPROMSlave).read_i2cArray(0xfa, 6)
119 lUniqueID = ( lUniqueID << 8 ) | lVal
120 echo(
"Timing Board PROM UID: "+style(hex(lUniqueID), fg=
"blue"))
125@debug.command('sfpexpander', short_help="Debug.")
128 lDevice = obj.mDevice
129 lBoardType = obj.mBoardType
131 if lBoardType != kBoardPC059:
132 secho(
'No SFP expander on {}'.format(kBoardNameMap[lBoardInfo[
'board_type'].value()]))
134 lI2CBusNode = lDevice.getNode(
"io.i2c")
135 lSFPExp = I2CExpanderSlave(lI2CBusNode, lI2CBusNode.get_slave(
'SFPExpander').get_i2c_address())
136 lSFPExpStatus = lSFPExp.debug()
148 for a,v
in enumerate(lSFPExpStatus):
149 echo(
"{} ({}): {}".format(lLabels[a], hex(a), hex(v)))
153@debug.command('scan-i2c', short_help="Debug.")
156 lDevice = obj.mDevice
157 lBoardType = obj.mBoardType
158 lIO = lDevice.getNode(
'io')
163 if lBoardType
in [kBoardFMC, kBoardPC069]:
164 lNodes = [
'io.sfp_i2c',
'io.uid_i2c',
'io.pll_i2c']
165 elif lBoardType == kBoardPC059:
166 lNodes = [
'io.i2c',
'io.usfp_i2c']
167 switch_address=lDevice.getNode(
'io.i2c').get_slave_address(
'SFP_Switch')
168 lSwitches={
"io.i2c": switch_address}
169 lSwitchChannels={
"io.i2c": 8}
170 elif lBoardType
in [kBoardTLU, kBoardMIB, kBoardGIB]:
172 if lBoardType == kBoardGIB:
173 lSwitches={
"io.i2c": 0x70}
174 lSwitchChannels={
"io.i2c": 7}
176 secho(f
"Error I don't know about board {lBoardType} : {kBoardNameMap[lBoardType]}", fg=
'red')
184 lI2CBusNode = lDevice.getNode(n)
185 echo(
'Scanning '+style(n,fg=
'cyan'))
186 print(
"reset switch")
187 lDevice.getNode(
"io.csr.ctrl.i2c_sw_rst").write(0x0)
189 lDevice.getNode(
"io.csr.ctrl.i2c_sw_rst").write(0x1)
191 lAddresses = lI2CBusNode.scan()
192 print(
" '{}': {} devices found.\n Addresses: {}".format(n, len(lAddresses),
', '.join((hex(a)
for a
in lAddresses))))
195 for switch,address
in lSwitches.items():
196 print (f
"switch {switch} address: {address}")
197 switch_channels=lSwitchChannels[switch]
198 print(f
"working with {switch}, @ adr {address}, it has {switch_channels} channels")
200 for channel
in range(0,switch_channels):
201 secho(f
"Scanning with channel {channel} enabled", fg=
'cyan')
203 lI2CBusNode.write_i2cPrimitive(address, [1<<channel])
205 secho(f
"failure configuring switch {address}")
206 lAddresses = lI2CBusNode.scan()
207 print(
" '{}': {} devices found.\n Addresses: {}".format(n, len(lAddresses),
', '.join((hex(a)
for a
in lAddresses))))
212@debug.command('pll', short_help="Debug.")
215 lDevice = obj.mDevice
216 lBoardType = obj.mBoardType
217 lIO = lDevice.getNode(
'io')
219 lI2CBusNode = lDevice.getNode(
'io.i2c')
220 lDevice.getNode(
"io.csr.ctrl.i2c_sw_rst").write(0x1)
221 lDevice.getNode(
"io.csr.ctrl.clk_gen_rst").write(0x1)
224 lI2CBusNode.write_i2cPrimitive(0x70, [1])
226 lSIChip = SI534xSlave(lI2CBusNode, 0x68)
229 lSIVersion = lSIChip.read_device_version()
230 echo(f
"PLL version {hex(lSIVersion)}")
234@debug.command('fanout-sfp-scan', short_help="Debug.")
238 lDevice = obj.mDevice
239 lBoardType = obj.mBoardType
241 if lBoardType != kBoardPC059:
242 print(
'Wrong board', lBoardType,
'sorry mate')
246 lDevice.getNode(
'io.csr.ctrl.rst_i2cmux').write(0x1)
248 lDevice.getNode(
'io.csr.ctrl.rst_i2cmux').write(0x0)
252 lSFPNodeName =
'io.i2c'
253 lI2CBusNode = lDevice.getNode(lSFPNodeName)
254 lSwitchSlave = lI2CBusNode.get_slave(
'SFP_Switch')
255 print(lSwitchSlave.ping())
260 lSwitchSlave.write_i2cPrimitive([3])
261 print(lSwitchSlave.read_i2cPrimitive(1))
262 print(lSwitchSlave.read_i2cPrimitive(1))
263 print(lSwitchSlave.read_i2cPrimitive(1))
266@debug.command('sfp-status', short_help="Debug.")
270 lDevice = obj.mDevice
271 lBoardType = obj.mBoardType
273 if lBoardType == kBoardFMC:
274 lSFPNodeName =
'io.sfp_i2c'
276 elif lBoardType == kBoardPC059:
277 lSFPNodeName =
'io.usfp_i2c'
280 secho(
'No SFP on {}'.format(kBoardNameMap[lBoardType]))
283 lI2CBusNode = lDevice.getNode(lSFPNodeName)
284 lEEPromSlave = lI2CBusNode.get_slave(
'SFP_EEProm')
285 lDiagSlave = lI2CBusNode.get_slave(
'SFP_Diag')
289 if lBoardType == kBoardPC059:
290 lDevice.getNode(
'io.csr.ctrl.rst_i2cmux').write(0x1)
292 lDevice.getNode(
'io.csr.ctrl.rst_i2cmux').write(0x0)
296 lI2CBusNode = lDevice.getNode(
'io.i2c')
297 lSwitchSlave = lI2CBusNode.get_slave(
'SFP_Switch')
298 lEEPromSlave = lI2CBusNode.get_slave(
'SFP_EEProm')
299 lDiagSlave = lI2CBusNode.get_slave(
'SFP_Diag')
304 for iSFP
in range(8):
306 lSwitchSlave.write_i2cPrimitive([1 << iSFP])
307 except RuntimeError
as lExc:
309 if not lEEPromSlave.ping():
310 secho(
'SFP {} not available'.format(iSFP),fg=
'yellow')
313 secho(
'SFP {} found'.format(iSFP),fg=
'green')
323 def asciidecode( v ):
324 return (
''.join([chr(c)
for c
in v])).rstrip()
327 lSign = -1
if ((v[0]>>7) & 0x1)
else 1
328 x = lSign*((v[0] & 0x7f) + v[1]/float(0xff))
329 return '{:.3f} C'.format(x)
332 return '{:.4f} V'.format(((v[0] << 8) + v[1])/float(10000))
334 def biascurdecode( v ):
335 return '{:.3f} mA'.format(((v[0] << 8) + v[1])*2e-3)
337 def powerdecode( v ):
338 return '{:.3f} mW'.format(((v[0] << 8) + v[1])*1e-3)
342 lVenInfoEnc = collections.OrderedDict()
343 lVenInfoEnc[
'Name'] = asciidecode(aEEProm.read_i2cArray(20,16))
344 lVenInfoEnc[
'OUI'] =
'{}.{}.{}'.format(*(aEEProm.read_i2cArray(37,3)))
345 lVenInfoEnc[
'Part Number'] = asciidecode(aEEProm.read_i2cArray(40,16))
346 lVenInfoEnc[
'Revision'] = asciidecode(aEEProm.read_i2cArray(56,4))
347 lVenInfoEnc[
'Serial Number'] = asciidecode(aEEProm.read_i2cArray(68,16))
348 lVenInfoEnc[
'Day'] = asciidecode(aEEProm.read_i2cArray(88,2))
349 lVenInfoEnc[
'Month'] = asciidecode(aEEProm.read_i2cArray(86,2))
350 lVenInfoEnc[
'Year'] = asciidecode(aEEProm.read_i2cArray(84,2))
352 secho(
"{} Vendor info".format(aLabel), fg=
'cyan')
356 echo(toolbox.formatDictTable(lVenInfoEnc, aHdr=
False, aSort=
False))
358 lLaserWl = aEEProm.read_i2cArray(60,2)
359 lLaserWl = (lLaserWl[0] << 8) + lLaserWl[1]
360 echo(
'Laser Wavelength: '+style(str(lLaserWl)+
'nm', fg=
'cyan'))
362 lRegs = collections.OrderedDict()
364 lRegs[
'Identifier'] = aEEProm.read_i2c(0)
365 lRegs[
'Ext Identifier'] = aEEProm.read_i2c(1)
366 lRegs[
'Connector'] = aEEProm.read_i2c(2)
369 lTransComp = aEEProm.read_i2cArray(3, 8)
371 lRegs[
'Encoding'] = aEEProm.read_i2c(11)
372 lRegs[
'BR, Nominal'] = aEEProm.read_i2c(12)
373 lRegs[
'Rate ID'] = aEEProm.read_i2c(13)
375 toolbox.printRegTable(lRegs, aHeader=
False, sort=
False)
378 secho(
"{} Diagnostic info".format(aLabel), fg=
'cyan')
380 lReadings = collections.OrderedDict()
382 lReadings[
'Temp'] = tempdecode(aDiag.read_i2cArray(96, 2))
383 lReadings[
'Vcc'] = vccdecode(aDiag.read_i2cArray(98, 2))
384 lReadings[
'TX bias'] = biascurdecode(aDiag.read_i2cArray(100, 2))
385 lReadings[
'TX power'] = powerdecode(aDiag.read_i2cArray(102, 2))
386 lReadings[
'RX power'] = powerdecode(aDiag.read_i2cArray(104, 2))
387 lMiscStatus = aDiag.read_i2c(110)
388 lReadings[
'TX disable'] = (lMiscStatus >> 7) & 0x1
393 echo(toolbox.formatDictTable(lReadings, aHdr=
False, aSort=
False))
397@debug.command('lm75-temp-read', short_help="Read temp data from a LM75.")
401 lDevice = obj.mDevice
402 lBoardType = obj.mBoardType
403 lIO = lDevice.getNode(
'io')
405 if lBoardType != kBoardFIB:
406 secho(f
'Only FIB (v2) supported. Board type is {lBoardType}', fg=
'red')
409 i2c_bus = lDevice.getNode(
'io.i2c')
411 lValues = i2c_bus.get_slave(
'TEMP_MON').read_i2cPrimitive(2)
412 temp_raw = (lValues[1] & 0x80) >> 7
413 temp_raw = temp_raw | (lValues[0] << 1)
414 echo(f
"LM75 temp data")
415 echo(f
" raw bytes: {hex(lValues[0])}, {hex(lValues[1])}")
416 echo(f
" combined word: {hex(temp_raw)}")
417 echo(f
" temp [C]: {toolbox.twos_complement(temp_raw,9)*0.5}")
421@debug.command('ltc2945', short_help="Read data from a LTC2945.")