1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
# MAX25-SoftModem — product definition
> **Authoritative rule:** [docs/CRDOP.md](../../../docs/CRDOP.md) · **Doc index:** [INDEX.md](INDEX.md)
## Name and role
- **Product:** MAX25-SoftModem (stack acronym **CRDOP**; plugin id `soft-crdop`)
- **Stack version:** MAX25-Stack **v1.0.0** · **Dev track:** `CUR999` in `$SRC/stacks/crdop/VERSION`
- **Stack:** MainAX25-Stack — **standard** component (built/installed unless `MAX25_BUILD_CRDOP=OFF`)
- **Nature:** Pure MAX25 in-house development — in **development and test phase**, openly documented
## Use like a hardware modem
CRDOP uses the host **sound card IN and OUT** plus a **suitable radio** (or acoustic coupling to existing RF hardware). In `max25d` it registers like any other device backend — operators use the same M25/1 flow (`SET DEVICE`, `CONNECT`, `SEND`).
```
┌──────────┐ line or acoustic ┌─────────────┐ TCP ┌─────────┐
│ Radio │ ◄──────────────────► │ CRDOP/ALSA │ ◄──────► │ max25d │
└──────────┘ └─────────────┘ └─────────┘
│
1200–19200 baud
half or full duplex
```
### Acoustic AX.25 compatibility
On the **acoustic / RF layer**, CRDOP targets **AX.25 Packet Radio** interoperability at the PHY level:
- **1200 baud Bell 202 AFSK** (1200/2200 Hz) — standard VHF/UHF and CB packet class
- **Half- and full-duplex** per radio and audio capability
- **Acoustic or line-level** coupling — valid test and field configuration
CRDOP is an **alternative modem** when the sound card is the RF interface. It does not replace an existing UART/KISS path when that path is already in use.
Interface specification for builders: [HARDWARE-INTERFACE.md](HARDWARE-INTERFACE.md). MAX25-Stack usage: [MAX25-USAGE.md](MAX25-USAGE.md).
## Protocol stack
| Layer | Policy |
|-------|--------|
| On-air / acoustic | AX.25-compatible AFSK tones (1200 baud primary) |
| Host to max25d | MAX25-native TCP control + data (see [PROTOCOL.md](PROTOCOL.md)) |
We study legacy stacks; we implement our own modem and document it for **reproducible hardware builds**.
## Sound path — kernel ALSA only
CRDOP does **not** use PulseAudio, PipeWire-as-default, or any desktop sound server.
| Layer | Function |
|-------|----------|
| **MAX25 sound-proxy** | Sole shim between modem DSP and ALSA — buffers, timing, duplex, xrun recovery |
| **libasound** | Direct `hw:` / `plughw:` opens |
| **Kernel ALSA** | Driver + `/dev/snd/*` |
| **Hardware** | Sound card → radio interface |
Configure explicit devices in `crdop.ini` `[audio]` (`capture`, `playback`). See [AUDIO-ARCHITECTURE.md](AUDIO-ARCHITECTURE.md).
## Baud scope
| Priority | Range | Status |
|----------|-------|--------|
| **P0** | **1200 baud** Bell 202 AFSK | Primary — CB + VHF on-air |
| **P1** | **9600–19200** G3RUH direct FSK | Planned after 1200 stable (VHF backbone) |
| **P2** | **300** HF AFSK | Optional |
| — | **>19200 baud** | **Not implemented** — do not configure or expect |
Full modulation matrix, RF paths, band context, delivery milestones: **[ROADMAP.md](../ROADMAP.md)**.
Higher baud rates demand **proportionally better** audio hardware (sample rate, jitter, SNR, isolation). G3RUH requires a **direct FSK radio path** — not the CB FM mic/speaker route.
## Duplex
| Mode | Status |
|------|--------|
| **Half-duplex** | Standard CB / packet-radio (PTT or VOX-style timing) |
| **Full-duplex** | Supported when radio and audio hardware allow simultaneous TX/RX paths |
Configure in `crdop.ini`: `[modem] duplex = half|full`.
## Sound card — required (not optional)
CRDOP must:
1. **Generate** precise mark/space frequencies on **playback**.
2. **Decode** those tones reliably on **capture**.
Requirements **scale with baud**:
| Baud class | Audio expectation |
|------------|-------------------|
| 1200 | Stable full-duplex or half-duplex USB codec or PCI interface; galvanic isolation to radio |
| 9600–19200 | Low-jitter interface, adequate bandwidth, verified loopback before on-air |
**Unsuitable:** onboard laptop mic/speaker shortcuts, anonymous USB “sound sticks”, Bluetooth bridges, unisolated consumer line inputs.
Document your ALSA device in INI (`[audio] capture` / `playback`) and verify with loopback or sidetone before traffic.
## Open hardware
Documentation targets builders who want to **manufacture radio ↔ sound-card interfaces**:
- Level matching (radio mic/speaker ↔ line level)
- Galvanic isolation (transformers / opto)
- PTT integration (GPIO, serial — VOX not recommended for packet)
- Acoustic coupler fixtures for bench validation
Generic interface specification: [HARDWARE-INTERFACE.md](HARDWARE-INTERFACE.md). Delivery milestones: [ROADMAP.md](../ROADMAP.md).
## Build / release (MAX25-Stack-v1.0.0)
**CRDOP dev track:** `CUR999` in `$SRC/stacks/crdop/VERSION` (ships with MAX25-Stack v1.0.0).
| Item | Shipped |
|------|---------|
| CRDOP scaffold (INI, launcher, install) | **Yes** — default CMake |
| `max25d` `crdop-tcp` backend | **Yes** — offline-tested |
| Native `crdopc` DSP binary | **In development** — in-house modem DSP |
| ARDOP / ardopcf vendor tree | **Never** in release tarball |
## HyBBX
When CRDOP is active, HyBBX Secondary attaches via `share/hybbx/crdop-host.ini.example`. HyBBX remains an external project.
## Testing phase
Current work: loopback audio, acoustic bench validation, field on-air trials, acceptable sound-card criteria. Report results via project issues — RF acceptance remains manual until automated gates exist. Developer tests: [DEVELOPER.md](DEVELOPER.md).
|