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, 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)
109 if clocksource
is None:
110 if lDesignType
in [kDesignMaster, kDesignBoreas, kDesignOuroboros, kDesignOuroborosSim]:
111 lClockSource=kFreeRun
112 elif lDesignType
in [kDesignEndpoint, kDesignChronos, kDesignHades, kDesignCharon]:
114 elif lDesignType == kDesignFanout:
115 if lBoardType == kBoardFIB:
117 elif lBoardType == kBoardPC059:
119 elif lDesignType
in [kDesignGaia, kDesignKerberos]:
122 if lClockSource
is None:
123 secho(f
"Unable to match a default clock source for {kDesignNameMap[lDesignType]} on {kBoardNameMap[lBoardType]}\nReset failed!".format(), fg=
'red')
126 secho(f
"Default clock config selected for {kDesignNameMap[lDesignType]} on {kBoardNameMap[lBoardType]} is: {lClockSource}", fg=
'yellow')
128 lClockSource=ClockSource.__members__[clocksource]
138 lIO.reset(lClockSource)
139 ctx.invoke(clkstatus)
141 secho(
"Board identifier {} not supported by timing library".format(lBoardType), fg=
'yellow')
146@io.command('freq', short_help="Measure some frequencies.")
149 lDevice = obj.mDevice
150 lBoardType = obj.mBoardType
151 lIO = lDevice.getNode(
'io')
153 secho(
"PLL Clock frequency measurement:", fg=
'cyan')
155 if lBoardType
in kLibrarySupportedBoards:
156 echo(lIO.get_clock_frequencies_table())
158 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
160 if lBoardType == kBoardMIB:
164 secho(
'MIB clock freqs', fg=
'green')
171@click.option('-v', 'verbose', is_flag=True)
174 lDevice = obj.mDevice
175 lBoardType = obj.mBoardType
176 lIO = lDevice.getNode(
'io')
178 if lBoardType
in kLibrarySupportedBoards:
179 ctx.invoke(print_hardware_info)
180 echo(lIO.get_status())
182 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
187@io.command('clk-status')
190@click.option('-v', 'verbose', is_flag=True)
193 lDevice = obj.mDevice
194 lDesignType = obj.mDesignType
195 lIO = lDevice.getNode(
'io')
196 lBoardType = obj.mBoardType
204 if lBoardType
in kLibrarySupportedBoards:
205 echo(lIO.get_pll_status())
207 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
212@io.command('dac-setup')
213@click.argument('value', type=click.IntRange(0,0xffff))
218 lDevice = obj.mDevice
219 lBoardType = obj.mBoardType
220 lIO = lDevice.getNode(
'io')
222 if lBoardType == kBoardTLU:
223 lIO.configure_dac(0,value)
224 lIO.configure_dac(1,value)
225 secho(
"DAC1 and DAC2 set to " + hex(value), fg=
'cyan')
227 secho(
"DAC setup only supported for TLU")
231@io.command('sfp-status', short_help="Read SFP parameters.")
234@click.option('--sfp-id', 'sfp_id', required=False, type=click.IntRange(0, 8), help=
'SFP id to query.')
240 lDevice = obj.mDevice
241 lBoardType = obj.mBoardType
242 lCarrierType = obj.mCarrierType
243 lDesignType = obj.mDesignType
245 lIO = lDevice.getNode(
'io')
248 if lBoardType
in kLibrarySupportedBoards:
249 ctx.invoke(print_hardware_info)
250 if sfp_id
is not None:
251 echo(lIO.get_sfp_status(sfp_id))
253 if lBoardType
in [kBoardFMC, kBoardTLU, kBoardPC069]:
254 echo(lIO.get_sfp_status(0))
255 elif lBoardType
in [ kBoardPC059, kBoardFIB, kBoardMIB, kBoardGIB ]:
257 if lBoardType == kBoardPC059:
259 elif lBoardType == kBoardFIB:
261 elif lBoardType == kBoardMIB:
263 elif lBoardType == kBoardGIB:
265 for i
in range(lSFPIDRange):
267 echo(lIO.get_sfp_status(i))
270 secho(f
"SFP {i} status gather failed\n", fg=
'red')
273 secho(f
"I don't know how many SFPs there are for board: {timing.common.definitions.BoardType(lBoardType)}\n", fg=
'red')
276 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
281@io.command('switch-sfp-tx', short_help="Control sfp tx")
284@click.option('--sfp-id', 'sfp_id', required=False, type=click.IntRange(0, 8), help=
'SFP id to query.')
285@click.option('--on/--off', default=False, help='enable/disable tx; default: FALSE')
288 Toggle SFP tx disable reg (if supported)
291 lDevice = obj.mDevice
292 lBoardType = obj.mBoardType
293 lCarrierType = obj.mCarrierType
294 lDesignType = obj.mDesignType
296 lIO = lDevice.getNode(
'io')
298 if lBoardType
in kLibrarySupportedBoards:
299 ctx.invoke(print_hardware_info)
303 lIO.switch_sfp_tx(lSFP, on)
305 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
310@io.command('switch-sfp-mux', short_help="Switch sfp mux")
311@click.argument('mux', type=int)
315 lDevice = obj.mDevice
316 lBoardType = obj.mBoardType
317 lIO = lDevice.getNode(
'io')
319 if lBoardType
in [kBoardPC059]:
321 echo(
"Setting sfp mux channel: {}".format(mux))
322 lIO.switch_sfp_mux_channel(mux)
325 raise RuntimeError(
'Board {} does not have a sfp mux!'.format(kBoardNameMap[lBoardType]))
329@io.command('print-hardware-info')
334 lDevice = obj.mDevice
335 lBoardType = obj.mBoardType
336 lIO = lDevice.getNode(
'io')
338 if lBoardType
in kLibrarySupportedBoards:
340 echo(lIO.get_hardware_info())
342 secho(
"Failed to retrieve hardware information! I2C issue? Initial board reset needed?", fg=
'yellow')
343 e = sys.exc_info()[0]
344 secho(
"Error: {}".format(e), fg=
'red')
346 secho(
"Board {} not supported by timing library".format(lBoardType), fg=
'yellow')
351@io.command('temp', short_help="Read board temperature")
355 lDevice = obj.mDevice
356 lBoardType = obj.mBoardType
357 lIO = lDevice.getNode(
'io')
359 if lBoardType
in [kBoardFIB]:
360 temp = lIO.read_board_temperature()
361 echo(f
"Board temp: {temp} [C]")
363 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)