Signal Monitoring
Signal monitoring uses two vendor commands: GET_SIGNAL_LOCK (0x90) for lock status and GET_SIGNAL_STRENGTH (0x87) for SNR and diagnostic data. Both read BCM4500 direct registers via I2C.
See the Register Map for a consolidated lookup of all register addresses referenced on this page.
Signal Lock (GET_SIGNAL_LOCK, 0x90)
Section titled “Signal Lock (GET_SIGNAL_LOCK, 0x90)”Returns 1 byte from BCM4500 direct register 0xA4.
| Bit | Mask | Meaning |
|---|---|---|
| 5 | 0x20 | Signal locked |
| Other bits | — | Additional status (undocumented) |
The kernel driver interprets any non-zero value as locked and reports the full lock status:
FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI | FE_HAS_SIGNAL | FE_HAS_CARRIERLock States
Section titled “Lock States”| Value | State | Description |
|---|---|---|
| 0x00 | Unlocked | No signal or signal not acquired |
| 0x20 | Locked | Signal locked, FEC decoding active |
| Other non-zero | Locked | Signal acquired, partial status bits |
Signal Strength (GET_SIGNAL_STRENGTH, 0x87)
Section titled “Signal Strength (GET_SIGNAL_STRENGTH, 0x87)”Returns 6 bytes. The first two bytes contain a 16-bit SNR value; the remaining bytes are diagnostic register data from the BCM4500.
Response Format
Section titled “Response Format”| Byte | Content | Notes |
|---|---|---|
| 0 | SNR low byte (LSB) | 16-bit little-endian |
| 1 | SNR high byte (MSB) | dBu x 256 units |
| 2 | Reserved | BCM4500 diagnostic register |
| 3 | Reserved | BCM4500 diagnostic register |
| 4 | Reserved | BCM4500 diagnostic register |
| 5 | Reserved | BCM4500 diagnostic register |
SNR Scaling
Section titled “SNR Scaling”The Windows BDA driver provides the scaling formula:
uint16_t snr_raw = (buf[1] << 8) | buf[0];
if (snr_raw <= 0x0F00) { signal_strength = snr_raw * 17; // Maps 0--0x0F00 to 0--65535} else { signal_strength = 0xFFFF; // 100% at SNR >= 0x0F00}| SNR Raw Value | Signal Strength | Quality |
|---|---|---|
| 0x0000 | 0 (0%) | No signal |
| 0x0400 | ~27% | Poor |
| 0x0800 | ~53% | Fair |
| 0x0C00 | ~80% | Good |
| 0x0F00 | 100% | Maximum |
| > 0x0F00 | 100% (clamped) | Maximum |
Firmware Implementation Differences
Section titled “Firmware Implementation Differences”The signal strength readback involves I2C transactions to the BCM4500’s indirect register protocol. The implementation varies between firmware versions:
| Aspect | v2.06 | Rev.2 v2.10 | v2.13 |
|---|---|---|---|
| Registers polled | 0xA2, 0xA8, 0xA4 | 0xA2, 0xA8, 0xA4 | Consolidated (1 register) |
| Max poll iterations | 6 | 6 | Simplified |
| Read-back verification | No | Yes (explicit) | No |
| Call chain | 3-register loop | 3-register + verify | Single register path |
All versions ultimately return the same 6-byte response format to the host.
BCM4500 Status Registers
Section titled “BCM4500 Status Registers”These direct registers are used for signal monitoring:
| Register | Address | Function | Access |
|---|---|---|---|
| Status | 0xA2 | BCM4500 readiness status | Polled during boot and signal checks |
| Lock | 0xA4 | Lock/ready; bit 5 = locked | Read by GET_SIGNAL_LOCK (0x90) |
| Command | 0xA8 | Indirect command status; bit 0 = busy | Polled during register operations |
| Demod Status | 0xF9 | Extended demod status | Read by GET_DEMOD_STATUS (0x99, v2.13 only) |
Register 0xA2 — Status
Section titled “Register 0xA2 — Status”Read during boot probing and signal strength readback. Returns 0x02 when the BCM4500 is powered on but no signal is locked. Exact bit field definitions are not documented in the public BCM4500 datasheet.
Register 0xA4 — Lock
Section titled “Register 0xA4 — Lock”The primary lock indicator. The kernel driver reads this as a single byte via GET_SIGNAL_LOCK (0x90). Bit 5 (0x20) is the definitive lock status flag.
Register 0xA8 — Command
Section titled “Register 0xA8 — Command”Used by the indirect register protocol to track command completion. Bit 0 clear indicates the previous indirect read/write command has completed. This register is polled after every indirect register operation.
Register 0xF9 — Demod Status (v2.13 only)
Section titled “Register 0xF9 — Demod Status (v2.13 only)”Read by the GET_DEMOD_STATUS vendor command (0x99). Also polled by the v2.13 INT0 handler for demodulator availability detection. This register is not accessed by v2.06 or Rev.2 firmware.