Skip to content

DSU Motion Server

PadForge broadcasts gyro and accelerometer data from your controller over UDP so emulators can use motion in Wii, Wii U, Switch, and 3DS games.

The Motion Server controls on the Dashboard


What it is

DSU (DualShock UDP) is the network format that emulators use to receive motion data. It came from the cemuhook project. The name says DualShock, but any controller with a gyro and accelerometer works. PadForge runs the server. Your emulator connects as a client.

PadForge accepts more than one subscriber at the same time. Run Cemu and Dolphin side by side and both receive the same motion stream.

Emulators that connect

Emulator Platform What to pick in its UI
Cemu Wii U DSU1 / By Slot
Dolphin Wii / GameCube DSUClient
Ryujinx (no longer maintained) Switch CemuHook compatible motion
Yuzu (no longer maintained) Switch CemuHook motion server
Lime3DS / Citra 3DS CemuHook motion server

Any app that asks for a "cemuhook motion server" or "DSU server" speaks this format.


Controllers that report motion

Passing a controller's own motion through needs a gyro and accelerometer in that controller. Motion made from other inputs needs neither: assign an input to Motion Pitch, Yaw or Roll on a PlayStation, Nintendo or Valve-profile slot, and DSU broadcasts it from slots 1 to 4 while DSU is on. The table below covers controllers with sensors.

Reports motion No motion sensors
DualSense (PS5) Xbox 360
DualShock 4 (PS4) Xbox One
DualShock 3 (PS3) Xbox Series
Switch Pro Controller Most third-party USB gamepads
Switch 2 Pro Controller
Joy-Con (left and right)
Wii Remote (gyro needs MotionPlus)
Steam Deck built-in controller
2015 Steam Controller
2026 Steam Controller

The Devices page shows live gyro and accelerometer values for any controller that has them.


Turn it on

  1. Plug in a controller that reports motion.
  2. Assign it to one of slots 1–4. Any virtual controller type works. An Xbox slot broadcasts its controller's motion the same as a PlayStation slot, with no motion mapping needed.
  3. On the Dashboard, tick Enable DSU Motion Server (CemuHook Motion Provider Protocol).
  4. Leave the Port box at 26760, or type a different number. The reset button next to it returns the port to 26760.
  5. Start the input engine with the play button.
  6. The status indicator lights up orange and the line beside it reads Listening on :26760. Point your emulator at 127.0.0.1 port 26760 (see tables below).

Motion data flows the moment both ends are running.

Per-slot tuning lives on the Gyro tab

The DSU broadcast starts from the calibrated gyro stream. The Gyro tab holds the tuning, stored per device, per slot: calibration, sensitivity (horizontal and vertical), deadzone, smoothing, response curve, acceleration, invert, real-world calibration, reference frame (Local / Player / World), the Grip hold, the Compass magnetometer anchor on controllers that carry one, the Easy Aim Threshold stick gate, and the Aim Engage Button picker. Both gates zero gyro output while their condition is not met.

Whether those controls reach the broadcast depends on one switch. The Gyro tab's Apply Gyro Tuning to Motion Passthrough toggle, under the Motion Passthrough header, is off by default. Left off, the broadcast sends the calibrated reading straight through. Sensitivity, smoothing, and both gates stay out of it, so emulators see motion whether or not the engage button is held. Turn it on and the broadcast follows the full tab tuning, the Easy Aim and Aim Engage gates included. With a gate configured and the toggle on, the DSU gyro reads zero while the gate is not satisfied, the same as a Gyro mapping row. Calibration drift correction applies either way.

The accelerometer stream skips the tuning chain. Sensitivity, deadzone, smoothing, curve, and both gates are gyro-only, so the broadcast carries the scaled accelerometer reading.

Three things still reach it. Grip rotates the body gyro, the body accelerometer, and gravity together in both states of the passthrough toggle, because a hold is a fact about the frame rather than a tuning choice. An aux accelerometer source (a Nunchuk, a pair's left Joy-Con) keeps its own frame. On a DualShock 3, Pitch and Roll Simulation fills the gyro's pitch and roll from the accelerometer in both states as well. And the Motion Accelerometer row's own Invert checkbox flips all three accel axes, the same way the Motion Gyro row's does for gyro.

The Mappings grid picks the source device

A PlayStation or Nintendo slot, or an Extended slot running a Valve profile (Steam Deck, or either Steam Controller), carries a Motion Gyro row and a Motion Accelerometer row in its Mappings grid, created automatically when a motion-capable device is assigned. Those rows feed the DSU broadcast, and the virtual controller's motion report where its preset has one: the plain DualShock 3 (SIXAXIS), plain Switch 2 Pro and plain Steam Deck Controller presets have none. While either row exists, DSU follows the rows alone. A channel with no row sends nothing, and so does a row emptied of sources. A row whose devices are all offline hands the channel to another row for the same sensor, on any layer, that has a live device, and sends nothing only when no such row exists.

A slot with neither row, such as an Xbox, Keyboard + Mouse, MIDI, or VR slot, still broadcasts. DSU combines the sensors of every enabled device assigned to the slot, axis by axis, and keeps the reading with the largest magnitude, the rule the Strongest combine mode uses. The virtual controller itself carries no motion on such a slot. Those slots have no Motion Pitch, Yaw or Roll rows either, so motion from a stick or buttons reaches DSU only from a PlayStation, Nintendo, or Valve slot.

  • Several motion devices on one slot stack as sources on the same row. The row's Combine setting merges their readings axis by axis: Strongest by default, or Combined, Average, or Custom.
  • The rows follow shift layers. While a layer is active its own Motion Gyro row applies, and a layer with no Motion Gyro row of its own uses the Base row. A layer row emptied of sources, or marked Do Not Inherit with none, switches the channel off on that layer.
  • On a Joy-Con pair, the source picker also offers Left Joy-Con Motion Gyro and Left Joy-Con Accelerometer to stream the left half's sensors instead of the pair's primary stream. A Wii Remote with a Nunchuk attached offers Nunchuk Accelerometer the same way.
  • The Motion Pitch, Yaw and Roll rows add motion from a stick or buttons. While one of them has an input, DSU sends the frame the virtual controller reports: the real sensors from the two rows above plus the simulated turn and lean, or the simulated motion alone on a slot with no sensors.

The Dashboard switch is the global on / off. There is no per-slot DSU enable toggle. Slots 1–4 broadcast when DSU is on. Slots 5–16 are above the protocol cap and never broadcast.


Emulator setup

All four guides assume the default port 26760. To move it, change the Port box on the Dashboard and the port in the emulator so both match.

127.0.0.1 means "this computer." Use it when PadForge and the emulator run on the same PC.

Cemu (Wii U)

  1. Options > GamePad motion source > DSU1 > By Slot.
  2. Server: 127.0.0.1. Port: 26760.
  3. Pick Slot 1.
  4. Launch a motion-using Wii U game (Splatoon, Breath of the Wild).

Dolphin (Wii / GameCube)

  1. Controllers.
  2. Set Wii Remote to "Emulated Wii Remote" and click Configure.
  3. Under Motion Simulation or Motion Input, pick source DSUClient.
  4. Click Configure next to DSUClient. Enter 127.0.0.1:26760.

Ryujinx (Switch, no longer maintained)

  1. Options > Settings > Input.
  2. Under Motion, tick Use CemuHook compatible motion.
  3. Server: 127.0.0.1. Port: 26760.
  4. Save.

Yuzu (legacy)

  1. Emulation > Configure > Controls.
  2. Under Motion, click Configure.
  3. Add a CemuHook motion server at 127.0.0.1:26760.

The 4-slot cap

The DSU format only carries 4 slots. PadForge supports 16. Slots 5–16 do not appear in the broadcast.

  • Single player: put the motion controller in slot 1.
  • Local multiplayer with motion: up to 4 controllers.
  • Motion controller in slot 5 or later does not show up in the emulator. Move it to slots 1–4.

Port

Default UDP port: 26760. Every emulator expects this number out of the box.

The Port box sits under the DSU toggle on the Dashboard. It accepts 1024 to 65535. The button beside it resets the value to 26760.

The DSU Port box and reset button on the Dashboard

  • The number has to match on both ends.
  • No other DSU server (BetterJoy, DS4Windows) can hold the same port.
  • PadForge binds to localhost only. No firewall rule needed when the emulator runs on the same PC.

If the status line reads Port 26760 in use, another DSU server holds the port. Stop it, or set a different number in the Port box (try 26761) and update the emulator to match. While the switch is on and the engine runs, PadForge tries the port again every 3 seconds, so the server starts on its own once the other one stops.


Axis convention

PadForge orients the axes for the emulator. The packet negates accelerometer X, Y, and Z and gyro yaw and roll against the sensor frame it reads, and keeps pitch. Nothing to flip by hand.

If a direction reads backward on your controller, say which one on the issue tracker with the model. Do not compensate inside the emulator: that hides the report the fix needs.


Trouble

Problem Fix
Emulator does not see motion Check the DSU status line reads Listening on :26760. Check the engine is running (play button).
Status reads Port 26760 in use Stop BetterJoy or DS4Windows, and the server starts within 3 seconds, or set a different Port and change the emulator to match.
Motion directions are wrong Open an issue with the controller model and what's flipped.
Only one controller has motion DSU caps at 4 slots. Move the motion device to slots 1–4.
Device has no motion sensors Some controllers (Xbox) ship without a gyro. Check the Devices page.
Emulator says "connected" but no values The physical controller has to be assigned to a slot, not only detected on the Devices page.
Emulator connected, controller assigned, still no motion Check the slot's Motion Gyro and Motion Accelerometer rows on the Mappings grid. While either row exists, DSU reads only those rows, so a row with no source, or one whose device is offline, sends no motion. Add the controller as a source on each row.


Last updated for PadForge 5.2.0.