Skip to content

Hardware Platform

The Carryout G2 is the most thoroughly documented variant in this project. Its firmware is verbose at boot and exposes low-level hardware state through GPIO, ADC, and SPI submenu commands. This page covers what we’ve identified about the three major silicon components and how they interconnect.

The G2 runs on three chips connected by two SPI buses:

SPI1 (4 MHz)
K60 MCU ────────────────────────── 2x A3981 (Stepper Drivers)
(Cortex-M4) AZ motor (40000 steps/rev)
| EL motor (24960 steps/rev)
|
| SPI2 (6.857 MHz)
└──────────────────────────── BCM4515 (DVB-S2 Tuner)
RSSI, SNR, lock detect
DiSEqC 2.x controller

The MCU runs the firmware shell, motor control loop, and DVB signal processing. The motor drivers are pure slave peripherals — they receive step/direction commands over SPI and handle microstepping and current regulation. The DVB tuner is also a slave but much more complex, running its own firmware for RF signal processing.

SpecValue
CoreARM Cortex-M4
Clock96 MHz
Flash512 KB
RAM128 KB SRAM
Package144-LQFP
FlexNVMEEPROM emulation (EE> submenu)
GPIO5 ports (A-E), ~92 pins bonded
SPI3 controllers (SPI0-SPI2)
UART6 controllers (UART0-UART5)

The K60 is an NXP Kinetis part, part of the K60 sub-family designed for industrial and motor control applications. Its Cortex-M4 core includes a single-precision FPU, which the firmware uses for angle calculations (position readouts are floating-point).

The firmware console runs on UART4 at 115200 baud, 8N1:

K60 PinGPIOFunction
PTE24E24UART4_TX (to computer RX pair)
PTE25E25UART4_RX (from computer TX pair)
PTE26E26UART4_CTS (hardware flow control, idle high)

CTS is connected but the firmware doesn’t appear to require hardware flow control — the console works fine without it.

Live GPIO probing (gpio regs, gpio dir, gpio r) across ports A-E revealed 92 pins. Notable patterns:

  • Port E is densely used: SPI1 (E0-E5), UART4 (E24-E27), plus unidentified pins
  • Port D carries SPI2 (D11-D15) and an output on D10 (likely BCM4515 reset/enable)
  • Port B has a cluster at B0-B3 (possibly SPI0 or I2C) and B11 (status LED or peripheral enable)
  • Port C has a contiguous block at C10-C13 (bus interface) and C18 (LNB voltage control)
  • Absent pins: A20-A23 and B12-B15 are not bonded on this package variant

Two A3981 ICs, one per motor axis, controlled over SPI1.

SpecValue
InterfaceSPI (mode 0x03) at 4 MHz
MicrosteppingUp to 1/16 step, AUTO mode
Current controlAUTO mode (adapts to load)
Fault detectionDIAG pin per driver (active-low open-drain)
Step resolutionFull, Half, Quarter, Eighth, Sixteenth
ParameterAZ (Motor 0)EL (Motor 1)
Steps per revolution4000024960
Max velocity65.00 deg/s45.00 deg/s
Max acceleration400.00 deg/s^2(from NVS)
Step velocity (raw)7222 ustep/s3120 ustep/s
Step acceleration (raw)44 ustep/s/ms28 ustep/s/ms
Gear ratio1.602564(from boot log)

The AZ motor is the “master” (more steps, faster) and drives the entire dish rotation. The EL motor is the “slave” with fewer steps per revolution.

K60 PinGPIOSPI FunctionNotes
PTE1E1SPI1_SOUTMOSI — MCU to A3981
PTE2E2SPI1_SCKSPI clock
PTE3E3SPI1_SINMISO — A3981 to MCU
PTE4E4SPI1_PCS0Chip select: AZ motor driver
PTE0E0SPI1_PCS1Chip select: EL motor driver
PTE5E5SPI1_PCS2Possibly A3981 RESET or enable

Three layers of motor control exist in the firmware:

  1. STEP submenu — raw stepper API in microstep units. Commands like p [motor] [steps] and v [motor] [ustep/sec] operate directly on the step counters.
  2. MOT submenu — angle-based API. The a <id> <deg> command converts degrees to steps using the steps-per-revolution values and manages PID control.
  3. BirdcageAntenna (our code) — adds leap-frog compensation and motor alternation on top of MOT commands.

On boot (when tracker is enabled), the firmware runs a homing sequence:

EL home: stall detect, 2 second timeout
AZ home: stall detect, 8 second timeout
"Antenna Facing Front"

The dish uses motor stalling (not limit switches) to find mechanical boundaries. The A3981’s stall detection watches for back-EMF signatures that indicate the motor has hit a hard stop.

After homing, the firmware reports cable wrap limits: wrap_min:-42333 wrap_max:2333 (centidegrees). Total AZ range is approximately 446.66 degrees.

The h <id> command triggers explicit homing for a single motor outside the boot sequence.

SpecValue
Chip ID0x4515
Silicon revisionB0
Firmware versionv113.37
Strap config0x25018
InterfaceSPI (mode 0x03) at 6.857 MHz
StandardDVB-S2 (Digital Video Broadcasting - Satellite, 2nd gen)
Search range18000-24000 ksps, rolloff 0.35

The BCM4515 is a highly integrated DVB-S2 demodulator. It handles the entire receive chain from IF input to transport stream output: RF/IF AGC, carrier recovery, timing recovery, LDPC/BCH decoding, and baseband processing.

K60 PinGPIOSPI FunctionNotes
PTD12D12SPI2_SCKSPI clock
PTD13D13SPI2_SOUTMOSI — MCU to BCM4515
PTD14D14SPI2_SINMISO — BCM4515 to MCU
PTD11D11SPI2_PCS0Chip select
PTD15D15SPI2_PCS1Secondary chip select (unused)
PTD10D10GPIO (OUT)Likely BCM4515 reset or power enable

The DVB submenu exposes several signal measurement modes useful for ham radio:

RSSIrssi <n> returns the average and current raw ADC values over n samples. Noise floor is approximately 500. Used for RF power measurement at each pointing position.

AGCagc streams real-time RF/IF AGC levels plus SNR and NID (Network ID). This is a continuous output interrupted by q.

SNR — Signal-to-noise ratio in dB.

Lock statusls returns total reads, no-signal count, glitch count, and NID table. qls gives a quick check.

LNB controllnbdc odu sets the LNB to 13V (V-polarization). Boot default is 18V (H-polarization). The lnbv command streams the actual voltage being applied.

The BCM4515 includes a DiSEqC controller for LNB switch control. DiSEqC uses 22 kHz tone bursts superimposed on the coax LNB bias line. The DVB submenu provides:

  • di2conf — LNB config register read
  • di2id — Hardware ID query
  • di2stat — LNB status flags
  • send <hex> — Raw DiSEqC packet transmission (up to 6 bytes)
  • ovraddr — Override target address (default 0x11)

Without an external DiSEqC switch connected, these commands return RxReplyTimeout.

The azscanwxp command in the MOT submenu performs an azimuth sweep while cycling through DVB transponders at each position. At each step, it records motor angle, RSSI, lock status, SNR, and scan delta. Combined with elevation stepping, this produces a 2D RF power map of the sky — essentially using the dish as a radio telescope.

azscanwxp [motor] [span_deg] [resolution_cdeg] [num_xponders]

Output per position:

Motor:<id> Angle:<cdeg> RSSI:<adc> Lock:<0/1> SNR:<dB> Scan Delta:<step>

This capability exists in the stock firmware — it was designed for Winegard’s factory alignment and satellite acquisition testing, but it works just as well for amateur radio sky mapping.