iRiser FAQ

How do I reset an iRiser back to factory settings?

from sanblaze import riser

slot = 1
device = riser.Riser(slot)
device.init()

init() stops the sequencer, resets GPIO to defaults, and clears sequencer memory. Use reset() if you only need to stop the sequencer and reset GPIO without clearing memory.

Which slot number should I use?

Pass the iRiser slot that matches the drive under test:

  • Rackmount (RM) systems: slots 0–18

  • Desktop (DT) systems: slots 0–4

In test scripts, use dut.slot or get_slot().

What does “iRiser5 not found” mean?

init() or reset() returns:

{'status': 1, 'reason': 'ERROR: iRiser5 not found', ...}

The requested slot has no iRiser hardware, or find_iriser does not list that slot. Verify the slot number and that the iRiser is connected. Scripts can call _is_supported() to skip tests when no iRiser is present, or pass check_hardware=True to Riser at construction.

When should I use set/clear instead of sequences?

Use set() and clear() when you need an immediate, one-shot change to a single signal with no hold time or follow-on actions.

Use add_transition() or edit_action() when transitions must be timed, chained, or synchronized with other signals (for example PERST assert, refclk off, wait 50 ms, refclk on).

To read GPIO direction and value, call get_bits(); there is no get() wrapper for a single signal name.

How do I find valid signal names?

Read GPIO after init():

from sanblaze import riser

device = riser.Riser(0)
device.init()
bits = device.get_bits(raw=True)
for bit in bits.bits:
    print(bit.name)

Common signals include perst0l, p0clkl, p1clkl, 12v, and usr1tst. See iRiser Signal Reference for a full list and Examples for a discovery example. Names are case-insensitive in add_transition().

What happens when I pass an invalid signal name?

add_transition() returns an error dict:

{'status': 1, 'reason': 'pers is a not a valid signal name'}

See Examples for a console example.

Why must I call wait_for_stopped after start_sequence?

start_sequence returns as soon as the sequencer starts. The signal transitions run asynchronously on the iRiser hardware. Call wait_for_stopped() to block until the sequence completes before issuing NVMe commands or checking drive status.

When do I need set_dir or toggle_bit?

add_transition() changes output values for named signals. For PERST and refclk scripts, you typically:

  1. Call get_bits(raw=True) after init().

  2. Set perst0l (or other driven pins) to output with bits.set_dir('perst0l', 'O').

  3. Use toggle_bit to assert/deassert individual signals while building edit_action calls.

  4. Set _next='stop' on the last action, or pass final=True to the last add_transition() call.

See the low-level example in Examples.

How do I start the power measurement service?

Power capture requires the iRiser DMA power service. If collection fails, call verify_service_status(), which starts the service with systemctl start iriser when it is not running.

Check available power rails with get_power_available(). See iRiser Power Measurement for the full capture workflow.