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 |
− | | Top screen flicker | + | | Bottom screen flicker |
| |- | | |- |
| | 0x05 | | | 0x05 |
| | s / 0x4003? | | | s / 0x4003? |
| | rw / ? | | | rw / ? |
− | | Bottom screen flicker or Danger zone - [[MCU_Services#MCU_firmware_versions|MCU firmware]] is uploaded here (???) | + | | 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 |
− | | rw(?) | + | | 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 here gets repeated indefinitely(?) | + | | 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) |
− | It seems to bug out register 0x3E due to having a size of 2 in the shared register pool
| |
| |- | | |- |
| | 0x3F | | | 0x3F |
| | s | | | s |
− | | rw(?) | + | | 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 |
− | bit4: unset when charger is plugged in, | + | bit5: unset while the charging LED is active |
− | bit6: unset when charging LED is active | + | 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 |