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.
Protocol Overview
Section titled “Protocol Overview”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 Command Format
Section titled “USB Command Format”USB SETUP: bmRequestType = 0x40 (vendor, host-to-device) bRequest = 0x8F (SET_DN_SWITCH) wValue = 7-bit switch command (bits 0-6) wIndex = 0x0000 wLength = 0Bit-Bang Sequence
Section titled “Bit-Bang Sequence”The firmware transmits the 7-bit command using the following GPIO sequence:
-
Start pulse: Assert P0.4 HIGH, delay approximately 32 CPU cycles (~0.67 us at 48 MHz)
-
Gap: De-assert P0.4 LOW, delay approximately 8 CPU cycles (~0.17 us at 48 MHz)
-
Data bits: Shift out 7 bits LSB-first via P0.4, with approximately 8-cycle delays between each bit transition
-
End: P0.4 returns to its previous LNB voltage state
Switch Position Mapping
Section titled “Switch Position Mapping”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 Type | Bit Pattern | Function |
|---|---|---|
| SW21 | Port A 0bxxxxxxx with port bit = 0 | Select satellite A input |
| SW21 | Port B 0bxxxxxxx with port bit = 1 | Select satellite B input |
| SW44 | Multiple bit fields | Select 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.
Timing Characteristics
Section titled “Timing Characteristics”The legacy switch protocol is significantly simpler and faster than DiSEqC:
| Parameter | Value |
|---|---|
| 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 pin | P0.4 (shared with LNB voltage) |
Kernel Driver Integration
Section titled “Kernel Driver Integration”The Linux kernel driver implements legacy Dish Network support through a dedicated callback:
// Registered as .send_legacy_dish_cmd in dvb_usb_device_propertiesstatic 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;}Comparison with DiSEqC
Section titled “Comparison with DiSEqC”| Feature | Legacy Dish Protocol | DiSEqC 1.0 |
|---|---|---|
| Standard | Proprietary (Dish Network) | EUTELSAT standard |
| Encoding | Serial bit-bang, LSB-first | Manchester encoding, MSB-first |
| Carrier | None (direct GPIO) | 22 kHz modulated |
| Message length | 7 bits | 3-6 bytes (24-54 bits + parity) |
| Timing | ~5-10 us total | ~48-88 ms total |
| Switch support | SW21, SW44 | DiSEqC 1.0/1.1/1.2 compatible switches |
| GPIO pin | P0.4 (shared with voltage) | P0.x (data) + P0.3 (carrier) |
| Vendor command | 0x8F | 0x8D |
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.