The original Xbox Communicator (voice headset), emulated on an ESP32-S3
Eagle makes an ESP32-S3 present itself as the original Xbox Communicator (the controller headset — Microsoft's internal codename for it really was Hawk), so an unmodified Xbox title sees a real communicator: microphone in, headphone out. Sibling of Talon (controller) and Falcon (camera).
Milestone 1 (this repo) — working, hardware-verified: the board has no microphone yet, so it "speaks" a recognizable C5–E5–G5 arpeggio into the mic endpoint and measures whatever the Xbox plays back to the headphone endpoint. With the bundled Xbox-side test app the loop closes end to end on a real console:
ESP32 tone ──iso IN──▶ Xbox mic XMO ──▶ TV speakers (you hear the arpeggio)
│
└──▶ headphone XMO ──iso OUT──▶ ESP32 stats
(the ESP32 heartbeat logs level + frequency)
The Xbox reads the tone (peak 12000, ~491 Hz averaged across the arpeggio), plays it out the TV and loops it back to the headphone endpoint, which the ESP32 receives and measures — proving both directions of the audio path.
The Xbox side needs the Hawk USB class driver present in the kernel/XAPI USB stack. It ships in the retail
xvoice.lib; the open-source RXDK toolchain carries a port of it (see the RXDK-Libslibxapi/usb/hawkdriver). Stock setups without that driver will enumerate the device but cannot open the communicator XMOs.
Planned next: stream a decoded OGG file as the mic source, WiFi
provisioning/web UI (ported from Talon's wifi_net), and eventually a real
I2S microphone/speaker path.
The communicator is one USB 1.1 device, VID/PID 045E:0283, with two
vendor-specific interfaces of class 0x78, one isochronous endpoint each:
| Interface | Endpoint | Direction | Role |
|---|---|---|---|
| 0 | 0x04 iso OUT |
Xbox → device | headphone (playback) |
| 1 | 0x85 iso IN |
device → Xbox | microphone (capture) |
Audio is 16-bit mono PCM, ≤50-byte packets, one per 1 ms USB frame. The rate is
set over EP0 with a vendor SET_FEATURE (bmRequestType 0x41, bRequest 0x03):
wIndex 0 selects a sample rate by index into {8000, 11025, 16000, 22050, 24000} Hz (wValue = 0x0100 | index), wIndex 1 toggles AGC. At 11.025 and
22.05 kHz some frames carry one extra sample (hawk_rates[] in
main/usb_descriptors.c mirrors the driver's own table).
Descriptors are byte-faithful to Microsoft's USB simulator of the device
(usbsim in the leak); the Hawk class driver matches by interface class and
endpoint direction, not VID/PID. Prior art:
Ryzee119/hawk (communicator firmware) and
xemu's usb-xblc device.
main/— ESP-IDF firmware: descriptors (usb_descriptors.c), the custom TinyUSB class driver owning both iso endpoints + the vendor EP0 requests (hawk_class.c), the tone source (tone.c), optional WiFi UDP log mirror (wifi_log.c, Kconfig-gated off).xbox/HawkLoopback/— RXDK test app: mic → headphone and mic → TV speakers, with a per-second level/frequency printout (see its readme).patches/— the dwc2 EP0-SETUP-DMA fix foresp_tinyusb, auto-applied at configure time (inherited from Falcon).
ESP-IDF ≥ 5.5, ESP32-S3. The native USB port is the communicator, so flash/log over the UART bridge:
idf.py set-target esp32s3
idf.py -p COM3 build flash monitorPlug the ESP32's native USB into a controller's communicator (top expansion) slot — the Xbox's Hawk driver expects the device behind the controller's internal hub, and rejects the bottom slot. The heartbeat line on the monitor shows enumeration state, the rate the Xbox selected, mic packets flowing out, and the level/±frequency of headphone audio coming back.
WiFi logging (UDP broadcast of the log, port 5556) is off by default — on
Falcon the radio load broke the Xbox's timing-strict enumeration. Enable
HAWK_WIFI_LOG in menuconfig for bench debugging only (needs
main/wifi_creds.h, copy the example).
xbox/HawkLoopback is a standard RXDK project: open the folder in VS Code
(RXDK extension) or VS20XX and press F5 — it builds, deploys over xbdm, and
launches. Watch the "Xbox Title" output for the per-port frequency estimate.
The same app also works against xemu (Input → attach an Xbox Live Communicator) and against a real communicator — speak into it and you'll hear yourself on the TV.