I2C Registers: Difference between revisions
Merge MCUHWC:ReadRegister to this |
→Device 3: added missing registers and their properties as placeholders and fixed mistakes |
||
| Line 242: | Line 242: | ||
| ro | | ro | ||
| Version low | | Version low | ||
|- | |||
| 0x02 | |||
| s | |||
| ro | |||
| ? | |||
|- | |||
| 0x03 | |||
| s | |||
| rw | |||
| Top screen flicker | |||
|- | |- | ||
| 0x04 | | 0x04 | ||
| s | | s | ||
| rw | | rw | ||
| | | Bottom screen flicker | ||
|- | |- | ||
| 0x05 | | 0x05 | ||
| s / 0x4003? | | s / 0x4003? | ||
| rw / ? | | rw / ? | ||
| | | Danger zone - [[MCU_Services#MCU_firmware_versions|MCU firmware]] is uploaded here (???) | ||
|- | |||
| 0x06 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x07 | |||
| s | |||
| rw | |||
| ? | |||
|- | |- | ||
| 0x08 | | 0x08 | ||
| Line 263: | Line 283: | ||
| Volume slider state (0x00 - 0x3F) | | Volume slider state (0x00 - 0x3F) | ||
This is the same value returned by [[MCUHWC:GetSoundVolume|MCUHWC:GetSoundVolume]] | This is the same value returned by [[MCUHWC:GetSoundVolume|MCUHWC:GetSoundVolume]] | ||
|- | |||
| 0x0A | |||
| s | |||
| ro | |||
| ? (seems to be power management related?) | |||
|- | |- | ||
| 0x0B | | 0x0B | ||
| Line 268: | Line 293: | ||
| ro | | ro | ||
| Battery percentage | | Battery percentage | ||
|- | |||
| 0x0C | |||
| s | |||
| ro | |||
| ? (changes to 0 for a second when the charger is plugged in then it resets to its previous value) | |||
|- | |- | ||
| 0x0D | | 0x0D | ||
| Line 273: | Line 303: | ||
| ro | | ro | ||
| System voltage | | System voltage | ||
|- | |||
| 0x0E | |||
| s | |||
| ro | |||
| ? | |||
|- | |- | ||
| 0x0F | | 0x0F | ||
| Line 283: | Line 318: | ||
| ro | | ro | ||
| Special HID status flags: bit0 = power button pressed, bit1 = power button pressed long, bit2 = home button pressed, bit3 = home button released, bit4 = wifi slider enabled, bit5 = shell got closed, bit6 = shell got opened. If nothing has changed this register is 0. | | Special HID status flags: bit0 = power button pressed, bit1 = power button pressed long, bit2 = home button pressed, bit3 = home button released, bit4 = wifi slider enabled, bit5 = shell got closed, bit6 = shell got opened. If nothing has changed this register is 0. | ||
Needs confirmation (or some flags to enable). | |||
|- | |||
| 0x11 | |||
| s | |||
| ro | |||
| ? | |||
|- | |- | ||
| 0x12 | | 0x12 | ||
| Line 288: | Line 329: | ||
| ro | | ro | ||
| 0x40 if volume slider position changed | | 0x40 if volume slider position changed | ||
Needs confirmation (or some flags to enable). | |||
|- | |||
| 0x13 | |||
| s | |||
| ro | |||
| ? | |||
|- | |||
| 0x14 | |||
| s | |||
| ro | |||
| ? | |||
|- | |||
| 0x15 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x16 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x17 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x18 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x19 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x1A | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x1B | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x1C | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x1D | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x1E | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x1F | |||
| s | |||
| rw | |||
| ? | |||
|- | |- | ||
| 0x20 | | 0x20 | ||
| s | | s | ||
| wo | | wo | ||
| System power control - bit0 = power off, bit1 = reboot (unused?). bit2 = reboot (used by mcu-module and LgyBg). bit3 = used by LgyBg to power off, causes hangs in 3DS-mode. bit4 = doesn't seem to do anything, but an mcu::RTC command uses this. Other bits are unused, and seem to do nothing. | | System power control - bit0 = power off, bit1 = reboot (unused?). bit2 = reboot (used by mcu-module and LgyBg). bit3 = used by LgyBg to power off, causes hangs in 3DS-mode. bit4 = doesn't seem to do anything, but an mcu::RTC command uses this. Other bits are unused, and seem to do nothing. | ||
|- | |||
| 0x21 | |||
| s | |||
| ro(?) | |||
| ? | |||
|- | |- | ||
| 0x22 | | 0x22 | ||
| s | | s | ||
| | | wo | ||
| Used to set LCD states. bit0 = don't push to LCDs, bit1 = push to LCDs, bit2 = bottom screen backlight off, bit3 = bottom screen backlight on, bit4 = top screen backlight off, bit5 = top screen backlight on | | Used to set LCD states. bit0 = don't push to LCDs, bit1 = push to LCDs, bit2 = bottom screen backlight off, bit3 = bottom screen backlight on, bit4 = top screen backlight off, bit5 = top screen backlight on | ||
|- | |||
| 0x23 | |||
| s | |||
| ro(?) | |||
| ? | |||
|- | |- | ||
| 0x24 | | 0x24 | ||
| Line 303: | Line 420: | ||
| ?? | | ?? | ||
| Watchdog timer. This must be set *before* the timer is triggered, otherwise the old value is used. Value zero disables the watchdog. | | Watchdog timer. This must be set *before* the timer is triggered, otherwise the old value is used. Value zero disables the watchdog. | ||
|- | |||
| 0x25 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x26 | |||
| s | |||
| rw | |||
| ? | |||
|- | |- | ||
| 0x27 | | 0x27 | ||
| s | | s | ||
| ro | | ro (rw?) | ||
| Raw volume slider state | | Raw volume slider state | ||
|- | |- | ||
| Line 315: | Line 442: | ||
|- | |- | ||
| 0x29 | | 0x29 | ||
| dynamic | | dynamic / s | ||
| rw | | ro / rw | ||
| Repeat register, any byte written | | Repeat register, any byte written in the first byte gets repeated indefinitely(?, needs confirmation past 0xFF). The rest of the bytes are read-only. Setting the shared byte of this register (via overflow glitches) will also work, confirming that this is a semi-dynamic register as the first byte is stored in the shared register pool, but the rest of the bytes are fake. | ||
|- | |- | ||
| 0x2A | | 0x2A | ||
| Line 342: | Line 469: | ||
| s | | s | ||
| ro | | ro | ||
| This [[MCURTC:GetInfoLEDStatus|returns]] the notification LED status when read | | This [[MCURTC:GetInfoLEDStatus|returns]] the notification LED status when read (1 means new cycle started) | ||
|- | |||
| 0x2F | |||
| s | |||
| ro(?) | |||
| ? | |||
|- | |- | ||
| 0x30 | | 0x30 | ||
| Line 349: | Line 481: | ||
| rw | | rw | ||
| RTC time (system clock). 7 bytes are read from this. The upper nibble of each byte encodes 10s (BCD), so each byte is post-processed with (byte & 0xF) + (10 * (byte >> 4)). Byte 0 encodes seconds, byte 1 minutes, byte 2 hours, byte *4* days, byte 5 months and byte 6 years (byte 3 is unused?) | | RTC time (system clock). 7 bytes are read from this. The upper nibble of each byte encodes 10s (BCD), so each byte is post-processed with (byte & 0xF) + (10 * (byte >> 4)). Byte 0 encodes seconds, byte 1 minutes, byte 2 hours, byte *4* days, byte 5 months and byte 6 years (byte 3 is unused?) | ||
|- | |||
| 0x38 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x39 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x3A | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x3B | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x3C | |||
| s | |||
| rw | |||
| ? | |||
|- | |- | ||
| 0x3D | | 0x3D | ||
0x3E | |||
| s (2) | | s (2) | ||
| ro | | ro | ||
| RTC tick counter (resets to 0 when the seconds increase) | | RTC tick counter (resets to 0 when the seconds increase) | ||
|- | |- | ||
| 0x3F | | 0x3F | ||
| s | | s | ||
| | | wo | ||
| Peripheral power related? bit0 seems to depower everything, pressing the power key afterwards instantly turns the whole 3DS off | | Peripheral power related? bit0 seems to depower everything, pressing the power key afterwards instantly turns the whole 3DS off | ||
|- | |||
| 0x40 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x41 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x42 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x43 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x44 | |||
| s | |||
| rw | |||
| ? (setting this seems to freeze the system for a second) | |||
|- | |||
| 0x45 | |||
| s | |||
| rw | |||
| ? | |||
|- | |- | ||
| 0x46 | | 0x46 | ||
| Line 375: | Line 562: | ||
| ro | | ro | ||
| Gyro X(?) axis rotation (0x00 = 3DS base facing upwards, 0x40 = face-down flat, 0xBE = standing(?) flat) | | Gyro X(?) axis rotation (0x00 = 3DS base facing upwards, 0x40 = face-down flat, 0xBE = standing(?) flat) | ||
|- | |||
| 0x4B | |||
| s | |||
| rw | |||
| ? (setting this to 0xFF seems to freeze the system when trying to transition to Home Menu if some other registers are set accordingly) | |||
|- | |||
| 0x4C | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x4D | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x4E | |||
| s | |||
| rw | |||
| ? | |||
|- | |- | ||
| 0x4F | | 0x4F | ||
| Line 380: | Line 587: | ||
| ro | | ro | ||
| Unkonwn. Reading past the 6th byte is FF-filled, so register size of 6 is assumed. | | Unkonwn. Reading past the 6th byte is FF-filled, so register size of 6 is assumed. | ||
|- | |||
| 0x50 | |||
- 0x57 | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x58 | |||
| s | |||
| rw | |||
| DSP volume slider 0% volume offset (setting this to 0xFF will esentially mute the DSP as it's the volume slider's maximum raw value) | |||
|- | |||
| 0x59 | |||
| s | |||
| rw | |||
| DSP volume slider 100% volume offset (setting both this and the above to 0 will disable the volume slider with 100% volume, setting this to a lower value than the above will make the volume slider have only 2 states; on and off) | |||
|- | |||
| 0x5A | |||
| s | |||
| rw | |||
| ? | |||
|- | |||
| 0x5B | |||
- 0x5F | |||
| s | |||
| ro(?) | |||
| ? (these seem to be invalid regsiters) | |||
|- | |- | ||
| 0x60 | | 0x60 | ||
| 0x100 | | 0x100 | ||
| ro | | ro | ||
first byte is wo | first byte is wo | ||
| Looping queue register | | Looping queue register | ||
| Line 390: | Line 624: | ||
|- | |- | ||
| 0x61 | | 0x61 | ||
| 0x100 | | 0x100 | ||
| rw | | rw | ||
| Writing to this register pushes values on top of register 0x60's stack. Reading from this register doesn't advance the stack. | | Writing to this register pushes values on top of register 0x60's stack. Reading from this register doesn't advance the stack. | ||
The first byte is used to store flags for managing FIRM/NS state - bit0 = "WirelessDisabled", bit1 = "SoftwareClosed", bit2 = "PowerOffInitiated", bit4 = "LegacyJumpProhibited". This register survives power-off, but does not seem to be saved to non-volatile storage (does not survive battery pulls). This register doesn't seem to actually control MCU behaviour by itself, it just seems to be used for storing arbitrary data. | The first byte is used to store flags for managing FIRM/NS state - bit0 = "WirelessDisabled", bit1 = "SoftwareClosed", bit2 = "PowerOffInitiated", bit4 = "LegacyJumpProhibited". This register survives power-off, but does not seem to be saved to non-volatile storage (does not survive battery pulls). This register doesn't seem to actually control MCU behaviour by itself, it just seems to be used for storing arbitrary data. | ||
|- | |||
| 0x62 - 0x7E | |||
| s | |||
| invalid (ro) | |||
| These registers don't exist at all, thus reading them will yield 0xFF | |||
|- | |- | ||
| 0x7F | | 0x7F | ||
| Line 406: | Line 645: | ||
byte 17: WiFi LED brightness | byte 17: WiFi LED brightness | ||
byte 18: raw button states? | byte 18: raw button states? | ||
bit0: unset while power button is held | bit0: unset while power button is held | ||
bit1: unset while home button is held | bit1: unset while home button is held | ||
bit2: unset while Wifi slider is held | bit2: unset while Wifi slider is held | ||
bit5: unset while the charging LED is active | |||
bit6: unset | bit6: unset while charger is plugged in | ||
this byte is reset to 0 before an svcBreak takes effect | this byte is reset to 0 before an svcBreak takes effect | ||