Add Starlight docs for v3.02 signal monitoring and RF analysis tools
New pages (Diátaxis framework): - tools/skywalker.mdx: reference for all 5 skywalker.py modes - tools/spectrum-analysis.mdx: how-to guide for RF analysis workflows - hardware/rf-coverage.mdx: explanation of LNB shifting and L-band coverage Updated pages: - firmware/custom-v301.mdx: v3.02 commands (0xB7-0xB9) with protocol docs - usb/vendor-commands.mdx: signal monitoring command reference - astro.config.mjs: sidebar entries and firmware version label
This commit is contained in:
parent
23055f34ab
commit
3f970967c4
6 changed files with 747 additions and 19 deletions
|
|
@ -1,11 +1,16 @@
|
|||
---
|
||||
title: Custom Firmware v3.01.0
|
||||
description: Open-source SDCC + fx2lib replacement firmware with diagnostic commands, spectrum sweep, and blind scan.
|
||||
title: Custom Firmware v3.01–v3.02
|
||||
description: Open-source SDCC + fx2lib replacement firmware with diagnostic commands, spectrum sweep, blind scan, and signal monitoring modes.
|
||||
---
|
||||
|
||||
import { Steps, Badge, Aside, Tabs, TabItem, FileTree } from '@astrojs/starlight/components';
|
||||
|
||||
The custom v3.01.0 firmware is an open-source replacement for the stock SkyWalker-1 FX2 firmware, built with the SDCC compiler and fx2lib library. It implements all stock vendor commands for kernel driver compatibility and adds new diagnostic, spectrum sweep, and blind scan capabilities. <Badge text="Custom" variant="success" />
|
||||
The custom firmware is an open-source replacement for the stock SkyWalker-1 FX2 firmware, built with the SDCC compiler and fx2lib library. It implements all stock vendor commands for kernel driver compatibility and adds diagnostic, spectrum sweep, blind scan, and signal monitoring capabilities. <Badge text="Custom" variant="success" />
|
||||
|
||||
| Version | Date | New Commands | Purpose |
|
||||
|---------|------|-------------|---------|
|
||||
| v3.01.0 | 2026-02-12 | `0xB0`--`0xB6` | Spectrum sweep, raw demod access, blind scan, hardware diagnostics |
|
||||
| v3.02.0 | 2026-02-12 | `0xB7`--`0xB9` | Signal monitoring, tune-and-measure, batch register read |
|
||||
|
||||
## Project Structure
|
||||
|
||||
|
|
@ -123,6 +128,59 @@ EP0BUF[0] = val;
|
|||
bcm_indirect_write(page, val);
|
||||
```
|
||||
|
||||
## Signal Monitoring Commands (v3.02)
|
||||
|
||||
Three new commands (`0xB7`--`0xB9`) optimize the USB protocol for spectrum analysis and real-time signal monitoring: <Badge text="v3.02" variant="success" />
|
||||
|
||||
| Command | Name | Direction | Payload | Purpose |
|
||||
|---------|------|-----------|---------|---------|
|
||||
| `0xB7` | SIGNAL_MONITOR | IN | 8 bytes | Fast combined read: SNR + AGC + lock + status |
|
||||
| `0xB8` | TUNE_MONITOR | OUT+IN | 10 bytes each | Tune + dwell + read in one round-trip |
|
||||
| `0xB9` | MULTI_REG_READ | IN | 1--64 bytes | Batch read contiguous indirect registers |
|
||||
|
||||
### Signal Monitor (0xB7)
|
||||
|
||||
Combines six indirect register reads and two direct register reads into a single 8-byte USB transfer. Replaces three separate transfers (`GET_SIGNAL_STRENGTH` + `GET_SIGNAL_LOCK` + individual register reads) with one.
|
||||
|
||||
```c title="SIGNAL_MONITOR response format (8 bytes)"
|
||||
Bytes 0-1: SNR (u16 LE, indirect regs 0x00-0x01, dBu × 256)
|
||||
Bytes 2-3: AGC1 (u16 LE, indirect regs 0x02-0x03)
|
||||
Bytes 4-5: AGC2 (u16 LE, indirect regs 0x04-0x05)
|
||||
Byte 6: Lock (direct reg 0xA4, bit 5 = locked)
|
||||
Byte 7: Status (direct reg 0xA2)
|
||||
```
|
||||
|
||||
Enables ~50 Hz polling for real-time dish alignment feedback.
|
||||
|
||||
### Tune Monitor (0xB8)
|
||||
|
||||
Combines tune + configurable dwell + signal read into one command round-trip. This is the building block for host-driven spectrum sweeps.
|
||||
|
||||
The command uses two USB control transfers sharing the same bRequest code, distinguished by direction:
|
||||
|
||||
```c title="TUNE_MONITOR protocol"
|
||||
// Phase 1: OUT (0x40) — host sends 10-byte tune payload
|
||||
// wValue = dwell_ms (1-255), firmware tunes, waits, reads signal
|
||||
// Phase 2: IN (0xC0) — host reads 10-byte result
|
||||
// Bytes 0-5: SNR(2) + AGC1(2) + AGC2(2)
|
||||
// Byte 6: lock, Byte 7: status
|
||||
// Bytes 8-9: dwell_ms echo (u16 LE)
|
||||
```
|
||||
|
||||
<Aside type="note">
|
||||
The OUT phase blocks for the full dwell time inside the FX2 vendor command handler. The USB STATUS phase does not complete until `handle_vendorcommand()` returns. With a maximum dwell of 255 ms and a USB timeout of 2000 ms, this is well within safe bounds.
|
||||
</Aside>
|
||||
|
||||
### Multi Register Read (0xB9)
|
||||
|
||||
Batch-reads up to 64 contiguous BCM4500 indirect registers in a single USB transfer. Each register still requires an individual I2C read sequence internally, but eliminating 63 USB control transfer round-trips provides ~64× speedup for register exploration.
|
||||
|
||||
```c title="MULTI_REG_READ parameters"
|
||||
wValue = start register number
|
||||
wIndex = count (1-64)
|
||||
Returns: count bytes, one per register
|
||||
```
|
||||
|
||||
## BCM4500 Boot Sequence
|
||||
|
||||
The `bcm4500_boot()` function replicates the stock firmware's initialization with added diagnostic instrumentation. The `boot_stage` variable tracks progress for debugging failed boots.
|
||||
|
|
@ -250,19 +308,21 @@ Initial state after `TD_Init()`:
|
|||
|
||||
## Differences from Stock Firmware
|
||||
|
||||
| Feature | Stock v2.06 | Custom v3.01 |
|
||||
|---------|-------------|--------------|
|
||||
| Toolchain | Unknown (proprietary) | SDCC + fx2lib (open source) |
|
||||
| I2C timeout | None (infinite spin) | 6000-count (~5 ms) |
|
||||
| Boot diagnostics | None | Incremental debug modes |
|
||||
| New commands | None | 7 commands (`0xB0`--`0xB6`) |
|
||||
| Spectrum sweep | Not possible | `0xB0` with configurable step |
|
||||
| Blind scan | Not possible | `0xB3` with SR sweep |
|
||||
| Raw register access | Not possible | `0xB1`/`0xB2` |
|
||||
| I2C bus scan | Not possible | `0xB4` |
|
||||
| GPIO read | Not possible | `0xB6` |
|
||||
| Anti-tampering | Present (v2.13) | Removed |
|
||||
| Source available | No | Yes (`firmware/skywalker1.c`) |
|
||||
| Feature | Stock v2.06 | Custom v3.01 | Custom v3.02 |
|
||||
|---------|-------------|--------------|--------------|
|
||||
| Toolchain | Unknown (proprietary) | SDCC + fx2lib (open source) | Same |
|
||||
| I2C timeout | None (infinite spin) | 6000-count (~5 ms) | Same |
|
||||
| Boot diagnostics | None | Incremental debug modes | Same |
|
||||
| Custom commands | None | 7 (`0xB0`--`0xB6`) | 10 (`0xB0`--`0xB9`) |
|
||||
| Spectrum sweep | Not possible | `0xB0` via EP2 bulk | `0xB8` via control EP (host-driven) |
|
||||
| Blind scan | Not possible | `0xB3` with SR sweep | Same |
|
||||
| Signal monitoring | 3 USB transfers | Same as stock | 1 transfer (`0xB7`, 8 bytes) |
|
||||
| Batch register read | 1 reg per transfer | Same | 64 regs per transfer (`0xB9`) |
|
||||
| Raw register access | Not possible | `0xB1`/`0xB2` | Same |
|
||||
| I2C bus scan | Not possible | `0xB4` | Same |
|
||||
| GPIO read | Not possible | `0xB6` | Same |
|
||||
| Anti-tampering | Present (v2.13) | Removed | Removed |
|
||||
| Source available | No | Yes | Yes (`firmware/skywalker1.c`) |
|
||||
|
||||
## Tuning Implementation
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue