Skip to content

Firmware Version Comparison

Five firmware versions have been analyzed through Ghidra reverse engineering and source code review. This page compares their architecture, features, and binary characteristics.

FirmwareVersion IDBuild DateTarget PIDFunctionsBinary SizeStack Pointer
v2.06.040x0206042007-07-130x0203619,472 bytes0x72
Rev.2 v2.10.040x020A042010-03-120x02021078,843 bytes0x4F
v2.13.01 (FW1)0x020D012010-03-120x020382-889,322 bytes0x50
v2.13.02 (FW2)0x020D012010-03-120x0203839,377 bytes0x50
v2.13.03 (FW3)0x020D012010-03-120x0203839,369 bytes0x52
Custom v3.01.00x0301002026-02-120x0203N/A~3 KB (RAM)N/A

The original SkyWalker-1 firmware extracted from the device’s onboard EEPROM.

PropertyValue
Version ID0x020604
Build date2007-07-13
Functions61
Binary size9,472 bytes
Stack pointer0x72
Config byte IRAM0x6D
Descriptor base0x1200
Init table addressCODE:0B46
Vendor commands30 (0x800x9D)
DiSEqC data pinP0.7

Characteristics:

  • Simplest firmware with the fewest functions
  • INT0 handler performs USB re-enumeration (CPUCS pulse)
  • No demodulator probe at boot
  • No retry loops or integrity verification
  • BCM4500 status polling reads 3 registers (0xA2, 0xA8, 0xA4) up to 6 times
  • Commands 0x99, 0x9A, 0x9C route to STALL
  • Command 0x9D reads descriptor byte and sets mode flag based on hardware revision (4, 5, or 6)
Featurev2.06Rev.2 v2.10v2.13Custom v3.01
Vendor commands30273030 stock + 7 custom
INT0 handlerUSB re-enumUSB re-enumDemod pollingN/A (fx2lib ISR)
Demod probe at bootNoNoYes (40 attempts)Yes (with timeout)
Retry loopsNoNoYes (20-attempt)Yes (with timeout)
HW revision detectNoYes (descriptor walker)Yes (flag _1_3)No
DiSEqC data pinP0.7P0.4P0.0P0.7
Config byte IRAM addr0x6D0x4E0x4FC variable
BCM4500 status poll3 registers3 registers1 register1 register
I2C timeoutNoneNoneNone6000-count
Anti-tamperingNoNoYesNo
New commands0x99/0x9A proto0x99, 0x9A, 0x9C0xB0—0xB6
0x9D behaviorHW revision modeN/A (out of range)Conditional demod resetN/A

The Linux kernel driver defines two firmware version thresholds in gp8psk-fe.h:

Kernel firmware version constants
GP8PSK_FW_REV1 = 0x020604 // v2.06.4
GP8PSK_FW_REV2 = 0x020704 // v2.07.4

If the firmware version reported by GET_FW_VERS (command 0x92) is >= GP8PSK_FW_REV2, the kernel enables Rev.2-specific code paths. All v2.10 and v2.13 firmwares are newer than either constant.

Byte-level comparison across the shared code length (percentage of identical bytes):

v2.06v2.13.1v2.13.2v2.13.3Rev.2
v2.064.8%4.3%4.3%6.0%
v2.13.157.2%59.4%8.0%
v2.13.283.5%5.8%
v2.13.35.8%
Rev.2

Functions that serve the same role but reside at different addresses:

Rolev2.06Rev.2v2.13
RESET vector / main0x188D0x155F0x170D
Main init + loop0x09A70x09A90x0800
USB descriptor setup0x13C30x10D90x11AB
Standard USB handler0x032A0x03190x034E
Vendor cmd dispatch0x00560x00560x0056
Main loop poll0x22970x21EC
GPIF/FIFO management0x19190x0D7C0x1800
BCM4500 firmware loader0x0DDD0x0C640x0CA4
BCM4500 status polling0x20000x208D
Delay loop0x1DFB0x1BDA0x14B9

The INT0 interrupt vector (CODE:0003) was repurposed between firmware generations:

USB Re-enumeration — pulses CPUCS bit 3 to trigger controlled USB disconnect/reconnect:

INT0 handler (v2.06 and Rev.2)
void INT0_vec(void) {
if (flag == 0) CPUCS |= 0x08; // CPUCS bit 3
else CPUCS |= 0x0A; // CPUCS bits 3+1
delay(5, 0xDC); // ~1500 cycles
EPIRQ = 0xFF; // Clear endpoint IRQs
USBIRQ = 0xFF; // Clear USB IRQs
EXIF &= 0xEF; // Clear external interrupt flag
CPUCS &= 0xF7; // Clear CPUCS bit 3
}

All versions initialize FX2 peripheral registers from a CODE-space table at startup. The table format is identical: [addr_hi] [addr_lo] [data_byte] triplets terminated by 0x0000.

FirmwareTable AddressKey Registers Set
v2.06CODE:0B46IFCONFIG, EP2CFG, EP2FIFOCFG, REVCTL, I2CTL
Rev.2CODE:0B48Same set, 2 bytes later
v2.13CODE:0B88Same set, different offsets

All versions set the same final values: IFCONFIG=0xEE, EP2CFG=0xE2, EP2FIFOCFG=0x0C, REVCTL=0x03, I2CTL=0x01.

All v2.13 sub-variants contain this string at firmware offset 0x1880:

"Tampering is detected. Attempt is logged. Warranty is voided ! \n"

This is followed by I2C register write commands (01 10 aa 82 02 41 41 83). The mechanism is absent from v2.06, Rev.2, and the custom firmware.

The GET_FW_VERS command (0x92) returns 6 bytes of hardcoded constants:

Byte 0: version minor_minor (e.g., 0x04)
Byte 1: version minor (e.g., 0x06)
Byte 2: version major (e.g., 0x02)
Byte 3: build day (e.g., 0x0D = 13)
Byte 4: build month (e.g., 0x07 = July)
Byte 5: build year - 2000 (e.g., 0x07 = 2007)

Full version = byte[2] << 16 | byte[1] << 8 | byte[0]. Build date = (2000 + byte[5]) / byte[4] / byte[3].