This page lists what is not implemented, what is only descriptive, and what is known to be unreliable, so you can plan around it. Where a field or feature exists in a schema but has no effect, it is listed here.
Reliability of the bench#
- Bad boots. About one boot in eight fails in the first DMA transfer after the PL comes out of reset, and some of those freeze the SoC. No observable distinguishes a bad boot in advance. Prove every boot with a byte-exact PL loopback before measuring, and count freezes rather than hiding them.
- Boot-to-boot variability. The same configuration can behave differently from one boot to the next, on the PL loopback as well as on the air path. Repeat measurements and their controls across reboots before drawing conclusions.
- One chain target per boot. Switching a boot between the PL loopback and the air target has been measured to wedge the datapath.
- Busy datapath after a loopback measurement. Later profile applies can time out in WAIT_SAFE until a reboot.
- Channel commits under dense traffic. The profile sequencer only commits while the datapath is idle, so channel changes during a dense feed can be staged and not applied (the run says so).
Modulation, rates and coding#
- Modulations: BPSK, QPSK and GMSK only. OQPSK, MSK, π/4-DQPSK, FSK and GFSK are refused.
- GMSK is approximated: an MSK-style continuous-phase modulator without a Gaussian filter, and a non-coherent discriminator. It works against itself; interoperability with a real GMSK radio is not established. It exposes no EVM.
- Four samples per symbol, fixed at synthesis.
phy.samples_per_symbolother than 4 is refused;matched_filter.spsis inert. - Symbol rates: a fixed ladder from 19 531.25 to 2 500 000 baud. 9600-baud spacecraft links cannot be matched.
- Reed-Solomon uses the conventional basis, not the CCSDS dual basis: interoperability with third-party CCSDS RS implementations is not guaranteed.
- No LDPC, turbo or polar codes:
fec.type: ldpc|turbo|polarconfigures the chain as uncoded without an error. - No interleaver, no line coding:
framing.interleaverandphy.encodingare descriptive. - Frame lengths: Reed-Solomon imposes 223-byte messages, which do not divide the 4096-byte DMA block, so slot framing and CCSDS transfer frames cannot be combined with Reed-Solomon.
- Scrambler polynomial is fixed;
scrambler.polynomialis descriptive. - The Viterbi decoder is hard-decision.
- CCSDS layers not implemented: SDLS security, COP-1 (FARM/FOP-1; the OCF is carried as four opaque bytes), AOS frame header error control, BCH error correction on TC decode (detection only), USLP CRC-32 FECF (refused). Transfer frames larger than one PL frame are refused, not segmented.
- Carrier-loop pull-in range has not been characterised in general. On the PL loopback path the acquisition aids are off, so a channel frequency offset of a few hundred hertz can stop the link.
Profile fields with no effect#
| Field | Status |
|---|---|
radio.rf_port | Descriptive; the modem always uses TX1/RX1 (RX port A) |
radio.duplex | Descriptive; conditioning sets FDD |
radio.tx_power_dbm > 0 | Refused at apply: the part's TX gain is an attenuation |
phy.freq_deviation_hz, phy.encoding | Descriptive |
framing.scrambler.polynomial, framing.interleaver | Descriptive |
framing.fec.rate | Required with coding, selects nothing |
packet.* | Descriptive: packets are built per request |
bus.* | Descriptive: the host link is the daemon's configuration |
timing.*, constraints.* | Descriptive: nothing enforces turnaround, timeouts, rate or duty cycle |
observability.metrics | Descriptive: the daemon publishes a fixed metric set |
metadata.vendor, family, revision | Descriptive |
Unknown keys in profiles and scenarios are ignored without an error.
Scenario DSL#
artifacts.*flags are descriptive: every report carries its events, assertions and samples.topology.role,topology.rf_portandtopology.bus_bindingsare descriptive;interface:on a step publishes a copy on a scenario endpoint, it does not route the packet.- Scenario runs inject packets in stream framing and observe whole DMA blocks; match expected
packets on
payload_contains_hex. rf.*metrics are model values and never verified.- The channel emulator exists only on the PL loopback path;
path_loss_dbandsnr_dbare relative, not physical, quantities. - Campaign
rebootandpower_cyclesteps are not performed by the daemon's shipped board provider.
Instruments#
- Lock flags are indicators, not proof: the timing lock says nothing about the carrier, and a loop can read locked on a rotating constellation. Prove links with frames and bytes.
rssi_dbmis monotonic but its absolute calibration offset is not set (about 13 dB off).part_rssi_dbis referred to the AD9361's input and depends on its uncalibrated gain table; use it for comparisons, not absolute levels.evmis meaningless on GMSK.ber_asmsaturates near 3·10⁻².- No per-frame FEC/CRC verdict in the PL;
/api/v1/framesrows carry none. Use transfer frames with a FECF for a per-frame verdict. BUILD_IDis0xDEADBEEFon every build, and is also what an unimplemented register offset returns: software cannot tell bitstreams apart at runtime.- The
fft_monitorPL block does not fit the device; the spectrum is computed by the PS from captured blocks instead. The IQ recorder's pre-trigger window is not implemented. - The output level calibration (
P_board ≈ att + 15.8 dBm) was taken on one board at 437 MHz between −30 and −10 dB of attenuation.
Platform#
- No real-time clock. Every board timestamp counts from boot unless the clock is seeded.
- RAM-disk root filesystem. Reports, uploaded scenarios, IQ captures, logs and hand-deployed binaries are lost at reboot; profiles pushed over HTTP live in memory only.
- Small persistent storage (
/mnt/jffs2, about 900 KB) is reserved for campaign cursors and the reset log. - Only one scenario runs at a time; a second launch is refused.
- Authentication is off by default, and the board ships with the stock Pluto SSH credentials. Keep the bench on a trusted network.
- The second RF channel (TX2/RX2) is not used by the modem, and whether the boards route it is not established.
- The LibreSDR product board shares the design and the timing constraints, but has not been validated on hardware to the extent the fishball has.
- Only ZeroMQ is implemented in the link service (NATS and MQTT are not).