8Bitdo M30 w/Retroarch

Sorry for bumping such an old thread.

As pointed out in other threads, most notably here, the current M30 Bluetooth autoconf from the repo is wrong. @ SirBedwyr has the right values in his thread. (complying with the LXR/YBA format for the 6 face buttons)

I have slightly reworked his profile for d-input adding the “Heart” key as the Menu Toggle key and renamed “Mode” as “Minus (-)” so that is is easier to remap SNES or other systems. L & R on the M30 also mapped as L2 and R2 of the RetroPad. It should help with Saturn.

Haven’t checked X-Input / udev / USB mode yet but they may have the same issue?

# 8BitDo M30 BT          - http://www.8bitdo.com/     - http://www.8bitdo.com/m30/
# Firmware v1.14         - http://support.8bitdo.com/

input_driver = "dinput"
input_device = "Bluetooth Wireless Controller   "
input_device_display_name = "8BitDo M30"

input_vendor_id = "11720"
input_product_id = "1617"

# ---------------------------------------

input_b_btn = "1"
input_y_btn = "0"
input_select_btn = "10"
input_start_btn = "11"
input_a_btn = "7"
input_x_btn = "4"
input_l_btn = "3"
input_r_btn = "6"
input_l2_btn = "8"
input_r2_btn = "9"
input_menu_toggle_btn = "2"

input_b_btn_label = "B"
input_y_btn_label = "A"
input_select_btn_label = "Minus (-)"
input_start_btn_label = "START"
input_a_btn_label = "C"
input_x_btn_label = "Y"
input_l_btn_label = "X"
input_r_btn_label = "Z"
input_l2_btn_label = "L"
input_r2_btn_label = "R"
input_menu_toggle_btn = "Heart"

# ---------------------------------------

input_up_btn = "h0up"
input_down_btn = "h0down"
input_left_btn = "h0left"
input_right_btn = "h0right"

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"

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

input_l_x_plus_axis_label = "D-PAD RIGHT"
input_l_x_minus_axis_label = "D-PAD LEFT"
input_l_y_plus_axis_label = "D-PAD DOWN"
input_l_y_minus_axis_label = "D-PAD UP"

input_r_x_plus_axis = "+2"
input_r_x_minus_axis = "-2"
input_r_y_plus_axis = "+5"
input_r_y_minus_axis = "-5"

input_r_x_plus_axis_label = "D-PAD RIGHT"
input_r_x_minus_axis_label = "D-PAD LEFT"
input_r_y_plus_axis_label = "D-PAD DOWN"
input_r_y_minus_axis_label = "D-PAD UP"
1 Like

You are absolutely right. I keep meaning to put in a pull request for both this and the snes modkit from another thread and it’s just a lower priority while o get a bunch of RL stuff sorted. If you’re feeling ambitious, feel free to change the ID for both devices (I think I have the correct one cited in the snes thread) a pull request and beat me to it. Just let everyone know here you’re done and very sorry for not being on the ball.

I’ll look at udev / x-input and the IDs over the weekend and try submit a PR. I’m only familiar with Github as a “passive” user (pulling sources, following compiling guides). Will report here if I need help!

Thanks for the reply!

OK, looks like I managed to do the PR? Had no idea Github had such a neat web interface.

fix for 8Bitdo M30 Bluetooth controller layout

Thanks again!

2 Likes

@Tanuki

Thanks for this, I want to share the recent config since the configuration template has changed since with recent versions, but otherwise it matches yours content-wise. If I buy a Genesis looking gamepad, I expect it to work with Sega Gensis games, I really don’t understand the RetroArch developer approach here. I wonder if they have overwritten your pull request.

The content of 8Bitdo_M30_gamepad.cfg:

# 8BitDo M30 Bluetooth controller
# https://www.8bitdo.com/m30/
# https://support.8bitdo.com/
# Firmware v1.15
#
# This configuration is for when the controller is connected by Bluetooth, and there's a corresponding one for when it is connected by USB.
#
# It's best to use this controller in DirectInput mode (which the manual calls "Android (D - input)") rather than XInput mode because in XInput mode it identifies itself using a generic product ID and a generic name that is shared with other 8BitDo controllers. That means that it's impossible to change the RetroArch configuration for it without also affecting the configuration of other 8BitDo controllers that have different layouts. In DirectInput mode the controller uses a unique product ID so we can recognize and configure it distinctly.

input_device_display_name = "8BitDo M30"

input_driver = "dinput"
input_device = "Bluetooth Wireless Controller   "
input_vendor_id = "11720"
input_product_id = "1617"

# Buttons:

# The RetroPad layout has four face buttons, whereas the M30 has six. 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 in 6-button fighting games in the FinalBurn Neo and MAME cores.

input_a_btn = "7"
input_b_btn = "1"
input_x_btn = "4"
input_y_btn = "0"
input_l_btn = "3"
input_r_btn = "6"
input_l2_btn = "8"
input_r2_btn = "9"
input_select_btn = "10"
input_start_btn = "11"
input_menu_toggle_btn = "2"

input_a_btn_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 = "L"
input_r2_btn_label = "R"
input_select_btn_label = "Minus (-)"
input_start_btn_label = "Start"
input_menu_toggle_btn_label = "Heart"

# D-Pad:

input_up_btn = "h0up"
input_down_btn = "h0down"
input_left_btn = "h0left"
input_right_btn = "h0right"

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 = "+0"
input_l_x_minus_axis = "-0"
input_l_y_plus_axis = "+1"
input_l_y_minus_axis = "-1"

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

input_r_x_plus_axis = "+2"
input_r_x_minus_axis = "-2"
input_r_y_plus_axis = "+5"
input_r_y_minus_axis = "-5"

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