Ring-Con

From Nintendo Switch Brew
Jump to navigation Jump to search

This page documents how the Ring Fit Adventure game uses hidbus for using the Ring-Con ExternalDevice, which attaches to Joy-Cons.

The BusType used with GetBusHandle is value 0 or 1.

The ExternalDeviceId is 0x20. After EnableExternalDevice is used successfully during initialization, EnableJoyPollingReceiveMode(flag=true) is used with 4-byte command 0x020101. For cleanup, DisableJoyPollingReceiveMode is used then on success EnableExternalDevice(flag=false) is used.

Commands (input data for EnableJoyPollingReceiveMode / SendAndReceive) start with the u32 cmd, there's generally no data after that. Data in the replies are at least 0x4-bytes, with fields being 4-byte aligned. Reply+0 is the u8 status. When the output size doesn't match the expected size, or status is non-zero, error 0xEDA is returned. When status is non-zero, a func is called with the status value which updates global state.

The status field is not listed below since all replies have it.

CRC

Some commands/replies use CRC(s) for validating the previous N-bytes prior to the CRC. When the CRC is invalid, the app sets an output flag indicating invalid CRC and skips writing output-data to the output-param.

This CRC doesn't use Xor(In/Out)/Reflect(In/Out). The polynomial is 0x8D.

Commands

Input cmd u32 Input cmd size Reply size
0x00020000 0x4 0x8
0x00020100 0x4 0x10
0x00020101 0x4 0x8
0x00020504 0x4 0x8
0x00023104 0x4 0x8
0x00023204 0x4 0x8
0x04013104 0x8 0x8

0x00020000

The two u8s at reply+0x4 are copied to an output struct.

0x00020100

Reply:

Offset Size Description
0x4 0x8 u64 copied to an output struct.
0xC 0x4 u32 copied to an output struct.

0x00020101

This is used with EnableJoyPollingReceiveMode/GetJoyPollingReceivedData. Reply+0x4 is an u16 which is copied to an output struct, the timestamp is also copied.

0x00020504

Reply+0x4 is a s16 which is used with the output from calling a func (which uses various other cmds) to generate a value which is written to the output param.

0x00023104

Reply:

Offset Size Description
0x4 0x3 Data, copied to an output struct as an u32.
0x7 0x1 #CRC over the previous 0x3-bytes.

0x00023204

The func implementing this in the app is identical to #0x00023104 except for the cmd u32.

0x04013104

The data at cmd+0x4 is all-zero. The app doesn't use reply data here besides the status.