Skip to content

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.

Returns 1 byte from BCM4500 direct register 0xA4.

BitMaskMeaning
50x20Signal locked
Other bitsAdditional status (undocumented)

The kernel driver interprets any non-zero value as locked and reports the full lock status:

Kernel Lock Status Flags
FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI | FE_HAS_SIGNAL | FE_HAS_CARRIER
ValueStateDescription
0x00UnlockedNo signal or signal not acquired
0x20LockedSignal locked, FEC decoding active
Other non-zeroLockedSignal 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.

ByteContentNotes
0SNR low byte (LSB)16-bit little-endian
1SNR high byte (MSB)dBu x 256 units
2ReservedBCM4500 diagnostic register
3ReservedBCM4500 diagnostic register
4ReservedBCM4500 diagnostic register
5ReservedBCM4500 diagnostic register

The Windows BDA driver provides the scaling formula:

SNR to Signal Strength Conversion
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 ValueSignal StrengthQuality
0x00000 (0%)No signal
0x0400~27%Poor
0x0800~53%Fair
0x0C00~80%Good
0x0F00100%Maximum
> 0x0F00100% (clamped)Maximum

The signal strength readback involves I2C transactions to the BCM4500’s indirect register protocol. The implementation varies between firmware versions:

Aspectv2.06Rev.2 v2.10v2.13
Registers polled0xA2, 0xA8, 0xA40xA2, 0xA8, 0xA4Consolidated (1 register)
Max poll iterations66Simplified
Read-back verificationNoYes (explicit)No
Call chain3-register loop3-register + verifySingle register path

All versions ultimately return the same 6-byte response format to the host.

These direct registers are used for signal monitoring:

RegisterAddressFunctionAccess
Status0xA2BCM4500 readiness statusPolled during boot and signal checks
Lock0xA4Lock/ready; bit 5 = lockedRead by GET_SIGNAL_LOCK (0x90)
Command0xA8Indirect command status; bit 0 = busyPolled during register operations
Demod Status0xF9Extended demod statusRead by GET_DEMOD_STATUS (0x99, v2.13 only)

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.

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.

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.