Circle Pad Pro

Circle Pad Pro

Also known as CTR-009, it sends the commands to the console through the IR interface on the back of the console.

🔗 Pictures of its contents.

Usage Instructions #

File:Circle pad pro instructions.jpg

IR Protocol #

Communications with this device is done via the ir:USER service, which uses obfuscation implemented in software. The bitrate-value passed to IRUSER is 0x04, hence the actual bps is 96000.

The application sends requests via IRUSER:SendIrnop and receives response from Circle Pad Pro via IRUSER:ReceiveIrnop (or read data from the shared memory). The request and response data structures below are payloads in packets. Each request begins with a one-byte ID that determines the request type.

Request 1: Read Input #

Request (3 bytes):

offsetSizeDescription
0x00x1Request ID (fixed value 1)
0x10x1Response period in ms
0x20x1Unknown

Response (6 bytes): This Response will be sent repeatedly by the specified period.

offsetSizeDescription
0x00x1Response ID? Fixed value 0x10
0x10x3Right circle pad position. This three bytes are two little-endian 12-bit fields. The first one is for x-axis and the second one is for y-axis.
0x40x1bit[0:4] battery level? bit[5] ZL button

bit[6] ZR button

bit[7] R button

Note that for the three button fields, the bit is set when the button is NOT pressed.

0x50x1Unknown

Request 2: Read Calibration Data? #

Request (6 bytes):

offsetSizeDescription
0x00x1Request ID (fixed value 2)
0x10x1Expected response time in ms?
0x20x2Data offset? (aligned to 0x10?)
0x40x2Data size (aligned to 0x10?)

Response (5 bytes + requested size)

offsetSizeDescription
0x00x1Response ID? Fixed value 0x11
0x10x2Data offset? Same as Request+0x2
0x30x2Data size. Same as Request+0x4
0x5data sizecalibration data?

Request 3 #

Request (22 bytes?):

offsetSizeDescription
0x00x1Request ID (fixed value 3)
0x10x1Expected response time in ms?
0x2?

Response (2 bytes?):

offsetSizeDescription
0x00x1Response ID? Fixed value 0x12
0x10x10?

Request 4: Reset Calibration Data? #

Request (3 bytes?):

offsetSizeDescription
0x00x1Request ID (fixed value 4)
0x10x1Expected response time in ms?
0x20x1?

Response (2 bytes?):

offsetSizeDescription
0x00x1Response ID? Fixed value 0x13
0x10x10?

Request 5 #

Request (2 bytes):

offsetSizeDescription
0x00x1Request ID (fixed value 5)
0x10x1Expected response time in ms?

Response (2 bytes?):

offsetSizeDescription
0x00x1Response ID? Fixed value 0x14
0x10x1?