All docsStellar LinkRF bench · by Stellar Systems v0.1.0

Troubleshooting

Known Limitations

What SatLink does not do, does only partly, or does not yet do reliably: modulations, rates, profile fields, coding, the RF path, instruments and platform.

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_symbol other than 4 is refused; matched_filter.sps is 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|polar configures the chain as uncoded without an error.
  • No interleaver, no line coding: framing.interleaver and phy.encoding are 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.polynomial is 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#

FieldStatus
radio.rf_portDescriptive; the modem always uses TX1/RX1 (RX port A)
radio.duplexDescriptive; conditioning sets FDD
radio.tx_power_dbm > 0Refused at apply: the part's TX gain is an attenuation
phy.freq_deviation_hz, phy.encodingDescriptive
framing.scrambler.polynomial, framing.interleaverDescriptive
framing.fec.rateRequired 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.metricsDescriptive: the daemon publishes a fixed metric set
metadata.vendor, family, revisionDescriptive

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_port and topology.bus_bindings are 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_db and snr_db are relative, not physical, quantities.
  • Campaign reboot and power_cycle steps 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_dbm is monotonic but its absolute calibration offset is not set (about 13 dB off).
  • part_rssi_db is referred to the AD9361's input and depends on its uncalibrated gain table; use it for comparisons, not absolute levels.
  • evm is meaningless on GMSK.
  • ber_asm saturates near 3·10⁻².
  • No per-frame FEC/CRC verdict in the PL; /api/v1/frames rows carry none. Use transfer frames with a FECF for a per-frame verdict.
  • BUILD_ID is 0xDEADBEEF on every build, and is also what an unimplemented register offset returns: software cannot tell bitstreams apart at runtime.
  • The fft_monitor PL 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).

Stellar Link · v0.1.0

↑↓ to moveEnter to open