Line 4: |
Line 4: |
| |- | | |- |
| ! Command Header | | ! Command Header |
| + | ! Available since system version |
| ! Description | | ! Description |
| |- | | |- |
| | 0x00010000 | | | 0x00010000 |
| + | | [[1.0.0-0]] |
| | [[IRU:Initialize|Initialize]] | | | [[IRU:Initialize|Initialize]] |
| |- | | |- |
| | 0x00020000 | | | 0x00020000 |
| + | | [[1.0.0-0]] |
| | [[IRU:Shutdown|Shutdown]] | | | [[IRU:Shutdown|Shutdown]] |
| |- | | |- |
| | 0x00030042 | | | 0x00030042 |
| + | | [[1.0.0-0]] |
| | [[IRU:StartSendTransfer|StartSendTransfer]] | | | [[IRU:StartSendTransfer|StartSendTransfer]] |
| |- | | |- |
| | 0x00040000 | | | 0x00040000 |
| + | | [[1.0.0-0]] |
| | [[IRU:WaitSendTransfer|WaitSendTransfer]] | | | [[IRU:WaitSendTransfer|WaitSendTransfer]] |
| |- | | |- |
| | 0x000500C2 | | | 0x000500C2 |
| + | | [[1.0.0-0]] |
| | [[IRU:StartRecvTransfer|StartRecvTransfer]] | | | [[IRU:StartRecvTransfer|StartRecvTransfer]] |
| |- | | |- |
| | 0x00060000 | | | 0x00060000 |
| + | | [[1.0.0-0]] |
| | [[IRU:WaitRecvTransfer|WaitRecvTransfer]] | | | [[IRU:WaitRecvTransfer|WaitRecvTransfer]] |
| |- | | |- |
| | 0x00070000 | | | 0x00070000 |
| + | | [[1.0.0-0]] |
| | [[IRU:GetRecvTransferCount|GetRecvTransferCount]] | | | [[IRU:GetRecvTransferCount|GetRecvTransferCount]] |
| |- | | |- |
| | 0x00080000 | | | 0x00080000 |
| + | | [[1.0.0-0]] |
| | [[IRU:GetSendState|GetSendState]] | | | [[IRU:GetSendState|GetSendState]] |
| |- | | |- |
| | 0x00090040 | | | 0x00090040 |
| + | | [[1.0.0-0]] |
| | [[IRU:SetBitRate|SetBitRate]] | | | [[IRU:SetBitRate|SetBitRate]] |
| |- | | |- |
| | 0x000A0000 | | | 0x000A0000 |
| + | | [[1.0.0-0]] |
| | [[IRU:GetBitRate|GetBitRate]] | | | [[IRU:GetBitRate|GetBitRate]] |
| |- | | |- |
| | 0x000B0040 | | | 0x000B0040 |
| + | | [[1.0.0-0]] |
| | [[IRU:SetIRLEDState|SetIRLEDState]] | | | [[IRU:SetIRLEDState|SetIRLEDState]] |
| |- | | |- |
| | 0x000C0000 | | | 0x000C0000 |
| + | | [[1.0.0-0]] |
| | [[IRU:GetIRLEDRecvState|GetIRLEDRecvState]] | | | [[IRU:GetIRLEDRecvState|GetIRLEDRecvState]] |
| |- | | |- |
| | 0x000D0000 | | | 0x000D0000 |
| + | | [[1.0.0-0]] |
| | [[IRU:GetSendFinishedEvent|GetSendFinishedEvent]] | | | [[IRU:GetSendFinishedEvent|GetSendFinishedEvent]] |
| |- | | |- |
| | 0x000E0000 | | | 0x000E0000 |
| + | | [[1.0.0-0]] |
| | [[IRU:GetRecvFinishedEvent|GetRecvFinishedEvent]] | | | [[IRU:GetRecvFinishedEvent|GetRecvFinishedEvent]] |
| |- | | |- |
| | 0x000F0000 | | | 0x000F0000 |
| + | | [[1.0.0-0]] |
| | [[IRU:GetTransferState|GetTransferState]] | | | [[IRU:GetTransferState|GetTransferState]] |
| |- | | |- |
| | 0x00100000 | | | 0x00100000 |
− | | | + | | [[1.0.0-0]] |
| + | | GetErrorStatus |
| |- | | |- |
| | 0x00110040 | | | 0x00110040 |
− | | [[IRU:SetRawIRState|SetRawIRState]] | + | | [[1.0.0-0]] |
| + | | [[IRU:SetSleepModeActive|SetSleepModeActive]] |
| |- | | |- |
| | 0x00120040 | | | 0x00120040 |
− | | | + | | [[1.0.0-0]] |
| + | | [[IRU:SetSleepModeState|SetSleepModeState]] |
| |} | | |} |
| | | |
Line 69: |
Line 88: |
| |- | | |- |
| | 0x00010182 | | | 0x00010182 |
− | | | + | | [[2.0.0-2]] |
− | | Initialize | + | | [[IRUSER:InitializeIrnop|InitializeIrnop]] |
| |- | | |- |
| | 0x00020000 | | | 0x00020000 |
− | | | + | | [[2.0.0-2]] |
− | | Shutdown | + | | FinalizeIrnop |
| |- | | |- |
| | 0x00030000 | | | 0x00030000 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | ClearReceiveBuffer |
| |- | | |- |
| | 0x00040000 | | | 0x00040000 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | ClearSendBuffer |
| |- | | |- |
− | | 0x00050000 | + | | 0x000500C0 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | WaitConnection |
| |- | | |- |
− | | 0x00060000 | + | | 0x00060040 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | RequireConnection (u8 input) |
| |- | | |- |
− | | 0x00070000 | + | | 0x000702C0 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | AutoConnection |
| |- | | |- |
| | 0x00080000 | | | 0x00080000 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | AnyConnection |
| |- | | |- |
| | 0x00090000 | | | 0x00090000 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | Disconnect |
| |- | | |- |
| | 0x000A0000 | | | 0x000A0000 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | GetReceiveEvent (writes event handle to cmdreply[3]) |
| |- | | |- |
| | 0x000B0000 | | | 0x000B0000 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | GetSendEvent (writes event handle to cmdreply[3]) |
| |- | | |- |
| | 0x000C0000 | | | 0x000C0000 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | GetConnectionStatusEvent (writes event handle to cmdreply[3]) |
| |- | | |- |
− | | 0x000D0000 | + | | 0x000D0042 |
− | | | + | | [[2.0.0-2]] |
− | | ? | + | | SendIrnop (u32 size, ((Size<<14) <nowiki>|</nowiki> 2), inbufptr) |
| + | |- |
| + | | 0x000E0042 |
| + | | [[2.0.0-2]] |
| + | | SendIrnopLarge (u32 size, ((Size<<8) <nowiki>|</nowiki> 10), inbufptr) |
| + | |- |
| + | | 0x000F0040 |
| + | | [[2.0.0-2]] |
| + | | ReceiveIrnop |
| + | |- |
| + | | 0x00100042 |
| + | | [[2.0.0-2]] |
| + | | ReceiveIrnopLarge |
| + | |- |
| + | | 0x0011.... |
| + | | [[2.0.0-2]] |
| + | | GetLatestReceiveErrorResult |
| + | |- |
| + | | 0x0012.... |
| + | | [[2.0.0-2]] |
| + | | GetLatestSendErrorResult |
| + | |- |
| + | | 0x0013.... |
| + | | [[2.0.0-2]] |
| + | | GetConnectionStatus |
| + | |- |
| + | | 0x0014.... |
| + | | [[2.0.0-2]] |
| + | | GetTryingToConnectStatus |
| + | |- |
| + | | 0x0015.... |
| + | | [[2.0.0-2]] |
| + | | GetReceiveSizeFreeAndUsed |
| + | |- |
| + | | 0x0016.... |
| + | | [[2.0.0-2]] |
| + | | GetSendSizeFreeAndUsed |
| + | |- |
| + | | 0x0017.... |
| + | | [[2.2.0-X]] |
| + | | GetConnectionRole |
| |- | | |- |
− | | 0x000E0000 | + | | 0x00180182 |
− | | | + | | [[2.2.0-X]] |
− | | ? | + | | [[IRUSER:InitializeIrnopShared|InitializeIrnopShared]] |
| |- | | |- |
− | | 0x000F0000 | + | | 0x00190040 |
− | | | + | | [[2.2.0-X]] |
− | | ? | + | | ReleaseReceivedData (32bit_value input) |
| |- | | |- |
− | | 0x00100000 | + | | 0x001A0040 |
− | | | + | | [[2.2.0-X]] |
− | | ? | + | | SetOwnMachineId (u8 input) |
| + | |} |
| + | |
| + | This service was added with [[2.0.0-2]]. |
| + | |
| + | When sending data, SendIrnop is used when the size is <=0xFC, otherwise SendIrnopLarge is used. |
| + | |
| + | = IR Service "ir:rst" = |
| + | {| class="wikitable" border="1" |
| |- | | |- |
− | | 0x00110000
| + | ! Command Header |
− | |
| + | ! Available since system-version |
− | | ?
| + | ! Description |
| |- | | |- |
− | | 0x00120000 | + | | 0x00010000 |
− | | | + | | [[8.0.0-18]] |
− | | ? | + | | [[IRRST:GetHandles|GetHandles]] |
| |- | | |- |
− | | 0x00130000 | + | | 0x00020080 |
− | | | + | | [[8.0.0-18]] |
− | | ? | + | | [[IRRST:Initialize|Initialize]] |
| |- | | |- |
− | | 0x00140000 | + | | 0x00030000 |
− | | | + | | [[8.0.0-18]] |
− | | ? | + | | [[IRRST:Shutdown|Shutdown]] |
| |- | | |- |
− | | 0x00150000 | + | | 0x00040000 |
− | | | + | | [[8.0.0-18]] |
− | | ? | + | | This writes an unknown u8 to index-word cmdreply[2], from data loaded from an I2C device register. |
| |- | | |- |
− | | 0x00160000 | + | | 0x00050000 |
− | | | + | | [[8.0.0-18]] |
− | | ? | + | | This writes an unknown u8 from IR-module state to index-word cmdreply[2]. |
| |- | | |- |
− | | 0x00170000 | + | | 0x00060000 |
− | | Unknown, >[[2.0.0-2]] | + | | [[8.0.0-18]] |
− | | ? | + | | This writes two unknown u8 fields from IR-module state to index-word cmdreply[2] and cmdreply[3]. |
| |- | | |- |
− | | 0x00180000 | + | | 0x00070080 |
− | | Unknown, >[[2.0.0-2]] | + | | [[9.0.0-20]] |
− | | ? | + | | (u8 unk0, u8 unk1) This is used for calibrating the C-stick on the N3DS EXTHID. |
| |- | | |- |
− | | 0x00190000 | + | | 0x00080000 |
− | | Unknown, >[[2.0.0-2]] | + | | [[9.0.0-20]] |
− | | ? | + | | (u8 unk0, u8 unk1) ? |
| |- | | |- |
− | | 0x001A0000 | + | | 0x00090000 |
− | | Unknown, >[[2.0.0-2]] | + | | [[9.0.0-20]] |
− | | ? | + | | This writes two unknown u8 fields to index-word cmdreply[2] and cmdreply[3]. |
| |} | | |} |
| | | |
− | Only one session to either of these services can be open at a time, thus only one process can use either of these services at once. These services interface with hardware services gpio::IR and i2c::IR. The i2c::IR service is used for sending/receiving data. | + | This service was added with [[8.0.0-18]]. Unlike the other IR services, this uses [[I2C]] deviceid 17(this deviceid isn't actually handled by the [[8.0.0-18]] I2C module). This is for the additional [[New 3DS]] HID hardware, this HID data is stored in [[IRRST_Shared_Memory|shared-memory]]. Even with [[9.0.0-20]] IR module still registers+handles this service on both Old3DS+New3DS. |
| + | |
| + | =IR Services= |
| + | Only one session(two sessions starting with [[8.0.0-18]]) to any of these services can be open at a time, thus only one/two process(es) can use any of these services at once. These services interface with hardware services gpio::IR and i2c::IR. The i2c::IR service is used for sending/receiving data. |
| + | |
| + | IRU is for regular IR comms. IRUSER uses a custom IR protocol(above the physical layer). Both of these services use IrDA-SIR. The IR hardware seems to only support IrDA-SIR, other physical protocols such as the one for TV-remotes are not supported(going by the datasheet linked [[Hardware|here]] for a different IC at least). |
| | | |
− | IRU is for regular IR comms. IRUSER uses a custom IR protocol(above the physical layer), which is for 3DS<>3DS comms. The IR hardware operates in the IrDA SIR mode by default, IRU doesn't have an interface for using other modes(such as the one for TV-remotes) via hardware.
| + | The protocol used with IRUSER involves encryption(?) implemented in software. IRUSER is used for the [[Circle Pad Pro]]. This same IRUSER service uses the New3DS HID hardware when running on New3DS. Note that the main service for New3DS HID is ir:rst, and these two service are mutually exclusive: when one is initialized and reading data from New3DS HID, the other cannot access it. |