You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.3 KiB

Integrace SX1255 HAT do DStarRepeater

Autor SX1255 podpory: Karel Kadlec (OK1LBC) xkk@post.cz

Analýza stávající architektury

dstarrepeaterd odděluje transport (jak se vzorky dostanou do/z rádia) od D-STAR protokolového stroje. Klíčové rozhraní je CModem (Common/Modem.h):

  • RX: driver vlastní I/O vlákno, dekóduje data a tlačí je do m_rxData (DSMTT_HEADER, DSMTT_DATA, DSMTT_EOT, ...).
  • TX: repeater volá writeHeader() / writeData() / getSpace() / isTXReady() / isTX().

CSoundCardController (Common/SoundCardController.*) už obsahuje kompletní D-STAR engine: GMSK modulaci/demodulaci, hledání synchronizačních vzorů, FEC (Viterbi), prokládání a scrambling. Pracuje se zvukovou kartou na 48 kHz (výstup z diskriminátoru rádia pro RX, audio do mikrofonu pro TX).

SX1255 HAT je jiný typ transportu:

  • přímé I/Q vzorky přes I2S ALSA kartu GenericStereoAu na 125 kHz (S32_LE, 2 kanály),
  • konfigurace (frekvence RX/TX, režim RX/TX, gain, ...) přes Linux SPI (/dev/spidev0.0),
  • režim se přepíná registrem 0x00 (viz sx1255-fm-repeater/src/sx1255-spi.c a sx1255_repeater.c).

Protože D-STAR engine je identický, integrace jen nahrazuje audio transport.

Provedené změny

Nový driver CSX1255Controller (Common/SX1255Controller.{h,cpp})

Dědí z CSoundCardController, takže znovu používá celý D-STAR engine (GMSK/FEC/scrambling) beze změny. Přepisuje pouze:

  • start() – otevře SPI, resetuje a inicializuje čip, nastaví frekvence, přepne do RX režimu, otevře ALSA I/Q zařízení a spustí tři vlákna.
  • stop() – ukončí vlákna, vypne čip, zavře SPI/ALSA.
  • isTX() – hlásí aktivní vysílání podle dat v TX bufferu.

Signálová cesta:

  • RX: 125 kHz I/Q → DC blok → komplexní směšovač (RXShift) → LPF + decimace 5 → 25 kHz → FM diskriminátor → lineární resampling na 48 kHz → zděděný CSoundCardController::entry() (GMSK demod + FEC).
  • TX: zděděný GMSK baseband 48 kHz → FM modulátor (deviace TXDeviation) → sample-and-hold upsample na 125 kHz → S32_LE I/Q.

TX front-end se přes SPI zapíná jen když teče D-STAR data a po ~50 ms nečinnosti se vypne, aby repeater v klidu nevyzařoval nemodulovanou nosnou.

Konfigurace

Nová sekce [SX1255] v dstarrepeater.ini (výchozí hodnoty viz Data/dstarrepeater.ini.example). Parser rozšiřuje CDStarRepeaterConfig::getSX1255().

Zapojení do výběru modemu

DStarRepeaterApp.cpp instancuje CSX1255Controller pro [Modem] Type=SX1255. Přidáno do Common/Makefile.

Build

make -j$(nproc) MQTT=0 GPIO=0   # SX1255 potřebuje jen ALSA, SPI (ioctl) a nic navíc

SPI se používá přes ioctl(SPI_IOC_MESSAGE), takže pro SPI není potřeba žádná další knihovna.

Reset pinu se provádí primárně přes libgpiod (v2 API, načítané dynamicky přes dlopen, takže není potřeba libgpiod-dev ani linkování). Nakonfiguruje se dvojicí:

ResetChip=/dev/gpiochip4   # na Pi 5 pinctrl-rp1; na Pi Zero 2 /dev/gpiochip0
ResetLine=25

Pokud ResetChip není nastaven, použije se legacy sysfs cesta ResetGPIO (globální číslo pinu). Při chybějícím reset pinu se čip považuje za již zinicializovaný.

PA PTT výstup

Volitelně se dá ovládat externí koncový zesilovač (PA) samostatným GPIO pínem, který se spíná při vysílání:

PTTChip=/dev/gpiochip0
PTTLine=17          # BCM GPIO_17
PTTInvert=0         # 0 = aktivní HIGH, 1 = aktivní LOW

Prázdný PTTChip funkci vypíná. PTT se sepne před zapnutím TX front-endu SX1255 a rozepne po dokončení vysílání.

Poznámky k nasazení

  • Overlay genericstereoaudiocodec + dtparam=spi=on musí být aktivní.
  • Výchozí ALSA zařízení: RX hw:GenericStereoAu,1,0, TX hw:GenericStereoAu,0,0.
  • RXShift (výchozí -25000 Hz) ladí RX syntezátor o tento posun níž (RXFrequency + RXShift) a vrací signál směšovačem k nule, aby se vyhnul DC špičce LO.
  • TXDeviation (výchozí 1200 Hz) odpovídá D-STAR GMSK h=0.5 při 4800 baud.
  • Reset přes gpiod: ResetChip=/dev/gpiochip4, ResetLine=25 (Pi 5, pinctrl-rp1); na Pi Zero 2 typicky /dev/gpiochip0.
  • PA PTT přes gpiod: PTTChip=/dev/gpiochip0, PTTLine=17, PTTInvert=0 (na Pi Zero 2 W; pin GPIO_17).

Powered by TurnKey Linux.