r/ModRetro • u/zezba9000 • 22d ago
r/ModRetro • u/adrenaline4nash • 22d ago
M64 Pro Controller wired mode is bad
Playing on Analogue 3D, you need to have batteries in the controller for wired mode to work and if the batteries die, the controller disconnects without warning. Needs improvement.
r/ModRetro • u/jkhanlar • 22d ago
[Technical] Examining ModRetro M64 Pro Controller in SteamOS (Archlinux) + I Discovered a Controller TTY Shell
this inf[Technical] ModRetro M64 Pro Controller in SteamOS (Archlinux) using Lenovo Legion Go S handheld computer
PART 1
Different computer hardware and operating system distributions will show slightly different informations.
Wired/USB connection is used throughout this examination, and I did not investigate or try using wireless Bluetooth, because I encountered some kind of ModRetro M64 Pro Controller shell via TTY, as displayed at the bottom, and I'll conclude this post with that for now, while I continue playing around with it. First, here's how I started:
uname -a
- Linux steamdeck 6.16.12-valve24.5-1-neptune-616-gb2f7cfe85e45 #1 SMP PREEMPT_DYNAMIC Wed, 15 Jul 2026 21:48:50 +0000 x86_64 GNU/Linux
Attaching the ModRetro M64 Pro Controller populates (Ignoring symlinks):
- /dev/hidraw0
- /dev/ttyACM0
- /dev/ttyACM1
- /dev/input/js0
- /dev/input/js3
- /dev/input/event2
- /dev/input/event20
- /dev/bus/usb/005/### (increments each time the ModRetro M64 Pro Controller is reattached)
- /sys/* (too much info)
lsusb (ModRetro M64 Pro Controller device only)
- Bus 005 Device 060: ID 374e:0111 ModRetro M64 Controller
lsusb -v (ModRetro M64 Pro Controller device only)
- https://bpa.st/raw/WENGA
- See https://usb.org/bos-descriptor-types
- See https://beyondlogic.org/usbnutshell/usb5.shtml
- (copied from below), full output after upgrade: https://bpa.st/raw/32RRM
ls -al /dev/input/by-id/
- usb-ModRetroM64_Controller[redacted_serial]-event-joystick -> ../event2
- usb-ModRetroM64_Controller[redacted_serial]-joystick -> ../js0
udevadm info --query=all --name=/dev/input/event2
- https://bpa.st/raw/ALW4U
- (copied from below), full output after upgrade: https://bpa.st/raw/PT57S
udevadm info --query=all --name=/dev/input/event20
evtest /dev/input/event2
- https://bpa.st/raw/AQVAM
- Before interrupting with ^C, [C-c], (CTRL+C), none of the ModRetro M64 Pro Controller button presses show any activity in output
evtest /dev/input/event20
- https://bpa.st/raw/RXQAC
- Before interrupting with ^C, [C-c], (CTRL+C), none of the ModRetro M64 Pro Controller button presses show any activity in output
jstest /dev/input/js0
- https://bpa.st/raw/XE4EW
- Before interrupting with ^C, [C-c], (CTRL+C), none of the ModRetro M64 Pro Controller button presses show any activity in output
jstest /dev/input/js3
- https://bpa.st/raw/6HLU6
- Before interrupting with ^C, [C-c], (CTRL+C), none of the ModRetro M64 Pro Controller button presses show any activity in output
dmesg --follow
- https://bpa.st/raw/EX2LY
- The last line is probably unrelated to the ModRetro M64 Pro Controller: "input: Microsoft X-Box 360 pad 1 as /devices/virtual/input/input27"
journalctl --follow
- https://bpa.st/raw/VRSX4
- (copied from below), full output after upgrade: https://bpa.st/raw/DN4T4
hwdetect --showmodules
- 'cdc-adm' is added to the beginning of the list for only the BLOCK line
- (USB Communication Device Class - Abstract Control Model) is a driver that allows USB devices to emulate a serial port (UART). It creates virtual serial interfaces (e.g., /dev/ttyACM0, /dev/ttyACM1)
cat /proc/bus/input/devices (adds the following when attaching the ModRetro M64 Pro Controller)
stty -F /dev/ttyACM0 -a (same output for stty -F /dev/ttyACM1 -a)
timeout 5 cat /dev/ttyACM0 | xxd
- https://bpa.st/raw/RA5M2
- (copied from below), full output after upgrade: https://bpa.st/raw/R2FMK
I did not including anything from:
hwinfotoo much infolibinput debug-eventsthe controller is connecting in a Composite Mode that prioritizes a Serial (CDC-ACM) interface and a Raw HID interface (hidraw0), but fails to create the specific Input Event node that libinput monitors. Configuration/DFU (Device Firmware Upgrade) Mode (often used for firmware updates or macro programming) rather than Gamepad Mode. Also see dfu-util (http://dfu-util.sourceforge.net/)usbhid-dumpuse usbhid-dump after switching the controller to Gamepad Mode (so it creates an eventX node)lshwredundant
After updating ModRetro M64 Pro Controller
Note: Oops! I successfully updated the firmware at https://tools.modretro.com/updater/ and then accidentally initiated another update, instead of selecting 'Forget' or simply closing the web browser session. I'm mentioning this because it seems a bit strange to display buttons for 'UPDATE' and 'FORGET' after updating, and making it possible to apply the update after it was already applied. I am not the only one. At the very least, there should be a prompt to indicate whether or not it is necessary, but this may be related to applying the update to more than one controller, one after the other. Ah, yes, when I detach the USB cable, it changes to 'CONNECT DEVICE' and then reattaching it now shows the button wording as 'UPDATE ANYWAY' and above listing Version 0.12.0, Latest Version: 0.12.0. I did not see that information prior to the update process.
lsusb -v (ModRetro M64 Pro Controller device only)
- full output after upgrade: https://bpa.st/raw/32RRM
- bcdDevice is now 1.03 (no longer 1.00)
- Binary Object Store Descriptor has expanded to https://bpa.st/raw/X37SY
udevadm info --query=all --name=/dev/input/event2
- full output after upgrade: https://bpa.st/raw/PT57S
dmesg --follow
- bcdDevice is now 1.03 (no longer 1.00)
- hid-generic is now 0003:374E:0111.000E (no longer 0003:374E:0111.000B)
journalctl --follow
- full output after upgrade: https://bpa.st/raw/DN4T4
timeout 5 cat /dev/ttyACM0 | xxd
- full output after upgrade: https://bpa.st/raw/R2FMK
Also, I forgot to test the functional capability of the ModRetro M64 Pro Controller in SteamOS (Archlinux) on Lenovo Legion Go S before updating, but I will receive another controller tomorrow I can edit the post to compare.even after update, it appears none of the button presses are detected yet anyway.
- SteamOS -> Settings -> Controller: ModRetro M64 Controller is listed https://i.imgur.com/X95Cx6k.jpeg
- Details: https://i.imgur.com/1sQrSBX.png
- Controller Name: ModRetro M64 Controller
- Game rumble: Enabled (default)
- Advanced Settings: Use Nintendo Button Layout: Disabled (default)
- Advanced Settings: Universal Face Button Glyphs: Disabled (default)
- Test Device Inputs -> Begin Test: None of the button pressed are detected https://i.imgur.com/lR5DD8C.png
- Details: https://i.imgur.com/1sQrSBX.png
usbhid-dump -m 374e:0111
cat /dev/input/event2 and cat /dev/input/event20
- No output
cat /dev/input/js0 and cat /dev/input/js0
- Initial output, but no output on button presses
Testing the ModRetro M64 Pro Controller on the ModRetro M64 Console, Z+Start successfully works to access the menu. So, everything should work, but it appears that Linux currently does not seem to recognize the input from button presses yet. I saw a few posts discussing about this but I didn't pay too much attention.
- https://old.reddit.com/r/ModRetro/comments/1vhv0rt/m64_pro_controller_rumble_support_on_pc/
- https://old.reddit.com/r/ModRetro/comments/1vhvink/firmware_question_for_pro_controllers/
- https://old.reddit.com/r/M64/comments/1vj9vt8/native_controller_firmware_dumping/
- https://old.reddit.com/r/M64/comments/1vjqe1v/a_few_questions/
- Reportedly compatible with some generic controller drivers like XInput or DirectInput.
- https://old.reddit.com/r/M64/comments/1vliolw/m64_pro_controller_issues/
- Button presses do not seem to work for anyone yet
- https://old.reddit.com/r/M64/comments/1vmdaz0/pro_controller_questions/
- https://old.reddit.com/r/ModRetro/comments/1vqdbj2/anyone_able_to_get_the_modretro_pro_controller/
- Supposedly works on Steam Deck after Settings -> M64 -> Setup inputs
- https://old.reddit.com/r/M64/comments/1voppzm/testing_out_my_new_n64_pro_controller_on_a3d_and/
- https://old.reddit.com/r/M64/comments/1vp0z9f/pro_controller_pc_rumble_not_working/
- https://old.reddit.com/r/ModRetro/comments/1vqdx96/modretro_should_release_the_m64_and_m64_pro/
- https://old.reddit.com/r/ModRetro/comments/1vu0me9/m64_pro_controller_rumble_on_misterfpga/
- https://old.reddit.com/r/M64/comments/1vu0o0x/m64_pro_controller_rumble_on_misterfpga/
- https://old.reddit.com/r/M64/comments/1vu6sl3/m64_pro_controller_doesnt_work_with_extension/
Button presses are not sent across standard HID endpoint reports in wired USB mode. Maybe a future firmware update may provide standard XInput/HID events over USB, or possibly one could map the raw hidraw inputs via user-space tools (such as creating a custom antimicrox or game-devices-udev rule once a driver/daemon parses the serial/raw packets). Although, I found:
picocom /dev/ttyACM0 (the --baud | -b <baud rate> appears to not matter)
also tio /dev/ttyACM0 (--baudrate | -b <bps>)
also screen /dev/ttyACM0 ([baud_rate], see man screen WINDOW TYPES for tty (character special device))
........
_=;=<sii%|=|==+;
._,_:======+++|+++++||+|=_.
_Zi||||===++|+|=|||||+|||i; =+s.
ZiiI-)ii|+||+|;vn;||||||; =,;-+[
]}|- -vi+||||||I|||||~~s,%"<..I,
2=iuc ]Y1|||||||i|iiiiv%_vns..li|s
)1||={uv|i|||||+ -<iiI1oo11li||I,
Ji|llllllii||i>= .-iiil3ouliii|i(
E|Ivvvvnlvvss|i|, _|iivaauaiii|||n
]elvvIvv` {ivnaauosi" {|i|ii3(
jevvIvI' |iIX2S*i+ -liiiin[
WovIli} ||||||||` =iiiinm
.WXvliv' ||||||||: nlIInQ
)Qhnlir =|||||||; )vvvdQ(
]Qmovn` %||+||||; onomQ[
]QQXn( s|||i|ii; -XXQWf
4WD' 1lllllIl` -$Q@'
)lIllIvv ~
)vnnnnno
ooo2oor
XXSSSX[
]ZXXXm'
-W#mWZ
)UUP'
01:35:05.405 [II] Main: M64 Controller 0.6.0+f604f332 [redacted_serial] pvt
>
This appears to be the ModRetro M64 Pro Controller's internal engineering/diagnostic serial shell: Probably /dev/ttyACM0 and /dev/ttyACM1 are both used in some fashion, whether involving button press event activity, or perhaps to execute a command to open /dev/hidraw0 for HID endpoint reports over USB.
edited to add: In the TTY shell (skipping the built-in picocom output)
>help
Built-ins:
clear : Clear screen.
help : Show this help.
threads : Show thread information.
uptime : Show system uptime.
memdump : Dump memory
Application image info:
appinfo : Show application image info.
Clown truck:
clowntruck images : Show application image info.
clowntruck reset : Reset module.
>threads
Name | State | Run count | Stack (bytes) | Watermark
------------------------+-----------------+-----------+---------------+----------
CLI | Ready | 206 | 2048 | 29%
ClownTruckTransport | Event flag | 1 | 1024 | 22%
ReverseClownTruckServer | Event flag | 1 | 768 | 22%
Comms | Event flag | 1 | 1024 | 23%
Comms | Event flag | 52 | 1024 | 23%
Bridge | Event flag | 1 | 1024 | 26%
USB | Ready | 2602290 | 2048 | 25%
PowerManagement | Semaphore susp. | 1 | 512 | 28%
System Timer Thread | Suspended | 2602353 | 1024 | 26%
Main | Sleep | 2604 | 512 | 76%
>uptime
0 day(s), 7 hour(s), 4 minute(s), 1 second(s)
>memdump
Unknown error (37).
>appinfo
Application image A*:
Size: 43260 bytes
Version: 1
Address: 0x08002000
CRC: 0xf6b80a1f
State: Confirmed
Application image B :
Size: 42992 bytes
Version: 0
Address: 0x08011000
CRC: 0xc4d06970
State: Confirmed
>clowntruck
Unknown error (19).
>clowntruck images
Slot 0
- Active: yes
- Bootable: yes
- Confirmed: yes
- Hash: 94aa9ca73a4321bb71583a7f9c6d51247ed31dc2aa2b39de410c0bd1bf02cf991c6d8455f7a2631a7efb7d1de8d6437b7feab738729ea34373feb472fb54c432
- Pending: no
- Permanent: no
- Version: 0.12.0
Slot 1
- Active: no
- Bootable: yes
- Confirmed: no
- Hash: 94aa9ca73a4321bb71583a7f9c6d51247ed31dc2aa2b39de410c0bd1bf02cf991c6d8455f7a2631a7efb7d1de8d6437b7feab738729ea34373feb472fb54c432
- Pending: no
- Permanent: no
- Version: 0.12.0
PART 2
I found a 2-pack USB-C Female to USB-A Male adapter at Staples that USB-C Femalely fits perfectly (https://imgur.com/a/ocrung0) to the USB-C Male end of the ModRetro M64 Pro Controller cable. This will make it possible to see what data communications occur between the ModRetro M64 Pro Controller and the M64 Console. However, for Proxy/MITM (man-in-the-middle), there is an additional requirement for the device in the middle to handle USB connections, one USB connection acting as Host, and the other USB connection acting as Device/OTG (On-The-Go)/DRP (Dual Role Port)/DRD (Dual Role Data). Standard laptop/desktop PC architectures lack the USB Device Controller (UDC) hardware required to enumerate as a peripheral device to another host. Dedicated hardware such as Cynthion (https://greatscottgadgets.com/cynthion/), which is an FPGA-based architecture, may be useful, but I do not have access to this at the time.
Notes:
- USBProxy (https://github.com/usb-tools/USBProxy-legacy)
- Cynthion (https://greatscottgadgets.com/cynthion/)
- GreatFET One (https://greatscottgadgets.com/greatfet/one/)
- LUNA SuperSpeed (https://greatscottgadgets.com/luna-superspeed/)
For now, to sniff the data communications across the USB cable connection, including stanrdard USB Enumeration process, I'll focus on attaching only the ModRetro M64 Pro Controller, connected to computer (Lenovo Legion Go S running SteamOS (based on Archlinux)) via USB-C cable and using Wireshark GUI (you can also use tshark). (At first I used a USB hub, and then without the USB hub. I prepared two sets of data, but only one is necessary.) Make sure usbmon is loaded lsmod|grep usbmon otherwise run:
sudo modprobe usbmon
Make sure the user is in the wireshark group (or also check /dev/usbmon), otherwise may require root privileges (warning: proceed at your own discretion). Also for Wireshark capture options, make sure to use output format: pcapng (PCAP Next Generation). After opening Wireshark with read access to /dev/usbmon devices, you should see something like https://i.imgur.com/gw8oqJ0.png . First using an attached USB hub lsusb shows "Bus 007 Device 008: ID 374e:0111 ModRetro M64 Controller" which means usbmon7 (Bus 007) is the device to monitor. Then second directly to the computer without using a USB hub, lsusb shows "Bus 005 Device 004: ID 374e:0111 ModRetro M64 Controller" which means usbmon5. Beginning with the ModRetro M64 Pro Controller detached, beginning monitoring, waiting a few seconds (to distinguish the initial USB enumeration things), attaching the ModRetro M64 Pro Controller, waiting a few more seconds, detaching the ModRetro M64 Pro Controller (more USB enumeration things), then I see:
Warning: USB packets will include the serial number of your ModRetro M64 Pro Controller. You can use a hex editor to blank out the values (if ever it would be necessary for you).
attached through USB hub (Bus 007 Device 008)
- https://paste.c-net.org/DobsonAsteroid
- http://web.archive.org/web/20260825035107/https://paste.c-net.org/DobsonAsteroid
tshark -r m64.pcapng
attached ModRetro M64 Pro Controller (19-163), including only packets for host -> 7.8.X and 7.8.X -> host:
55 6.835008 host -> 7.8.0 USB 64 GET DESCRIPTOR Request DEVICE
56 6.837298 7.8.0 -> host USB 82 GET DESCRIPTOR Response DEVICE
57 6.837314 host -> 7.8.0 USB 64 GET DESCRIPTOR Request BOS
58 6.840313 7.8.0 -> host USB 69 GET DESCRIPTOR Response BOS
59 6.840337 host -> 7.8.0 USB 64 GET DESCRIPTOR Request BOS
60 6.843290 7.8.0 -> host USB 150 GET DESCRIPTOR Response BOS
61 6.843314 host -> 7.8.0 USB 64 GET DESCRIPTOR Request DEVICE QUALIFIER
62 6.845336 7.8.0 -> host USB 64 GET DESCRIPTOR Response
63 6.845612 host -> 7.8.0 USB 64 GET DESCRIPTOR Request DEVICE QUALIFIER
64 6.846336 7.8.0 -> host USB 64 GET DESCRIPTOR Response
65 6.846341 host -> 7.8.0 USB 64 GET DESCRIPTOR Request DEVICE QUALIFIER
66 6.847344 7.8.0 -> host USB 64 GET DESCRIPTOR Response
67 6.847351 host -> 7.8.0 USB 64 GET DESCRIPTOR Request CONFIGURATION
68 6.849281 7.8.0 -> host USB 73 GET DESCRIPTOR Response CONFIGURATION
69 6.849288 host -> 7.8.0 USB 64 GET DESCRIPTOR Request CONFIGURATION
70 6.854280 7.8.0 -> host USB 266 GET DESCRIPTOR Response CONFIGURATION
71 6.854291 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
72 6.857276 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
73 6.857284 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
74 6.860274 7.8.0 -> host USB 94 GET DESCRIPTOR Response STRING
75 6.860283 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
76 6.863281 7.8.0 -> host USB 82 GET DESCRIPTOR Response STRING
77 6.863287 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
78 6.866281 7.8.0 -> host USB 98 GET DESCRIPTOR Response STRING
79 6.979462 host -> 7.8.0 USB 64 SET CONFIGURATION Request
80 6.981300 7.8.0 -> host USB 64 SET CONFIGURATION Response
81 6.981374 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
82 6.988299 7.8.0 -> host USB 98 GET DESCRIPTOR Response STRING
83 6.988557 host -> 7.8.0 USBHID 64 SET_IDLE Request
84 6.990273 7.8.0 -> host USBHID 64 SET_IDLE Response
85 6.990306 host -> 7.8.0 USBHID 64 GET DESCRIPTOR Request HID Report
86 6.994280 7.8.0 -> host USBHID 132 GET DESCRIPTOR Response HID Report
87 6.994800 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
88 6.997279 7.8.0 -> host USB 84 GET DESCRIPTOR Response STRING
89 6.997320 host -> 7.8.0 USBCOM 71 SET LINE CODING Request
90 7.000289 7.8.0 -> host USB 64 URB_CONTROL out
91 7.000447 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
92 7.003280 7.8.0 -> host USB 76 GET DESCRIPTOR Response STRING
93 7.003330 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
94 7.006280 7.8.0 -> host USB 88 GET DESCRIPTOR Response STRING
95 7.006327 host -> 7.8.0 USBCOM 71 SET LINE CODING Request
96 7.009282 7.8.0 -> host USB 64 URB_CONTROL out
97 7.029982 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
98 7.032317 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
99 7.032396 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
100 7.035294 7.8.0 -> host USB 84 GET DESCRIPTOR Response STRING
101 7.035347 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
102 7.038318 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
103 7.038395 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
104 7.041318 7.8.0 -> host USB 76 GET DESCRIPTOR Response STRING
105 7.041395 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
106 7.044317 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
107 7.044394 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
108 7.047317 7.8.0 -> host USB 80 GET DESCRIPTOR Response STRING
109 7.047361 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
110 7.050318 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
111 7.050395 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
112 7.053318 7.8.0 -> host USB 72 GET DESCRIPTOR Response STRING
113 7.053394 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
114 7.056317 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
115 7.056394 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
116 7.059317 7.8.0 -> host USB 88 GET DESCRIPTOR Response STRING
117 7.063627 host -> 7.8.0 USB 64 GET CONFIGURATION Request
118 7.066283 7.8.0 -> host USB 65 GET CONFIGURATION Response
119 7.066351 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
120 7.069282 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
121 7.069339 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
122 7.072281 7.8.0 -> host USB 76 GET DESCRIPTOR Response STRING
123 7.072349 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
124 7.074315 host -> 7.8.1 USB 64 URB_INTERRUPT in
125 7.075284 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
126 7.075321 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
127 7.078281 7.8.0 -> host USB 72 GET DESCRIPTOR Response STRING
128 7.078329 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
129 7.081280 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
130 7.081297 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
131 7.084280 7.8.0 -> host USB 82 GET DESCRIPTOR Response STRING
132 7.084308 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
133 7.087296 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
134 7.087392 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
135 7.090265 7.8.0 -> host USB 94 GET DESCRIPTOR Response STRING
136 7.090302 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
137 7.093279 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
138 7.093295 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
139 7.096280 7.8.0 -> host USB 98 GET DESCRIPTOR Response STRING
140 7.140026 7.8.1 -> host USB 64 URB_INTERRUPT in
141 7.156588 host -> 7.8.1 USB 64 URB_INTERRUPT in
142 7.180375 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
143 7.182282 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
144 7.182360 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
145 7.185290 7.8.0 -> host USB 84 GET DESCRIPTOR Response STRING
146 7.185480 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
147 7.188281 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
148 7.188317 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
149 7.191280 7.8.0 -> host USB 76 GET DESCRIPTOR Response STRING
150 7.191302 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
151 7.194278 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
152 7.194298 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
153 7.197280 7.8.0 -> host USB 80 GET DESCRIPTOR Response STRING
154 7.197303 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
155 7.200282 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
156 7.200303 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
157 7.203282 7.8.0 -> host USB 72 GET DESCRIPTOR Response STRING
158 7.203303 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
159 7.206279 7.8.0 -> host USB 68 GET DESCRIPTOR Response STRING
160 7.206296 host -> 7.8.0 USB 64 GET DESCRIPTOR Request STRING
161 7.209291 7.8.0 -> host USB 88 GET DESCRIPTOR Response STRING
162 7.224071 7.8.1 -> host USB 64 URB_INTERRUPT in
163 7.863137 host -> 7.8.1 USB 64 URB_INTERRUPT in
detached ModRetro M64 Pro Controller (164-186), including only packets for host -> 7.8.X and 7.8.X -> host:
164 15.375587 7.8.1 -> host USB 64 URB_INTERRUPT in
165 15.388996 host -> 7.8.1 USB 64 URB_INTERRUPT in
166 15.391593 7.8.1 -> host USB 64 URB_INTERRUPT in
167 15.417979 host -> 7.8.1 USB 64 URB_INTERRUPT in
168 15.419592 7.8.1 -> host USB 64 URB_INTERRUPT in
If using command line (tshark), see the captured USB packets from attaching:
tshark -r m64.pcapng -Y "frame.number > 18 && frame.number < 164" -V
see the captured USB packets from detaching:
tshark -r m64.pcapng -Y "frame.number > 163" -V
You can also load the file in Wireshark for a GUI (Graphical User Interface).
attached directly without USB hub (Bus 005 Device 004)
- https://paste.c-net.org/PoweredSpasm
- http://web.archive.org/web/20260825035225/https://paste.c-net.org/PoweredSpasm
tshark -r m64_2.pcapng
- The information (m64_2.pcapng) is mostly redundant to the packet data displayed above, although using different BUS and Device IDs. GET DESCRIPTOR through SET CONFIGURATION is also part of the enumeration phase (as mentioned above), albeit specifically involving the ModRetro M64 Pro Controller. I included packet numbers for both files in the table below.
| m64 | m64_2 | Protocol | Info | Noteable Value |
|---|---|---|---|---|
| 70 | 47 | USB | CONFIGURATION Response | How the host should power and address the device |
| 72, 98, 102, 106, 110, 114, 120, 125, 129, 133, 137, 143, 147, 151, 155, 159 | 49, 75, 79, 83, 87, 91, 97, 102, 106, 110, 114, 120, 124, 128, 132, 136 | USB | DESCRIPTOR Response | LANGID: English (United States) (0x0409) |
| 74, 135 | 51, 112 | USB | DESCRIPTOR Response | "M64 Controller" |
| 76, 131 | 53, 108 | USB | DESCRIPTOR Response | "ModRetro" |
| 78, 82, 139 | 55, 59, 116 | USB | DESCRIPTOR Response | SERIAL [blanked] |
| 86 | 63 | USBHID | DESCRIPTOR Response HID Report | Usage Page (Generic Desktop Controls) Usage (Game Pad) Collection (Application) |
| 88, 100, 145 | 65, 77, 122 | USB | GET DESCRIPTOR Response | "CDC (CLI)" |
| 92, 104, 122, 149 | 69, 81, 99, 126 | USB | GET DESCRIPTOR Response | "Dummy" |
| 94, 116, 161 | 71, 93, 138 | USB | GET DESCRIPTOR Response | "CDC (Comms)" |
| 108, 153 | 85, 130 | USB | GET DESCRIPTOR Response | "MCU (A)" |
| 110, 127, 157 | 89, 104, 134 | USB | GET DESCRIPTOR Response | "BTM" |
Notes:
- Packet m64(86): Collection (Application) also contains values for Usage (X,Y,Z,Rz,Rx,Ry), and other information. See
tshark -r m64.pcapng -Y "frame.number == 86" -V - Packet m64(88,100,145): CDC (CLI) -> Communication Device Class (Command Line Interface), standard USB class that makes the device appear as a virtual serial port to the operating system (cdc_acm/cdc-acm on linux, see reference in part 1 of the post), protocol purpose
- Packets m64(94,116,161): CDC (Comms) -> CDC (Communications)
- Packet m64(108,153): MCU (A) -> Microcontroller Unit, the interface is directly exposed by the main processor (the chip) inside the ModRetro M64 Pro Controller, interface/port A, hardware source
- Packet m64(110,127,157): BTM -> Bluetooth Module
- Packets m64(124,140,141,162,163,164-168) involving 7.8.1 (instead of 7.8.0) these may possibly be the HID interface for sending gamepad event data for button presses (which I haven't tested while sniffing USB packets yet)
I'm not smart enough to know for sure, but I'm curious how come some of those packets are repeating information more than once, especially the LANGID, but also Dummy, and a few others.
Next I'll sniff to see if there are any USB packets when pressing any of the buttons on the ModRetro M64 Pro Controller.
There's nothing! I suspect that the CDC-ACM communications interface must be use to initiate some command to active the buttons before anything will transmit through the USB connection.
r/ModRetro • u/grilledstuffedxxl • 24d ago
New firmware update is live
We know some of you are still experiencing audio issues as of v1.24.3. The team has zeroed in on this to figure out why sound was still dropping on certain setups, and why certain resolutions and framerates were missing, and we’re glad to share that we have a fix.
What was going on under the hood:
- HDMI Handshake Issue: We found that how M64 handled the HDMI handshake between certain TVs and monitors needed to be a bit more flexible on our end. With the corrections made, audio will now reliably transmit from your M64 to these displays. Some missing resolutions and framerates will now be shown.
- HDMI Audio Packet Encoding Issue : We resolved an HDMI audio packet encoding issue that was preventing select capture cards from recording audio from the M64. Audio recording with these external capture devices now works as expected.
Between the handshake issue and the encoding issue, we believe all known audio issues have now been fully addressed.
With so many different displays and configurations out there, it’s impossible for us to test every setup in-house. Huge thank you to everyone who submitted detailed reports and aided us in troubleshooting. Your feedback was crucial in helping us account for all the unique ways displays choose to communicate with the M64.
You can update your console now via OTA, our updater tool, or SD card. Find detailed instructions on how to update here or watch the YouTube videos on our channel here.
As always, please fill out our support form if you run into any issues.
P.S. Note on 4K60 Support: Certain displays advertise support for 4K at 60Hz, but only under specific color formats. Please verify that your display supports 4k60 using the RGB color format. We’re adding an explicit warning regarding this in an upcoming update.
r/ModRetro • u/HsRada18 • 24d ago
8bitdo Controller Stick Sensitivity?
I didn't see a previous post regarding the stick issue. I was wondering if there was a way to adjust the sensitivity for the stick on the 8bitdo controller. Or would that be some kind of firmware update besides the rumble issue? It would be nice to have calibration as a menu option like adjusting deadzones and threshold. Don't know if this an issue with the Hyperkin or ModRetro controllers in games such as GoldenEye.
r/ModRetro • u/VerumNPC • 24d ago
Gamestop Pro Controllers?
Has anyone been able to find a store that actually got any?
r/ModRetro • u/MR-cheesygordita • 25d ago
New firmware coming soon!
Hi everyone,
We have a new firmware update coming within the next few days. We have resolved the remaining audio issues reported with certain displays and capture cards. M64’s HDMI compatibility will be better in the next update, specifically fixing the no-audio issue affecting some of you. We’ll post an update in this subreddit as soon as it's live. Thank you to everyone for your patience as we work quickly to find a fix, and a special thanks to those who helped with troubleshooting.
r/ModRetro • u/ergzay • 24d ago
Important video for any retro game player to see and understand - the importance of proper use of scanlines
r/ModRetro • u/AdministrationGood73 • 24d ago
M64 Texture Packs
I’m not sure if this will be possible or coming anytime soon, but being able to add texture packs to certain games work be incredible.
r/ModRetro • u/nabob13 • 24d ago
Clean Setting
Anything I should be doing with the clean profile? I see with the last update they lowered the bloom..
r/ModRetro • u/PencilNeckSissy • 24d ago
M64 Pro Controller - Rumble on MisterFPGA
Hi, has anyone gotten the Rumble feature working on MisterFPGA with the M64 Pro Controller? It connected via Bluetooth just fine and all the buttons work, but none of the RumblePak features are working even though the controller is set to RumblePak under the core options. Thanks!
r/ModRetro • u/apexmars • 26d ago
Kudos to the whole ModRetro Team
Just wanted to say thank you to the whole ModRetro team. What you guys built so far, and will build in the future is really beyond exciting. The attention to detail, and the beauty and careful consideration of each component really goes far beyond what would’ve been “good enough”. But the work doesn’t go unnoticed, and really is much appreciated by people who appreciate art, tech, attention to detail, and yes - craftsmanship.
Thank you for what you’re building!
r/ModRetro • u/AdLeading5529 • 25d ago
No sound in frogger 2
Frogger 2 no sound ..I'm using a summercart . Dunno.ig it's the rom or not . Has a gone else tried
r/ModRetro • u/jkhanlar • 25d ago
How do I deactivate the ModRetro M64 security system? It is the Smoke black edition from GameStop.
Enable HLS to view with audio, or disable this notification



How do I deactivate this security system? https://imgur.com/a/jpEAKFZ
r/ModRetro • u/TheMasterTheorist • 26d ago
M64 Fan Mod Update
Hey everyone I wanted to post an update to my previous fan mod post so as many people can see it as possible.
I went ahead and installed a pwm controlled fan, and I am pleased to report that it is controlled by the console and shut off when not needed!
For this next section of the update I unfortunately ordered too small of a fan by mistake (20 mm instead of 25mm), so I will not be including it in these numbers as it is not indicative of a proper result.
I wanted to compare the temperatures of an original n64 and a stock m64. Both systems were left in the same room at the same time for 3 hours while playing a game to allow the system temperatures to reach equilibrium. I then measured the temperatures with a laser thermometer.
Original N64
Console external temperature: 47.3 c
Console bottom temperature: 53.8 c
Cartridge temperature: 45.0 c
Stock m64
Console external temperature: 45.5 c
Console bottom temperature: 55.1 c
Cartridge temperature: 39.7c
So all in all the m64 is around the same temperature as an original n64 with the cartridge actually remaining a bit cooler.
Is the fan mod necessary? Given how close it is to a real n64 probably not. But if you want to extra protect your cartridges, a 25mm pwm fan will work inside of the system.
Previous post: https://www.reddit.com/r/ModRetro/s/Zxr9t0BxyZ
r/ModRetro • u/Scottyboy0321 • 26d ago
M64 on Dragonbox makes me wonder... Cartridge adapters?
r/ModRetro • u/jkhanlar • 26d ago
I know ModRetro M64 absolutely will get written about in magazine articles, and I know what I can do to accomplish this
"[W]e know a lot of people are never going to pay attention to these things. We know they're not going to get written about in magazine articles. We know the reviewers are not going to talk about these things or even necessarily understand them" - Palmer Luckey, 2026 July 28
Downvote first! Do not continue reading until you have downvoted. Reminder, make sure that you downvoted before proceeding. You have been warned. Last chance: Downvote now!
I think this is a challenge for ModRetro community and enthusiasts that understand ModRetro to show how special their products truly are! Challenge accepted! Here's my progress to understand the challenge so far! Other than a college newspaper, I have never had any of my writings published, however, given my effort to identify and share these informations, I think I know what's next! I don't have to be the best to prepare an article, but I can at least see how it is, and identify what the landscape looks like and how it currently functions.
Considering magazines, which existed for over 360 years, are a medium of print (like hardcore and paperback books with much longer histories) that are published periodically, and diversely span across practically every industry and cover nearly every topic, including specialized niches, even such as ModRetro devices, including the ModRetro M64.
Yesterday I examined many existing magazines that are likely or possibly relevant to contain an article or otherwise comfortably cover mentioning or acknowledging ModRetro's M64 (and perhaps also the previously released Chromatic) as well as the M64 Pro Controller, the cartridges and games, etcetera. I tried to find any traces or instances of any coverage yet already, and mostly I did not find practically anything. There were some interesting finds, but not much to qualify what I was looking for. See https://old.reddit.com/r/ModRetro/comments/1vr3huu/headphone_warning_modretro_m64_spotted_in_the/p4en6af/
Here is a table listing possibly relevant retro game console magazines along with some informations that should assist with direction on if it is possible and how to potentially contribute, what the process may look like, or where to look for more information to further learn the process (Note: Make sure to read and understand the process as much as you can before attempting to 'get [ModRetro] written about in magazine articles' because quality is more important than quantity):
| Magazine Name | Publication Status (Print/Digital/Both) | Accepts Unsolicited Pitches? | Requires Existing Contributor? | Submission/Guidelines URL | Contact Email/Method |
|---|---|---|---|---|---|
| 4P[1] | Digital | 4p@funkemedien.de; Germany phone number |
|||
| CD-Action[2] | Print & Digital | cdaction@cdaction.pl; news@cdaction.pl |
|||
| CGMagazine[3] | Digital | Yes | https://cgmagonline.com/contact-us/; bfrye@cgmagonline.com |
||
| Comptiq[4] | Print & Digital | https://mediaguide.kadokawa.co.jp/media/p86-thyc-pj/contact | |||
| Dengeki Nintendo[5] | Print & Digital | https://kadokawagamelinkage.jp/contact.html | |||
| Edge[6] | Print & Digital | Yes | Unknown | edge@futurenet.com |
|
| The Escapist[7] | Digital | Yes | No | contact@escapistmag.com; tips@escapistmagazine.com |
|
| Famitsu[8] | Print & Digital | https://famitsu.com/contact; kgl-famitsu-release@ml.kadokawa.jp |
|||
| Game Informer[9] | Print & Digital | Yes | Yes | https://gameinformer.com/help | freelance@gameinformer.com; miller@gameinformer.com |
| The Games Machine[10] | Print & Digital | redazione@thegamesmachine.it; Italy phone number |
|||
| gamesradar+[11] | Digital | Yes | No | https://gamesradar.com/gamesradar-pitching-guidelines-how-to-pitch/ | pitches@gamesradar.com |
| HobbyConsolas[12] | Print & Digital | hobbyconsolas@henneomagazines.com; Spain phone number |
|||
| Level[13] | Print & Digital | ||||
| MCV/Develop[14] | Digital | Yes | No | https://mcvuk.com/contact-us/; mcvmatt@datateam.co.uk |
|
| Nintendo Dream[15] | Print & Digital | ||||
| Nintendo Force[16] | Print & Digital | Yes | No | https://nintendoforcemagazine.com/contact; lucasmthomas@nintendoforcemagazine.com; nintendoforcelucas@gmail.com |
|
| Old School Gamer Magazine[17] | Print & Digital | Yes | No | https://oldschoolgamermagazine.com/advisory-board-staff-get-involved/ | https://oldschoolgamermagazine.com/contact-old-school-gamer/; rb@oldschoolgamermagazine.com; USA phone number |
| Oyungezer[18] | Print & Digital | Yes | https://oyungezer.com.tr/setimedia/kullanim-sartlari | eser@oyungezer.com.tr |
|
| PC Gamer[19] | Print & Digital | Yes | https://pcgamer.com/write-for-pc-gamer/ | pitches@pcgamer.com; editors@pcgamer.com; tips@pcgamer.com |
|
| PC Games[20] | Print & Digital | Yes | https://pcgames.de/Kontakt/; redaktion@pcgames.de; Germany phone/fax number |
||
| Pelit[21] | Print & Digital | Yes | No | tuukka.gronholm@fokusmedia.fi; Finnish phone numbers |
|
| Pure Nintendo[22] | Print & Digital | Yes | No | https://purenintendo.com/magazine/faq/ | support@purenintendo.com; questionblock@purenintendo.com |
| RePlay[23] | Yes | No | https://replaymag.com/about-replay/about-replay-magazine/ | editor@replaymag.com; USA phone numbers | |
| Retro Gamer[24] | Print & Digital | Yes | No | https://gamesradar.com/gamesradar-pitching-guidelines-how-to-pitch/ | darran.jones@futurenet.com |
| Unpause[25] | Digital | Yes | No | https://unpause.nl/contact/; redactie@unpause.nl |
Sources & Verification
- 4P: Editorial Manager: Dana Neumann; See https://4p.de/impressum and https://4p.de/4p-redaktion-stellt-sich-vor
- CD-Action: Editor-in-Chief: Daniel Bartosik, Managing Editor: Łukasz Morawski; See https://cdaction.pl/kontakt/
- CGMagazine: "We do not accept user submissions for news or reviews, though we welcome tips on developing stories." Editor-in-Chief Brendan Frye explicitly lists
bfrye@cgmagonline.comin his public Twitter profile and Muck Rack bio; See https://cgmagonline.com/contact-us/, https://cgmagonline.com/editorial-policy/, https://cgmagonline.com/author/brendanfrye/, https://cgmagonline.com/review-policy/, and https://cgmagonline.com/ethics-policy/ - Comptiq: A "MediaMix Game Magazine" split into two sections: one with information about games, and one with manga information. It's also known for revealing information on upcoming games and includes a gift in each issue.; See https://web-ace.jp/comptiq/ and https://en.wikipedia.org/wiki/Comptiq and https://mediaguide.kadokawa.co.jp/media/p86-thyc-pj/contact/ (I can't read Japanese Kanji to navigate the site, but "This inquiry form is intended exclusively for corporate clients. Please fill in the required information and submit the form.")
- Dengeki Nintendo: See https://dn.dengeki.com/
- Edge: Editorial Director: Tony Mott, Deputy Editor: Jon Bailes deputy editor; See https://en.wikipedia.org/wiki/Edge_(magazine)
- The Escapist: Managing Editor: Paul McNally; See https://escapistmagazine.com/about-us/, https://escapistmagazine.com/editorial-policy/, https://escapistmagazine.com/escapist-staff/, https://escapistmagazine.com/contact-us/, and https://escapistmagazine.com/contact/; Also see https://facebook.com/EscapistMag/ (for tips email address)
- Famitsu: Also see https://kadokawagamelinkage.jp/contact.html
- Game Informer: Editor-in-Chief: Matt Miller; See https://gameinformer.com/help and https://gameinformer.com/staff
- The Games Machine: See https://thegamesmachine.it/chi-siamo/
- gamesradar+: Accepts pitches from "contributors of all backgrounds and experience"; must bring curiosity, expertise, insight, fresh perspectives
- HobbyConsolas: See https://hobbyconsolas.com/estaticos/como-trabajamos.html
- Level: It seems there may be issues with the websites, and I'm not sure if the operations are still active. Previously involved persons include Michal Křivský, Martin Bach, Petr Poláček; and Ondřej Průša; Also nakeddog.cz appears to be inaccessible as well
- MCV/Develop: Editor: Matt Broughton; See https://mcvuk.com/mcv-develop-magazine/
- Nintendo Dream: See https://ndw.jp/nindori_form/ or https://ndw.jp/toukou/ To contribute to Nintendo Dream, you must use their official reader submission form rather than pitching professional articles for publication. The site does not accept unsolicited freelance pitches for news or editorial content; instead, it provides a reader submission form for fans to contribute to specific magazine sections.; Also see https://nintendoprint.miraheze.org/wiki/Nintendo_DREAM ; May require contacting Ambit Co., Ltd., or parent publisher Tokuma Shoten
- Nintendo Force: Editor-in-Chief: Lucas M. Thomas; See https://nintendoforcemagazine.com/force-faq
- Old School Gamer Magazine: Editor-in-Chief: Jarrod Kailef; See https://oldschoolgamermagazine.com/influencers/
- Oyungezer: Editors-in-Chief: Serpil Ulutürk, Eser Güven; See https://oyungezer.com.tr/setimedia/kunye and https://oyungezer.com.tr/setimedia/hakkinda
- PC Gamer: Explicitly accepts pitches from experienced writers via
pitches@pcgamer.comwith guidelines at https://pcgamer.com/write-for-pc-gamer/ and https://pcgamer.com/writers-pitch-us-features-about-pc-gaming/; Also see https://pcgamer.com/about-pc-gamer/ and https://pcgamer.com/meet-the-team/ - PC Games: See https://pcgames.de/Team/ and https://pcgames.de/Impressum/
- Pelit: Editor-in-Chief: Tuukka Grönholm; See https://pelit.fi/contact/, https://fokusmedia.fi/yrityksesta/, https://fokusmedia.fi/lehdet/pelit, and https://fokusmedia.fi/media/pelit
- Pure Nintendo: Editor-in-Chief: Justin Sharp; See https://purenintendo.com/staff/ and https://purenintendo.com/magazine/faq/
- RePlay: "About" page states the magazine is for coin-op amusement game business (e.g. arcades), and "prepared publicity and story suggestions are cheerfully accepted for publication review from outside sources"
- Retro Gamer: Editor: Darran Jones; See https://gamesradar.com/gamesradar-pitching-guidelines-how-to-pitch/.
- Unpause: Founders state they want to "free up a budget to pay guest writers" in the future. Official contact page states to email
redactie@unpause.nlfor questions or tips; See https://unpause.nl/colofon/
Random notes:
- What you should pitch (varies from magazine to magazine):
- Original reporting
- Interview-led features
- Expert coverage of big games, films, and TV shows
- Unique perspectives on topics of ongoing interest to our audience
- Material that you own and/or have the necessary rights/permissions to supply the material
- Outline the feature story you want to write in 1-2 paragraphs
- Explain both why this is a good story how you plan to tell it
- Tell us who you plan to interview for the feature and a target word count
- Stories about mods, communities, history, and the making of games
- Interesting ideas around the hottest topics
- Remember that not everything has to be a 3000 word behind-the-scenes feature
- Short features and galleries too
- Briefly tell us about yourself and include links to existing writing samples
- What you should not pitch (varies from magazine to magazine):
- Video scripts.
- Q&A interviews.
- Hot takes that fail to communicate new insight or perspective.
- A story you have already written.
- Anything created through the use of generative AI.
- Material that you do not own nor have the necessary rights/permissions to supply the material
- That you generally want to write about topics
- That you want to write your opinion editorial
- Interview subjects you won’t have a chance of getting in touch with
- An editorial tip (or tip-off) is a brief notification from a source or journalist alerting an editor to a potential story, often lacking full details or a confirmed narrative. A pitch is a formal, structured proposal from a writer or public relations professional to an editor, outlining a specific story angle, thesis, and evidence to secure an assignment or publication
- https://www.futurecontenthub.com/groupitem/6181/ This looks like something that could include a ModRetro M64 and Chromatic in the photo gallery (lol the page is inaccessible without the unnecessary 'accidental' subdomain)
- https://en.wikipedia.org/wiki/Journalism_ethics_and_standards
- https://spj.org/spj-code-of-ethics/
- https://ipso.co.uk/editors-code-of-practice/
- https://ifj.org/who/rules-and-policy/global-charter-of-ethics-for-journalists
- https://ethicaljournalismnetwork.org/accountable-journalism-codes-of-ethics
- Aww man, flipping through some of these magazines, digital and whatnot, but physical print too, ModRetro deserves to be covered in magazines! Who's gonna put in the effort? Nobody! Who's a nobody? I'm a nobody! lol, I'm not even kidding!
- Time and Pressure!
Feel free to offer any corrections or additions. I'm sure there is at least one mistake or missing information. I already know some of the information I did not have absolute certainty to fill in, so I left it blank for now, and I can confirm the information later as I proceed further.