Skip to content

Legacy Dish Network Switch

The SkyWalker-1 supports legacy Dish Network satellite switches (SW21, SW44) through vendor command 0x8F (SET_DN_SWITCH). This protocol predates DiSEqC and uses a simpler serial bit-bang scheme on a shared GPIO pin.

The legacy Dish Network switch protocol sends a 7-bit serial command via GPIO P0.4 (the same pin used for LNB voltage selection). The command is bit-banged LSB-first with fixed timing delays.

USB SETUP:
bmRequestType = 0x40 (vendor, host-to-device)
bRequest = 0x8F (SET_DN_SWITCH)
wValue = 7-bit switch command (bits 0-6)
wIndex = 0x0000
wLength = 0

The firmware transmits the 7-bit command using the following GPIO sequence:

  1. Start pulse: Assert P0.4 HIGH, delay approximately 32 CPU cycles (~0.67 us at 48 MHz)

  2. Gap: De-assert P0.4 LOW, delay approximately 8 CPU cycles (~0.17 us at 48 MHz)

  3. Data bits: Shift out 7 bits LSB-first via P0.4, with approximately 8-cycle delays between each bit transition

  4. End: P0.4 returns to its previous LNB voltage state

The legacy protocol supports the SW21 (2-input, 1-output) and SW44 (4-input, 4-output) switches. The 7-bit command encodes the desired input port and satellite selection:

Switch TypeBit PatternFunction
SW21Port A 0bxxxxxxx with port bit = 0Select satellite A input
SW21Port B 0bxxxxxxx with port bit = 1Select satellite B input
SW44Multiple bit fieldsSelect one of 4 inputs to one of 4 outputs

The exact bit-field layout is proprietary to Dish Network. The kernel driver constructs the command value in dishnetwork_send_legacy_command() based on the requested switch position.

The legacy switch protocol is significantly simpler and faster than DiSEqC:

ParameterValue
Start pulse width~0.67 us (32 cycles at 48 MHz)
Inter-bit gap~0.17 us (8 cycles at 48 MHz)
Total command time~5-10 us for 7 bits
GPIO pinP0.4 (shared with LNB voltage)

The Linux kernel driver implements legacy Dish Network support through a dedicated callback:

Legacy Dish Network command callback
// Registered as .send_legacy_dish_cmd in dvb_usb_device_properties
static int gp8psk_send_legacy_dish_cmd(struct dvb_frontend *fe, unsigned long cmd)
{
struct dvb_usb_adapter *adap = fe->dvb->priv;
struct dvb_usb_device *d = adap->dev;
// Bit 7 (0x80) controls voltage, sent separately
gp8psk_usb_out_op(d, SET_LNB_VOLTAGE, (cmd >> 7) & 1, 0, NULL, 0);
// Bits 0-6 sent via SET_DN_SWITCH
gp8psk_usb_out_op(d, SET_DN_SWITCH, cmd & 0x7F, 0, NULL, 0);
return 0;
}
FeatureLegacy Dish ProtocolDiSEqC 1.0
StandardProprietary (Dish Network)EUTELSAT standard
EncodingSerial bit-bang, LSB-firstManchester encoding, MSB-first
CarrierNone (direct GPIO)22 kHz modulated
Message length7 bits3-6 bytes (24-54 bits + parity)
Timing~5-10 us total~48-88 ms total
Switch supportSW21, SW44DiSEqC 1.0/1.1/1.2 compatible switches
GPIO pinP0.4 (shared with voltage)P0.x (data) + P0.3 (carrier)
Vendor command0x8F0x8D

For modern satellite installations, DiSEqC is the preferred switch protocol. The legacy Dish Network protocol exists for backward compatibility with older SW21 and SW44 switches commonly found in North American installations. See the DiSEqC Protocol page for the full DiSEqC implementation.