Make your 8BitDo Ultimate 2C Wired Controller work with Steam and games on macOS.
macOS doesn't natively recognize the 8BitDo Ultimate 2C controller. When you plug it in:
- System Information shows it under USB devices
- But no games or apps detect it as a controller
- Steam doesn't see it
GCController.controllers()returns empty
Connect in DirectInput mode by holding the B button while plugging in the USB cable.
That's it. Steam will recognize it immediately.
The 8BitDo Ultimate 2C has two USB modes:
| Mode | How to Activate | macOS Behavior |
|---|---|---|
| XInput (default) | Just plug in | Appears as keyboard (0x1/0x6) - doesn't work |
| DirectInput | Hold B while plugging in | Appears as Game Pad (0x1/0x5) - works! |
Steam's "Generic Gamepad Configuration Support" handles DirectInput devices natively.
- Unplug the controller if connected
- Hold the B button on the controller
- While holding B, plug in the USB-C cable
- Release B after the controller is connected
- Open Steam → Settings → Controller
- Your controller should appear as "8BitDo Ultimate 2C Wired Controller"
In Steam Controller Settings, you should see:
- Controller Name:
8BitDo Ultimate 2C Wired Controller - Game rumble: Available
- All buttons and sticks functional in "Test Device Inputs"
Recommended settings in Steam → Settings → Controller:
| Setting | Recommended |
|---|---|
| Enable Steam Input for generic controllers | ON |
| Game rumble | ON |
| Use Nintendo Button Layout | OFF (unless you prefer Nintendo layout) |
Some games work better with specific controller templates:
- Right-click game → Properties → Controller
- Choose "Enable Steam Input" or a specific template
- Big Picture Mode offers more detailed configuration
- Check connection mode: Unplug, hold B, replug
- Check Steam settings: Enable Steam Input for generic controllers
- Restart Steam after connecting the controller
- Check USB cable: Try a different USB-C cable
- Open Steam → Settings → Controller → "Test Device Inputs"
- Press buttons and move sticks to verify all inputs register
- If some inputs don't work, the controller may need firmware update
- Check if the game has native controller support settings
- Try enabling/disabling "Steam Input" for that specific game
- Some games require Big Picture Mode for controller support
- Model: 8BitDo Ultimate 2C Wired Controller
- USB Vendor ID:
0x2dc8 - USB Product ID:
0x301d(DirectInput mode) - Connection: USB-C wired only
For developers interested in raw HID access:
Byte 0: Report ID (0x01)
Byte 1: Buttons low byte (bitmask)
Byte 2: Buttons high byte (bitmask)
Byte 3: D-Pad (0x0F=neutral, 0-7=directions)
Byte 4: Left Stick X (0x00-0xFF, 0x7F=center)
Byte 5: Left Stick Y (0x00-0xFF, 0x7F=center)
Byte 6: Right Stick X (0x00-0xFF, 0x7F=center)
Byte 7: Right Stick Y (0x00-0xFF, 0x7F=center)
Byte 8: Left Trigger (0x00-0xFF)
Byte 9: Right Trigger (0x00-0xFF)
The GamepadReader/ directory contains a Swift CLI tool for debugging HID input:
cd GamepadReader
swift build
.build/debug/GamepadReaderThis tool:
- Detects the controller via IOKit HID
- Prints raw input values to console
- Useful for verifying the controller is in DirectInput mode
Note: Requires Input Monitoring permission in System Settings → Privacy & Security.
Games that use Apple's GCController API directly (without Steam) will not detect this controller. This includes:
- Apple Arcade games
- Some Mac App Store games
- Apps that specifically query
GCController.controllers()
Why? Apple's GCVirtualController API doesn't support programmatic input injection on native macOS (the setValue methods are marked [NoMac]). A DriverKit-based virtual HID device would be required to solve this, which is significantly more complex.
Workaround: For Apple Arcade games, consider using a controller that macOS natively supports (Xbox Wireless, PlayStation DualSense, etc.).
This solution only covers the wired 8BitDo Ultimate 2C. Bluetooth connectivity is not supported.
Only single-controller use has been tested. Multiple 8BitDo controllers may or may not work simultaneously.
macos-gamepad-driver/
├── README.md # This file
├── GamepadReader/ # Phase 1 PoC - HID input reader
│ ├── Package.swift
│ └── Sources/
│ └── GamepadReader/
│ ├── main.swift
│ ├── HIDManager.swift
│ └── GamepadInput.swift
├── docs/
│ └── Ultimate-2C-Wired-Controller.pdf # Controller manual
└── _bmad-output/ # Development artifacts
└── implementation-artifacts/
└── tech-spec-*.md
Issues and pull requests welcome. Key areas that could use help:
- Testing with other 8BitDo controller models
- Bluetooth support investigation
- DriverKit virtual HID device for native GCController support
- Multi-controller testing
MIT
- 8BitDo for making great controllers (even if macOS support is tricky)
- Steam for their excellent Generic Gamepad Configuration Support
- The IOKit/HID documentation (what little exists)