<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Floogle</id>
	<title>3dbrew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Floogle"/>
	<link rel="alternate" type="text/html" href="https://www.3dbrew.org/wiki/Special:Contributions/Floogle"/>
	<updated>2026-04-14T22:09:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Circle_Pad_Pro&amp;diff=23587</id>
		<title>Circle Pad Pro</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Circle_Pad_Pro&amp;diff=23587"/>
		<updated>2025-06-22T17:07:19Z</updated>

		<summary type="html">&lt;p&gt;Floogle: /* Request 2: Read Calibration Data? */ Add calibration data format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also known as CTR-009, it sends the commands to the console through the IR interface on the back of the console.&lt;br /&gt;
&lt;br /&gt;
[http://what-games.golog.jp/archives/1350330.html Pictures of its contents].&lt;br /&gt;
&lt;br /&gt;
== Usage Instructions ==&lt;br /&gt;
&lt;br /&gt;
[[File:Circle pad pro instructions.jpg]]&lt;br /&gt;
&lt;br /&gt;
== IR Protocol ==&lt;br /&gt;
Communications with this device is done via the [[IR_Services|ir:USER]] service, which uses obfuscation implemented in software. The [[IRU:SetBitRate|bitrate-value]] passed to IRUSER is 0x04, hence the actual bps is 96000.&lt;br /&gt;
&lt;br /&gt;
The application sends requests via [[IRUSER:SendIrnop]] and receives response from Circle Pad Pro via [[IRUSER:ReceiveIrnop]] (or read data from the [[IRUSER_Shared_Memory|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.&lt;br /&gt;
&lt;br /&gt;
=== Request 1: Read Input ===&lt;br /&gt;
&lt;br /&gt;
Request (3 bytes):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Request ID (fixed value 1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Response period in ms&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response (6 bytes):&lt;br /&gt;
This Response will be sent repeatedly by the specified period.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Response ID? Fixed value 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Right circle pad position. &lt;br /&gt;
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.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x1&lt;br /&gt;
| bit[0:4] battery level?&lt;br /&gt;
bit[5] ZL button&lt;br /&gt;
&lt;br /&gt;
bit[6] ZR button&lt;br /&gt;
&lt;br /&gt;
bit[7] R button&lt;br /&gt;
&lt;br /&gt;
Note that for the three button fields, the bit is set when the button is NOT pressed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x1&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Request 2: Read Calibration Data? ===&lt;br /&gt;
&lt;br /&gt;
Request (6 bytes):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Request ID (fixed value 2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Expected response time in ms?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| Data offset (aligned to 0x10)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x2&lt;br /&gt;
| Data size (aligned to 0x10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response (5 bytes + requested size)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Response ID? Fixed value 0x11&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x2&lt;br /&gt;
| Data offset. Same as Request+0x2&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x2&lt;br /&gt;
| Data size. Same as Request+0x4&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| data size&lt;br /&gt;
| calibration data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Calibration data:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Right circle pad offset. &lt;br /&gt;
These three bytes are two little-endian 12-bit fields. The lower one is for x-axis and the upper one is for y-axis.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Right circle pad x-axis scale factor (floating-point).&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Right circle pad y-axis scale factor (floating-point).&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x3&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0x1&lt;br /&gt;
| [[CRC-8-CCITT]] over data above&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Circle Pad Pro contains many sets of calibration data. Sets with an invalid CRC checksum should be ignored.&lt;br /&gt;
&lt;br /&gt;
To calculate the right circle pad&#039;s position, first subtract the calibration offset from the value reported in the &amp;quot;Read Input&amp;quot; request, then multiply by the scaling factor. Dividing the result by 8 gives a value with a similar range to that of the left circle pad: -0x9C(bottom/left) - 0x9C(top/right).&lt;br /&gt;
&lt;br /&gt;
=== Request 3 ===&lt;br /&gt;
Request (22 bytes?):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Request ID (fixed value 3)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Expected response time in ms?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| ...&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Response (2 bytes?):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Response ID? Fixed value 0x12&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Request 4: Reset Calibration Data? ===&lt;br /&gt;
Request (3 bytes?):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Request ID (fixed value 4)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Expected response time in ms?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response (2 bytes?):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Response ID? Fixed value 0x13&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Request 5 ===&lt;br /&gt;
Request (2 bytes):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Request ID (fixed value 5)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Expected response time in ms?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response (2 bytes?):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Response ID? Fixed value 0x14&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Floogle</name></author>
	</entry>
</feed>