Skip to content

Instantly share code, notes, and snippets.

@palmerj
Last active August 12, 2022 22:52
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save palmerj/7a65e162c48bb417fe276ef8e78b9669 to your computer and use it in GitHub Desktop.
Save palmerj/7a65e162c48bb417fe276ef8e78b9669 to your computer and use it in GitHub Desktop.
8BitDo M30 2.4G Gamepad for Genesis Mini/Mega Drive Mini

Collection of FAQs and Configs for the 8BitDo M30 2.4G

image

Can I map the Dpad on this controller? Can I also map and swap the A/B/X/Y buttons on this controller?

Yes, you can when wired via USB. The default mode of the DPad on this controller is as left analogue stick. You can also:

  • LEFT + Select : set Dpad as left analogue stick.
  • Up + Select : reset Dpad.
  • Right + Select : set Dpad as right analogue stick.
  • Down + Select : Swap A/B and X/Y mapping (on Switch mode only).

Notes:

  • Press and hold any of the key combinations above for 5 seconds to map the buttons.
  • LED will blink in red to indicate the success of each button mapping.
  • You need to reset the buttons manually.

What do the two shoulder buttons do?

When it is connected to SG Mini/SG Mini:

  • L = Z
  • R = C

When it is connected to Switch:

  • C = R
  • Z = L
  • L = ZL
  • R = ZR

When it is connected to Windows 10:

  • C = R1
  • Z = L1
  • L = L2
  • R = R2

How do I charge the controller? How long does the battery last when fully charged?

We suggest you charge it via a phone power adapter. The controller uses 480mAh rechargeable battery with 1-2 hour charging time. The battery can last up to 35 hours when fully charged.

Controller won't turn on

Not sure if this applies to the M30 2.4G, but seems to work when in wired mode.

  • First, make sure it's off
  • Hold Start to power off - note the lights at the bottom

Now, to bring it back online:

  • Hold Y + Start to power on - Switch mode
  • Hold X + Start to power on - Windows X-Input mode
  • Hold B + Start to power on - Android OR Windows X-Input mode if using the Retro Receiver (also maybe Hold Select + Up for 3 seconds)

How do I update the firmware

  1. Turn off the controller
  2. Press and hold L+R+START to enter its pairing mode
  3. Blue and yellow LEDs start to blink
  4. Plug in the USB cable (PC will read it as a U disk)
  5. Copy or drag the DAT file to the U disk
  6. Unplug the USB cable and then press and hold START for 3 seconds to turn back on the controller

Manual

image

RetroArch / Batocera Mapping

image

  • C = A
  • B = B
  • Y = X
  • A = Y
  • X = LB
  • Z = RB
  • LB = L2
  • RB = R2

Emulation Station Input config (Wired via USB)

<inputConfig type="joystick" name="8BitDo M30 2.4G USB" deviceName="Microsoft X-Box 360 pad" deviceGUID="030000005e0400008e02000014010000">
  <input name="a" type="axis" id="5" value="1" code="5" />
  <input name="b" type="button" id="1" value="1" code="305" />
  <input name="down" type="hat" id="0" value="4" />
  <input name="hotkey" type="button" id="8" value="1" code="316" />
  <input name="joystick1left" type="axis" id="0" value="-1" code="0" />
  <input name="joystick1up" type="axis" id="1" value="-1" code="1" />
  <input name="joystick2left" type="axis" id="3" value="-1" code="3" />
  <input name="joystick2up" type="axis" id="4" value="-1" code="4" />
  <input name="l2" type="button" id="4" value="1" code="310" />
  <input name="left" type="hat" id="0" value="8" />
  <input name="pagedown" type="button" id="5" value="1" code="311" />
  <input name="pageup" type="button" id="2" value="1" code="307" />
  <input name="r2" type="axis" id="2" value="1" code="2" />
  <input name="right" type="hat" id="0" value="2" />
  <input name="select" type="button" id="6" value="1" code="314" />
  <input name="start" type="button" id="7" value="1" code="315" />
  <input name="up" type="hat" id="0" value="1" />
  <input name="x" type="button" id="3" value="1" code="308" />
  <input name="y" type="button" id="0" value="1" code="304" />
</inputConfig>

Emulation Station Input config (2.4G Wireless)

<inputConfig type="joystick" deviceName="6B controller" name="8BitDo M30 2.4G" deviceGUID="03000000a30c00002400000011010000">
  <input name="a" type="button" id="5" value="1" code="293" />
  <input name="b" type="button" id="1" value="1" code="289" />
  <input name="down" type="axis" id="1" value="1" code="1" />
  <input name="hotkey" type="button" id="8" value="1" code="296" />
  <input name="l2" type="button" id="6" value="1" code="294" />
  <input name="left" type="axis" id="0" value="-1" code="0" />
  <input name="pagedown" type="button" id="4" value="1" code="292" />
  <input name="pageup" type="button" id="3" value="1" code="291" />
  <input name="r2" type="button" id="7" value="1" code="295" />
  <input name="right" type="axis" id="0" value="1" code="0" />
  <input name="select" type="button" id="8" value="1" code="296" />
  <input name="start" type="button" id="9" value="1" code="297" />
  <input name="up" type="axis" id="1" value="-1" code="1" />
  <input name="x" type="button" id="0" value="1" code="288" />
  <input name="y" type="button" id="2" value="1" code="290" />
</inputConfig>

Libretro HID config 8Bitdo_M30_24G_USB.cfg

input_driver = "hid"

# This configuration is for when the controller is connected by USB. Note the 8BitDo M30 2.4G USB
# when plugged in via USB runs in XInput mode and identifies itself using a generic Xbox 360 Wired
# controller product and vendor ID. That means that it's impossible to change the RetroArch
# configuration for it without also affecting the configuration of other controllers!

input_device = "Xbox 360 Wired Controller"
input_device_display_name = "8BitDo M30 2.4G USB"
input_vendor_id = "1118"
input_product_id = "654"

# Buttons

# The RetroPad layout has four face buttons, whereas the M30 has six. We map the M30's to the Retroarch
# Megadrive/Genesis (6 Button) layout to allow nature layout in megadrive/genesis emulators.

# We map the M30's L and R buttons to the RetroPad's triggers, and map the M30's Z and C buttons to the 
# RetroPad's left and right shoulder buttons respectively. That may seem somewhat counterintuitive but
# it follows the convention that is used in many cores for systems that have six face buttons in this
# layout. That allows the controller to be autoconfigured and work in the natural way in the Beetle
# Saturn core, and  megadrive/genesis emulators. However, this does cause issues with some emulators
# with fighting games such as SNES, FBNeo, PSX and MAME. If you want a config for those systems uncomment
# config further below

# Mapping (M30->libretro):
# C = A
# B = B
# Y = X
# A = Y
# X = LB
# Z = RB
# LB = L2
# RB = R2

# Genesis/Saturn buttons layout:

input_select_btn = "9"
input_start_btn = "8"
input_menu_toggle_btn = "10"
input_a_axis = "+5"
input_b_btn = "1"
input_x_btn = "3"
input_y_btn = "0"
input_l_btn = "2"
input_r_btn = "5"
input_l2_btn = "4"
input_r2_axis = "+4"

input_select_btn_label = "Mode (-)"
input_start_btn_label = "Start"
input_menu_toggle_btn_label = "Heart"
input_a_axis_label = "C"
input_b_btn_label = "B"
input_x_btn_label = "Y"
input_y_btn_label = "A"
input_l_btn_label = "X"
input_r_btn_label = "Z"
input_l2_btn_label = "LB"
input_r2_axis_label = "RB"

# Fighting game layout for the SNES, FBNeo, PSX and MAME:
# uncomment further below if you want this one
# A = B
# B = A
# C = R
# X = Y
# Y = X
# Z = L
# LB = L2
# RB = R2

# input_select_btn = "9"
# input_start_btn = "8"
# input_menu_toggle_btn = "10"
# input_b_btn = "0"
# input_a_btn = "1"
# input_r_axis = "+5"
# input_y_btn = "2"
# input_x_btn = "3"
# input_l_btn = "5"
# input_l2_btn = "4"
# input_r2_axis = "+4"

# input_select_btn_label = "Mode (-)"
# input_start_btn_label = "Start"
# input_menu_toggle_btn_label = "Heart"
# input_b_btn_label = "A"
# input_a_btn_label = "B"
# input_r_axis_label = "C"
# input_y_btn_label = "X"
# input_x_btn_label = "Y"
# input_l_btn_label = "Z"
# input_l2_btn_label = "LB"
# input_r2_axis_label = "RB"

# D-Pad:

input_up_btn = "11"
input_down_btn = "12"
input_left_btn = "13"
input_right_btn = "14"

input_up_btn_label = "D-PAD Up"
input_down_btn_label = "D-PAD Down"
input_left_btn_label = "D-PAD Left"
input_right_btn_label = "D-PAD Right"

# The controller can be configured to have the D-Pad report inputs as either a left or right analog
# stick instead of as a digital D-Pad:

input_l_x_plus_axis = "+1"
input_l_x_minus_axis = "-1"
input_l_y_plus_axis = "-2"
input_l_y_minus_axis = "+2"

input_l_x_plus_axis_label = "D-PAD Right (Left Analog Stick Mode)"
input_l_x_minus_axis_label = "D-PAD Left (Left Analog Stick Mode)"
input_l_y_plus_axis_label = "D-PAD Down (Left Analog Stick Mode)"
input_l_y_minus_axis_label = "D-PAD Up (Left Analog Stick Mode)"

input_r_x_plus_axis = "+3"
input_r_x_minus_axis = "-3"
input_r_y_plus_axis = "+4"
input_r_y_minus_axis = "-4"

input_r_x_plus_axis_label = "D-PAD Right (Right Analog Stick Mode)"
input_r_x_minus_axis_label = "D-PAD Left (Right Analog Stick Mode)"
input_r_y_plus_axis_label = "D-PAD Down (Right Analog Stick Mode)"
input_r_y_minus_axis_label = "D-PAD Up (Right Analog Stick Mode)"

Also see

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment