Skip to content

Vendor Commands

All vendor commands use USB control transfers with USB_TYPE_VENDOR (bmRequestType bit 6 set). The vendor command dispatcher at CODE:0056 validates bRequest in the range 0x80—0x9D (30 entries for v2.06/v2.13) or 0x80—0x9A (27 entries for Rev.2) and dispatches via an indexed jump table at CODE:0076.

CmdNameDirwValuewIndexwLengthPurposev2.06Rev.2v2.13
0x80GET_8PSK_CONFIGIN001Read configuration status byteOKOKOK
0x81SET_8PSK_CONFIGOUTvaries00Set config (reserved)STALLSTALLSTALL
0x82(reserved)ReservedSTALLSTALLSTALL
0x83I2C_WRITEOUTdev_addrreg_addrNWrite to I2C deviceOKOKOK
0x84I2C_READINdev_addrreg_addrNRead from I2C deviceOKOKOK
0x85ARM_TRANSFEROUT0/100Start (1) / stop (0) MPEG-2 streamOKOKOK
0x86TUNE_8PSKOUT0010Set tuning parametersOKOKOK
0x87GET_SIGNAL_STRENGTHIN006Read SNR and diagnosticsOKOKChanged
0x88LOAD_BCM4500OUT100Initiate BCM4500 FW downloadSTALLSTALLSTALL
0x89BOOT_8PSKIN0/101Power on (1) / off (0) demodulatorOKOKOK
0x8ASTART_INTERSILIN0/101Enable (1) / disable (0) LNB supplyOKOKOK
0x8BSET_LNB_VOLTAGEOUT0/10013V (0) or 18V (1)OKOKOK
0x8CSET_22KHZ_TONEOUT0/100Tone off (0) or on (1)OKOKOK
0x8DSEND_DISEQC_COMMANDOUTmsg[0]0lenDiSEqC message or tone burstOKOKOK
0x8ESET_DVB_MODEOUT100Enable DVB-S modeSTALLSTALLSTALL
0x8FSET_DN_SWITCHOUTcmd7bit00Legacy Dish Network switch protocolOKOKOK
0x90GET_SIGNAL_LOCKIN001Read signal lock statusOKOKOK
0x92GET_FW_VERSIN006Read firmware version + build dateOKOKOK
0x93GET_SERIAL_NUMBERIN004Read 4-byte serial from EEPROMOKOKOK
0x94USE_EXTRA_VOLTOUT0/100Enable +1V LNB boost (14V/19V)OKOKOK
0x95GET_FPGA_VERSIN001Read EEPROM hardware/platform IDOKOKOK

0x87 GET_SIGNAL_STRENGTH: Returns 6 bytes. Bytes 0—1 contain a 16-bit SNR value (little-endian, dBu x 256 units). Bytes 2—5 are reserved/diagnostic BCM4500 registers. Version differences: v2.06 polls 3 registers (0xA2, 0xA8, 0xA4) up to 6 times; v2.13 consolidates to 1 register with a simplified poll.

0x8D SEND_DISEQC_COMMAND: When wLength > 0, the payload is a standard DiSEqC message (3—6 bytes) with wValue set to msg[0] (framing byte, typically 0xE0 or 0xE1). When wLength == 0 and wValue == 0, tone burst A is sent. When wLength == 0 and wValue != 0, tone burst B is sent.

0x8F SET_DN_SWITCH: wValue carries a 7-bit Dish Network switch command (LSB-first), bit-banged on GPIO P0.4 with specific timing. The 8th bit (0x80) of the original switch command selects LNB voltage and is sent separately via SET_LNB_VOLTAGE.

0x92 GET_FW_VERS: Returns 6 bytes of hardcoded constants:

GET_FW_VERS Response Format
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]

0x93 GET_SERIAL_NUMBER: Returns 4 bytes read from I2C EEPROM at device address 0x51 (7-bit), extracted at 8-bit intervals using a shift/rotate routine.

0x94 USE_EXTRA_VOLT: wValue=1 writes 0x6A to XRAM 0xE0B6; wValue=0 writes 0x62. The difference is bit 3 (0x08), which controls the voltage boost on the LNB power regulator.

0x95 GET_FPGA_VERS: Reads from I2C EEPROM at 0x51. Despite the name, there is no FPGA on the SkyWalker-1 — this returns a hardware platform ID. v2.06 reads EEPROM offset 0x31 (2 bytes); v2.13/Rev.2 read offset 0x00 (1 byte).

The dispatch logic at CODE:0056 (identical address across all stock versions):

1. Check bmRequestType bit 6 -> vendor request?
2. Read bRequest from SETUPDAT[1]
3. Subtract 0x80 (command base offset)
4. Compare against maximum: < 0x1E (v2.06/v2.13) or < 0x1B (Rev.2)
5. If in range: double the index (2 bytes per AJMP) -> JMP @A+DPTR
6. If out of range: route to STALL handler

The jump table at CODE:0076 contains 2-byte AJMP instruction targets, one per command from 0x80 upward.