I2C Registers: Difference between revisions

Kynex7510 (talk | contribs)
mNo edit summary
MarcusD (talk | contribs)
Start adding more info on I2CLCD
Line 762: Line 762:


== Device 5 & 6 ==
== Device 5 & 6 ==
LCD controllers for main/sub displays, most likely.
These are the chip-on-glass display controllers, also known as I2CLCD.
 
=== Shared registers ===
These registers are the same across all known I2CLCD controllers (except Controller ID 0x00).


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Register
!  Register
!  Width
!  Name
!  Name
!  Valid bits
!  Description
!  Description
|-
|-
| 0x1
| 0x01
| 8
| Display enable
| ?
| 0x11
| Values:
 
  - 0x00 - screen off, slow burn-in
  - 0x01 - screen off, fast burn-in
  - 0x10 - screen on, color input used
  - 0x11 - screen on, color input not used, High-Z (display turns black or white depending on interface config)
|-
| 0x40
| Read address
|  
|  
| Write to this register to set the read address.
Reading from I2CLCD is non-standard. When you read, it returns pairs of the currently read address, and then the data byte at that address. The read address auto-increments.
|-
| 0x54
| Checksum? trigger
| 0x01
| When transitioning bit0 from 0 to 1, it seems to trigger some sort of checksum calcuation. Broken on controller 0x01, where it's oneshot.
|-
| 0x55
| ???
| 0x03 (all) /
0x07 (2DS)
| Unknown. When toggling 0x54 bit0 from 0 to 1, this register gets changed to 0x01 (all) / 0x05 (2DS).
This register is sometimes seen with a value of 0x02 at initialization time on the top screen.
|-
| 0x56
| Checksum?
|
| Unknown. Read-writable with no effect (old3DS) / read-only (all).
A random value is written here when 0x54 bit0 is changed from 0 to 1. Constantly updates with a seemingly random value, except on Controller ID 0x01, where it's oneshot/bugged.
|-
| 0x60
| ???
| 0x01
| Unknown. 0x00 is written here during init. Seems to have no effect.
|-
| 0x61
| Register checksum
|
| Some - but not all - register values are combined using an unknown algorithm into this register. 
It's unknown which registers influence this value, as some registers which influence this value are read-only.
|-
| 0x62
| ???
| 0x01
| Unknown, does nothing on known controllers. During init, gsp waits for this to become 0x01.
|-
| 0xFE
| ???
|
| Unknown, does nothing. 0xAA is written here during init.
|-
| 0xFF
| Controller ID
|
| Upper 4bits is manufacturer. Lower 4bits is unknown, most likely revision, possibly encoded as a Johnson counter.
Known IDs:
  - 0xC7 - new3DS, new3DSXL, new2DSXL, and some select newer old3DSXL
  - 0xC3 - older old3DSXL
  - 0xE1 - 2DS
  - 0x10 - some select new3DS and new3DSXL with IPS screens
  - 0x01 - old3DS
  - 0x00 - unknown, gsp compares for this exact Controller ID for an alternate initialization path
Manufacturers:
  - 0xC - SHARP (TN)
  - 0x1 - JDI (LTPS IPS), found in select new3DS and new3DSXL consoles
  - 0xE - unknown, found in 2DS only
  - 0x0 - unknown, found in old3DS (non-XL) only
|}
=== Custom registers for controller 0x00 ===
This Controller ID is fully unknown, and the only reason we know about its existance is due to gsp having special handling code for it.
{| class="wikitable" border="1"
!  Register
!  Name
!  Valid bits
!  Description
|-
|-
| 0x11
| 0x11
| 8
| ???
| ?
|  
| Unknown. Write 0x10 to initialize.
|-
| 0x50
| ???
|  
|  
| Unknown. Write 0x01 to initialize.
|}
=== Custom registers for controller 0x01 ===
{| class="wikitable" border="1"
!  Register
!  Name
!  Valid bits
!  Description
|-
|-
| 0x40
| 0x10
| 8
| Interface config
| CMD_IN/CMD_RESULT1
| 0xF7
| Write to trigger a command? Seen commands: 0xFF=Reset?, 0x62=IsFinished?. Result is stored in CMD_RESULT1:CMD_RESULT0.
| Regonfigures the input pins and pin behavior of the controller.
|-
|-
| 0x41
| 0x11
| 8
| Image config
| CMD_RESULT0
| 0x7F
| Read result
| Image filters and pixel clock control.
|-
|-
| 0x50
| 0x50
| 8
| ???
| ?
| 0x11
| Unknown. Has no effect on bottom screen. On the top screen, bit4 blanks out the display (LVDS disable?).
|-
| 0x53
| ???
| 0x73
| Unknown. While other bits seem to have no effect, bit0 kills the controller until a power cycle.
|}
 
=== Custom registers for controller 0xC3 ===
Basically the same as Controller ID 0xC7.
 
=== Custom registers for controller 0xC7 ===
This is the most common non-old3DS display controller. Quite overclockable.
 
{| class="wikitable" border="1"
!  Register
!  Name
!  Valid bits
!  Description
|-
| 0xAF
| Factory key
|  
|  
| Write 0xAA here to unlock factory controls.
|}
=== Custom registers for controller 0xE1 ===
This controller is designed to drive a split panel. As such, the factory controls have been slightly altered to accomodate this.
This is the only I2CLCD which responds on both I2CLCD addresses. The dominant screen is the bottom one.
{| class="wikitable" border="1"
!  Register
!  Name
!  Valid bits
!  Description
|-
|-
| 0x60
| 0xAF
| 8
| Factory key
| ?
|
| Write 0xAA here to unlock factory controls.
|}
 
=== Custom registers for controller 0x10 ===
JDI IPS controller. It's currently unknown how to unlock factory registers.
 
Factory mode registers:
{| class="wikitable" border="1"
!  Register
!  Name
!  Valid bits
!  Description
|-
| 0x70-0x7F
| Driving curve 1-1
|
|
|-
| 0x80-0x8F
| Driving curve 1-2
|
|
|-
| 0x90-0x9F
| Driving curve 2-1
|
|
|-
| 0xA0-0xAF
| Driving curve 2-2
|
|
|-
| 0xB0-0xBF
| Driving curve 3-1
|  
|  
|  
|-
|-
| 0xFE
| 0xC0-0xCF
| 8
| Driving curve 3-2
| ?
|  
|  
|  
|}
|}