docs: plan native Switch-family HD rumble
This commit is contained in:
parent
65e635dc2b
commit
44a474e103
1 changed files with 100 additions and 0 deletions
|
|
@ -685,6 +685,106 @@ Research basis:
|
|||
- Xbox Elite Shift: modifier-driven alternate mappings —
|
||||
https://support.xbox.com/en-US/help/hardware-network/controller/shift-elite-series-2
|
||||
|
||||
### Native Switch-family HD rumble — Planned
|
||||
|
||||
Goal: preserve Nintendo's left/right, low/high-band commands on controllers
|
||||
that can execute them natively. This is a separate output backend from the
|
||||
DualSense PCM synthesizer, not a promise that every controller in “Switch
|
||||
mode” supports the same rumble protocol. No Switch-family native forwarding
|
||||
implementation is included in the current DualSense work.
|
||||
|
||||
Current constraints:
|
||||
|
||||
- `ControllerRumbleOutput.hd` retains decoded substeps but not the original
|
||||
eight wire bytes. Unity-gain forwarding therefore needs an explicit raw
|
||||
representation alongside the decoded, profile-scaled timeline.
|
||||
- The patched Bluepad32 Switch parser enables vibration with subcommand
|
||||
`0x48`, then implements conventional magnitudes through fixed frequencies
|
||||
and a 40 ms refresh. Preserve that hardware-tested third-party fallback.
|
||||
- `send_subcmd()` currently has a process-global four-bit packet counter;
|
||||
native ownership needs a counter per physical controller shared by every
|
||||
`0x01`/`0x10` sender. Player-LED requests currently construct zeroed rumble
|
||||
fields, so they must participate in rumble arbitration rather than silently
|
||||
overwrite the current command.
|
||||
- Joy-Cons are currently separate, horizontally mapped controllers in
|
||||
Bluepad32. A paired two-Joy-Con logical controller is not implemented.
|
||||
|
||||
Delivery order:
|
||||
|
||||
1. **Qualify protocol and models.** Start with an original genuine Switch Pro
|
||||
Controller (`057E:2009`), then original Joy-Con L/R (`057E:2006/2007`).
|
||||
Capture console USB commands and actual Bluetooth output for neutral,
|
||||
repeated, relative and multi-substep words. Verify the accepted formats,
|
||||
amplitude normalization and repeated-word semantics against real hardware;
|
||||
the older public four-byte tables alone do not establish every compressed
|
||||
command's behavior. Do not infer native support from a Pro-like parser
|
||||
type, name or VID/PID alone: ambiguous clones stay on compatibility output
|
||||
until their model is qualified. Switch 2 controllers and NSO retro models
|
||||
require separate capability/protocol qualification.
|
||||
2. **Add a generation-tagged native command path.** Extend the existing rumble
|
||||
envelope with original bytes and an explicit validity/unmodified flag;
|
||||
retain the decoded timeline for scaling, recovery and fallback. Add a
|
||||
fixed-capacity Core-0-to-Core-1 command queue and one output owner per
|
||||
physical Switch device. Use native Bluetooth report `0x10`, not PCM.
|
||||
The existing format is 11 bytes including the Bluetooth HID transaction
|
||||
byte: about 1,375 payload bytes/s at 125 reports/s, before L2CAP/HCI/radio
|
||||
overhead. Direct forwarding need not inherit the DualSense 10.667 ms PCM
|
||||
lookback, but its actual latency must be measured.
|
||||
3. **Implement fidelity, scaling and resynchronization together.** Raw
|
||||
forwarding is a fast path only when profile gain is unity and physical
|
||||
controller state is synchronized. Other gains require a bounded encoder
|
||||
from the scaled per-band timeline, preserving all representable substeps.
|
||||
Validate the inverse amplitude mapping against independent golden data;
|
||||
decoder-normalized Q15 values are not raw wire amplitude codes. Preserve
|
||||
silence and Nintendo's safe amplitude bounds. Do not apply the DualSense
|
||||
2x/0.8-power response curve to Nintendo actuators. If a scaled multi-step
|
||||
command cannot be represented in one word, qualify a bounded legal packet
|
||||
schedule/quantization policy explicitly; do not quietly collapse it to a
|
||||
peak or latest magnitude. After queue loss, feedback or reconnect, send a
|
||||
valid absolute current-state/neutral resynchronization before dependent
|
||||
relative commands; never replay an obsolete vibration backlog.
|
||||
4. **Unify LEDs, feedback and lifetime handling.** Keep the current effective
|
||||
rumble bytes in all applicable subcommand reports. Local confirmation
|
||||
temporarily overrides host output while host state continues advancing,
|
||||
then resumes the current state, not the old effect. Preserve the existing
|
||||
50 ms Switch-command expiry policy and prioritize explicit stop. Cancel
|
||||
duration, delayed-start and refresh timers when ownership changes or a
|
||||
device disconnects; old-generation callbacks must never touch a replacement.
|
||||
XInput input to this backend remains a two-magnitude, stateful effect with
|
||||
fixed carriers, not invented Nintendo frequency detail.
|
||||
5. **Add single-actuator and third-party policies.** A standalone Joy-Con
|
||||
needs an explicit mono downmix so effects addressed to either host side
|
||||
are not simply lost. Preserve each band's dominant contribution with
|
||||
deterministic frequency/tie handling and safe amplitude limits; document
|
||||
the unavoidable spatial loss. Stereo routing to a Joy-Con pair belongs
|
||||
with a separate logical-pairing feature. Keep the current 8BitDo Ultimate
|
||||
enable/fixed-frequency/refresh behavior unless that exact model passes
|
||||
native qualification; never replace it with a blanket Switch-family rule.
|
||||
6. **Qualify and promote per model.** Add independent codec/golden-packet
|
||||
regressions, scale-zero/unity/intermediate checks, channel separation,
|
||||
packet-counter wrap, backpressure/resync, LED/feedback coexistence,
|
||||
timeout/stop and disconnect/reuse cases. Run safe physical frequency and
|
||||
amplitude sweeps and captured game effects; then measure one and four
|
||||
controllers, mixed DualSense/Switch output, simultaneous input/motion and
|
||||
persistent-profile writes. Report p50/p95/p99/worst host-receipt-to-HCI
|
||||
submission, skipped/resynchronized commands and physical actuator onset
|
||||
where instrumentation is available. Enable the path only for qualified
|
||||
models; keep the UART protocol, bonds, calibration and wake configuration
|
||||
unchanged.
|
||||
|
||||
Implementation locations: `usb/switch/switch_haptics.*` and the profile
|
||||
rumble transform for representation/scaling; `input/bluepad32_input_backend.*`
|
||||
for routing/lifetimes; a bounded Switch output scheduler under `input/`;
|
||||
and `patches/bluepad32-sdl3-imu.patch` for parser integration. Patch the
|
||||
build-local Bluepad32 copy, not the upstream checkout.
|
||||
|
||||
Protocol references:
|
||||
|
||||
- Bluetooth reports, neutral values and actuator safety:
|
||||
https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/bluetooth_hid_notes.md
|
||||
- Frequency/amplitude encoding tables:
|
||||
https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/rumble_data_table.md
|
||||
|
||||
### Phase 8 — Performance and release qualification
|
||||
|
||||
Measure:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue