Skip to content

FW2.13 Sub-Variant Comparison

The v2.13 firmware was distributed as three sub-variants via the SW1_update_2_13_x.exe Windows updater tool. Ghidra analysis reveals that these target fundamentally different hardware interfaces, not just minor revisions.

AspectFW1 (v2.13.1)FW2 (v2.13.2)FW3 (v2.13.3)
Version ID0x020D010x020D010x020D01
Build date2010-03-122010-03-122010-03-12
Functions828383
Binary size9,322 bytes9,377 bytes9,369 bytes
Stack pointer0x500x500x52
P0 init0xA40xA40xA0
Status registerINTMEM 0x4FINTMEM 0x4FINTMEM 0x51
Demod interfaceI2C busParallel bus (P0/P1)Parallel bus (enhanced)
Config sourceHardcodedExternal (0xE0800xE08E)External (0xE0800xE08E)

All three sub-variants report the same version ID (0x020D01) to the host. The Windows updater SW1_update_2_13_x.exe selects which sub-variant to flash, but the detection mechanism is not yet fully understood.

Although the updater’s detection method is opaque, the firmware binaries themselves contain clear markers that distinguish each target hardware:

CharacteristicFW1FW2FW3Docs
P0 init value0xA40xA40xA0 (bit 2 cleared)Register Map — IRAM
Stack pointer0x500x500x52 (+2 for status reg)Register Map — IRAM
Config status IRAM0x4F0x4F0x51Config Status
I2C buffer IRAM0x48/0x490x48/0x490x4A/0x4BRegister Map — IRAM
Demod interfaceI2C busParallel (P0/P1)Parallel (enhanced, dual-phase)See tabs below
Config sourceHardcodedExternal 0xE0800xE08EExternal 0xE0800xE08ERegister Map — XRAM

FW1 is the only sub-variant that performs demodulator type identification at runtime. Function FUN_CODE_1405 reads the P1 port after an I2C transaction and matches the result against known silicon signatures:

Type CodeP1 SignatureLikely Silicon
Type 30xA5 or 0xB5Original BCM4500
Type 40x5ABCM4500 revision A
Type 50x5BBCM4500 revision B
Type 60x5CBCM4500 revision C

FW2 and FW3 use a different signature check (P1 ^ 0x1D) through the parallel bus, suggesting the demod variant is already known at flash time on those PCBs.

FW1 targets the original SkyWalker-1 PCB with an I2C-connected demodulator. The FX2 communicates with the demod entirely through standard I2C master-mode transactions.

Evidence from FUN_CODE_0eea:

  • Uses FUN_CODE_23ae (I2C START), FUN_CODE_23ee (I2C byte write), FUN_CODE_23d0 (I2C address)
  • Standard I2C retry with NACK detection
  • Timer2-based I2C timeout (TR2 check in vendor handler)
  • Reads back via FUN_CODE_2164

Unique functions:

  • FUN_CODE_0fc7 — I2C write-with-retry (20 attempts via I2C bus)
  • FUN_CODE_1405 — Tuner/demodulator identification via I2C + P1 port reads with signature matching
  • FUN_CODE_14b9 — Calibrated delay function with CPUCS clock divider awareness

Demodulator type detection (from FUN_CODE_1405):

Type CodeP1 Signature
Type 30xA5 or 0xB5
Type 40x5A
Type 50x5B
Type 60x5C

Byte-level differences between sub-variants:

PairDifferent BytesPercentage Different
FW1 vs FW23,99342.8%
FW1 vs FW33,78940.6%
FW2 vs FW31,52516.5%

FW2 and FW3 are 83.5% identical at the byte level, confirming they share the same parallel-bus architecture. FW1 diverges significantly because it uses a completely different bus interface (I2C vs. parallel).

These regions are byte-identical across all three sub-variants:

Address RangeContent
0x00000x000FRESET vector (LJMP 0x170D), INT0 handler
0x0B880x0B9FInit table (same XRAM register initialization)
0x06D90x06F0Generic memory access utilities
0x17400x174FBit manipulation lookup table

This is where the three sub-variants diverge most dramatically:

FW1: 8f44 8c45 8d46 8b47 754a14 e544 b451...
(I2C transfer parameters in registers)
FW2: 753e14 e50d 240a f582 e435 0cf5 83e0...
(reads from DPTR+offset table)
FW3: 753e14 e4f5 3ff5 40 e50d 240a f582...
(similar to FW2 + accumulator initialization)

FW1’s FUN_CODE_0eea is a standard I2C master transfer function. FW2/FW3’s version is a parallel bus demodulator interface.

FW1: 02 2252 00 02 22dd 00 02 22c7 00 02 226a 00
FW2: 02 228d 00 02 2318 00 02 2302 00 02 22a5 00
FW3: 02 228d 00 02 2318 00 02 2302 00 02 22a5 00

FW2 and FW3 share identical interrupt handler targets. FW1 jumps to different addresses, reflecting its different internal function layout.

PropertyFW1FW2FW3
SP value0x500x500x52
Status IRAM0x4F0x4F0x51
I2C buffer IRAM0x48/0x490x48/0x490x4A/0x4B

FW3 pushes the stack pointer up by 2 bytes to make room for the additional status register at IRAM 0x51. The 2-byte SP difference exactly accounts for moving the status register from 0x4F to 0x51.

VariantP0 InitBinaryDifference
FW1/FW20xA41010 0100Bit 2 = 1
FW30xA01010 0000Bit 2 = 0

P0 bit 2 controls a GPIO signal likely related to demodulator interface mode or reset polarity on the FW3 target PCB.

FeatureFW1FW2/FW3
Case 0x3D3TR2 timer check (I2C timeout)OR operation (parallel bus)
Case 0x421-0x423Simple checkP2.1 write + rotate-left (bus direction)
Error pathfunc_0x06e4DAT=0x0

FW1’s timer-based case is used for I2C bus timeout recovery. FW2/FW3’s rotate-left and P2.1 write is a parallel bus data direction control.

The three sub-variants represent an evolutionary progression:

  1. FW1 (v2.13.1): Original design with I2C-connected demodulator. Simple interface but limited in bandwidth. The FX2 acts purely as an I2C master bridge.

  2. FW2 (v2.13.2): Redesigned with parallel-bus demodulator for higher throughput. P1 carries 8-bit data, P0 provides control signals. External calibration data at 0xE0800xE08E.

  3. FW3 (v2.13.3): Refined parallel interface for a newer demod silicon revision. Dual-phase reads with OR-accumulation handle bus timing differences. Additional IRAM state tracking (SP bumped to 0x52).

All three support the same modulation types (DVB-S QPSK, Turbo QPSK/8PSK/16QAM, DCII, DSS) and the same demod type codes (3—6). The differences are purely hardware interface, not feature set.