Difference between revisions of "I2C Services"

From 3dbrew
Jump to navigation Jump to search
(add link between 0x00150080 , IR service, and ZL + ZR + Cstick)
 
(22 intermediate revisions by 8 users not shown)
Line 1: Line 1:
 
[[Category:Services]]
 
[[Category:Services]]
 
= I2C Service Names =
 
= I2C Service Names =
* "i2c::MCU"
+
{| class="wikitable" border="1"
* "i2c::CAM"
+
|-
* "i2c::LCD"
+
!  Service names
* "i2c::DEB"
+
!  Notes
* "i2c::HID"
+
!  Accessible [[I2C_Registers|deviceIDs]]
* "i2c::IR"
+
!  Service used by sysmodule
* "i2c::EEP"
+
|-
 +
| "i2c::MCU"
 +
|
 +
| 0, 3
 +
| [[MCU_Services|MCU]]
 +
|-
 +
| "i2c::CAM"
 +
|
 +
| 1, 2, 4
 +
| [[Camera_Services|Camera]]
 +
|-
 +
| "i2c::LCD"
 +
|
 +
| 5, 6
 +
| [[GSP_Services|GSP]]
 +
|-
 +
| "i2c::DEB"
 +
|
 +
| 7, 8
 +
| Unknown
 +
|-
 +
| "i2c::HID"
 +
|
 +
| 9, 10, 11, 12
 +
| [[HID_Services|HID]]
 +
|-
 +
| "i2c::IR"
 +
|
 +
| 13, and additionally for New3DS i2c module: 17
 +
| [[IR_Services|IR]]
 +
|-
 +
| "i2c::EEP"
 +
|
 +
| 14
 +
| [[Config_Services|Cfg]]
 +
|-
 +
| "i2c::NFC"
 +
| Only available via the New3DS i2c sysmodule.
 +
| 15
 +
| New3DS [[NFC_Services|NFC]]
 +
|-
 +
| "i2c::QTM"
 +
| Only available via the New3DS i2c sysmodule.
 +
| 16
 +
| New3DS [[QTM_Services|QTM]]
 +
|}
 +
 
 +
Each I2C service can only access certain I2C [[I2C_Registers|device(s)]]. When the specified deviceid isn't accessible, error 0xE0A02FEA is returned.
  
 
= I2C Service =
 
= I2C Service =
Line 13: Line 60:
 
|-
 
|-
 
!  Command Header
 
!  Command Header
 +
!  Available since system-version
 
!  Description
 
!  Description
 
|-
 
|-
 
| 0x00010100
 
| 0x00010100
 +
|
 
| SetRegisterBits8 (u8 devid, u8 regid, u8 regdata, u8 mask)
 
| SetRegisterBits8 (u8 devid, u8 regid, u8 regdata, u8 mask)
 
|-
 
|-
| 0x0002....
+
| 0x000200C0
 +
|
 
| EnableRegisterBits8 (u8 devid, u8 regid, u8 enablemask)
 
| EnableRegisterBits8 (u8 devid, u8 regid, u8 enablemask)
 
|-
 
|-
 
| 0x000300C0
 
| 0x000300C0
 +
|
 
| DisableRegisterBits8 (u8 devid, u8 regid, u8 disablemask)
 
| DisableRegisterBits8 (u8 devid, u8 regid, u8 disablemask)
 
|-
 
|-
 
| 0x00040102
 
| 0x00040102
 +
|
 
| MultiSetRegisterBits16 (u16 regid, u16 regdata, u16 mask, devcount, u8* devidlistptr)
 
| MultiSetRegisterBits16 (u16 regid, u16 regdata, u16 mask, devcount, u8* devidlistptr)
 
|-
 
|-
| 0x0005....
+
| 0x000500C0
 +
|
 
| WriteRegister8 (u8 devid, u8 regid, u8 regdata)
 
| WriteRegister8 (u8 devid, u8 regid, u8 regdata)
 
|-
 
|-
| 0x0006....
+
| 0x00060080
 +
|
 
| WriteCommand8 (u8 devid, u8 cmdid)
 
| WriteCommand8 (u8 devid, u8 cmdid)
 
|-
 
|-
| 0x0007....
+
| 0x000700C0
| WriteRegister16 (u8 devid, u16 regid, u16 regdata)
+
|
 +
| WriteRegister16 (u8 devid, u8 regid, u16 regdata)
 
|-
 
|-
 
| 0x000800C2
 
| 0x000800C2
 +
|
 
| MultiWriteRegister16 (u16 regid, u16 regdata, devcount, u8* devidlistptr)
 
| MultiWriteRegister16 (u16 regid, u16 regdata, devcount, u8* devidlistptr)
 
|-
 
|-
| 0x0009....
+
| 0x00090080
 +
|
 
| u8 ReadRegister8 (u8 devid, u8 regid)
 
| u8 ReadRegister8 (u8 devid, u8 regid)
 
|-
 
|-
| 0x000A....
+
| 0x000A0080
| u16 ReadRegister16 (u8 devid, u16 regid)
+
|
 +
| u16 ReadRegister16 (u8 devid, u8 regid)
 
|-
 
|-
 
| 0x000B00C2
 
| 0x000B00C2
| WriteRegisterBuffer8 (u8 devid, u8 regid, buffersize, u8* bufferptr)
+
|
 +
| WriteRegisterBuffer8 (u8 devid, u8 regid, buffersize, (buffersize << 14) <nowiki>|</nowiki> 0x402, u8* bufferptr)
 
|-
 
|-
 
| 0x000C00C2
 
| 0x000C00C2
| WriteRegisterBuffer16 (u8 devid, u16 regid, buffersize, u16* bufferptr)
+
|
 +
| WriteRegisterBuffer16 (u8 devid, u16 regid, buffersize, (buffersize << 15) <nowiki>|</nowiki> 0x402, u16* bufferptr)
 
|-
 
|-
| 0x000D....
+
| 0x000D00C0
 
|  
 
|  
 +
| ReadRegisterBuffer8 (u8 devid, u8 regid, buffersize, +0x180: (buffersize << 14) <nowiki>|</nowiki> 2, +0x184: u8 bufferptr)
 
|-
 
|-
 
| 0x000E00C2
 
| 0x000E00C2
| WriteRegisterBuffer8_again? (u8 devid, u8 regid, buffersize, u8* bufferptr)
+
|  
 +
| WriteRegisterBuffer (u8 devid, u8 regid, unused (bufsize?), (bufsize << 14) <nowiki>|</nowiki> 0x402, void* buffer)
 
|-
 
|-
| 0x000F....
+
| 0x000F00C0
 
|  
 
|  
 +
| ReadRegisterBuffer (u8 devid, u8 regid, min(bufsize, 0x20)), +0x180: (bufsize << 14) <nowiki>|</nowiki> 2, void* buffer
 
|-
 
|-
| 0x0010....
+
| 0x001000C0
 
|  
 
|  
 +
| ReadEEPROM (u8 devid = 14, u16 blockid, min(bufsize >> 1, 0x10)), +0x180: (bufsize << 15) <nowiki>|</nowiki> 2, u16* buffer
 
|-
 
|-
 
| 0x001100C2
 
| 0x001100C2
| ReadRegisterBuffer(u8 devid, u16 regid, buffersize, u8 *buff)
+
|  
 +
| WriteRegisterBuffer(u8 devid, u8 regid, buffersize, u8 *buff)
 
|-
 
|-
 
| 0x001200C2
 
| 0x001200C2
| WriteRegisterBuffer(u8 devid, u16 regid, buffersize, u8 *buff)
+
|  
 +
| ReadRegisterBuffer(u8 devid, u8 regid, buffersize, u8 *buff)
 
|-
 
|-
| 0x0013....
+
| 0x00130040
|
+
| [[8.0.0-18]]
 +
| ReadDeviceRaw8(u8 devid) Writes the output read u8 I2C data to cmdreply[2]. After successfully selecting the I2C device, it writes 0xE1 to CNT then loads the output u8 I2C data from the DATA register.
 
|-
 
|-
 
| 0x00140082
 
| 0x00140082
|  
+
| [[8.0.0-18]]
 +
| WriteDeviceRaw(u8 devid, u32 buffersize, (buffersize << 14) <nowiki>|</nowiki> 0x402, bufferptr) This is basically the write-data version of command 0x00150080.
 
|-
 
|-
| 0x0015....
+
| 0x00150080
|  
+
| [[8.0.0-18]]
 +
| ReadDeviceRaw(u8 devid, u32 buffersize, +0x180: (buffersize << 14) <nowiki>|</nowiki> 2, +0x184: bufferptr) This is the >1-byte version of command 0x00130040, except value 0xF0 is used for CNT instead of 0xE1.
 
|}
 
|}
 +
 +
Commands 0x00130040..0x00150080 are only usable with the New3DS i2c module: on Old3DS the actual command-handler function for each of these commands just return an error. Commands 0x00140082 and 0x00150080 are used by [[NFC_Services|NFC]] module. Command 0x00150080 is also used for reading ZL, ZR, and C-stick data by [[IR Services]].

Latest revision as of 10:11, 29 April 2024

I2C Service Names[edit]

Service names Notes Accessible deviceIDs Service used by sysmodule
"i2c::MCU" 0, 3 MCU
"i2c::CAM" 1, 2, 4 Camera
"i2c::LCD" 5, 6 GSP
"i2c::DEB" 7, 8 Unknown
"i2c::HID" 9, 10, 11, 12 HID
"i2c::IR" 13, and additionally for New3DS i2c module: 17 IR
"i2c::EEP" 14 Cfg
"i2c::NFC" Only available via the New3DS i2c sysmodule. 15 New3DS NFC
"i2c::QTM" Only available via the New3DS i2c sysmodule. 16 New3DS QTM

Each I2C service can only access certain I2C device(s). When the specified deviceid isn't accessible, error 0xE0A02FEA is returned.

I2C Service[edit]

Command Header Available since system-version Description
0x00010100 SetRegisterBits8 (u8 devid, u8 regid, u8 regdata, u8 mask)
0x000200C0 EnableRegisterBits8 (u8 devid, u8 regid, u8 enablemask)
0x000300C0 DisableRegisterBits8 (u8 devid, u8 regid, u8 disablemask)
0x00040102 MultiSetRegisterBits16 (u16 regid, u16 regdata, u16 mask, devcount, u8* devidlistptr)
0x000500C0 WriteRegister8 (u8 devid, u8 regid, u8 regdata)
0x00060080 WriteCommand8 (u8 devid, u8 cmdid)
0x000700C0 WriteRegister16 (u8 devid, u8 regid, u16 regdata)
0x000800C2 MultiWriteRegister16 (u16 regid, u16 regdata, devcount, u8* devidlistptr)
0x00090080 u8 ReadRegister8 (u8 devid, u8 regid)
0x000A0080 u16 ReadRegister16 (u8 devid, u8 regid)
0x000B00C2 WriteRegisterBuffer8 (u8 devid, u8 regid, buffersize, (buffersize << 14) | 0x402, u8* bufferptr)
0x000C00C2 WriteRegisterBuffer16 (u8 devid, u16 regid, buffersize, (buffersize << 15) | 0x402, u16* bufferptr)
0x000D00C0 ReadRegisterBuffer8 (u8 devid, u8 regid, buffersize, +0x180: (buffersize << 14) | 2, +0x184: u8 bufferptr)
0x000E00C2 WriteRegisterBuffer (u8 devid, u8 regid, unused (bufsize?), (bufsize << 14) | 0x402, void* buffer)
0x000F00C0 ReadRegisterBuffer (u8 devid, u8 regid, min(bufsize, 0x20)), +0x180: (bufsize << 14) | 2, void* buffer
0x001000C0 ReadEEPROM (u8 devid = 14, u16 blockid, min(bufsize >> 1, 0x10)), +0x180: (bufsize << 15) | 2, u16* buffer
0x001100C2 WriteRegisterBuffer(u8 devid, u8 regid, buffersize, u8 *buff)
0x001200C2 ReadRegisterBuffer(u8 devid, u8 regid, buffersize, u8 *buff)
0x00130040 8.0.0-18 ReadDeviceRaw8(u8 devid) Writes the output read u8 I2C data to cmdreply[2]. After successfully selecting the I2C device, it writes 0xE1 to CNT then loads the output u8 I2C data from the DATA register.
0x00140082 8.0.0-18 WriteDeviceRaw(u8 devid, u32 buffersize, (buffersize << 14) | 0x402, bufferptr) This is basically the write-data version of command 0x00150080.
0x00150080 8.0.0-18 ReadDeviceRaw(u8 devid, u32 buffersize, +0x180: (buffersize << 14) | 2, +0x184: bufferptr) This is the >1-byte version of command 0x00130040, except value 0xF0 is used for CNT instead of 0xE1.

Commands 0x00130040..0x00150080 are only usable with the New3DS i2c module: on Old3DS the actual command-handler function for each of these commands just return an error. Commands 0x00140082 and 0x00150080 are used by NFC module. Command 0x00150080 is also used for reading ZL, ZR, and C-stick data by IR Services.