Skip to content

macOS DriverKit driver to fix 8BitDo controller compatibility with Steam

Notifications You must be signed in to change notification settings

cannt/VirtualGamepad

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

macOS Gamepad Driver

Make your 8BitDo Ultimate 2C Wired Controller work with Steam and games on macOS.

The Problem

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

The Solution

Connect in DirectInput mode by holding the B button while plugging in the USB cable.

That's it. Steam will recognize it immediately.

Why This Works

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.

Quick Start

  1. Unplug the controller if connected
  2. Hold the B button on the controller
  3. While holding B, plug in the USB-C cable
  4. Release B after the controller is connected
  5. Open Steam → Settings → Controller
  6. Your controller should appear as "8BitDo Ultimate 2C Wired Controller"

Verify It's Working

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"

Steam Configuration

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)

Per-Game Configuration

Some games work better with specific controller templates:

  1. Right-click game → Properties → Controller
  2. Choose "Enable Steam Input" or a specific template
  3. Big Picture Mode offers more detailed configuration

Troubleshooting

Controller not detected in Steam

  1. Check connection mode: Unplug, hold B, replug
  2. Check Steam settings: Enable Steam Input for generic controllers
  3. Restart Steam after connecting the controller
  4. Check USB cable: Try a different USB-C cable

Controller detected but inputs don't work

  1. Open Steam → Settings → Controller → "Test Device Inputs"
  2. Press buttons and move sticks to verify all inputs register
  3. If some inputs don't work, the controller may need firmware update

Works in Steam but not in a specific game

  1. Check if the game has native controller support settings
  2. Try enabling/disabling "Steam Input" for that specific game
  3. Some games require Big Picture Mode for controller support

Technical Details

Controller Specifications

  • Model: 8BitDo Ultimate 2C Wired Controller
  • USB Vendor ID: 0x2dc8
  • USB Product ID: 0x301d (DirectInput mode)
  • Connection: USB-C wired only

HID Report Structure (DirectInput Mode)

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)

Phase 1 PoC Tool

The GamepadReader/ directory contains a Swift CLI tool for debugging HID input:

cd GamepadReader
swift build
.build/debug/GamepadReader

This 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.

Known Limitations

Native macOS Games (Non-Steam)

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.).

Bluetooth

This solution only covers the wired 8BitDo Ultimate 2C. Bluetooth connectivity is not supported.

Multiple Controllers

Only single-controller use has been tested. Multiple 8BitDo controllers may or may not work simultaneously.

Project Structure

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

Contributing

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

License

MIT

Acknowledgments

  • 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)

About

macOS DriverKit driver to fix 8BitDo controller compatibility with Steam

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published