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
GenericStereoAuna 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(vizsx1255-fm-repeater/src/sx1255-spi.casx1255_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=onmusí být aktivní. - Výchozí ALSA zařízení: RX
hw:GenericStereoAu,1,0, TXhw: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 GMSKh=0.5př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).