summaryrefslogtreecommitdiff
path: root/stacks/crdop/docs/SOFTMODEM.md
blob: fef0a0ea17e368b616d0c2def50d7e0ae5e8de6f (plain)
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).
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com