1from __future__
import print_function
16from click
import echo, style, secho
17from os.path
import join, expandvars, basename
18from timing.core import SI534xSlave, I2CExpanderSlave, DACSlave
20from timing.common.definitions import kBoardSim, kBoardFMC, kBoardPC059, kBoardMicrozed, kBoardTLU, kBoardFIB, kBoardMIB, kBoardPC069, kBoardGIB, kBoardGIBV3, kFIBRev2
21from timing.common.definitions import kFMCRev1, kFMCRev2, kFMCRev3, kFMCRev4, kPC059Rev1, kTLURev1, kSIMRev1, kFIBRev1, kMIBRev1, kGIBRev1
22from timing.common.definitions import kCarrierEnclustraA35, kCarrierKC705, kCarrierMicrozed, kCarrierNexusVideo, kCarrierTrenzTE0712
23from timing.common.definitions import kDesignMaster, kDesignOuroboros, kDesignOuroborosSim, kDesignEndpoint, kDesignFanout, kDesignChronos, kDesignBoreas, kDesignTest, kDesignKerberos, kDesignGaia, kDesignCharon, kDesignHades
35@click.group('io', invoke_without_command=True)
37@click.argument('device', callback=toolbox.validate_device, shell_complete=toolbox.completeDevices)
40 Timing master commands.
42 DEVICE: uhal device identifier
44 lDevice = obj.mConnectionManager.getDevice(str(device))
46 lDevice.setTimeoutPeriod(obj.mTimeout)
48 echo(
'Created device ' + click.style(lDevice.id(), fg=
'blue'))
49 lTopDesign = lDevice.getNode(
'')
50 lBoardInfo = toolbox.readSubNodes(lDevice.getNode(
'io.config'),
False)
53 if lBoardInfo[
'board_type'].value()
in kLibrarySupportedBoards
and lBoardInfo[
'design_type'].value()
in kLibrarySupportedDesigns:
54 lTopDesign.validate_firmware_version()
56 echo(
"Design '{}' on board '{}' on carrier '{}' with frequency {} MHz".format(
57 style(kDesignNameMap[lBoardInfo[
'design_type'].value()], fg=
'blue'),
58 style(kBoardNameMap[lBoardInfo[
'board_type'].value()], fg=
'blue'),
59 style(kCarrierNameMap[lBoardInfo[
'carrier_type'].value()], fg=
'blue'),
60 style(str(lBoardInfo[
'clock_frequency'].value()/1e6), fg=
'blue')
65 obj.mBoardType = lBoardInfo[
'board_type'].value()
66 obj.mCarrierType = lBoardInfo[
'carrier_type'].value()
67 obj.mDesignType = lBoardInfo[
'design_type'].value()
72@io.command('reset', short_help="Perform a hard reset on the timing master.")
73@click.option('--soft', '-s', is_flag=True, default=False, help='Soft reset i.e. skip the clock chip configuration.')
74@click.option('--clock-source', 'clocksource', type=click.Choice(ClockSource.__members__.keys()), help=
'Manually specify clock source, free-running, upstream, etc..')
75@click.option('--force-pll-cfg', 'forcepllcfg', type=click.Path(exists=True), help=
'Manually specify clock config file' )
78def reset(ctx, obj, soft, clocksource, forcepllcfg):
80 Perform a hard reset on a timing board, including
85 - pll and pll configuration
88 echo(
'Resetting ' + click.style(obj.mDevice.id(), fg=
'blue'))
91 lBoardType = obj.mBoardType
92 lDesignType = obj.mDesignType
94 lIO = lDevice.getNode(
'io')
96 if lBoardType
in kLibrarySupportedBoards:
102 if forcepllcfg
is not None:
103 if clocksource
is not None:
104 secho(
"You specified both a clock source for automatic clock config file look-up, and an explicit clock config file. Explicit clock config file will take precedence.", fg=
'yellow')
106 lIO.reset(forcepllcfg)
108 if clocksource
is None:
109 lClockSource = toolbox.get_default_clock_source(
110 lDesignType, lBoardType)
111 if lClockSource
is None:
112 secho(f
"Unable to match a default clock source for {kDesignNameMap[lDesignType]} on {kBoardNameMap[lBoardType]}\nReset failed!".format(), fg=
'red')
115 secho(f
"Default clock config selected for {kDesignNameMap[lDesignType]} on {kBoardNameMap[lBoardType]} is: {lClockSource}", fg=
'yellow')
117 lClockSource=ClockSource.__members__[clocksource]
127 lIO.reset(lClockSource)
128 ctx.invoke(clkstatus)
130 secho(
"Board identifier {} not supported by timing library".format(lBoardType), fg=
'yellow')
135@io.command('freq', short_help="Measure some frequencies.")
138 lDevice = obj.mDevice
139 lBoardType = obj.mBoardType
140 lIO = lDevice.getNode(
'io')
142 secho(
"PLL Clock frequency measurement:", fg=
'cyan')
144 if lBoardType
in kLibrarySupportedBoards:
145 echo(lIO.get_clock_frequencies_table())
147 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
149 if lBoardType == kBoardMIB:
153 secho(
'MIB clock freqs', fg=
'green')
160@click.option('-v', 'verbose', is_flag=True)
163 lDevice = obj.mDevice
164 lBoardType = obj.mBoardType
165 lIO = lDevice.getNode(
'io')
167 if lBoardType
in kLibrarySupportedBoards:
168 ctx.invoke(print_hardware_info)
169 echo(lIO.get_status())
171 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
176@io.command('clk-status')
179@click.option('-v', 'verbose', is_flag=True)
182 lDevice = obj.mDevice
183 lDesignType = obj.mDesignType
184 lIO = lDevice.getNode(
'io')
185 lBoardType = obj.mBoardType
193 if lBoardType
in kLibrarySupportedBoards:
194 echo(lIO.get_pll_status())
196 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
201@io.command('dac-setup')
202@click.argument('value', type=click.IntRange(0,0xffff))
207 lDevice = obj.mDevice
208 lBoardType = obj.mBoardType
209 lIO = lDevice.getNode(
'io')
211 if lBoardType == kBoardTLU:
212 lIO.configure_dac(0,value)
213 lIO.configure_dac(1,value)
214 secho(
"DAC1 and DAC2 set to " + hex(value), fg=
'cyan')
216 secho(
"DAC setup only supported for TLU")
220@io.command('sfp-status', short_help="Read SFP parameters.")
223@click.option('--sfp-id', 'sfp_id', required=False, type=click.IntRange(0, 8), help=
'SFP id to query.')
229 lDevice = obj.mDevice
230 lBoardType = obj.mBoardType
231 lCarrierType = obj.mCarrierType
232 lDesignType = obj.mDesignType
234 lIO = lDevice.getNode(
'io')
237 if lBoardType
in kLibrarySupportedBoards:
238 ctx.invoke(print_hardware_info)
239 if sfp_id
is not None:
240 echo(lIO.get_sfp_status(sfp_id))
242 if lBoardType
in [kBoardFMC, kBoardTLU, kBoardPC069]:
243 echo(lIO.get_sfp_status(0))
244 elif lBoardType
in [ kBoardPC059, kBoardFIB, kBoardMIB,
245 kBoardGIB, kBoardGIBV3 ]:
247 if lBoardType == kBoardPC059:
249 elif lBoardType == kBoardFIB:
251 elif lBoardType == kBoardMIB:
253 elif lBoardType == kBoardGIB:
255 elif lBoardType == kBoardGIBV3:
257 for i
in range(lSFPIDRange):
259 echo(lIO.get_sfp_status(i))
261 except Exception
as e:
262 if isinstance(e, RuntimeError)
and str(e) ==
" I2C bus: i2c error. Transfer finished but bus still busy I2CException on bus: i2c":
263 secho(f
"Bad SFP {i} found with exception:")
265 if lBoardType
in [kBoardGIB, kBoardGIBV3]:
266 secho(
"resetting i2c after failure\n", fg=
'yellow')
267 lDevice.getNode(
"io.csr.ctrl.i2c_sw_rst").write(0x0)
269 lDevice.getNode(
"io.csr.ctrl.i2c_sw_rst").write(0x1)
272 secho(f
"SFP {i} status gather failed with exception:", fg=
'red')
276 secho(f
"I don't know how many SFPs there are for board: {timing.common.definitions.BoardType(lBoardType)}\n", fg=
'red')
279 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
284@io.command('switch-sfp-tx', short_help="Control sfp tx")
287@click.option('--sfp-id', 'sfp_id', required=False, type=click.IntRange(0, 8), help=
'SFP id to query.')
288@click.option('--on/--off', default=False, help='enable/disable tx; default: FALSE')
291 Toggle SFP tx disable reg (if supported)
294 lDevice = obj.mDevice
295 lBoardType = obj.mBoardType
296 lCarrierType = obj.mCarrierType
297 lDesignType = obj.mDesignType
299 lIO = lDevice.getNode(
'io')
301 if lBoardType
in kLibrarySupportedBoards:
302 ctx.invoke(print_hardware_info)
306 lIO.switch_sfp_tx(lSFP, on)
308 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
313@io.command('switch-sfp-mux', short_help="Switch sfp mux")
314@click.argument('mux', type=int)
318 lDevice = obj.mDevice
319 lBoardType = obj.mBoardType
320 lIO = lDevice.getNode(
'io')
322 if lBoardType
in [kBoardPC059]:
324 echo(
"Setting sfp mux channel: {}".format(mux))
325 lIO.switch_sfp_mux_channel(mux)
328 raise RuntimeError(
'Board {} does not have a sfp mux!'.format(kBoardNameMap[lBoardType]))
332@io.command('print-hardware-info')
337 lDevice = obj.mDevice
338 lBoardType = obj.mBoardType
339 lIO = lDevice.getNode(
'io')
341 if lBoardType
in kLibrarySupportedBoards:
343 echo(lIO.get_hardware_info())
345 secho(
"Failed to retrieve hardware information! I2C issue? Initial board reset needed?", fg=
'yellow')
346 e = sys.exc_info()[0]
347 secho(
"Error: {}".format(e), fg=
'red')
349 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
354@io.command('temp', short_help="Read board temperature")
358 lDevice = obj.mDevice
359 lBoardType = obj.mBoardType
360 lIO = lDevice.getNode(
'io')
362 if lBoardType
in [kBoardFIB]:
363 temp = lIO.read_board_temperature()
364 echo(f
"Board temp: {temp} [C]")
366 raise RuntimeError(
'Board {} does not have a temp reading!'.format(kBoardNameMap[lBoardType]))
status(ctx, obj, verbose)
sfpstatus(ctx, obj, sfp_id)
print_hardware_info(ctx, obj)
dacsetup(ctx, obj, value)
reset(ctx, obj, soft, clocksource, forcepllcfg)
switchsfptx(ctx, obj, sfp_id, on)
clkstatus(ctx, obj, verbose)