Skip to content

BCM4500 Register Map

This page consolidates every known register address used by the SkyWalker-1 hardware into a single lookup reference.

These registers are accessed via standard I2C read/write to the BCM4500 at 7-bit address 0x08 (write byte 0x10, read byte 0x11).

AddressNameR/WFunction
0xA2StatusRReadiness status. Returns 0x02 when powered on, no signal locked. Polled during boot probe and signal strength readback.
0xA4LockRSignal lock indicator. Bit 5 (mask 0x20) = signal locked. Read by GET_SIGNAL_LOCK (0x90). The kernel treats any non-zero value as locked.
0xA6Indirect PageWPage/address select for the indirect register protocol. Typically written with 0x00 (page 0).
0xA7Indirect DataR/WData register for indirect reads and writes. Supports auto-increment for multi-byte writes within a single I2C transaction.
0xA8Indirect CommandR/WCommand register. Write 0x01 = indirect read, 0x03 = indirect write. Read to poll: bit 0 clear = command complete.
0xF9Demod StatusRExtended demodulator status. Read by GET_DEMOD_STATUS (0x99) in v2.13 firmware. Also polled by the v2.13 INT0 handler. Not accessed by v2.06 or Rev.2.

Registers 0xA6, 0xA7, and 0xA8 form a triad that provides access to the BCM4500’s internal register space. The sequence is always: select page (0xA6) → write/read data (0xA7) → execute command (0xA8) → poll 0xA8 for completion.

See Demodulator — Indirect Register Protocol for the full byte-level I2C sequences.

These are the BCM4500 internal registers accessed through the 0xA6/0xA7/0xA8 indirect protocol. All known registers are on page 0x00.

RegisterSizeFunctionRead By
0x00—0x012 bytesSNR value (16-bit, little-endian). Bytes 0—1 of GET_SIGNAL_STRENGTH (0x87) response.Signal Monitoring
0x02—0x054 bytesAGC and diagnostic data. Bytes 2—5 of GET_SIGNAL_STRENGTH (0x87) response.Signal Monitoring

Three blocks written during BCM4500 firmware load. The first byte of each block is the starting register address.

BlockStart RegLengthData (hex)Purpose
00x067 bytes06 0b 17 38 9f d9 80Primary demod configuration
10x078 bytes07 09 39 4f 00 65 b7 10Secondary demod configuration
20x0F3 bytes0f 0c 09Final demod configuration

After modulation dispatch, the tuning protocol writes frequency, symbol rate, FEC, and modulation parameters into BCM4500 page 0 registers via the indirect write protocol. The exact target register range depends on the configuration data length (typically 12—18 bytes starting at register 0x00).

External RAM (XRAM) addresses used by the FX2 microcontroller for tuning state and configuration. These are not BCM4500 registers — they are FX2 memory locations that hold data destined for or read from the demodulator.

AddressNameFunction
0xE0EBFEC Code RateLooked up from the FEC table for the active modulation. DCII modes use fixed value 0xFC. DSS/BPSK modes OR the lookup with 0x80.
0xE0ECModulation Type0x09 for DVB-S, Turbo, DSS, and BPSK modes. DCII modes load from the DCII lookup table.
0xE0F5Demod Mode0x10 for most modes. DCII variants use 0x10 (combo), 0x11 (offset QPSK), 0x12 (I-stream), or 0x16 (Q-stream).
0xE0F6Turbo Flag0x00 = standard FEC. 0x01 = turbo FEC (QPSK/8PSK/16QAM turbo modes).
AddressSizeContentSource
0xE0CB—0xE0CE4 bytesSymbol rate (big-endian)Byte-reversed from EP0BUF[0—3] during TUNE_8PSK
0xE0DB—0xE0DE4 bytesIF frequency (big-endian)Byte-reversed from EP0BUF[4—7] during TUNE_8PSK

Populated at boot from CODE-space initialization tables. Indexed by the FEC rate byte from the TUNE_8PSK command payload.

Base AddressModulationMax IndexRates
0xE0B1Turbo 8PSK5Turbo-specific code rates
0xE0B7Turbo QPSK5Turbo-specific code rates
0xE0BCTurbo 16QAM1Single code rate
0xE0BDDCII (all variants)9Combined code + modulation values
0xE0F9DVB-S QPSK / DSS / BPSK71/2, 2/3, 3/4, 5/6, 7/8, auto, none
AddressSizeContent
0xE080—0xE08E15 bytesExternal calibration data loaded by FW2 and FW3 into demod registers at 0xE6C0—0xE6CD. Not used by FW1 (hardcoded config).
AddressSizeContent
0xE740—0xE74910 bytesEP0BUF — USB control transfer buffer. Contains the raw TUNE_8PSK payload before parsing.

Internal RAM (IRAM) addresses vary between firmware versions due to different stack pointer placement. This table maps the key locations for each version.

Locationv2.06Rev.2 v2.10v2.13 FW1/FW2v2.13 FW3
Stack pointer (SP)0x720x4F0x500x52
Config status byte0x6D0x4E0x4F0x51
I2C buffer high0x480x480x4A
I2C buffer low0x490x490x4B

The config status byte is returned by GET_8PSK_CONFIG (0x80). See Config Status for bit definitions.

LocationAddressFunction
Modulation type0x4DCopied from EP0BUF[8] during TUNE_8PSK parsing
FEC rate index0x4FCopied from EP0BUF[9] during TUNE_8PSK parsing

The custom firmware built with SDCC + fx2lib uses C variables instead of fixed IRAM addresses. The compiler manages allocation, so addresses are not guaranteed stable across builds. Key variables:

VariableTypePurpose
config_statusvolatile BYTEConfiguration status byte
boot_stagevolatile BYTEBoot progress (0x00 = not started, 0xFF = complete)
i2c_buf[16]__xdata BYTEI2C scratch buffer for writes
i2c_rd[8]__xdata BYTEI2C scratch buffer for reads
tm_result[10]__xdata BYTETune monitor result buffer

Core FX2LP registers used for USB control transfers, CPU management, and peripheral configuration.

RegisterAddressFunction
CPUCS0xE600CPU control/status. Write 0x01 to halt, 0x00 to run. Bits 4:3 select clock speed (10 = 48 MHz).
IFCONFIG0xE601Interface configuration. Value 0xEE = internal 48 MHz clock, GPIF master, async mode.
REVCTL0xE60BRevision control. Value 0x03 = NOAUTOARM + SKIPCOMMIT (required for manual EP management).
EP2FIFOCFG0xE618EP2 FIFO configuration. Value 0x0C = AUTOIN + ZEROLENIN, 8-bit data bus.

Populated by the FX2 hardware when a SETUP packet arrives on EP0. The vendor command dispatcher reads SETUPDAT[1] to determine the command.

RegisterAddressContent
SETUPDAT[0]0xE6B8bmRequestType (0x40 = vendor OUT, 0xC0 = vendor IN)
SETUPDAT[1]0xE6B9bRequest (vendor command ID: 0x80—0xB9)
SETUPDAT[2]0xE6BAwValueL
SETUPDAT[3]0xE6BBwValueH
SETUPDAT[4]0xE6BCwIndexL
SETUPDAT[5]0xE6BDwIndexH
SETUPDAT[6]0xE6BEwLengthL
SETUPDAT[7]0xE6BFwLengthH
RegisterAddressFunction
EP0BCH0xE68AEP0 byte count high.
EP0BCL0xE68BEP0 byte count low. Writing this register arms the EP0 IN transfer.
EP0BUF0xE740EP0 data buffer start (64 bytes). Contains TUNE_8PSK payload bytes 0xE740—0xE749.
AddressFunction
0xE0B6LNB voltage control register. Written by SET_LNB_VOLTAGE (0x8B) in the custom firmware.

The Cypress FX2LP’s built-in I2C master controller uses three hardware registers in the SFR-mapped XRAM space.

RegisterAddressFunction
I2CS0xE678Control/Status. Bit fields: DONE (bit 0), ACK (bit 1), BERR (bit 2), ID (bits 4:3), LASTRD (bit 5), STOP (bit 6), START (bit 7).
I2DAT0xE679Data register. Write to transmit a byte, read to receive. First write after START sends the slave address byte.
I2CTL0xE67AControl register. Bit 0 = 400 kHz mode (set by all firmware versions at init). Bit 1 = STOPIE (stop interrupt enable).
7-bit Address8-bit Write8-bit ReadDevice
0x080x100x11BCM4500 demodulator (operating address)
0x100x200x21Tuner / LNB controller
0x510xA20xA3Configuration EEPROM (serial number, calibration, firmware storage)
0x3F0x7E0x7FBCM4500 alternate probe address (v2.13 boot detection only)
0x7F0xFE0xFFBCM4500 alternate probe address (v2.13 boot detection only)

See I2C Bus Architecture for bus topology and the STOP Corruption Bug for the spurious STOP issue affecting the FX2 controller.

Every documentation page that references specific registers or memory addresses:

RegisterPages
0xA2 (Status)Demodulator, Signal Monitoring, Version Comparison
0xA4 (Lock)Demodulator, Signal Monitoring, Tuning Protocol
0xA6/0xA7/0xA8 (Indirect)Demodulator, Tuning Protocol, Signal Monitoring
0xF9 (Demod Status)Demodulator, Signal Monitoring, Version Comparison
Address RangePages
0xE0B1—0xE0F9 (FEC tables)Tuning Protocol
0xE0CB—0xE0DE (Tune params)Tuning Protocol
0xE0EB—0xE0F6 (Mod config)Tuning Protocol
0xE080—0xE08E (FW2/FW3 cal)FW2.13 Variants
AddressPages
Config status (version-dependent)Config Status, Version Comparison, FW2.13 Variants
SP, I2C buffersFW2.13 Variants, Version Comparison
RegisterPages
I2CS/I2DAT/I2CTL (0xE678—0xE67A)I2C Bus Architecture, STOP Corruption Bug, Demodulator