<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Unknown</id>
	<title>3dbrew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Unknown"/>
	<link rel="alternate" type="text/html" href="https://www.3dbrew.org/wiki/Special:Contributions/Unknown"/>
	<updated>2026-04-25T03:51:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=21915</id>
		<title>3DS Userland Flaws</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=21915"/>
		<updated>2022-07-24T09:36:24Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Non-system applications */ Add Me and My pets 3d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists vulnerabilities / exploits for 3DS applications and applets. Exploiting these initially results in ROP, from that ROP one can then for example try exploiting [[3DS_System_Flaws|system]] flaw(s).&lt;br /&gt;
&lt;br /&gt;
=Non-system applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Application name&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Last app/system version this flaw was checked for&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this vuln was discovered&lt;br /&gt;
!  Vuln discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Cubic Ninja&lt;br /&gt;
| Map-data stack smash&lt;br /&gt;
| See [[Ninjhax|here]] regarding Ninjhax.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.4.0-29]].&lt;br /&gt;
| Ninjhax release&lt;br /&gt;
| July 2014&lt;br /&gt;
| [[User:smea|smea]]&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Ocarina of Time 3D&lt;br /&gt;
| UTF-16 name string buffer overflow via unchecked u8 length field&lt;br /&gt;
| The u8 at offset 0x2C in the savefile is the character-length of the UTF-16 string at offset 0x1C. When copying this string, it&#039;s essentially a memory-copy with lenval*2, not a string-copy. This can be used to trigger buffer overflows at various locations depending on the string length.&lt;br /&gt;
* When value is &amp;gt;=0x6E it crashes when saving the saveslot, this causes a stack-smash however it normally crashes before it returns from the function which had the stack-frame overwritten.&lt;br /&gt;
* With value &amp;gt;=0x9A, it crashes via stack-smash in-game once any dialogs are opened(touching buttons on the touch-screen can trigger it too).&lt;br /&gt;
* Length value&amp;gt;=0xCD causes a crash while loading the saveslot, via a heap buffer overflow. This buf-overflow overwrites a heap memchunk following the allocated buffer. When the first 16-bits overwriting that heap memchunk is not the memchunk magic-number(0x7373), the mem-alloc code will just return a NULL ptr which later results in a crash. When the magic-number is valid, the mem-alloc code will continue to attempt to parse the memchunk, which may crash depending on the data which overwrote the memchunk. This heap code is separate from the CTRSDK heap code. Exploiting this doesn&#039;t seem to be possible: since the heap code actually verifies that the magic-number for the next/prev memchunk ptrs are correct(unlike CTRSDK), it&#039;s not possible to change those ptrs to useful arbitrary addresses outside of savedata(like with triggering a write to a c++ object ptr which later is used with a vtable func-call, this is what one would do with CTRSDK heap here).&lt;br /&gt;
&lt;br /&gt;
On March 11, 2015, an exploit using this vuln was released, that one was intended for warez/etc. The following exploit wasn&#039;t released before then mainly because doing so would (presumably) result in the vuln being fixed. The following old exploit was released on March 14, 2015: [https://github.com/yellows8/oot3dhax].&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.6.0-31]].&lt;br /&gt;
| March 11, 2015&lt;br /&gt;
| Around October 22, 2012&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Super Smash Bros 3DS&lt;br /&gt;
| Buffer overflow in local-multiplayer beacon handling.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| App: v1.1.3&lt;br /&gt;
| See [[smashbroshax|here]]. System: [[10.3.0-28]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Super Mystery Dungeon&lt;br /&gt;
| Heap overflow within linear memory via unchecked save file length&lt;br /&gt;
| Pokemon Super Mystery Dungeon uses zlib compression for most of its save files, possibly due to the save files being larger than its predecessor, Gates to Infinity. When a save file is being prepared to be loaded and read from, only a 0x32000 large buffer is allocated for file reading, and a 0x3e800-large buffer for decompression is also allocated before the file is read. However, the game does not limit the size of the file read to this allocation bound, allowing for the file to overflow into the linear memory heap and into the next allocation. Since Pokemon Super Mystery Dungeon stores allocation memchunks directly before the allocation, overwriting the next memchunk with a corrupted one allows for arbitrary writes of linear heap pointers when the next buffer is allocated or arbitrary writes of any pointer within writable memory when the corrupted buffer is freed.&lt;br /&gt;
| None&lt;br /&gt;
| O3DS: [[11.3.0-36]]. N3DS: [[11.4.0-37]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 14, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| VVVVVV&lt;br /&gt;
| Buffer overflow in XML save file array parsing&lt;br /&gt;
| VVVVVV utilizes several XML files (renamed with a .vvv extension) to store level save data, stats and settings. Within these XML files are several tags containing an array of data which, when parsed, is not properly checked to be of proper length for the tag being parsed from. This allows for an overflow of 16-bit array values from the location where the array is parsed. With unlock.vvv, XML data is parsed to the stack, and with level saves the heap. This allows for the pointer where the level save worldmap tag array should be parsed into to be overwritten with a stack address, allowing for ROP from within the XML array parsing function on the next level load.&lt;br /&gt;
| App: v1.1&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 25, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| Citizens of Earth&lt;br /&gt;
| Save file read stack smash&lt;br /&gt;
| Citizens of Earth also uses &amp;quot;XML&amp;quot; files for saves, which are actually entirely binary data (not XML at all) with no checksums. These files are read from the filesystem on to a fixed size stack buffer which leads to an incredibly trivial stack smash. When using the autosave slot for this, the save is parsed when the user selects &amp;quot;continue&amp;quot;. When using one of the dedicated save slots (1-3), the save is parsed shortly after the company splash screens fade. Note that the save is read quite high (descending) on the stack - when exploiting this, one would likely need to move SP due to almost instantly overflowing the physical stack.&lt;br /&gt;
| None&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| May 5, 2016&lt;br /&gt;
| [[User:Dazzozo|Dazzozo]]&lt;br /&gt;
|-&lt;br /&gt;
| SmileBASIC 3.x&lt;br /&gt;
| Poor parameter validation on &amp;quot;BGSCREEN&amp;quot; command&lt;br /&gt;
| The SmileBASIC &amp;quot;BGSCREEN&amp;quot; command&#039;s second parameter is not properly validated as being within range.  As a result, one can set the screen size to an absurdly large value.  This means that the &amp;quot;BGGET&amp;quot; and &amp;quot;BGPUT&amp;quot; commands can then be used on out-of-range values to read and write a significant chunk of the interpreter&#039;s address space.&lt;br /&gt;
With a series of carefully-designed BGPUT commands, one can build a ROP chain and cause it to be executed.&lt;br /&gt;
| App: 3.3.2.&lt;br /&gt;
| System: [[11.0.0-33]].&lt;br /&gt;
| July 20, 2016&lt;br /&gt;
| Around June 26, 2016&lt;br /&gt;
| slackerSnail, 12Me12, incvoid&lt;br /&gt;
Exploited by MrNbaYoh and [[User:Plutooo|plutoo]].&lt;br /&gt;
|-&lt;br /&gt;
| SmileBASIC 3.x&lt;br /&gt;
| Subscripted TIME$/DATE$ allow write access to DATA/BSS&lt;br /&gt;
| Utf-16 characters can be assigned to subscripted TIME$/DATE$ interpreter sysvars which results in write-only access to all of DATA and some BSS in userland.&lt;br /&gt;
TIME$[0]/DATE$[0] actually point to somewhere in rodata, and an overly large subscript can be used to write well past it and into the aforementioned areas. Demo [https://github.com/zoogie/smilehax-IIe here.]&lt;br /&gt;
| App: 3.6.2 (3.6.0 latest for US/EU, JP appvers. can be downgraded)&lt;br /&gt;
| System: [[11.13.0-45]].&lt;br /&gt;
| April 2020&lt;br /&gt;
| February 2020&lt;br /&gt;
| bug publicly documented [https://translate.google.com/translate?sl=auto&amp;amp;tl=en&amp;amp;u=http%3A%2F%2Fsmilebasic.com%2Fdebug%2Farchive%2F here.]&lt;br /&gt;
Exploited by Zoogie&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Tri Force Heroes&lt;br /&gt;
| [[3DS_System_Flaws#General.2FCTRSDK|CTRSDK]] CTPK buffer overflow combined with game&#039;s usage of SpotPass&lt;br /&gt;
| During the very first screen displayed by the game during boot(&amp;quot;Loading...&amp;quot;), just seconds after title launch, the game loads CTPK from the [[BOSS_Services|stored]] SpotPass content. Hence, this game could be exploited via the vulnerable CTRSDK CTPK code &#039;&#039;if&#039;&#039; one could get custom SpotPass data into extdata somehow(ctr-httpwn &amp;gt;=v1.2 with bosshaxx allows this).&lt;br /&gt;
&lt;br /&gt;
The code for this runs from a thread separate from the main-thread, with the stack in linearmem heap. This SpotPass handling triggers before the game ever opens the regular savedata archive. The extdata is opened at some point before this: it opens a file for checking if it exists, then immediately closes it.&lt;br /&gt;
&lt;br /&gt;
The two SpotPass URLs for this have always(?) returned HTTP 404 as of November 2016. It appears these were intended for use as textures for additional costumes(and never got used publicly), but this wasn&#039;t tested.&lt;br /&gt;
&lt;br /&gt;
This is used by [https://github.com/yellows8/ctpkpwn ctpkpwn_tfh].&lt;br /&gt;
| None&lt;br /&gt;
| App: v2.1.0&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| November 14, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pixel Paint&lt;br /&gt;
| Buffer overflow via unchecked extdata file length&lt;br /&gt;
| Pixel Paint loads pictures saved by the user from extdatas. The file is read to a fixed size buffer but the file length remains unchecked, so with a large enough file, one can overwrite pointers in memory and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| November 5, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Steel Diver : Sub Wars&lt;br /&gt;
| Heap overflow / arbitrary memcpy&lt;br /&gt;
| Savefile datas are stored as key/value pairs, a large enough string key makes the game overwrite a memcpy source/destination addresses and size arguments. So one can actually memcpy a rop on the stack and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around July 15, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]], Vegaroxas&lt;br /&gt;
|-&lt;br /&gt;
| 1001 Spikes&lt;br /&gt;
| Buffer overflow via unchecked array-indexes in XML savefile parsing&lt;br /&gt;
| The savefiles are stored as renamed .xml files, which contain several tags with attributes like &#039;array-index=&amp;quot;array-value&amp;quot;&#039;, where both of these are converted from ASCII strings to integers as signed-int32, and the array-value given blindly written to an array inside a structure using the (unchecked) index given. With several of these attributes, one can overwrite the stack starting from the stored lr of the function that does this parsing, and write a ROP chain there. Testing used the &amp;quot;LevelAttempts&amp;quot; tag which is the last such tag parsed in that function.&lt;br /&gt;
| None&lt;br /&gt;
| App: v1.2.0 (TMD v2096)&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around November 2, 2016&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| Secret base team name heap overflow&lt;br /&gt;
| When the player wants to edit the team name, it is copied over the heap, however its length is not verified. So with a large enough team name one can overwrite some pointers and get two arbitrary jumps and then get control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.2.0-35]].&lt;br /&gt;
| December 30, 2016&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Swapdoodle&lt;br /&gt;
| Heap buffer overflow via unchecked size&lt;br /&gt;
| The letter file format used by doodlebomb is composed of multiple chunks. Each chunks is described in the header of the file where the name, size and CRC of each chunk are stored. Some chunks are meant to be headers, every header&#039;s size should be 0x80, however the length of the STAHED1 chunk remains unchecked and the game memcpy the chunk to a 0x80 byte buffer with the length provided in the file. This way one is able to overwrite some pointers and get control of the execution flow.&lt;br /&gt;
| App: &amp;gt; v1.1.1&lt;br /&gt;
| App: v1.1.1&lt;br /&gt;
| April 24, 2017&lt;br /&gt;
| February, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Picross&lt;br /&gt;
| Arbitrary memcpy via unchecked size&lt;br /&gt;
| When reading the savefile, the game handles some lists of buffers that are copied to memory. These buffers should always be 0x14-bytes long but the game uses the size provided in the savefile to copy them. These buffers are copied in some structs and thus with a big enough length value, one can overwrite the next struct which contains a size and a destination address for a memcpy.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| May 29, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow on .bss section&lt;br /&gt;
| When loading a project, the game copies multiple chunks over the BSS section. However the number of chunks to copy is not checked, thus a large amount of chunk result in a buffer overflow. There&#039;s multiple way to exploit this flaw to gain an arbitrary memcpy or an arbitrary jump.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 28, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow via unchecked file size&lt;br /&gt;
| When loading a project, the game loads the file to a 0x200000 bytes long buffer. However the size remains unchecked, so with a big enough file one can overflow the buffer and overwrite a thread stack and then achieve ROP.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 29, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]], [[User: ChampionLeake|ChampionLeake]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| PSS data heap/stack overflow&lt;br /&gt;
| When launching the game, multiple chunks from the save file are parsed and copied to a large heap buffer. When parsing PSS data (acquaintances, passerby) the game copies each entry to the heap buffer, the number of entries to copy is read from the end of the multiple pss data chunks and is not checked, leading to an overflow. The &amp;quot;PSS data - friends&amp;quot; chunk is vulnerable too, but the overflow occurs on the stack and unfortunately this isn&#039;t exploitable because of a 4 bytes uncontrolled value (in each entry) that gets written on sensitive data.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.6.0]].&lt;br /&gt;
| October 1, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| OOB write&lt;br /&gt;
| When handling events in a map, the indices of &amp;quot;buttons&amp;quot; are not checked. This results in an out of bound bit write, one can thus write a rop directly on the stack (bit by bit).&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 5, 2018&lt;br /&gt;
| &lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Unholy Heights&lt;br /&gt;
| Buffer overflow via unchecked string size&lt;br /&gt;
| The game stores some utf-16 messages in the savefile. Right before the message is the length(u32) for the string, the game uses this size to memcpy the message from the savefile to the stack without checking the length. This allows one to overwrite some function addresses on the stack and form a rop chain.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial Version&lt;br /&gt;
| September 13, 2018&lt;br /&gt;
| August, 2018&lt;br /&gt;
| Kartik&lt;br /&gt;
|-&lt;br /&gt;
| Mononoke Forest&lt;br /&gt;
| String Buffer Overflow via unchecked string length&lt;br /&gt;
| The game stores plaintext profile names in the savefile. The profile names are strcpy/memcpy to different areas of the game&#039;s functions in the stack. Using a large extensive profile name, a user can overwrite some stack-registers and point to stack buffer addresses to eventually gain control of the stack to lead and form a rop-chain. &lt;br /&gt;
| None&lt;br /&gt;
| App: v1.0.0&lt;br /&gt;
| August 14, 2019&lt;br /&gt;
| February 8, 2019&lt;br /&gt;
| [[User: ChampionLeake|ChampionLeake]] and [[User: Kartik|Kartik]]&lt;br /&gt;
|-&lt;br /&gt;
| Picross 3D: Round 2&lt;br /&gt;
| Out of bounds array access allowing to point to fabricated objects and vtable&lt;br /&gt;
| Game only checks save header. With the last interacted save slot index at +0xb270 in the save data unchecked we can achieve a predictable out of bounds access, as well inserting ROP data without detecting save corruption. Game references an object from an array of 3 elements and passes it to a function that will read object pointers and hit a vtable call. With a copy save data left in memory and a properly calculated index, we can point to a fake object position in the save, vtable jump to a stack pivot and start the ROP chain.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version&lt;br /&gt;
| September 10, 2020&lt;br /&gt;
| August 24, 2020&lt;br /&gt;
| [[User: Luigoalma|Luigoalma]] and [[User: Kartik|Kartik]]&lt;br /&gt;
|-&lt;br /&gt;
| Me and My Pets 3D&lt;br /&gt;
| String buffer overflow&lt;br /&gt;
| The game stores some strings in the savegame. Using a large enough string, once can overwrite addresses on the stack and form a ropchain.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial Version&lt;br /&gt;
| June 24, 2022&lt;br /&gt;
| June 12, 2022&lt;br /&gt;
| [[User: Kartik|Kartik]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Flipnote Studio 3D==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Flaw discovered by&lt;br /&gt;
|-&lt;br /&gt;
| KFH frame count overflow&lt;br /&gt;
| The KFH frame count field should not be &amp;gt;= 0x3E8, but it wasn&#039;t checked and so uncontrolled data were written over pointers, causing an unexploitable crash.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI paper color overflow&lt;br /&gt;
| Paper color field (and similar color fields) in KMI chunks was not checked, a too high value caused a jump to an uncontrolled location.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KSN BGM data size overflow&lt;br /&gt;
| The size of the BGM data in the KSN chunk was not checked, it was used in a memcpy so with a big enough size one could overwrite a thread stack on linear mem and achieve ROP (notehax v1).&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMC chunk unchecked&lt;br /&gt;
| The KMC chunk was not verified at all, the CRC32 and the size were not checked. A big enough size caused an integer overflow and made the game read the file backward.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI layer size unchecked&lt;br /&gt;
| The 3 layer size fields in KMI chunks were not checked, leading to some crashes in the editor.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Bad &amp;quot;queue&amp;quot; implementation&lt;br /&gt;
| When a KWZ was parsed, frames were copied in a kind of queue, bounds were not checked obviously, so with the KMI layer size flaw one was able to fill completely the queue, then write past the buffer and overwrite a heap chunk header (notehax v2). This is not possible anymore, the queue cannot be filled because layer sizes are checked. Moreover each time an element is removed from the queue, the whole content is memmoved *facepalm*.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Useless crashes / applications which were fuzzed==&lt;br /&gt;
* Pushmo (3DSWare), QR codes: level name is properly limited to 16 characters, game doesn&#039;t crash with a longer name. The only possible crashes are triggered by out-of-bounds array index values, these crashes are not exploitable due to the index value being 8bit.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids 2 (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/yellows8/mm3d_re The Legend of Zelda: Majora&#039;s Mask 3D]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;The Legend of Zelda: A Link Between Worlds&amp;quot; and &amp;quot;The Legend of Zelda: Tri Force Heroes&amp;quot;: these games don&#039;t crash at all when the entire save-file(minus constant header data) is overwritten with /dev/random output / 0xFF-bytes. All of the CRC32s were updated for this of course.  Note that this refers to the regular save file: Tri Force Heroes can be exploited via BOSS extdata - see above.&lt;br /&gt;
&lt;br /&gt;
* Pokemon Mystery Dungeon: Gates to Infinity has the same unchecked file bounds as Pokemon Super Mystery Dungeon, however since save compression was introduced in Pokemon Super Mystery Dungeon, it only allocates one buffer within the application heap instead of several within the linear heap, resulting in nothing to corrupt or overwrite even if the file&#039;s length is extended past its allocation.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Kid Icarus: Uprising&amp;quot;: Overwriting the entire savedata results in various crashes, nothing useful.&lt;br /&gt;
&lt;br /&gt;
* Savedata/extdata for &amp;quot;Super Smash Bros 3DS&amp;quot;: Overwriting the various files stored under savedata/extdata results in useless crashes.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;StarFox 64 3D&amp;quot;: Doesn&#039;t crash at all with the entire savedata overwritten.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Frogger 3D&amp;quot;: Overwriting a savefile with random-data results in *nothing* crashing.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Mutant Mudds&amp;quot;: Overwriting the savefile with random data results in a crash&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Worcle Worlds&amp;quot;: Overwriting the savefile with 0xFF results in a crash due to an out of bound read&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Animal Crossing: New Leaf&amp;quot;: Creating a QR code from random data results in a valid QR code and a random design. In some very rare cases(which aren&#039;t always reproducible?) a crash/etc may occur, but this isn&#039;t known to be useful.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Angry Birds Star Wars&amp;quot;: Strings in the savefile are preceded by their lengths. These strings are never stored on the stack and are memcpy&#039;d into heap memory. If the size is invalid the alloc will fail and thus the memcpy will operate on a nullptr resulting in a useless data abort.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Gem Smashers&amp;quot;: Overwriting the savefile with random bytes results in useless crashes.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Luxor:&amp;quot; Strings/plaintext in the savefile are present and these&#039;s no checks. Overwriting the whole save (excluding the header), with /dev/random cause a useless crash.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Luv Me Buddies Wonderland:&amp;quot; Doesn&#039;t crash at all with the entire savedata overwritten. Overwriting some areas, points to useless nulls&lt;br /&gt;
&lt;br /&gt;
==Crashes needing investigation==&lt;br /&gt;
* Disney Infinity crashes when all savedata overwritten with /dev/urandom. No checksums. 0xFF bytes don&#039;t cause a crash.&lt;br /&gt;
&lt;br /&gt;
* Football Up Online / Soccer Up Online and Football Up 3D / Soccer Up 3D crash when teamname(UTF-16) length = 0x48 AND 0x20 null bytes are removed after just the name or if teamname length is way longer than 0x48.&lt;br /&gt;
&lt;br /&gt;
=System applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| 3DS [[System Settings]] DS profile string stack-smash&lt;br /&gt;
| Too long or corrupted strings (01Ah  2   Nickname length in characters     050h  2   Message length in characters) in the NVRAM DS user settings (System Settings-&amp;gt;Other Settings-&amp;gt;Profile-&amp;gt;Nintendo DS Profile) cause it to crash in 3DS-mode due to a stack-smash. The DSi is not vulnerable to this, DSi launcher(menu) and DSi System Settings will reset the NVRAM user-settings if the length field values are too long(same result as when the CRCs are invalid). TWL_FIRM also resets the NVRAM user-settings when the string-length(s) are too long.&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| 2012&lt;br /&gt;
| [[User:Ichfly|Ichfly]]&lt;br /&gt;
|-&lt;br /&gt;
| 3DS [[System Settings]] stack smash via title strings in [[DSiWare_Exports]]&lt;br /&gt;
| DSiWare export banners contain 16 consecutive 0x100 byte, utf-16 game title strings for different languages. Nintendo correctly limits the string&#039;s max length by placing a NULL at str[127] before it&#039;s copied to the stack. However, they didn&#039;t allocate enough space for all 128 wchars (char/wchar type confusion?), so an attacker can craft a valid full-length string that will crash the stack at about str+0xEC. ROP execution can then be obtained from this crash in DSiWare Data Management as demonstrated [https://github.com/zoogie/Bannerbomb3 here].&lt;br /&gt;
&lt;br /&gt;
Interesting note: A line feed wchar (00 0A) at any point in the string before the crash offset will prevent the crash from occurring.&lt;br /&gt;
| None&lt;br /&gt;
| [[11.13.0-45]]&lt;br /&gt;
| Dec. 2018&lt;br /&gt;
| Zoogie&lt;br /&gt;
|-&lt;br /&gt;
| 3DS SAFE_MODE [https://www.3dbrew.org/wiki/System_Settings#System_Updater System Updater] stack smash from proxy-url string&lt;br /&gt;
| During [[Recovery Mode]] and after all 3 wifi slots fail to find an access point for sysupdate, a user is permitted to access the wifi settings mode to make changes. Here, if the proxy-url field string&#039;s NULL terminator had been altered beforehand, a stack smash can occur when the user selects Proxy Settings -&amp;gt; Detailed Setup and the corrupted url string is displayed.&lt;br /&gt;
&lt;br /&gt;
This is a difficult crash to control because the url string is converted from ascii to utf-16 between the slot and stack, effectively reducing the available gadgets to 0.4% of the normal amount. It&#039;s possible to improvise an &amp;quot;escape&amp;quot; using an eoreq pc w/shift gadget to combine registers and form a jump that can access 1/2 of all available gadgets.&lt;br /&gt;
&lt;br /&gt;
Because this exploit runs *under* SAFE_MODE, it&#039;s possible to run safehax with one&#039;s choice of k11 and arm9 hax. Prerequisite: a userland exploit with cfg:s/i access to modify the wifi slot. A demonstration can be viewed [https://github.com/zoogie/unSAFE_MODE here].&lt;br /&gt;
| None&lt;br /&gt;
| [[11.13.0-45]]&lt;br /&gt;
| Jan. 2020&lt;br /&gt;
| Zoogie&lt;br /&gt;
|-&lt;br /&gt;
| [[Nintendo 3DS Sound]]&lt;br /&gt;
| When a .m4a is loaded, the song name is copied to a 256 byte buffer. When the song name begins with a Unicode BOM marker, it memcpy&#039;s the tag using the user-provided length. This gives an arbitrary write which can be used to achieve ROP.&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| June/July 2016&lt;br /&gt;
| [[User:nedwill|nedwill]]&lt;br /&gt;
|-&lt;br /&gt;
| [[EShop]]&lt;br /&gt;
| When creating an audio decoder object for the moflex movie player, if the audio codec is PCM16, the application uses an uninitialized value as a pointer. One can spray the heap to get control of that pointer and achieve ROP.&lt;br /&gt;
| None&lt;br /&gt;
| [[11.14.0-46]]&lt;br /&gt;
| 2020&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=System applets=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Webkit/web-browser bugs&lt;br /&gt;
| spider has had at least three different code-execution exploits. Majority of them are use-after-free issues. See also [[browserhax|here]].&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 2013?&lt;br /&gt;
|&lt;br /&gt;
| A lot of people.&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS/New3DS [[Internet_Browser|Browser-version-check]] bypass&lt;br /&gt;
| When the browser-version-check code runs where the savedata for it was never initialized(such as when the user used the &amp;quot;Initialize savedata&amp;quot; option), it will use base_timestamp=0 instead of the timestamp loaded from savedata. This is then used with &amp;quot;if(cur_timestamp - base_timestamp &amp;gt;= &amp;lt;24h timestamp&amp;gt;){Run browser-version-check HTTPS request code}&amp;quot;.&lt;br /&gt;
Hence, if the savedata was just initialized, and if the system datetime is set to before January 2, 2000, the browser-version-check will be skipped. This includes January 1, 2000, 00:00, because that&#039;s the epoch(timestamp value 0x0) used with this timestamp.&lt;br /&gt;
&lt;br /&gt;
See [http://yls8.mtheall.com/3dsbrowserhax.php here] for bypass usage instructions.&lt;br /&gt;
&lt;br /&gt;
This was fixed with [[10.7.0-32|10.7.0-32]], see [[Internet_Browser|here]] for details.&lt;br /&gt;
| [[10.7.0-32|10.7.0-32]]&lt;br /&gt;
| &lt;br /&gt;
| [[9.9.0-26|9.9.0-26]]&lt;br /&gt;
| February 25, 2016&lt;br /&gt;
| November 2, 2015 (Exactly one week after the browser version pages were initially updated server-side)&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Skater - Bookmark OOB write&lt;br /&gt;
| Each bookmark has an id that should not exceed 0x63 (99), however ids are not checked, this results in an OOB write on the stack, but only the value 0x01 can be written.&lt;br /&gt;
| &lt;br /&gt;
| [[11.6.0-39|11.6.0-39]]&lt;br /&gt;
| &lt;br /&gt;
| May 21, 2018&lt;br /&gt;
| May 20, 2018&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| MicroSD Management - malformed security blob causes stack buffer overflow (mhax) &lt;br /&gt;
| The MicroSD Management application&#039;s parsing of Windows NTLM security blobs in the SMB/CIFS protocol doesn&#039;t verify that the client&#039;s specified NT domain name is less than 32 UTF-16 characters.  When it&#039;s longer, a stack buffer overrun occurs, leading to a ROP chain and complete control of the mcopy application.&lt;br /&gt;
&lt;br /&gt;
The malformed security blob can be sent by an attacker within the SMB_COM_SESSION_SETUP_ANDX (0x73) packet.&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[9.0.0-20|9.0.0-20]]&lt;br /&gt;
| August 12, 2018&lt;br /&gt;
| 2018&lt;br /&gt;
| smea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Home Menu==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| u8 brightness setting OOB index (menuhax67)&lt;br /&gt;
| Config block 0x50001, which contains a u8 brightness setting that indexes a table of u32 addresses, can be set to an out-of-bounds index (it&#039;s normally 1-5). Located within cfg block 0x50009, there exists a single controllable u32 that&#039;s located within the u8&#039;s range. With these set properly, one can eventually redirect a function pointer to an address of their choice. This is triggered after the Home Menu quick launch tab is activated. POC [https://github.com/zoogie/menuhax67 here].&lt;br /&gt;
| None&lt;br /&gt;
| [[11.13.0-45]]&lt;br /&gt;
| &lt;br /&gt;
| October 4, 2020&lt;br /&gt;
| September, 2020&lt;br /&gt;
| Zoogie&lt;br /&gt;
|-&lt;br /&gt;
| bossbannerhax&lt;br /&gt;
| After successfully loading [[Extended_Banner|extended-banner]] data(done when selecting an icon), Home Menu attempts to load &amp;quot;[[CBMD]]&amp;quot; data into a 0x100000-byte heap buffer from the [[BOSS_Services|stored]] SpotPass content. When successful and the magic-number is CBMD, Home Menu then decompresses the exbanner sections into another fixed-size heap buffer, without checking the outsize at all. The main CBMD CGFX code with ExeFS checks the size, but this code doesn&#039;t(however this is exbanner &amp;quot;CBMD&amp;quot;, not a &amp;quot;normal&amp;quot; CBMD).&lt;br /&gt;
&lt;br /&gt;
Used with menuhax as of v3.2.&lt;br /&gt;
| [[11.3.0-36|11.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[1.0.0-0|1.0.0-0]]&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| December 23, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| sdiconhax&lt;br /&gt;
| This is basically the same as nandiconhax, the vulnerable SD/NAND functions are &#039;&#039;identical&#039;&#039; minus the file-buffer offsets. Exploitation is different due to different heap-buffer location though. Unlike nandiconhax, the icon buffer for SD is located in linearmem(with recent Home Menu versions at least). This is used by [[menuhax]].&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| July 27, 2016&lt;br /&gt;
| October 23, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| [[System_SaveData|NAND-savedata]] Launcher.dat icons (nandiconhax)&lt;br /&gt;
| The homemenu code processing the titleid list @ launcherdat+8 copies those titleIDs to another buffer, where the offset relative to that buffer is calculated using the corresponding s8/s16 entries. Those two values are not range checked at all. Hence, one can use this to write u64(s) with arbitrary values to before/after this allocated output buffer. See [[Home_Menu|here]] regarding Launcher.dat structure.&lt;br /&gt;
&lt;br /&gt;
This can be exploited(with Launcher.dat loading at startup at least) by using a s16 for the icon entry with value 0xFFEC(-20)(and perhaps more icons with similar s16 values to write multiple u64s). The result is that the u64 value is written to outbuf-0xA0, which overwrites object+0(vtable) and object+4(doesn&#039;t matter here) for an object that gets used a bit after the vulnerable function triggers. The low 32bits of the u64 can then be set to the address of controlled memory(either outbuf in regular heap or the entire launcherdat buffer in linearmem), for use as a fake vtable in order to get control of PC. From there one can begin ROP via vtable funcptrs to do a stack-pivot(r4=objectaddr at the time the above object gets used).&lt;br /&gt;
&lt;br /&gt;
Originally this vuln could only be triggered via Launcher.dat at Home Menu startup, right after Launcher.dat gets loaded + memory gets allocated, once the file-format version code is finished running. Starting with v9.6 this can be triggered when loading layouts from SD extdata as well. The vuln itself triggers before the layout data is written to Launcher.dat, but it doesn&#039;t seem to be possible to overwrite anything which actually gets used before the function which writes Launcher.dat into the layout gets called.&lt;br /&gt;
&lt;br /&gt;
Home Menu has some sort of fail-safe system(or at least on v9.7) when Home Menu crashes due to Launcher.dat(this also applies for other things with Home Menu): after crashing once, Home Menu resets Launcher.dat to a state where it no longer crashes anymore. However, note that any exploits using this which hang/etc without crashing will still brick the system. &#039;&#039;&#039;Hence, attempting anything with this on physnand without hw-nand-access isn&#039;t really recommended.&#039;&#039;&#039;&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| May 14, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Theme-data decompression buffer overflow ([[menuhax|themehax]])&lt;br /&gt;
| The only func-call size parameter used by the theme decompression function is one for the compressed size, none for the decompressed size. The decompressed-size value from the LZ header is used by this function to check when to stop decompressing, but this function itself has nothing to verify the decompressed_size with. The code calling this function does not check or even use the decompressed size from the header either.&lt;br /&gt;
&lt;br /&gt;
This function is separate from the rest of the Home Menu code: the function used for decompressing themes is *only* used for decompressing themes, nothing else. There&#039;s a separate decompression function in Home Menu used for decompressing everything else.&lt;br /&gt;
&lt;br /&gt;
That other decompression function in Home Menu handles decompression size properly(decompressed size check for max buffer size is done by code calling the other function, not in the function itself). Unlike the other function, the theme function supports multiple LZ algorithms, but the one which actually gets used in official themes is the same one supported by the other function anyway.&lt;br /&gt;
&lt;br /&gt;
See also [[menuhax|here]].&lt;br /&gt;
&lt;br /&gt;
With [[10.2.0-28|10.2.0-X]] Home Menu, the only code change was that the following was added right after theme-load and before actual decompression: &amp;quot;if(&amp;lt;get_lzheader_decompressed_size&amp;gt;(compressed_buf) &amp;gt; 0x150000)&amp;lt;exit&amp;gt;;&amp;quot;. This fixed the vuln.&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| &amp;lt;Old3DS/New3DS version which added initial theme support&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| December 22, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]], [[User:Myria|Myria]] independently (~spring 2015)&lt;br /&gt;
|-&lt;br /&gt;
| Shuffle body-data buffer overflow ([[menuhax|shufflehax]])&lt;br /&gt;
| See [[menuhax|here]].&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[9.3.0-21|9.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| January 3, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Extdata file-data loading buffer overflow&lt;br /&gt;
| The extdata file-reading code allocates a fixed-size heap buffer for the expected filesize, then reads the filedata into this buffer using the actual FS filesize. Before v5.0 the filesize used here wasn&#039;t validated, hence if the filesize is larger than alloc_size a buffer overflow would occur. &#039;&#039;After&#039;&#039; doing the file-read it does validate that the actual_readsize matches the alloc_size, but at this point the buffer overflow has already occurred.&lt;br /&gt;
&lt;br /&gt;
This affected at least the following: SaveData.dat and Cache.dat.&lt;br /&gt;
&lt;br /&gt;
This can be triggered with SaveData.dat by installing a &amp;lt;v4.0 Home Menu version, with Home Menu extdata from &amp;gt;=v4.0 still on SD. When this is done with v2.0 Home Menu, a kernelpanic occurs when processing an AM command(it appears a buffer ptr which is then passed to a command was overwritten with 0x0 - of course other SaveData.dat filesizes may result in different behaviour).&lt;br /&gt;
| [[5.0.0-11|5.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[2.0.0-2|2.0.0-X]]&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The icon data arrays used with {sd/nand}iconhax were added to SaveData.dat/Launcher.dat with [[4.0.0-7|4.0.0-X]], hence the vulnerable functions were added with that same version.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;=v4.0 the SaveData.dat buffer is located in the regular heap. It&#039;s unknown when exactly it was moved to linearmem, which is where it&#039;s located with recent versions. It&#039;s located in linearmem for KOR &amp;gt;=v9.6 for example.&lt;br /&gt;
&lt;br /&gt;
The SaveData.dat/Launcher.dat icon vulns were fixed by doing various unsigned &amp;gt;=60/&amp;gt;=360 checks on the loaded values. When these checks fail, it just skips over handling this icon entry. Hence, the original value can&#039;t be negative / out-of-bounds any more.&lt;br /&gt;
&lt;br /&gt;
==Useless crashes==&lt;br /&gt;
Old3DS system web-browser:&lt;br /&gt;
* 2^32 characters long string(&#039;&#039;finally&#039;&#039; fixed with v10.6): this is similar to the vulnerability fixed [http://git.chromium.org/gitweb/?p=external/Webkit.git;a=commitdiff;h=ec471f16fbd1f879cb631f9b022fd16acd75f4d4 here], concat-large-strings-crash2.html triggers a crash which is about the same as the one triggered by a 2^32 string. Most of the time this vulnerability will cause a memory page permissions fault, since the WebKit code attempts to copy the string text data to the output buffer located in read-only [[CRO0|CRO]] heap memory. The only difference between a crash triggered by a 2^32 string and the concat-large-strings-crash2.html crash is at the former copies the string data using the original string length(like 1 text character for &amp;quot;x&amp;quot;, 4 for &amp;quot;xxxx&amp;quot;) while the latter attempts to copy &amp;gt;12MB. In some &#039;&#039;very&#039;&#039; rare cases a thread separate from the string data-copy thread will crash, this might be exploitable. However, this is mostly useless since it rarely crashes this way.&lt;br /&gt;
&lt;br /&gt;
* Trying to directly load a page via the browser &amp;quot;URL&amp;quot; option with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] setup, causes a crash to trigger in oss.cro due to an use-after-free being caught with webkitdebug. This is presumably some sort of realloc() issue in the libcurl version used by the &amp;lt;={v10.2-v10.3} browser. This happens with *every* *single* *page* one tries to load via the &amp;quot;URL&amp;quot; option, but not when loading links on the current page, hence this is probably useless. A different use-after-free with realloc triggers with loading any page at all regardless of method too(libcurl probably).&lt;br /&gt;
&lt;br /&gt;
* This WebKit build has &#039;&#039;a lot&#039;&#039; of crash-trigger bugs that only happen with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] completely setup(addr accesses near 0x0), with &#039;&#039;just&#039;&#039; trying to load any page at all.&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=I2C_Registers&amp;diff=21519</id>
		<title>I2C Registers</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=I2C_Registers&amp;diff=21519"/>
		<updated>2021-05-06T10:17:37Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* I2C Devices */ devid 9 is not debug gyroscope and exists on retail devices&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Registers =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Old3DS&lt;br /&gt;
!  Name&lt;br /&gt;
!  Address&lt;br /&gt;
!  Width&lt;br /&gt;
!  Used by&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C1_DATA&lt;br /&gt;
| 0x10161000&lt;br /&gt;
| 1&lt;br /&gt;
| I2C bus 1 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| [[#I2C_CNT|I2C1_CNT]]&lt;br /&gt;
| 0x10161001&lt;br /&gt;
| 1&lt;br /&gt;
| I2C bus 1 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C1_CNTEX&lt;br /&gt;
| 0x10161002&lt;br /&gt;
| 2&lt;br /&gt;
| I2C bus 1 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C1_SCL&lt;br /&gt;
| 0x10161004&lt;br /&gt;
| 2&lt;br /&gt;
| I2C bus 1 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C2_DATA&lt;br /&gt;
| 0x10144000&lt;br /&gt;
| 1&lt;br /&gt;
| I2C bus 2 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| [[#I2C_CNT|I2C2_CNT]]&lt;br /&gt;
| 0x10144001&lt;br /&gt;
| 1&lt;br /&gt;
| I2C bus 2 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C2_CNTEX&lt;br /&gt;
| 0x10144002&lt;br /&gt;
| 2&lt;br /&gt;
| I2C bus 2 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C2_SCL&lt;br /&gt;
| 0x10144004&lt;br /&gt;
| 2&lt;br /&gt;
| I2C bus 2 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C3_DATA&lt;br /&gt;
| 0x10148000&lt;br /&gt;
| 1&lt;br /&gt;
| I2C bus 3 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| [[#I2C_CNT|I2C3_CNT]]&lt;br /&gt;
| 0x10148001&lt;br /&gt;
| 1&lt;br /&gt;
| I2C bus 3 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C3_CNTEX&lt;br /&gt;
| 0x10148002&lt;br /&gt;
| 2&lt;br /&gt;
| I2C bus 3 devices&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| I2C3_SCL&lt;br /&gt;
| 0x10148004&lt;br /&gt;
| 2&lt;br /&gt;
| I2C bus 3 devices&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== I2C_CNT ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  BIT&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Stop (0=No, 1=Stop/last byte)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Start (0=No, 1=Start/first byte)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Pause (0=Transfer Data, 1=Pause after Error, used with/after Stop)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Ack Flag         (0=Error, 1=Okay)  (For DataRead: W, for DataWrite: R)&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Data Direction   (0=Write, 1=Read)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Interrupt Enable (0=Disable, 1=Enable)&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Start/busy       (0=Ready, 1=Start/busy)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== I2C_CNTEX ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  BIT&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0-1&lt;br /&gt;
| ? Set to 2 normally.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== I2C_SCL ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  BIT&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0-5&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 8-12&lt;br /&gt;
| ? Set to 5 normally.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I2C Devices =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!   [[I2C_Registers|Device id]]&lt;br /&gt;
!   Device bus id&lt;br /&gt;
!   Device Write Address&lt;br /&gt;
!   Accessible via I2C [[I2C_Services|service]]&lt;br /&gt;
!   Device description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0x4a&lt;br /&gt;
| &amp;quot;i2c::MCU&amp;quot;&lt;br /&gt;
| Power management?(same device addr as the DSi power-management)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0x7a&lt;br /&gt;
| &amp;quot;i2c::CAM&amp;quot;&lt;br /&gt;
| Camera0?(same dev-addr as DSi cam0)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 0x78&lt;br /&gt;
| &amp;quot;i2c::CAM&amp;quot;&lt;br /&gt;
| Camera1?(same dev-addr as DSi cam1)&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 0x4a&lt;br /&gt;
| &amp;quot;i2c::MCU&amp;quot;&lt;br /&gt;
| MCU&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 0x78&lt;br /&gt;
| &amp;quot;i2c::CAM&amp;quot;&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 2&lt;br /&gt;
| 0x2c&lt;br /&gt;
| &amp;quot;i2c::LCD&amp;quot;&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 2&lt;br /&gt;
| 0x2e&lt;br /&gt;
| &amp;quot;i2c::LCD&amp;quot;&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 2&lt;br /&gt;
| 0x40&lt;br /&gt;
| &amp;quot;i2c::DEB&amp;quot;&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 2&lt;br /&gt;
| 0x44&lt;br /&gt;
| &amp;quot;i2c::DEB&amp;quot;&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 3&lt;br /&gt;
| 0xa6&lt;br /&gt;
| &amp;quot;i2c::HID&amp;quot;&lt;br /&gt;
| Gyroscope. The device table in I2C-module had the device address changed from 0xA6 to 0xD6 with [[8.0.0-18]].&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 3&lt;br /&gt;
| 0xd0&lt;br /&gt;
| &amp;quot;i2c::HID&amp;quot;&lt;br /&gt;
| Gyroscope (old3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 3&lt;br /&gt;
| 0xd2&lt;br /&gt;
| &amp;quot;i2c::HID&amp;quot;&lt;br /&gt;
| Gyroscope (2DS, new3DSXL, new2DSXL)&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 3&lt;br /&gt;
| 0xa4&lt;br /&gt;
| &amp;quot;i2c::HID&amp;quot;&lt;br /&gt;
| DebugPad&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 3&lt;br /&gt;
| 0x9a&lt;br /&gt;
| &amp;quot;i2c::IR&amp;quot;&lt;br /&gt;
| IR&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 3&lt;br /&gt;
| 0xa0&lt;br /&gt;
| &amp;quot;i2c::EEP&amp;quot;&lt;br /&gt;
| HWCAL EEPROM ([[Hardware_calibration#Header|only present on dev units where SHA256 is used for HWCAL verification]])&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 2&lt;br /&gt;
| 0xee&lt;br /&gt;
| &amp;quot;i2c::NFC&amp;quot;&lt;br /&gt;
| New3DS-only [[NFC_Services|NFC]]&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 1&lt;br /&gt;
| 0x40&lt;br /&gt;
| &amp;quot;i2c::QTM&amp;quot;&lt;br /&gt;
| New3DS-only [[QTM_Services|QTM]]&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| 3&lt;br /&gt;
| 0x54&lt;br /&gt;
| &amp;quot;i2c::IR&amp;quot;&lt;br /&gt;
| Used by IR-module starting with [[8.0.0-18]], for New3DS-only HID via &amp;quot;ir:rst&amp;quot;. This deviceid doesn&#039;t seem to be supported by i2c module on [[8.0.0-18]](actual support was later added in New3DS i2c module).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notice&#039;&#039;&#039;: These device addresses are used for writing to the respective device, for reading bit0 must be set (see I2C protocol). Thus, the actual device address is &amp;gt;&amp;gt; 1.&lt;br /&gt;
&lt;br /&gt;
== Device 3 ==&lt;br /&gt;
  ro = read-only (writing is no-op)&lt;br /&gt;
  rw = read-write&lt;br /&gt;
  wo = write-only (reading will yield 00, FF, or unpredictable data)&lt;br /&gt;
&lt;br /&gt;
  d* = dynamic register (explaination below this table)&lt;br /&gt;
  s* = shared register (explaination below this table)&lt;br /&gt;
  ds = dynamic shared (explaination below this table)&lt;br /&gt;
&lt;br /&gt;
Reading or writing multiple bytes from/to single-byte registers increments the register ID along with it. For example reading two bytes from reg 0x00 reads regs 0x00 and 0x01.&lt;br /&gt;
&lt;br /&gt;
This is not the case for multibyte regs (0x29, 0x2D, 0x4F, 0x61 and 0x7F), plus reg 0x60.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  REGISTER&lt;br /&gt;
!  WIDTH&lt;br /&gt;
!  INFO&lt;br /&gt;
!  DESCRIPTION &lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Version high&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Version low&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| d&lt;br /&gt;
| rw&lt;br /&gt;
| For bit0 and 1 values, writing will mask away/&amp;quot;acknowledge&amp;quot; the event, set to 3 by mcuMainLoop on reset if reset source is Watchdog&lt;br /&gt;
  bit0: RTC clock value got reset to defaults&lt;br /&gt;
  bit1: Watchdog reset happened&lt;br /&gt;
  bit5: TWL MCU reg: volume mode (0: 8-step, 1: 32-step)&lt;br /&gt;
  bit6: TWL MCU reg: NTR (0) vs TWL mode (1)&lt;br /&gt;
  bit7: TWL MCU reg: Uses NAND&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| ds&lt;br /&gt;
| rw&lt;br /&gt;
| Top screen Vcom&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| ds&lt;br /&gt;
| rw&lt;br /&gt;
| Bottom screen Vcom&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
- 0x07&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Danger zone - [[MCU_Services#MCU_firmware_versions|MCU unlock sequence]] is written here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Raw 3D slider position&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Volume slider state (0x00 - 0x3F)&lt;br /&gt;
This is the same value returned by [[MCUHWC:GetSoundVolume|MCUHWC:GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Battery temperature (in Celcius?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Battery percentage&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Battery percentage, fractional part (seems to have a resolution of around 0.1% according to tests)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| System voltage&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Flags: bit7-5 are read via [[MCU_Services|mcu::GPU]]. The rest of them are read via [[MCU_Services|mcu::RTC]].&lt;br /&gt;
  bit01: ShellState&lt;br /&gt;
  bit03: AdapterState&lt;br /&gt;
  bit04: BatteryChargeState&lt;br /&gt;
  bit05: Bottom screen backlight on&lt;br /&gt;
  bit06: Top screen backlight on&lt;br /&gt;
  bit07: GPU on(?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
- 0x13&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Received interrupt bitmask, see register 0x18 for possible values  &lt;br /&gt;
If no interrupt was received this register is 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Unused and unwritable byte :(&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
- 0x17&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Unused and unreferenced free RAM! Good for userdata.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
- 0x1B&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Interrupt mask for register 0x10 (0=enabled,1=disabled)&lt;br /&gt;
  bit00: Power button press (for 27 &amp;quot;ticks&amp;quot;)&lt;br /&gt;
  bit01: Power button held (for 375 &amp;quot;ticks&amp;quot;; the 3DS turns off regardless after a fixed time)&lt;br /&gt;
  bit02: HOME button press (for 5 &amp;quot;ticks&amp;quot;)&lt;br /&gt;
  bit03: HOME button release&lt;br /&gt;
  bit04: WiFi switch button&lt;br /&gt;
  bit05: Shell close&lt;br /&gt;
  bit06: Shell open&lt;br /&gt;
  bit07: Fatal hardware condition([[Services#Notifications|?]]) (sent when the MCU gets reset by the Watchdog timer)&lt;br /&gt;
  bit08: Charger removed&lt;br /&gt;
  bit09: Charger plugged in&lt;br /&gt;
  bit10: RTC alarm (when some conditions are met it&#039;s sent when the current day and month and year matches the current RTC time)&lt;br /&gt;
  bit11: ??? (accelerometer related)&lt;br /&gt;
  bit12: HID update&lt;br /&gt;
  bit13: Battery percentage status change (triggered at 10%, 5%, and 0% while discharging)&lt;br /&gt;
  bit14: Battery stopped charging (independent of charger state)&lt;br /&gt;
  bit15: Battery started charging&lt;br /&gt;
Nonmaskable(?) interrupts&lt;br /&gt;
  bit16: ???&lt;br /&gt;
  bit17: ??? (opposite even for bit16)&lt;br /&gt;
  bit22: Volume slider position change&lt;br /&gt;
  bit23: ??? Register 0x0E update&lt;br /&gt;
  bit24: ??? (the off event for below bit)&lt;br /&gt;
  bit25: ??? (triggered when something related to the GPU is turned on, most likely backlight)&lt;br /&gt;
  bit26: ??? (???)&lt;br /&gt;
  bit27: ??? (???)&lt;br /&gt;
  bit28: ??? (???)&lt;br /&gt;
  bit29: ??? backlight on?&lt;br /&gt;
  bit30: bit set by mcu sysmodule&lt;br /&gt;
  bit31: bit set by mcu sysmodule&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
- 0x1F&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Unused and unreferenced free RAM! Good for userdata.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| d&lt;br /&gt;
| wo&lt;br /&gt;
| System power control:&lt;br /&gt;
  bit0: power off&lt;br /&gt;
  bit1: full reboot (unused). Discards things like [[CONFIG9_Registers#CFG9_BOOTENV|CFG9_BOOTENV]]&lt;br /&gt;
    - Asserts RESET1 via PMIC command (?) (deasserts nRESET1). This could be the reset that controls some CFG9 registers&lt;br /&gt;
    - Asserts RESET2 (P0.1 = 0, PM0.1 = 0 (output)) (deasserts nRESET2)&lt;br /&gt;
    - Asserts FCRAM_RESET (P3.0 = 0) (deasserts nFCRAM_RESET)&lt;br /&gt;
  bit2: normal reboot. Preserves [[CONFIG9_Registers#CFG9_BOOTENV|CFG9_BOOTENV]], etc.&lt;br /&gt;
    - Asserts RESET2 (P0.1 = 0, PM0.1 = 0)&lt;br /&gt;
    - If in NTR emulation mode (see reg 0x02), asserts FCRAM_RESET (P3.0 = 0)&lt;br /&gt;
    - Resets TWL MCU i2c registers&lt;br /&gt;
  bit3: FCRAM reset (present in by LgyBg. Unused because a system reboot does the same thing &amp;amp; a PDN reg also possibly implements this function)&lt;br /&gt;
    - Asserts FCRAM_RESET (P3.0 = 0)&lt;br /&gt;
  bit4: signal that sleep mode is about to be entered (used by PTM)&lt;br /&gt;
Bit 4 sets a bit at a RAM address which seems to control the watcdog timer state, then this bit is immediately unmasked. This field has a bitmask of 0x0F.&lt;br /&gt;
&lt;br /&gt;
If any of the reset bits is set, the MCU waits for 5ms, then deasserts RESET1 (via PMIC), RESET2 (PM0.1 = 1 (input)) and FCRAM_RESET (P3.0 = 1), and reinitializes some other various registers after a 100ms delay.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21&lt;br /&gt;
| d&lt;br /&gt;
| wo&lt;br /&gt;
| Used in legacy mode to signal events for TWL MCU &amp;quot;emulation&amp;quot; (written to REG[0x5D])? Software then asserts the TWL MCU IRQ pin via [[#LGY_GPIOEMU_MASK|Legacy I/O registers]].&lt;br /&gt;
  bit0: Signal TWL POWER button click&lt;br /&gt;
  bit1: Signal TWL reset&lt;br /&gt;
  bit2: Signal TWL power off&lt;br /&gt;
  bit3: Signal TWL battery low&lt;br /&gt;
  bit4: Signal TWL battery empty&lt;br /&gt;
  bit5: Signal TWL volume button click&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| d&lt;br /&gt;
| wo&lt;br /&gt;
| Used to set LCD states&lt;br /&gt;
  bit0: don&#039;t push to LCDs&lt;br /&gt;
  bit1: push to LCDs&lt;br /&gt;
  bit2: bottom screen backlight off&lt;br /&gt;
  bit3: bottom screen backlight on&lt;br /&gt;
  bit4: top screen backlight off&lt;br /&gt;
  bit5: top screen backlight on&lt;br /&gt;
&lt;br /&gt;
Bits 4 and 5 have no effect on a 2DS because the backlight source is the bottom screen.&lt;br /&gt;
The rest of the bits are masked away.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23&lt;br /&gt;
| d&lt;br /&gt;
| wo&lt;br /&gt;
| Writing 0x72 (&#039;r&#039;) resets the MCU, but this is stubbed on retail?&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Watchdog timer. This must be set *before* the timer is triggered, otherwise the old value is used. Value zero disables the watchdog.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x27&lt;br /&gt;
| sd&lt;br /&gt;
| rw&lt;br /&gt;
| Raw volume slider state&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Brightness of the WiFi/Power LED&lt;br /&gt;
|-&lt;br /&gt;
| 0x29&lt;br /&gt;
| sd(5)&lt;br /&gt;
| rw&lt;br /&gt;
| Power mode indicator state (read-write)&lt;br /&gt;
  1 = forced default blue&lt;br /&gt;
  2 = sleep mode animation&lt;br /&gt;
  3 = &amp;quot;power off&amp;quot; mode&lt;br /&gt;
  4 = disable blue power LED and turn on red power LED&lt;br /&gt;
  5 = disable red power LED and turn on blue power LED&lt;br /&gt;
  6 = animate blue power LED off and flash red power LED&lt;br /&gt;
  anything else = automatic mode&lt;br /&gt;
The other 4 bytes (32bits) affect the pattern of the red power LED (write only)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| WiFi LED state, non-0 value turns on the WiFi LED, 4 bits wide&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Camera LED state, 4bits wide,&lt;br /&gt;
  0, 3, 6-0xF = off&lt;br /&gt;
  1 = slowly blinking&lt;br /&gt;
  2 = constantly on&lt;br /&gt;
  3 = &amp;quot;TWL&amp;quot; mode&lt;br /&gt;
  4 = flash once&lt;br /&gt;
  5 = delay before changing to 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| 3D LED state, 4 bits wide&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D&lt;br /&gt;
| 0x64&lt;br /&gt;
| wo&lt;br /&gt;
| This is used for [[MCURTC:SetInfoLEDPattern|controlling]] the notification LED (see [[MCURTC:SetInfoLEDPatternHeader]] as well), when this register is written. It&#039;s possible to write data here with size less than 0x64, and only that portion of the pattern data will get overwritten. Reading from this register only returns zeroes, so it&#039;s considered write-only. Writing past the size of this register seems to do nothing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| This [[MCURTC:GetInfoLEDStatus|returns]] the notification LED status when read (1 means new cycle started)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F&lt;br /&gt;
| s&lt;br /&gt;
| wo?&lt;br /&gt;
| ??? The write function for this register is stubbed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
- 0x36&lt;br /&gt;
| ds&lt;br /&gt;
| rw&lt;br /&gt;
| 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 &amp;amp; 0xF) + (10 * (byte &amp;gt;&amp;gt; 4)).&lt;br /&gt;
  byte 0: seconds&lt;br /&gt;
  byte 1: minutes&lt;br /&gt;
  byte 2: hours&lt;br /&gt;
  byte 3: current week (unused)&lt;br /&gt;
  byte 4: days&lt;br /&gt;
  byte 5: months&lt;br /&gt;
  byte 6: years&lt;br /&gt;
|-&lt;br /&gt;
| 0x37&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| RTC time byte 7: leap year counter / &amp;quot;watch error correction&amp;quot; register (unused in code)&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
- 0x3C&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| RTC alarm registers&lt;br /&gt;
  byte 0: minutes&lt;br /&gt;
  byte 1: hours&lt;br /&gt;
  byte 2: day&lt;br /&gt;
  byte 3: month&lt;br /&gt;
  byte 4: year&lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Could be used on extremely old MCU_FIRM versions to upload [[MCU_Services#MCU_firmware_versions|MCU firmware]] if reg 0xF == 0 and reg 0x10 == 1 (presumably major and minor version fields for mcufw 0.1 which largely predates factory firm). &lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
0x3E&lt;br /&gt;
| ds&lt;br /&gt;
| ro&lt;br /&gt;
| RTC tick counter / &amp;quot;ITMC&amp;quot; (when resets to 0 the seconds increase)&lt;br /&gt;
Only reading 0x3D will update the in-RAM value&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| d&lt;br /&gt;
| wo&lt;br /&gt;
| 2 bits&lt;br /&gt;
  bit0: Asserts RESET1 (P0.0 = 0, PM0.0 = 0 (output)) but does NOT deassert it (wtf?). This seems to kill the entire SoC: is it because it doesn&#039;t deassert it, or does it not deassert it because the SoC hangs anyway? This is the pin that controls some security-critical regs like CFG9_BOOTENV!&lt;br /&gt;
  bit1: turns on a prohibited bit in an RTC Control register and turns P12 into an output&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Tilt sensor sampling mode. Bits 0 and 1 control the mode. If bits 0 or 1 are set then the tilt sensor is enabled and sampled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x41&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Index selector for register 0x44&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Unused?&lt;br /&gt;
|-&lt;br /&gt;
| 0x43&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Unused???, accelometer related&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| ???, pedoometer related(?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x45&lt;br /&gt;
- 0x4A&lt;br /&gt;
| s&lt;br /&gt;
| ro&lt;br /&gt;
| Tilt sensor 3D rotation from the 12bit ADC, left shifted 4 to fit in a 16bit signed short, relative to the 3DS bottom screen&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  AXIS&lt;br /&gt;
!  V=0x00&lt;br /&gt;
!  V=0x40&lt;br /&gt;
!  V=0xC0 &lt;br /&gt;
|-&lt;br /&gt;
| X (left/right)&lt;br /&gt;
| held up vertically&lt;br /&gt;
| rotated left 90° like a steering wheel&lt;br /&gt;
| rotated right 90° like a steering wheel&lt;br /&gt;
|-&lt;br /&gt;
| Y (forwards/backwards)&lt;br /&gt;
| laid flat on the desk with the screen facing up&lt;br /&gt;
| held up vertically&lt;br /&gt;
| held up vertically with screen facing upside-down&lt;br /&gt;
|-&lt;br /&gt;
| Z (???)&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| PedometerStepCount (for the current day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
0x4D&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E&lt;br /&gt;
| d&lt;br /&gt;
| rw&lt;br /&gt;
| ??? this = (0xFFE9E &amp;amp; 1) ? 0x10 : 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F&lt;br /&gt;
| d(6)&lt;br /&gt;
| ro&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x51&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x52&lt;br /&gt;
- 0x57&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Register-mapped ADC register&lt;br /&gt;
DSP volume slider 0% volume offset (setting this to 0xFF will esentially mute the DSP as it&#039;s the volume slider&#039;s maximum raw value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x59&lt;br /&gt;
| s&lt;br /&gt;
| rw&lt;br /&gt;
| Register-mapped ADC register&lt;br /&gt;
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)&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| s&lt;br /&gt;
| ro/rw&lt;br /&gt;
| Invalid, do not use! On newer MCU_FIRM versions this is unused, but on older MCU_FIRM versions this is a read-only counter.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5B&lt;br /&gt;
- 0x5F&lt;br /&gt;
| s&lt;br /&gt;
| - &lt;br /&gt;
| These registers are out of bounds (0xFFC00 and up), they don&#039;t exist, writing is no-op, reading will yield FFs.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| d&lt;br /&gt;
| rw&lt;br /&gt;
| Free register bank address (index) select&lt;br /&gt;
Selects the index to read from in the free register bank, up to 200. Used in conjunction with reg 0x61.&lt;br /&gt;
&lt;br /&gt;
  byte 0: bit0 = &amp;quot;WirelessDisabled&amp;quot;, bit1 = &amp;quot;SoftwareClosed&amp;quot;, bit2 = &amp;quot;PowerOffInitiated&amp;quot;, bit3 = &amp;quot;LgyNativeResolution&amp;quot;, bit4 = &amp;quot;LegacyJumpProhibited&amp;quot;&lt;br /&gt;
  byte 1: Legacy LCD data&lt;br /&gt;
  bytes 2 and 3: Local Friend Code counter&lt;br /&gt;
  bytes 4 and 5: UUID clock sequence&lt;br /&gt;
  bytes 6 and 7: Unused&lt;br /&gt;
  bytes 8 to 175: Playtime data for legacy titles&lt;br /&gt;
  bytes 176 to 188: Playtime data&lt;br /&gt;
  bytes 188 to 199: Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x61&lt;br /&gt;
| d(200)&lt;br /&gt;
| rw&lt;br /&gt;
| Free register bank, data is read from/written to here.&lt;br /&gt;
&lt;br /&gt;
Accessing N bytes of this register increments the selected index by N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 - 0x7E&lt;br /&gt;
| s&lt;br /&gt;
| -&lt;br /&gt;
| These registers don&#039;t exist, writing is no-op, reading will yield FFs.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| d(9-0x13)&lt;br /&gt;
| ro&lt;br /&gt;
| Various system state information (debug pointer table)&lt;br /&gt;
  byte 0x00: Console type, see [[Configuration_Memory#MCU_HW_INFO|here]]&lt;br /&gt;
  byte 0x01: PMIC vendor code&lt;br /&gt;
  byte 0x02: Battery vendor code&lt;br /&gt;
  byte 0x03: MGIC version (major?)&lt;br /&gt;
  byte 0x04: MGIC version (minor?)&lt;br /&gt;
  byte 0x05: RCOMP(?)&lt;br /&gt;
  byte 0x06: battery related? (seems to decrease while charging and increase while discharging)&lt;br /&gt;
  byte 0x09: system model (see [[Cfg:GetSystemModel#System_Model_Values|Cfg:GetSystemModel]] for values)&lt;br /&gt;
  byte 0x0A: Red Power LED mode (0 = off, 1 = on)&lt;br /&gt;
  byte 0x0B: Blue Power LED intensity  (0x00 - 0xFF)&lt;br /&gt;
  byte 0x0D: RGB LED red intensity&lt;br /&gt;
  byte 0x0E: RGB LED green intensity&lt;br /&gt;
  byte 0x0F: RGB LED blue intensity&lt;br /&gt;
  byte 0x11: WiFi LED brightness&lt;br /&gt;
  byte 0x12: raw button states?&lt;br /&gt;
    bit0: unset while Power button is held&lt;br /&gt;
    bit1: unset while HOME button is held&lt;br /&gt;
    bit2: unset while WiFi slider is held&lt;br /&gt;
    bit5: unset while the charging LED is active&lt;br /&gt;
    bit6: unset while charger is plugged in&lt;br /&gt;
&lt;br /&gt;
On MCU_FIRM major version 1 the size of this is 9, reading past the 9th byte will yield AA instead of FF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
- 0xFF&lt;br /&gt;
| s&lt;br /&gt;
| -&lt;br /&gt;
| These registers don&#039;t exist, writing is no-op, reading will yield FFs.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shared register: the letter &amp;quot;s&amp;quot;  means that the given register is in a &amp;quot;shared register pool&amp;quot;, meaning the resgister is in the register pool in RAM at address &amp;lt;code&amp;gt;0xFFBA4 + registernumber&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dynamic register: these registers aren&#039;t in the shared pool, they just &amp;quot;pretend&amp;quot; to be there. These registers often don&#039;t retain their set value, change rapidly, or control various hardware.&lt;br /&gt;
&lt;br /&gt;
Non-shared (dynamic) register: it&#039;s a register whose contents separate from the shared register pool. Messing with these registers will not affect the shared register pool at all.&lt;br /&gt;
&lt;br /&gt;
On old versions of MCU_FIRM none of the invalid registers are masked away by the read handler function, but are still read-only. Newer MCU_FIRM versions return the hardcoded value FF instead.&lt;br /&gt;
&lt;br /&gt;
== Device 5 &amp;amp; 6 ==&lt;br /&gt;
LCD controllers for main/sub displays, most likely.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Register&lt;br /&gt;
!  Width&lt;br /&gt;
!  Name&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 8&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x11&lt;br /&gt;
| 8&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 8&lt;br /&gt;
| CMD_IN/CMD_RESULT1&lt;br /&gt;
| Write to trigger a command? Seen commands: 0xFF=Reset?, 0x62=IsFinished?. Result is stored in CMD_RESULT1:CMD_RESULT0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x41&lt;br /&gt;
| 8&lt;br /&gt;
| CMD_RESULT0&lt;br /&gt;
| Read result &lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 8&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 8&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xFE&lt;br /&gt;
| 8&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Device 10 ==&lt;br /&gt;
See the datasheet linked to on the [[Hardware]] page for reference.&lt;br /&gt;
&lt;br /&gt;
== Device 11 ==&lt;br /&gt;
See the datasheet linked to on the [[Hardware]] page for reference.&lt;br /&gt;
&lt;br /&gt;
== Device 12 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  REGISTER&lt;br /&gt;
!  WIDTH&lt;br /&gt;
!  DESCRIPTION &lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 21&lt;br /&gt;
| DebugPad state.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the DebugPad device, see [[HID_Shared_Memory|here]].&lt;br /&gt;
&lt;br /&gt;
== Device 13 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Raw I2C register address&lt;br /&gt;
!  Internal register address&lt;br /&gt;
!  Width&lt;br /&gt;
!  Description &lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x40&lt;br /&gt;
| RHR / THR (data receive/send FIFO)&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| IER&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| FCR/IIR&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| LCR&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x1&lt;br /&gt;
| MCR&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x1&lt;br /&gt;
| LSR&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x1&lt;br /&gt;
| MSR/TCR&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x1&lt;br /&gt;
| SPR/TLR&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x1&lt;br /&gt;
| TXLVL&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x1&lt;br /&gt;
| RXLVL&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0x1&lt;br /&gt;
| IODir&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0x1&lt;br /&gt;
| IOState&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x1&lt;br /&gt;
| IoIntEna&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0x1&lt;br /&gt;
| reserved&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0x1&lt;br /&gt;
| IOControl&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0x1&lt;br /&gt;
| EFCR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See the [http://www.alldatasheet.net/datasheet-pdf/pdf/347838/NXP/SC16IS750IBS.html datasheet] linked to on the [[Hardware]] page for reference. From that datasheet, for the structure of the I2C register address u8: &amp;quot;Bit 0 is not used, bits 2:1 select the channel, bits 6:3 select one of the UART internal registers. Bit 7 is not used with the I2C-bus interface, but it is used by the SPI interface to indicate a read or a write operation.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Device 14 ==&lt;br /&gt;
&lt;br /&gt;
Used by [[Config_Services|Cfg]]-sysmodule via the i2c::EEP service. This is presumably EEPROM going by the service name.&lt;br /&gt;
&lt;br /&gt;
The Cfg-module code which loads the [[Flash_Filesystem|CCAL]](nandro:/sys/{HWCAL0.dat/HWCAL1.dat}) file from NAND will load it from I2C instead, if a certain state flag is non-zero. Likewise for the function which writes CCAL to NAND. HMAC/hash verification after loading is skipped when the CCAL was loaded from I2C.&lt;br /&gt;
&lt;br /&gt;
== Device 15 ==&lt;br /&gt;
This the New3DS [[NFC_Services|NFC]] controller &amp;quot;I2C&amp;quot; interface. This device is accessed via the WriteDeviceRaw/ReadDeviceRaw I2C service [[I2C_Services|commands]].&lt;br /&gt;
&lt;br /&gt;
Since the *Raw commands are used with this, this device has no I2C registers. Instead, raw data is transfered after the I2C device is selected. Hence, WriteDeviceRaw is used for sending commands to the controller, while ReadDeviceRaw is for receiving responses from the controller. Certain commands may return multiple command responses.&lt;br /&gt;
&lt;br /&gt;
Command request / response structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Normally 0x10?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Command source / destination.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| CmdID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| Payload size.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Following the above header is the payload data(when payload size is non-zero), with the size specified in the header. The command response payload is usually at least 1-byte, where that byte appears to be normally 0x0. For command requests the payload data is the command parameters.&lt;br /&gt;
&lt;br /&gt;
For command requests sent to the NFC tag itself, Cmd[1]=0x0 and CmdID=0x0. The command request payload data here is the actual command request data for the NFC tag, starting with the CmdID u8 at payload+0.&lt;br /&gt;
&lt;br /&gt;
During NFC module startup, a certain command is sent to the controller which eventually(after various cmd-reply headers etc) returns the following the payload after the first byte in the payload:&lt;br /&gt;
 000000: 44 65 63 20 32 32 20 32 30 31 32 31 34 3a 35 33  Dec 22 201214:53 &lt;br /&gt;
 000010: 3a 35 30 01 05 0d 46 05 1b 79 20 07 32 30 37 39  :50...F..y .2079&lt;br /&gt;
 000020: 31 42 35                                         1B5&lt;br /&gt;
&lt;br /&gt;
Or that is: &amp;quot;Dec 22 201214:53:50&amp;lt;binary&amp;gt;20791B5&amp;quot;. Therefore, this appears to return the part-number of the NFC controller(other command request(s) / response(s) use this part-number value too).&lt;br /&gt;
&lt;br /&gt;
=== NFC controller commands  ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  CmdRequest[1]&lt;br /&gt;
!  CmdID&lt;br /&gt;
!  Payload data for parameters&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 0x2F&lt;br /&gt;
| Firmware image for this chunk, size varies.&lt;br /&gt;
| This is used during NFC module startup to upload the firmware image to the NFC controller. This is used repeatedly to upload multiple chunks of the image.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=GPIO_Services&amp;diff=21518</id>
		<title>GPIO Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=GPIO_Services&amp;diff=21518"/>
		<updated>2021-05-04T11:09:19Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* GPIO Bits */ 0x100-&amp;gt;Gyroscope&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Services]]&lt;br /&gt;
= GPIO Service Names =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Service name&lt;br /&gt;
!  Permitted GPIO bitmasks&lt;br /&gt;
|-&lt;br /&gt;
| gpio:CDC&lt;br /&gt;
| 0x48&lt;br /&gt;
|-&lt;br /&gt;
| gpio:MCU&lt;br /&gt;
| 0x48020&lt;br /&gt;
|-&lt;br /&gt;
| gpio:HID&lt;br /&gt;
| 0x4301&lt;br /&gt;
|-&lt;br /&gt;
| gpio:NWM&lt;br /&gt;
| 0x40020&lt;br /&gt;
|-&lt;br /&gt;
| gpio:IR&lt;br /&gt;
| 0xEC0&lt;br /&gt;
|-&lt;br /&gt;
| gpio:NFC&lt;br /&gt;
| 0x13000&lt;br /&gt;
|-&lt;br /&gt;
| gpio:QTM&lt;br /&gt;
| 0x20000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the mapping between GPIO bitmasks and IRQs see: [[GPIO:BindInterrupt#Supported_values]].&lt;br /&gt;
&lt;br /&gt;
The commands for these services are identical.&lt;br /&gt;
&lt;br /&gt;
The input bitmask for each command is masked with the above permission bitmask, if the result is non-zero an error is occurred.&lt;br /&gt;
&lt;br /&gt;
= GPIO Services =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
!  Uses [[GPIO_Registers|GPIO Regs]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| u32 GetRegPart1(u32 mask)&lt;br /&gt;
| 0x10147010, 0x10147020&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| void SetRegPart1(u32 value, u32 mask)&lt;br /&gt;
| 0x10147010, 0x10147020&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| u32 GetRegPart2(u32 mask)&lt;br /&gt;
| 0x10147010, 0x10147024&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040080&lt;br /&gt;
| u32 SetRegPart2(u32 value, u32 mask)&lt;br /&gt;
| 0x10147010, 0x10147024&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| u32 GetInterruptMask(u32 mask)&lt;br /&gt;
| 0x10147010, 0x10147024&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| void SetInterruptMask(u32 value, u32 mask)&lt;br /&gt;
| 0x10147010, 0x10147024&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[GPIO:GetGPIOData|GetGPIOData]]&lt;br /&gt;
| 0x10147000, 0x10147010, 0x10147014, 0x10147020, 0x10147028&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080080&lt;br /&gt;
| [[GPIO:SetGPIOData|SetGPIOData]]&lt;br /&gt;
| 0x10147010, 0x10147014, 0x10147020, 0x10147028&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090082&lt;br /&gt;
| [[GPIO:BindInterrupt|BindInterrupt]]&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0042&lt;br /&gt;
| [[GPIO:UnbindInterrupt|UnbindInterrupt]]&lt;br /&gt;
| None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=GPIO Bitmask=&lt;br /&gt;
The bitmask used by the service commands determines which bits in the GPIO registers to access. The output value from [[GPIO:GetGPIOData|GetGPIOData]] uses the same format as the bitmask: the values of bits in the output field are set to the value of GPIO data when those bits are set in the input bitmask.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Bits in the bitmask&lt;br /&gt;
!  Register&lt;br /&gt;
!  Bits from register&lt;br /&gt;
!  Handled with [[GPIO:SetGPIOData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0-2 (0x7)&lt;br /&gt;
| 0x10147000&lt;br /&gt;
| 0-2&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 3-4 (0x18)&lt;br /&gt;
| 0x10147010&lt;br /&gt;
| 0-1&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 5 (0x20)&lt;br /&gt;
| 0x10147014&lt;br /&gt;
| 0&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 6-17 (0x3FFC0)&lt;br /&gt;
| 0x10147020&lt;br /&gt;
| 0-11&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 18 (0x40000)&lt;br /&gt;
| 0x10147028&lt;br /&gt;
| 0&lt;br /&gt;
| Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==GPIO Bits==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Bit&lt;br /&gt;
!  Bitmask&lt;br /&gt;
!  Accessible via GPIO service&lt;br /&gt;
!  Used by&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x1&lt;br /&gt;
| gpio:HID&lt;br /&gt;
| HID-sysmodule&lt;br /&gt;
| Used with [[HID_Shared_Memory|HID]] PAD state.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x2&lt;br /&gt;
| None&lt;br /&gt;
| &lt;br /&gt;
| Not known to be used by &#039;&#039;anything&#039;&#039;, with the latest system-version at least.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x4&lt;br /&gt;
| None&lt;br /&gt;
| &lt;br /&gt;
| Not known to be used by &#039;&#039;anything&#039;&#039;, with the latest system-version at least.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x8&lt;br /&gt;
| gpio:CDC&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x10&lt;br /&gt;
| None&lt;br /&gt;
| &lt;br /&gt;
| Not known to be used by &#039;&#039;anything&#039;&#039;, with the latest system-version at least.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x20&lt;br /&gt;
| gpio:MCU, gpio:NWM&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x40&lt;br /&gt;
| gpio:CDC, gpio:IR&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x80&lt;br /&gt;
| gpio:IR&lt;br /&gt;
| Boot11&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 0x100&lt;br /&gt;
| gpio:HID&lt;br /&gt;
| HID sysmodule&lt;br /&gt;
| Used with gyroscope&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 0x200&lt;br /&gt;
| gpio:HID, gpio:IR&lt;br /&gt;
| HID-sysmodule and IR-sysmodule&lt;br /&gt;
| Unknown, used with ir:rst.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 0x400&lt;br /&gt;
| gpio:IR&lt;br /&gt;
| IR-sysmodule, Boot11&lt;br /&gt;
| IR [[IRU:SetIRLEDState|send]]. 1 = IR LED enable, 0 = IR LED disable.&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 0x800&lt;br /&gt;
| gpio:IR&lt;br /&gt;
| IR-sysmodule&lt;br /&gt;
| IR [[IRU:GetIRLEDRecvState|receive]]&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 0x1000&lt;br /&gt;
| gpio:NFC&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 0x2000&lt;br /&gt;
| gpio:NFC&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 0x4000&lt;br /&gt;
| gpio:HID&lt;br /&gt;
| HID-sysmodule&lt;br /&gt;
| Used with [[HID_Shared_Memory|HID]]  PAD state.&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 0x8000&lt;br /&gt;
| gpio:MCU&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 0x10000&lt;br /&gt;
| gpio:NFC&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| 0x20000&lt;br /&gt;
| gpio:QTM&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 0x40000&lt;br /&gt;
| gpio:MCU, gpio:NWM&lt;br /&gt;
| NWM-sysmodule&lt;br /&gt;
| Wifi enable. 1=Enabled, 0=Disabled.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=11.14.0-46&amp;diff=21353</id>
		<title>11.14.0-46</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=11.14.0-46&amp;diff=21353"/>
		<updated>2020-11-18T13:35:00Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* NATIVE_FIRM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Old3DS+New3DS 11.14.0-46 system update was released for all regions on November 17, 2020. This Old3DS update was released for the following regions: USA, EUR, JPN, CHN, KOR, and TWN. This New3DS update was released for the following regions: USA, EUR, JPN, CHN, KOR, and TWN.&lt;br /&gt;
&lt;br /&gt;
==Change-log==&lt;br /&gt;
[https://en-americas-support.nintendo.com/app/answers/detail/a_id/667/p/430/c/267 Official] USA change-log:&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
==System Titles==&lt;br /&gt;
===NATIVE_FIRM===&lt;br /&gt;
* Kernel11 was updated, svcBindInterrupt will now only bind to ARM11 interrupt 15(fiq related) if its running on debug hardware, otherwise 0xD8E007EE is returned.&lt;br /&gt;
&lt;br /&gt;
===Friends driver===&lt;br /&gt;
* Reported version upgraded to 0xF&lt;br /&gt;
===SSL driver===&lt;br /&gt;
* TBD, possibly TLS 1.3 support and/or an update to root certificates.&lt;br /&gt;
===Internet Browser===&lt;br /&gt;
* Fix for both exploits used in zoogie&#039;s browserhax 2020&lt;br /&gt;
* TBD, possibly TLS 1.3 support and/or an update to root certificates.&lt;br /&gt;
===Hotspot list===&lt;br /&gt;
* &amp;quot;nintendo[1-5]&amp;quot;, &amp;quot;NCL-NZSERVICE[2-5]&amp;quot;, and &amp;quot;nzae200818&amp;quot; removed&lt;br /&gt;
* All remaining SSIDs except &amp;quot;NintendoSpotPass[1-2]&amp;quot; are not Nintendo Zones anymore.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
System update report(s):&lt;br /&gt;
* [https://yls8.mtheall.com/ninupdates/reports.php?date=2020-11-17_00-00-33&amp;amp;sys=ctr]&lt;br /&gt;
* [https://yls8.mtheall.com/ninupdates/reports.php?date=2020-11-17_00-00-38&amp;amp;sys=ktr]&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21342</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21342"/>
		<updated>2020-10-30T11:27:24Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Published by&lt;br /&gt;
!  Subscribed by&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| &lt;br /&gt;
| Not Needed&lt;br /&gt;
| This indicates that the recipient must terminate.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| PTM&lt;br /&gt;
| NS&lt;br /&gt;
| Signaled on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x102&lt;br /&gt;
| PTM&lt;br /&gt;
| NS&lt;br /&gt;
| Sleep Mode related? &lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| PTM&lt;br /&gt;
| NS, CSND, NWM, AC, NIM&lt;br /&gt;
| Fired on sleep mode entry (Kernel state is modified by PTM after publishing this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| PTM&lt;br /&gt;
| HID&lt;br /&gt;
| This indicates that the system is entering sleep mode. (Kernel state is modified by PTM before publishing this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| PTM&lt;br /&gt;
| NS, DSP, CSND, GSP, CODEC, CAMERA, HID, QTM, MIC, IR, NWM, FRIENDS, AC, CECD, ACT, NDM, NIM&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| PTM&lt;br /&gt;
| NS, MIC, AC, NEWS, CECD, BOSS&lt;br /&gt;
| Fired after sleep mode exit.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| PTM&lt;br /&gt;
| NWM, CECD, BOSS, NDM, NIM, NEWS&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| PTM&lt;br /&gt;
| GSP, QTM&lt;br /&gt;
| System is going to Power Down.&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| CFG&lt;br /&gt;
| GSP&lt;br /&gt;
| CFG block 0x00050001 has been modified, change LCD brightness/PWM settings&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B&lt;br /&gt;
| CFG&lt;br /&gt;
| CAMERA&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| PM&lt;br /&gt;
| &lt;br /&gt;
| A Regular application has started.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| PM&lt;br /&gt;
| NS&lt;br /&gt;
| Sent on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| PM&lt;br /&gt;
| PTM, NS&lt;br /&gt;
| All processes other than PTM and NS have terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
|&lt;br /&gt;
| NS&lt;br /&gt;
| Signaled just before sleep mode is exited from.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| MCU / NWM&lt;br /&gt;
| NWM&lt;br /&gt;
| The physical Wi-Fi slider state changed&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
|&lt;br /&gt;
| MENU&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
|&lt;br /&gt;
| MENU&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
|&lt;br /&gt;
| NS, MENU&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
|&lt;br /&gt;
| NS, MENU&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
|&lt;br /&gt;
| NS, MENU&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| MCU&lt;br /&gt;
| PTM&lt;br /&gt;
| Published on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| MCU&lt;br /&gt;
| GSP&lt;br /&gt;
| Charger plugged out.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| MCU&lt;br /&gt;
| GSP&lt;br /&gt;
| Charger plugged in. &lt;br /&gt;
|-&lt;br /&gt;
| 0x20F&lt;br /&gt;
| MCU&lt;br /&gt;
| &lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x8000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|- &lt;br /&gt;
| 0x210&lt;br /&gt;
| MCU&lt;br /&gt;
| &lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x4000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| PTM&lt;br /&gt;
|&lt;br /&gt;
| Battery very low (5%)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| PTM&lt;br /&gt;
|&lt;br /&gt;
| Battery low (10%)&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
| NS&lt;br /&gt;
| CODEC, HID, GSP, CAMERA, MIC, NDM, QTM, PTM &lt;br /&gt;
| Shell opened.&lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
| NS&lt;br /&gt;
| CODEC, HID, GSP, CAMERA, MIC, NDM, QTM, PTM.&lt;br /&gt;
| Shell closed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| AC&lt;br /&gt;
| NDM, MENU&lt;br /&gt;
| Signaled after sleep mode exit and during system boot.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| AC&lt;br /&gt;
| FRIENDS, NDM&lt;br /&gt;
| Signaled just before sleep mode is exited from.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| NWM&lt;br /&gt;
| NDM, SOCKET, FRIENDS, AC&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
|&lt;br /&gt;
| CECD, NDM&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
|&lt;br /&gt;
| CECD, NDM, SOCKET&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=WIFI_Registers&amp;diff=21326</id>
		<title>WIFI Registers</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=WIFI_Registers&amp;diff=21326"/>
		<updated>2020-08-07T14:24:01Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Registers */ Fix a wrong address&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These registers are used to control the WiFi card via the SDIO protocol.&lt;br /&gt;
&lt;br /&gt;
=Registers=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Address&lt;br /&gt;
!  Width&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_CMD&lt;br /&gt;
| 0x10122000&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| ?&lt;br /&gt;
| 0x10122002&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_CMDARG0&lt;br /&gt;
| 0x10122004&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_CMDARG1&lt;br /&gt;
| 0x10122006&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_BLKCOUNT&lt;br /&gt;
| 0x1012200a&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_CLKCTL&lt;br /&gt;
| 0x10122024&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_BLKLEN&lt;br /&gt;
| 0x10122026&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Camera_Services&amp;diff=21323</id>
		<title>Camera Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Camera_Services&amp;diff=21323"/>
		<updated>2020-08-06T07:41:03Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* cam:q (PORT_QTM) */ Add note and rest of the commands which are common&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==cam:c (PORT_REG) ==&lt;br /&gt;
Same as [[#cam:u_.28PORT_USER.29|cam:u]]&lt;br /&gt;
&lt;br /&gt;
==cam:s (PORT_CAL) ==&lt;br /&gt;
Same as [[#cam:u_.28PORT_USER.29|cam:u]]&lt;br /&gt;
&lt;br /&gt;
==cam:q (PORT_QTM) ==&lt;br /&gt;
This was added with New3DS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[CAMU:StartCapture|StartCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[CAMU:StopCapture|StopCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003004?&lt;br /&gt;
| [[CAMU:IsBusy|IsBusy]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[CAMU:ClearBuffer|ClearBuffer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005004?&lt;br /&gt;
| [[CAMU:GetVsyncInterruptEvent|GetVsyncInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006004?&lt;br /&gt;
| [[CAMU:GetBufferErrorInterruptEvent|GetBufferErrorInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007????&lt;br /&gt;
| [[CAMU:StartRecieving|StartRecieving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[CAMU:IsFinishedRecieving|IsFinishedRecieving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090100&lt;br /&gt;
| [[CAMU:SetTransferLines|SetTransferLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A008?&lt;br /&gt;
| [[CAMU:GetMaxLines|GetMaxLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0100&lt;br /&gt;
| [[CAMU:SetTransferBytes|SetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C004?&lt;br /&gt;
| [[CAMU:GetTransferBytes|GetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D008?&lt;br /&gt;
| [[CAMU:GetMaxBytes|GetMaxBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| [[CAMU:SetTrimming|SetTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F004?&lt;br /&gt;
| [[CAMU:IsTrimming|IsTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100140&lt;br /&gt;
| [[CAMU:SetTrimmingParams|SetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0011????&lt;br /&gt;
| [[CAMU:GetTrimmingParams|GetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120140&lt;br /&gt;
| [[CAMU:SetTrimmingParamsCenter|SetTrimmingParamsCenter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130040&lt;br /&gt;
| [[CAMU:Activate|Activate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140080&lt;br /&gt;
| [[CAMU:SwitchContext|SwitchContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150080&lt;br /&gt;
| [[CAMU:SetExposure|SetExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160080&lt;br /&gt;
| [[CAMU:SetWhiteBalance|SetWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170080&lt;br /&gt;
| [[CAMU:SetSharpness|SetSharpness]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180080&lt;br /&gt;
| [[CAMU:SetAutoExposure|SetAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0019004?&lt;br /&gt;
| [[CAMU:IsAutoExposure|IsAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0080&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalance|SetAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B004?&lt;br /&gt;
| [[CAMU:IsAutoWhiteBalance|IsAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C00C0&lt;br /&gt;
| [[CAMU:FlipImage|FlipImage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D020?&lt;br /&gt;
| [[CAMU:SetDetailSize|SetDetailSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E00C0&lt;br /&gt;
| [[CAMU:SetSize|SetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0080&lt;br /&gt;
| [[CAMU:SetFrameRate|SetFrameRate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200080&lt;br /&gt;
| [[CAMU:SetPhotoMode|SetPhotoMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002100C0&lt;br /&gt;
| [[CAMU:SetEffect|SetEffect]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220080&lt;br /&gt;
| [[CAMU:SetContrast|SetContrast]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230080&lt;br /&gt;
| [[CAMU:SetLensCorrection|SetLensCorrection]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002400C0&lt;br /&gt;
| [[CAMU:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0025014?&lt;br /&gt;
| [[CAMU:SetAutoExposureWindow|SetAutoExposureWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0026014?&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalanceWindow|SetAutoWhiteBalanceWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270080&lt;br /&gt;
| [[CAMU:SetNoiseFilter|SetNoiseFilter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280080&lt;br /&gt;
| [[CAMU:SyncronizeVsyncTiming|SyncronizeVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0029????&lt;br /&gt;
| [[CAMU:GetLatestVsyncTiming|GetLatestVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A????&lt;br /&gt;
| [[CAMU:GetStereoCallibrationData|GetStereoCallibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B????&lt;br /&gt;
| [[CAMU:SetPackageParameterWithoutContext|SetPackageParameterWithoutContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0080&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContext|SetPackageParameterWithContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D????&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContextDetail|SetPackageParameterWithContextDetail]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E???&lt;br /&gt;
| [[CAMU:GetSuitableY2RStandardCoeffecient|GetSuitableY2RStandardCoeffecient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F&lt;br /&gt;
| [[CAMU:PlayShutterSoundWithWave|PlayShutterSoundWithWave]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0030????&lt;br /&gt;
| [[CAMU:PlayShutterSound|GetShutterSound]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0031000?&lt;br /&gt;
| [[CAMU:DriverInitailize|DriverInitialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0032000?&lt;br /&gt;
| [[CAMU:DriverFinalize|DriverFinalize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0033000?&lt;br /&gt;
| [[CAMU:GetActivatedCamera|GetActivatedCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0034000?&lt;br /&gt;
| [[CAMU:GetSleepCamera|GetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350040&lt;br /&gt;
| [[CAMU:SetSleepCamera|SetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| [[CAMU:SetBrightnessSyncronization|SetBrightnessSyncronization]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0037004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0038000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0039004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0000&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Most commands are same as cam:u, although, with different command headers since some commands which are available in cam:u do not exist in cam:q&lt;br /&gt;
&lt;br /&gt;
==cam:u (PORT_USER)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[CAMU:StartCapture|StartCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[CAMU:StopCapture|StopCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| [[CAMU:IsBusy|IsBusy]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[CAMU:ClearBuffer|ClearBuffer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| [[CAMU:GetVsyncInterruptEvent|GetVsyncInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[CAMU:GetBufferErrorInterruptEvent|GetBufferErrorInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070102&lt;br /&gt;
| [[CAMU:SetReceiving|SetReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[CAMU:IsFinishedReceiving|IsFinishedReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090100&lt;br /&gt;
| [[CAMU:SetTransferLines|SetTransferLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0080&lt;br /&gt;
| [[CAMU:GetMaxLines|GetMaxLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0100&lt;br /&gt;
| [[CAMU:SetTransferBytes|SetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| [[CAMU:GetTransferBytes|GetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0080&lt;br /&gt;
| [[CAMU:GetMaxBytes|GetMaxBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| [[CAMU:SetTrimming|SetTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| [[CAMU:IsTrimming|IsTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100140&lt;br /&gt;
| [[CAMU:SetTrimmingParams|SetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| [[CAMU:GetTrimmingParams|GetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120140&lt;br /&gt;
| [[CAMU:SetTrimmingParamsCenter|SetTrimmingParamsCenter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130040&lt;br /&gt;
| [[CAMU:Activate|Activate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140080&lt;br /&gt;
| [[CAMU:SwitchContext|SwitchContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150080&lt;br /&gt;
| [[CAMU:SetExposure|SetExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160080&lt;br /&gt;
| [[CAMU:SetWhiteBalance|SetWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170080&lt;br /&gt;
| [[CAMU:SetWhiteBalanceWithoutBaseUp|SetWhiteBalanceWithoutBaseUp]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180080&lt;br /&gt;
| [[CAMU:SetSharpness|SetSharpness]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190080&lt;br /&gt;
| [[CAMU:SetAutoExposure|SetAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0040&lt;br /&gt;
| [[CAMU:IsAutoExposure|IsAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0080&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalance|SetAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0040&lt;br /&gt;
| [[CAMU:IsAutoWhiteBalance|IsAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D00C0&lt;br /&gt;
| [[CAMU:FlipImage|FlipImage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0200&lt;br /&gt;
| [[CAMU:SetDetailSize|SetDetailSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F00C0&lt;br /&gt;
| [[CAMU:SetSize|SetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200080&lt;br /&gt;
| [[CAMU:SetFrameRate|SetFrameRate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| [[CAMU:SetPhotoMode|SetPhotoMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002200C0&lt;br /&gt;
| [[CAMU:SetEffect|SetEffect]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230080&lt;br /&gt;
| [[CAMU:SetContrast|SetContrast]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240080&lt;br /&gt;
| [[CAMU:SetLensCorrection|SetLensCorrection]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002500C0&lt;br /&gt;
| [[CAMU:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260140&lt;br /&gt;
| [[CAMU:SetAutoExposureWindow|SetAutoExposureWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270140&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalanceWindow|SetAutoWhiteBalanceWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280080&lt;br /&gt;
| [[CAMU:SetNoiseFilter|SetNoiseFilter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290080&lt;br /&gt;
| [[CAMU:SynchronizeVsyncTiming|SynchronizeVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0080&lt;br /&gt;
| [[CAMU:GetLatestVsyncTiming|GetLatestVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| [[CAMU:GetStereoCameraCalibrationData|GetStereoCameraCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0400&lt;br /&gt;
| [[CAMU:SetStereoCameraCalibrationData|SetStereoCameraCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D00C0&lt;br /&gt;
| [[CAMU:WriteRegisterI2c|WriteRegisterI2c]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E00C0&lt;br /&gt;
| [[CAMU:WriteMcuVariableI2c|WriteMcuVariableI2c]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0080&lt;br /&gt;
| [[CAMU:ReadRegisterI2cExclusive|ReadRegisterI2cExclusive]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300080&lt;br /&gt;
| [[CAMU:ReadMcuVariableI2cExclusive|ReadMcuVariableI2cExclusive]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310180&lt;br /&gt;
| [[CAMU:SetImageQualityCalibrationData|SetImageQualityCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| [[CAMU:GetImageQualityCalibrationData|GetImageQualityCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003302C0&lt;br /&gt;
| [[CAMU:SetPackageParameterWithoutContext|SetPackageParameterWithoutContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340140&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContext|SetPackageParameterWithContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003501C0&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContextDetail|SetPackageParameterWithContextDetail]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360000&lt;br /&gt;
| [[CAMU:GetSuitableY2rStandardCoefficient|GetSuitableY2rStandardCoefficient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370202&lt;br /&gt;
| [[CAMU:PlayShutterSoundWithWave|PlayShutterSoundWithWave]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380040&lt;br /&gt;
| [[CAMU:PlayShutterSound|PlayShutterSound]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390000&lt;br /&gt;
| [[CAMU:DriverInitialize|DriverInitialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0000&lt;br /&gt;
| [[CAMU:DriverFinalize|DriverFinalize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0000&lt;br /&gt;
| [[CAMU:GetActivatedCamera|GetActivatedCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0000&lt;br /&gt;
| [[CAMU:GetSleepCamera|GetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0040&lt;br /&gt;
| [[CAMU:SetSleepCamera|SetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| [[CAMU:SetBrightnessSynchronization|SetBrightnessSynchronization]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0040&lt;br /&gt;
| Stubbed, always returns 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x004000C0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410040&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430000&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Port===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| PORT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PORT_CAM1&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PORT_CAM2&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| PORT_BOTH&lt;br /&gt;
| PORT_CAM1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; PORT_CAM2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CameraSelect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT1&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1 &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT2&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1_OUT1 &lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_IN1&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT1_OUT2&lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1_OUT2 &lt;br /&gt;
| SELECT_IN1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_ALL      &lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_IN1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Context===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_A   &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_B   &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_BOTH&lt;br /&gt;
| CONTEXT_A &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; CONTEXT_B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Flip===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_NONE      &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_HORIZONTAL&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_VERTICAL  &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_REVERSE   &lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Size===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_VGA        &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QVGA       &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QQVGA      &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CIF        &lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QCIF       &lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_DS_LCD     &lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_DS_LCDx4   &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CTR_TOP_LCD&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CTR_BOTTOM_LCD&lt;br /&gt;
| SIZE_QVGA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===FrameRate===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15      &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_5 &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_2 &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_10      &lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_8_5     &lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_5       &lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20      &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20_TO_5 &lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30      &lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30_TO_5 &lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_10&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20_TO_10&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30_TO_10&lt;br /&gt;
| 0xC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===WhiteBalance===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_AUTO &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_3200K&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_4150K&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_5200K&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_7000K&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_MAX  &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_NORMAL                 &lt;br /&gt;
| WHITE_BALANCE_AUTO&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_TUNGSTEN               &lt;br /&gt;
| WHITE_BALANCE_3200K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_WHITE_FLUORESCENT_LIGHT&lt;br /&gt;
| WHITE_BALANCE_4150K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_DAYLIGHT               &lt;br /&gt;
| WHITE_BALANCE_5200K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_CLOUDY                 &lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_HORIZON                &lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_SHADE                  &lt;br /&gt;
| WHITE_BALANCE_7000K&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PhotoMode===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_NORMAL   &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_PORTRAIT &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_LANDSCAPE&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_NIGHTVIEW&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_LETTER   &lt;br /&gt;
| 0x4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Effect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NONE    &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_MONO    &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_SEPIA   &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NEGATIVE&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NEGAFILM&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_SEPIA01 &lt;br /&gt;
| 0x5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Contrast===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_01&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_02&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_03&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_04&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_05&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_06&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_07&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_08&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_09&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_10&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_11&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_LOW   &lt;br /&gt;
| CONTRAST_PATTERN_05&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_NORMAL&lt;br /&gt;
| CONTRAST_PATTERN_06&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_HIGH  &lt;br /&gt;
| CONTRAST_PATTERN_07&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LensCorrection===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_OFF  &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_ON_70&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_ON_90&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_DARK  &lt;br /&gt;
| LENS_CORRECTION_OFF&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_NORMAL&lt;br /&gt;
| LENS_CORRECTION_ON_70&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_BRIGHT&lt;br /&gt;
| LENS_CORRECTION_ON_90&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OutputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_YUV_422&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_565&lt;br /&gt;
| 0x1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ShutterSoundType===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_NORMAL   &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_MOVIE    &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_MOVIE_END&lt;br /&gt;
| 0x2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ImageQualityCalibrationData===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| aeBaseTarget&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kRL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kGL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kBL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| ccmPosition&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL9Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL9Left&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL10Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL10Left&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbX0Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbX0Left&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===StereoCameraCalibrationData===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| isValidRotationXY&lt;br /&gt;
|-&lt;br /&gt;
| bool[3]&lt;br /&gt;
| reservedFlag&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| scale&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationZ&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| translationX&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| translationY&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationX&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationY&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| angleOfViewRight&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| angleOfViewLeft&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| distanceToChart&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| distanceCameras&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| imageWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| imageHeight&lt;br /&gt;
|-&lt;br /&gt;
| u8[16]&lt;br /&gt;
| reserved&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterCameraSelect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| s8&lt;br /&gt;
| exposure&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#WhiteBalance|WhiteBalance]] whiteBalance&lt;br /&gt;
|-&lt;br /&gt;
| s8&lt;br /&gt;
| sharpness&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| autoExposureOn&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| autoWhiteBalanceOn&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#FrameRate|FrameRate]] frameRate&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#PhotoMode|PhotoMode]] photoMode&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| contrast&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#LensCorrection|LensCorrection]] lensCorrection&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| noiseFilterOn&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowX&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowY&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowHeight&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowX&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowY&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowHeight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterContext===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Context|Context]] context&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Flip|Flip]] flip&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Effect|Effect]] effect&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Size|Size]] size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterContextDetail===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Context|Context]] context&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Flip|Flip]] flip&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Effect|Effect]] effect&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| width&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| height&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropX0&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropY0&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropX1&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropY1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== y2r:u ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[Y2R:SetInputFormat|SetInputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[Y2R:GetInputFormat|GetInputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| [[Y2R:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[Y2R:GetOutputFormat|GetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| [[Y2R:SetRotation|SetRotation]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| [[Y2R:GetRotation|GetRotation]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[Y2R:SetBlockAlignment|SetBlockAlignment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| [[Y2R:GetBlockAlignment|GetBlockAlignment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[Y2R:SetSpacialDithering|SetSpacialDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| [[Y2R:GetSpacialDithering|GetSpacialDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| [[Y2R:SetTemporalDithering|SetTemporalDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| [[Y2R:GetTemporalDithering|GetTemporalDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[Y2R:SetTransferEndInterrupt|SetTransferEndInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[Y2R:GetTransferEndInterrupt|GetTransferEndInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| [[Y2R:GetTransferEndEvent|GetTransferEndEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100102&lt;br /&gt;
| [[Y2R:SetSendingY|SetSendingY]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110102&lt;br /&gt;
| [[Y2R:SetSendingU|SetSendingU]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120102&lt;br /&gt;
| [[Y2R:SetSendingV|SetSendingV]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130102&lt;br /&gt;
| [[Y2R:SetSendingYuv|SetSendingYuv]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[Y2R:IsFinishedSendingYuv|IsFinishedSendingYuv]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150000&lt;br /&gt;
| [[Y2R:IsFinishedSendingY|IsFinishedSendingY]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| [[Y2R:IsFinishedSendingU|IsFinishedSendingU]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170000&lt;br /&gt;
| [[Y2R:IsFinishedSendingV|IsFinishedSendingV]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180102&lt;br /&gt;
| [[Y2R:SetReceiving|SetReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190000&lt;br /&gt;
| [[Y2R:IsFinishedReceiving|IsFinishedReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0040&lt;br /&gt;
| [[Y2R:SetInputLineWidth|SetInputLineWidth]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0000&lt;br /&gt;
| [[Y2R:GetInputLineWidth|GetInputLineWidth]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0040&lt;br /&gt;
| [[Y2R:SetInputLines|SetInputLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0000&lt;br /&gt;
| [[Y2R:GetInputLines|GetInputLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0100&lt;br /&gt;
| [[Y2R:SetCoefficientParams|SetCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0000&lt;br /&gt;
| [[Y2R:GetCoefficientParams|GetCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200040&lt;br /&gt;
| [[Y2R:SetStandardCoefficient|SetStandardCoefficient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210040&lt;br /&gt;
| [[Y2R:GetStandardCoefficientParams|GetStandardCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220040&lt;br /&gt;
| [[Y2R:SetAlpha|SetAlpha]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| [[Y2R:GetAlpha|GetAlpha]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240200&lt;br /&gt;
| [[Y2R:SetDitheringWeightParams|SetDitheringWeightParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| [[Y2R:GetDitheringWeightParams|GetDitheringWeightParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| [[Y2R:StartConversion|StartConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| [[Y2R:StopConversion|StopConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| [[Y2R:IsBusyConversion|IsBusyConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002901C0&lt;br /&gt;
| [[Y2R:SetPackageParameter|SetPackageParameter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| [[Y2R:PingProcess|PingProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| [[Y2R:DriverInitialize|DriverInitialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| [[Y2R:DriverFinalize|DriverFinalize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[Y2R:GetPackageParameter|GetPackageParameter]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===InputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_INDIV_8&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV420_INDIV_8&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_INDIV_16&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV420_INDIV_16&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_BATCH&lt;br /&gt;
| 0x4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OutputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_32&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_24&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_16_555&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_16_565&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rotation===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_90&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_180&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_270&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BlockAlignment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enum&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLOCK_LINE&lt;br /&gt;
| 0x0&lt;br /&gt;
| Output buffer&#039;s pixels are arranged linearly. Used when outputting to the framebuffer.&lt;br /&gt;
|-&lt;br /&gt;
| BLOCK_8_BY_8&lt;br /&gt;
| 0x1&lt;br /&gt;
| Output buffer&#039;s pixels are morton swizzled. Used when outputting to a GPU texture.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CoefficientParams===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| Y_A&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| R_V&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_V&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_U&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| B_U&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| R_Offset&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_Offset&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| B_Offset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===StandardCoefficient===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_601&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_709&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_601_SCALING&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_709_SCALING&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===DitheringWeightParams===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xOdd_yOdd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameter===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#InputFormat|InputFormat]] inputFormat&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#OutputFormat_2|OutputFormat]] outputFormat&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Rotation|Rotation]] rotation&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#BlockAlignment|BlockAlignment]] blockAlignment&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| inputLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| inputLines&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#StandardCoefficient|StandardCoefficient]] standardCoefficient&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| alpha&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Camera_Services&amp;diff=21322</id>
		<title>Camera Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Camera_Services&amp;diff=21322"/>
		<updated>2020-08-06T07:25:19Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* cam:q (PORT_QTM) */ x2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==cam:c (PORT_REG) ==&lt;br /&gt;
Same as [[#cam:u_.28PORT_USER.29|cam:u]]&lt;br /&gt;
&lt;br /&gt;
==cam:s (PORT_CAL) ==&lt;br /&gt;
Same as [[#cam:u_.28PORT_USER.29|cam:u]]&lt;br /&gt;
&lt;br /&gt;
==cam:q (PORT_QTM) ==&lt;br /&gt;
This was added with New3DS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[CAMU:StartCapture|StartCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[CAMU:StopCapture|StopCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003004?&lt;br /&gt;
| [[CAMU:IsBusy|IsBusy]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[CAMU:ClearBuffer|ClearBuffer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005004?&lt;br /&gt;
| [[CAMU:GetVsyncInterruptEvent|GetVsyncInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006004?&lt;br /&gt;
| [[CAMU:GetBufferErrorInterruptEvent|GetBufferErrorInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007????&lt;br /&gt;
| [[CAMU:StartRecieving|StartRecieving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[CAMU:IsFinishedRecieving|IsFinishedRecieving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090100&lt;br /&gt;
| [[CAMU:SetTransferLines|SetTransferLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A008?&lt;br /&gt;
| [[CAMU:GetMaxLines|GetMaxLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0100&lt;br /&gt;
| [[CAMU:SetTransferBytes|SetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C004?&lt;br /&gt;
| [[CAMU:GetTransferBytes|GetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D008?&lt;br /&gt;
| [[CAMU:GetMaxBytes|GetMaxBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| [[CAMU:SetTrimming|SetTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F004?&lt;br /&gt;
| [[CAMU:IsTrimming|IsTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100140&lt;br /&gt;
| [[CAMU:SetTrimmingParams|SetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0011????&lt;br /&gt;
| [[CAMU:GetTrimmingParams|GetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120140&lt;br /&gt;
| [[CAMU:SetTrimmingParamsCenter|SetTrimmingParamsCenter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130040&lt;br /&gt;
| [[CAMU:Activate|Activate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140080&lt;br /&gt;
| [[CAMU:SwitchContext|SwitchContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150080&lt;br /&gt;
| [[CAMU:SetExposure|SetExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160080&lt;br /&gt;
| [[CAMU:SetWhiteBalance|SetWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170080&lt;br /&gt;
| [[CAMU:SetSharpness|SetSharpness]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180080&lt;br /&gt;
| [[CAMU:SetAutoExposure|SetAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0019004?&lt;br /&gt;
| [[CAMU:IsAutoExposure|IsAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0080&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalance|SetAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B004?&lt;br /&gt;
| [[CAMU:IsAutoWhiteBalance|IsAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C00C0&lt;br /&gt;
| [[CAMU:FlipImage|FlipImage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D020?&lt;br /&gt;
| [[CAMU:SetDetailSize|SetDetailSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E00C0&lt;br /&gt;
| [[CAMU:SetSize|SetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0080&lt;br /&gt;
| [[CAMU:SetFrameRate|SetFrameRate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200080&lt;br /&gt;
| [[CAMU:SetPhotoMode|SetPhotoMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002100C0&lt;br /&gt;
| [[CAMU:SetEffect|SetEffect]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220080&lt;br /&gt;
| [[CAMU:SetContrast|SetContrast]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230080&lt;br /&gt;
| [[CAMU:SetLensCorrection|SetLensCorrection]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002400C0&lt;br /&gt;
| [[CAMU:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0025014?&lt;br /&gt;
| [[CAMU:SetAutoExposureWindow|SetAutoExposureWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0026014?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0029????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E???&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F&lt;br /&gt;
| ??????&lt;br /&gt;
|-&lt;br /&gt;
| 0x0030????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0031000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0032000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0033000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0034000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350040&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0037004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0038000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0039004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0000&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==cam:u (PORT_USER)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[CAMU:StartCapture|StartCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[CAMU:StopCapture|StopCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| [[CAMU:IsBusy|IsBusy]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[CAMU:ClearBuffer|ClearBuffer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| [[CAMU:GetVsyncInterruptEvent|GetVsyncInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[CAMU:GetBufferErrorInterruptEvent|GetBufferErrorInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070102&lt;br /&gt;
| [[CAMU:SetReceiving|SetReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[CAMU:IsFinishedReceiving|IsFinishedReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090100&lt;br /&gt;
| [[CAMU:SetTransferLines|SetTransferLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0080&lt;br /&gt;
| [[CAMU:GetMaxLines|GetMaxLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0100&lt;br /&gt;
| [[CAMU:SetTransferBytes|SetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| [[CAMU:GetTransferBytes|GetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0080&lt;br /&gt;
| [[CAMU:GetMaxBytes|GetMaxBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| [[CAMU:SetTrimming|SetTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| [[CAMU:IsTrimming|IsTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100140&lt;br /&gt;
| [[CAMU:SetTrimmingParams|SetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| [[CAMU:GetTrimmingParams|GetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120140&lt;br /&gt;
| [[CAMU:SetTrimmingParamsCenter|SetTrimmingParamsCenter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130040&lt;br /&gt;
| [[CAMU:Activate|Activate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140080&lt;br /&gt;
| [[CAMU:SwitchContext|SwitchContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150080&lt;br /&gt;
| [[CAMU:SetExposure|SetExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160080&lt;br /&gt;
| [[CAMU:SetWhiteBalance|SetWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170080&lt;br /&gt;
| [[CAMU:SetWhiteBalanceWithoutBaseUp|SetWhiteBalanceWithoutBaseUp]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180080&lt;br /&gt;
| [[CAMU:SetSharpness|SetSharpness]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190080&lt;br /&gt;
| [[CAMU:SetAutoExposure|SetAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0040&lt;br /&gt;
| [[CAMU:IsAutoExposure|IsAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0080&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalance|SetAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0040&lt;br /&gt;
| [[CAMU:IsAutoWhiteBalance|IsAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D00C0&lt;br /&gt;
| [[CAMU:FlipImage|FlipImage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0200&lt;br /&gt;
| [[CAMU:SetDetailSize|SetDetailSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F00C0&lt;br /&gt;
| [[CAMU:SetSize|SetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200080&lt;br /&gt;
| [[CAMU:SetFrameRate|SetFrameRate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| [[CAMU:SetPhotoMode|SetPhotoMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002200C0&lt;br /&gt;
| [[CAMU:SetEffect|SetEffect]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230080&lt;br /&gt;
| [[CAMU:SetContrast|SetContrast]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240080&lt;br /&gt;
| [[CAMU:SetLensCorrection|SetLensCorrection]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002500C0&lt;br /&gt;
| [[CAMU:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260140&lt;br /&gt;
| [[CAMU:SetAutoExposureWindow|SetAutoExposureWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270140&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalanceWindow|SetAutoWhiteBalanceWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280080&lt;br /&gt;
| [[CAMU:SetNoiseFilter|SetNoiseFilter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290080&lt;br /&gt;
| [[CAMU:SynchronizeVsyncTiming|SynchronizeVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0080&lt;br /&gt;
| [[CAMU:GetLatestVsyncTiming|GetLatestVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| [[CAMU:GetStereoCameraCalibrationData|GetStereoCameraCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0400&lt;br /&gt;
| [[CAMU:SetStereoCameraCalibrationData|SetStereoCameraCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D00C0&lt;br /&gt;
| [[CAMU:WriteRegisterI2c|WriteRegisterI2c]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E00C0&lt;br /&gt;
| [[CAMU:WriteMcuVariableI2c|WriteMcuVariableI2c]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0080&lt;br /&gt;
| [[CAMU:ReadRegisterI2cExclusive|ReadRegisterI2cExclusive]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300080&lt;br /&gt;
| [[CAMU:ReadMcuVariableI2cExclusive|ReadMcuVariableI2cExclusive]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310180&lt;br /&gt;
| [[CAMU:SetImageQualityCalibrationData|SetImageQualityCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| [[CAMU:GetImageQualityCalibrationData|GetImageQualityCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003302C0&lt;br /&gt;
| [[CAMU:SetPackageParameterWithoutContext|SetPackageParameterWithoutContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340140&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContext|SetPackageParameterWithContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003501C0&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContextDetail|SetPackageParameterWithContextDetail]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360000&lt;br /&gt;
| [[CAMU:GetSuitableY2rStandardCoefficient|GetSuitableY2rStandardCoefficient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370202&lt;br /&gt;
| [[CAMU:PlayShutterSoundWithWave|PlayShutterSoundWithWave]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380040&lt;br /&gt;
| [[CAMU:PlayShutterSound|PlayShutterSound]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390000&lt;br /&gt;
| [[CAMU:DriverInitialize|DriverInitialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0000&lt;br /&gt;
| [[CAMU:DriverFinalize|DriverFinalize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0000&lt;br /&gt;
| [[CAMU:GetActivatedCamera|GetActivatedCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0000&lt;br /&gt;
| [[CAMU:GetSleepCamera|GetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0040&lt;br /&gt;
| [[CAMU:SetSleepCamera|SetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| [[CAMU:SetBrightnessSynchronization|SetBrightnessSynchronization]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0040&lt;br /&gt;
| Stubbed, always returns 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x004000C0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410040&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430000&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Port===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| PORT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PORT_CAM1&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PORT_CAM2&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| PORT_BOTH&lt;br /&gt;
| PORT_CAM1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; PORT_CAM2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CameraSelect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT1&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1 &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT2&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1_OUT1 &lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_IN1&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT1_OUT2&lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1_OUT2 &lt;br /&gt;
| SELECT_IN1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_ALL      &lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_IN1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Context===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_A   &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_B   &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_BOTH&lt;br /&gt;
| CONTEXT_A &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; CONTEXT_B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Flip===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_NONE      &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_HORIZONTAL&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_VERTICAL  &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_REVERSE   &lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Size===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_VGA        &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QVGA       &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QQVGA      &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CIF        &lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QCIF       &lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_DS_LCD     &lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_DS_LCDx4   &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CTR_TOP_LCD&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CTR_BOTTOM_LCD&lt;br /&gt;
| SIZE_QVGA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===FrameRate===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15      &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_5 &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_2 &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_10      &lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_8_5     &lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_5       &lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20      &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20_TO_5 &lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30      &lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30_TO_5 &lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_10&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20_TO_10&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30_TO_10&lt;br /&gt;
| 0xC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===WhiteBalance===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_AUTO &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_3200K&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_4150K&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_5200K&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_7000K&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_MAX  &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_NORMAL                 &lt;br /&gt;
| WHITE_BALANCE_AUTO&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_TUNGSTEN               &lt;br /&gt;
| WHITE_BALANCE_3200K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_WHITE_FLUORESCENT_LIGHT&lt;br /&gt;
| WHITE_BALANCE_4150K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_DAYLIGHT               &lt;br /&gt;
| WHITE_BALANCE_5200K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_CLOUDY                 &lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_HORIZON                &lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_SHADE                  &lt;br /&gt;
| WHITE_BALANCE_7000K&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PhotoMode===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_NORMAL   &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_PORTRAIT &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_LANDSCAPE&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_NIGHTVIEW&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_LETTER   &lt;br /&gt;
| 0x4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Effect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NONE    &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_MONO    &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_SEPIA   &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NEGATIVE&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NEGAFILM&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_SEPIA01 &lt;br /&gt;
| 0x5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Contrast===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_01&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_02&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_03&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_04&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_05&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_06&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_07&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_08&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_09&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_10&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_11&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_LOW   &lt;br /&gt;
| CONTRAST_PATTERN_05&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_NORMAL&lt;br /&gt;
| CONTRAST_PATTERN_06&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_HIGH  &lt;br /&gt;
| CONTRAST_PATTERN_07&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LensCorrection===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_OFF  &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_ON_70&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_ON_90&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_DARK  &lt;br /&gt;
| LENS_CORRECTION_OFF&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_NORMAL&lt;br /&gt;
| LENS_CORRECTION_ON_70&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_BRIGHT&lt;br /&gt;
| LENS_CORRECTION_ON_90&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OutputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_YUV_422&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_565&lt;br /&gt;
| 0x1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ShutterSoundType===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_NORMAL   &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_MOVIE    &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_MOVIE_END&lt;br /&gt;
| 0x2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ImageQualityCalibrationData===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| aeBaseTarget&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kRL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kGL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kBL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| ccmPosition&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL9Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL9Left&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL10Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL10Left&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbX0Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbX0Left&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===StereoCameraCalibrationData===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| isValidRotationXY&lt;br /&gt;
|-&lt;br /&gt;
| bool[3]&lt;br /&gt;
| reservedFlag&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| scale&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationZ&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| translationX&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| translationY&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationX&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationY&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| angleOfViewRight&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| angleOfViewLeft&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| distanceToChart&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| distanceCameras&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| imageWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| imageHeight&lt;br /&gt;
|-&lt;br /&gt;
| u8[16]&lt;br /&gt;
| reserved&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterCameraSelect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| s8&lt;br /&gt;
| exposure&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#WhiteBalance|WhiteBalance]] whiteBalance&lt;br /&gt;
|-&lt;br /&gt;
| s8&lt;br /&gt;
| sharpness&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| autoExposureOn&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| autoWhiteBalanceOn&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#FrameRate|FrameRate]] frameRate&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#PhotoMode|PhotoMode]] photoMode&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| contrast&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#LensCorrection|LensCorrection]] lensCorrection&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| noiseFilterOn&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowX&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowY&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowHeight&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowX&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowY&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowHeight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterContext===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Context|Context]] context&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Flip|Flip]] flip&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Effect|Effect]] effect&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Size|Size]] size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterContextDetail===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Context|Context]] context&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Flip|Flip]] flip&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Effect|Effect]] effect&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| width&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| height&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropX0&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropY0&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropX1&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropY1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== y2r:u ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[Y2R:SetInputFormat|SetInputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[Y2R:GetInputFormat|GetInputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| [[Y2R:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[Y2R:GetOutputFormat|GetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| [[Y2R:SetRotation|SetRotation]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| [[Y2R:GetRotation|GetRotation]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[Y2R:SetBlockAlignment|SetBlockAlignment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| [[Y2R:GetBlockAlignment|GetBlockAlignment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[Y2R:SetSpacialDithering|SetSpacialDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| [[Y2R:GetSpacialDithering|GetSpacialDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| [[Y2R:SetTemporalDithering|SetTemporalDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| [[Y2R:GetTemporalDithering|GetTemporalDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[Y2R:SetTransferEndInterrupt|SetTransferEndInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[Y2R:GetTransferEndInterrupt|GetTransferEndInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| [[Y2R:GetTransferEndEvent|GetTransferEndEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100102&lt;br /&gt;
| [[Y2R:SetSendingY|SetSendingY]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110102&lt;br /&gt;
| [[Y2R:SetSendingU|SetSendingU]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120102&lt;br /&gt;
| [[Y2R:SetSendingV|SetSendingV]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130102&lt;br /&gt;
| [[Y2R:SetSendingYuv|SetSendingYuv]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[Y2R:IsFinishedSendingYuv|IsFinishedSendingYuv]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150000&lt;br /&gt;
| [[Y2R:IsFinishedSendingY|IsFinishedSendingY]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| [[Y2R:IsFinishedSendingU|IsFinishedSendingU]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170000&lt;br /&gt;
| [[Y2R:IsFinishedSendingV|IsFinishedSendingV]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180102&lt;br /&gt;
| [[Y2R:SetReceiving|SetReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190000&lt;br /&gt;
| [[Y2R:IsFinishedReceiving|IsFinishedReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0040&lt;br /&gt;
| [[Y2R:SetInputLineWidth|SetInputLineWidth]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0000&lt;br /&gt;
| [[Y2R:GetInputLineWidth|GetInputLineWidth]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0040&lt;br /&gt;
| [[Y2R:SetInputLines|SetInputLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0000&lt;br /&gt;
| [[Y2R:GetInputLines|GetInputLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0100&lt;br /&gt;
| [[Y2R:SetCoefficientParams|SetCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0000&lt;br /&gt;
| [[Y2R:GetCoefficientParams|GetCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200040&lt;br /&gt;
| [[Y2R:SetStandardCoefficient|SetStandardCoefficient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210040&lt;br /&gt;
| [[Y2R:GetStandardCoefficientParams|GetStandardCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220040&lt;br /&gt;
| [[Y2R:SetAlpha|SetAlpha]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| [[Y2R:GetAlpha|GetAlpha]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240200&lt;br /&gt;
| [[Y2R:SetDitheringWeightParams|SetDitheringWeightParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| [[Y2R:GetDitheringWeightParams|GetDitheringWeightParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| [[Y2R:StartConversion|StartConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| [[Y2R:StopConversion|StopConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| [[Y2R:IsBusyConversion|IsBusyConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002901C0&lt;br /&gt;
| [[Y2R:SetPackageParameter|SetPackageParameter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| [[Y2R:PingProcess|PingProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| [[Y2R:DriverInitialize|DriverInitialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| [[Y2R:DriverFinalize|DriverFinalize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[Y2R:GetPackageParameter|GetPackageParameter]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===InputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_INDIV_8&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV420_INDIV_8&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_INDIV_16&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV420_INDIV_16&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_BATCH&lt;br /&gt;
| 0x4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OutputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_32&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_24&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_16_555&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_16_565&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rotation===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_90&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_180&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_270&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BlockAlignment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enum&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLOCK_LINE&lt;br /&gt;
| 0x0&lt;br /&gt;
| Output buffer&#039;s pixels are arranged linearly. Used when outputting to the framebuffer.&lt;br /&gt;
|-&lt;br /&gt;
| BLOCK_8_BY_8&lt;br /&gt;
| 0x1&lt;br /&gt;
| Output buffer&#039;s pixels are morton swizzled. Used when outputting to a GPU texture.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CoefficientParams===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| Y_A&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| R_V&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_V&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_U&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| B_U&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| R_Offset&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_Offset&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| B_Offset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===StandardCoefficient===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_601&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_709&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_601_SCALING&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_709_SCALING&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===DitheringWeightParams===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xOdd_yOdd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameter===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#InputFormat|InputFormat]] inputFormat&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#OutputFormat_2|OutputFormat]] outputFormat&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Rotation|Rotation]] rotation&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#BlockAlignment|BlockAlignment]] blockAlignment&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| inputLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| inputLines&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#StandardCoefficient|StandardCoefficient]] standardCoefficient&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| alpha&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Camera_Services&amp;diff=21321</id>
		<title>Camera Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Camera_Services&amp;diff=21321"/>
		<updated>2020-08-06T07:13:20Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* cam:q (PORT_QTM) */ ida decompilation shows that these commands are common with cam:u&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==cam:c (PORT_REG) ==&lt;br /&gt;
Same as [[#cam:u_.28PORT_USER.29|cam:u]]&lt;br /&gt;
&lt;br /&gt;
==cam:s (PORT_CAL) ==&lt;br /&gt;
Same as [[#cam:u_.28PORT_USER.29|cam:u]]&lt;br /&gt;
&lt;br /&gt;
==cam:q (PORT_QTM) ==&lt;br /&gt;
This was added with New3DS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[CAMU:StartCapture|StartCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[CAMU:StopCapture|StopCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003004?&lt;br /&gt;
| [[CAMU:IsBusy|IsBusy]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[CAMU:ClearBuffer|ClearBuffer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005004?&lt;br /&gt;
| [[CAMU:GetVsyncInterruptEvent|GetVsyncInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006004?&lt;br /&gt;
| [[CAMU:GetBufferErrorInterruptEvent|GetBufferErrorInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007????&lt;br /&gt;
| [[CAMU:StartRecieving|StartRecieving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[CAMU:IsFinishedRecieving|IsFinishedRecieving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090100&lt;br /&gt;
| [[CAMU:SetTransferLines|SetTransferLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A008?&lt;br /&gt;
| [[CAMU:GetMaxLines|GetMaxLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0100&lt;br /&gt;
| [[CAMU:SetTransferBytes|SetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C004?&lt;br /&gt;
| [[CAMU:GetTransferBytes|GetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D008?&lt;br /&gt;
| [[CAMU:GetMaxBytes|GetMaxBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| [[CAMU:SetTrimming|SetTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F004?&lt;br /&gt;
| [[CAMU:IsTrimming|IsTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100140&lt;br /&gt;
| [[CAMU:SetTrimmingParams|SetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0011????&lt;br /&gt;
| [[CAMU:GetTrimmingParams|GetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120140&lt;br /&gt;
| [[CAMU:SetTrimmingParamsCenter|SetTrimmingParamsCenter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130040&lt;br /&gt;
| [[CAMU:Activate|Activate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0019004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C00C0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D020?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E00C0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002100C0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002400C0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0025014?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0026014?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0029????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E???&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F&lt;br /&gt;
| ??????&lt;br /&gt;
|-&lt;br /&gt;
| 0x0030????&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0031000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0032000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0033000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0034000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350040&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0037004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0038000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x0039004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B004?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0080&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D000?&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0000&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==cam:u (PORT_USER)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[CAMU:StartCapture|StartCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[CAMU:StopCapture|StopCapture]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| [[CAMU:IsBusy|IsBusy]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[CAMU:ClearBuffer|ClearBuffer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| [[CAMU:GetVsyncInterruptEvent|GetVsyncInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[CAMU:GetBufferErrorInterruptEvent|GetBufferErrorInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070102&lt;br /&gt;
| [[CAMU:SetReceiving|SetReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[CAMU:IsFinishedReceiving|IsFinishedReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090100&lt;br /&gt;
| [[CAMU:SetTransferLines|SetTransferLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0080&lt;br /&gt;
| [[CAMU:GetMaxLines|GetMaxLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0100&lt;br /&gt;
| [[CAMU:SetTransferBytes|SetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| [[CAMU:GetTransferBytes|GetTransferBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0080&lt;br /&gt;
| [[CAMU:GetMaxBytes|GetMaxBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| [[CAMU:SetTrimming|SetTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| [[CAMU:IsTrimming|IsTrimming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100140&lt;br /&gt;
| [[CAMU:SetTrimmingParams|SetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| [[CAMU:GetTrimmingParams|GetTrimmingParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120140&lt;br /&gt;
| [[CAMU:SetTrimmingParamsCenter|SetTrimmingParamsCenter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130040&lt;br /&gt;
| [[CAMU:Activate|Activate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140080&lt;br /&gt;
| [[CAMU:SwitchContext|SwitchContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150080&lt;br /&gt;
| [[CAMU:SetExposure|SetExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160080&lt;br /&gt;
| [[CAMU:SetWhiteBalance|SetWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170080&lt;br /&gt;
| [[CAMU:SetWhiteBalanceWithoutBaseUp|SetWhiteBalanceWithoutBaseUp]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180080&lt;br /&gt;
| [[CAMU:SetSharpness|SetSharpness]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190080&lt;br /&gt;
| [[CAMU:SetAutoExposure|SetAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0040&lt;br /&gt;
| [[CAMU:IsAutoExposure|IsAutoExposure]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0080&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalance|SetAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0040&lt;br /&gt;
| [[CAMU:IsAutoWhiteBalance|IsAutoWhiteBalance]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D00C0&lt;br /&gt;
| [[CAMU:FlipImage|FlipImage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0200&lt;br /&gt;
| [[CAMU:SetDetailSize|SetDetailSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F00C0&lt;br /&gt;
| [[CAMU:SetSize|SetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200080&lt;br /&gt;
| [[CAMU:SetFrameRate|SetFrameRate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| [[CAMU:SetPhotoMode|SetPhotoMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002200C0&lt;br /&gt;
| [[CAMU:SetEffect|SetEffect]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230080&lt;br /&gt;
| [[CAMU:SetContrast|SetContrast]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240080&lt;br /&gt;
| [[CAMU:SetLensCorrection|SetLensCorrection]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002500C0&lt;br /&gt;
| [[CAMU:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260140&lt;br /&gt;
| [[CAMU:SetAutoExposureWindow|SetAutoExposureWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270140&lt;br /&gt;
| [[CAMU:SetAutoWhiteBalanceWindow|SetAutoWhiteBalanceWindow]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280080&lt;br /&gt;
| [[CAMU:SetNoiseFilter|SetNoiseFilter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290080&lt;br /&gt;
| [[CAMU:SynchronizeVsyncTiming|SynchronizeVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0080&lt;br /&gt;
| [[CAMU:GetLatestVsyncTiming|GetLatestVsyncTiming]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| [[CAMU:GetStereoCameraCalibrationData|GetStereoCameraCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0400&lt;br /&gt;
| [[CAMU:SetStereoCameraCalibrationData|SetStereoCameraCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D00C0&lt;br /&gt;
| [[CAMU:WriteRegisterI2c|WriteRegisterI2c]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E00C0&lt;br /&gt;
| [[CAMU:WriteMcuVariableI2c|WriteMcuVariableI2c]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0080&lt;br /&gt;
| [[CAMU:ReadRegisterI2cExclusive|ReadRegisterI2cExclusive]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300080&lt;br /&gt;
| [[CAMU:ReadMcuVariableI2cExclusive|ReadMcuVariableI2cExclusive]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310180&lt;br /&gt;
| [[CAMU:SetImageQualityCalibrationData|SetImageQualityCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| [[CAMU:GetImageQualityCalibrationData|GetImageQualityCalibrationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003302C0&lt;br /&gt;
| [[CAMU:SetPackageParameterWithoutContext|SetPackageParameterWithoutContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340140&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContext|SetPackageParameterWithContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003501C0&lt;br /&gt;
| [[CAMU:SetPackageParameterWithContextDetail|SetPackageParameterWithContextDetail]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360000&lt;br /&gt;
| [[CAMU:GetSuitableY2rStandardCoefficient|GetSuitableY2rStandardCoefficient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370202&lt;br /&gt;
| [[CAMU:PlayShutterSoundWithWave|PlayShutterSoundWithWave]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380040&lt;br /&gt;
| [[CAMU:PlayShutterSound|PlayShutterSound]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390000&lt;br /&gt;
| [[CAMU:DriverInitialize|DriverInitialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0000&lt;br /&gt;
| [[CAMU:DriverFinalize|DriverFinalize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0000&lt;br /&gt;
| [[CAMU:GetActivatedCamera|GetActivatedCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0000&lt;br /&gt;
| [[CAMU:GetSleepCamera|GetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0040&lt;br /&gt;
| [[CAMU:SetSleepCamera|SetSleepCamera]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| [[CAMU:SetBrightnessSynchronization|SetBrightnessSynchronization]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0040&lt;br /&gt;
| Stubbed, always returns 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x004000C0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410040&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430000&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| Stubbed, returns D8A053EA if flag is not 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Port===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| PORT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PORT_CAM1&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PORT_CAM2&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| PORT_BOTH&lt;br /&gt;
| PORT_CAM1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; PORT_CAM2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CameraSelect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT1&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1 &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT2&lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1_OUT1 &lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_IN1&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_OUT1_OUT2&lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_IN1_OUT2 &lt;br /&gt;
| SELECT_IN1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|-&lt;br /&gt;
| SELECT_ALL      &lt;br /&gt;
| SELECT_OUT1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_IN1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; SELECT_OUT2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Context===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_A   &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_B   &lt;br /&gt;
| 0x1 &amp;lt;&amp;lt; 0x1&lt;br /&gt;
|-&lt;br /&gt;
| CONTEXT_BOTH&lt;br /&gt;
| CONTEXT_A &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; CONTEXT_B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Flip===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_NONE      &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_HORIZONTAL&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_VERTICAL  &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| FLIP_REVERSE   &lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Size===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_VGA        &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QVGA       &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QQVGA      &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CIF        &lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_QCIF       &lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_DS_LCD     &lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_DS_LCDx4   &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CTR_TOP_LCD&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| SIZE_CTR_BOTTOM_LCD&lt;br /&gt;
| SIZE_QVGA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===FrameRate===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15      &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_5 &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_2 &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_10      &lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_8_5     &lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_5       &lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20      &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20_TO_5 &lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30      &lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30_TO_5 &lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_15_TO_10&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_20_TO_10&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| FRAME_RATE_30_TO_10&lt;br /&gt;
| 0xC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===WhiteBalance===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_AUTO &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_3200K&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_4150K&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_5200K&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_7000K&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_MAX  &lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_NORMAL                 &lt;br /&gt;
| WHITE_BALANCE_AUTO&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_TUNGSTEN               &lt;br /&gt;
| WHITE_BALANCE_3200K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_WHITE_FLUORESCENT_LIGHT&lt;br /&gt;
| WHITE_BALANCE_4150K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_DAYLIGHT               &lt;br /&gt;
| WHITE_BALANCE_5200K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_CLOUDY                 &lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_HORIZON                &lt;br /&gt;
| WHITE_BALANCE_6000K&lt;br /&gt;
|-&lt;br /&gt;
| WHITE_BALANCE_SHADE                  &lt;br /&gt;
| WHITE_BALANCE_7000K&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PhotoMode===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_NORMAL   &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_PORTRAIT &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_LANDSCAPE&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_NIGHTVIEW&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| PHOTO_MODE_LETTER   &lt;br /&gt;
| 0x4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Effect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NONE    &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_MONO    &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_SEPIA   &lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NEGATIVE&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_NEGAFILM&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| EFFECT_SEPIA01 &lt;br /&gt;
| 0x5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Contrast===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_01&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_02&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_03&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_04&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_05&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_06&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_07&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_08&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_09&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_10&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_PATTERN_11&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_LOW   &lt;br /&gt;
| CONTRAST_PATTERN_05&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_NORMAL&lt;br /&gt;
| CONTRAST_PATTERN_06&lt;br /&gt;
|-&lt;br /&gt;
| CONTRAST_HIGH  &lt;br /&gt;
| CONTRAST_PATTERN_07&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LensCorrection===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_OFF  &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_ON_70&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_ON_90&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_DARK  &lt;br /&gt;
| LENS_CORRECTION_OFF&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_NORMAL&lt;br /&gt;
| LENS_CORRECTION_ON_70&lt;br /&gt;
|-&lt;br /&gt;
| LENS_CORRECTION_BRIGHT&lt;br /&gt;
| LENS_CORRECTION_ON_90&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OutputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_YUV_422&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_565&lt;br /&gt;
| 0x1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ShutterSoundType===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_NORMAL   &lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_MOVIE    &lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| SHUTTER_SOUND_TYPE_MOVIE_END&lt;br /&gt;
| 0x2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ImageQualityCalibrationData===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| aeBaseTarget&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kRL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kGL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| kBL&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| ccmPosition&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL9Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL9Left&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL10Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbCcmL10Left&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbX0Right&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| awbX0Left&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===StereoCameraCalibrationData===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| isValidRotationXY&lt;br /&gt;
|-&lt;br /&gt;
| bool[3]&lt;br /&gt;
| reservedFlag&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| scale&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationZ&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| translationX&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| translationY&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationX&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| rotationY&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| angleOfViewRight&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| angleOfViewLeft&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| distanceToChart&lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| distanceCameras&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| imageWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| imageHeight&lt;br /&gt;
|-&lt;br /&gt;
| u8[16]&lt;br /&gt;
| reserved&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterCameraSelect===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| s8&lt;br /&gt;
| exposure&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#WhiteBalance|WhiteBalance]] whiteBalance&lt;br /&gt;
|-&lt;br /&gt;
| s8&lt;br /&gt;
| sharpness&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| autoExposureOn&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| autoWhiteBalanceOn&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#FrameRate|FrameRate]] frameRate&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#PhotoMode|PhotoMode]] photoMode&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| contrast&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#LensCorrection|LensCorrection]] lensCorrection&lt;br /&gt;
|-&lt;br /&gt;
| bool&lt;br /&gt;
| noiseFilterOn&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowX&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowY&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoExposureWindowHeight&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowX&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowY&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| autoWhiteBalanceWindowHeight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterContext===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Context|Context]] context&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Flip|Flip]] flip&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Effect|Effect]] effect&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Size|Size]] size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameterContextDetail===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#CameraSelect|CameraSelect]] camera&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Context|Context]] context&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Flip|Flip]] flip&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Effect|Effect]] effect&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| width&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| height&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropX0&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropY0&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropX1&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| cropY1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== y2r:u ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| [[Y2R:SetInputFormat|SetInputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[Y2R:GetInputFormat|GetInputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| [[Y2R:SetOutputFormat|SetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[Y2R:GetOutputFormat|GetOutputFormat]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| [[Y2R:SetRotation|SetRotation]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| [[Y2R:GetRotation|GetRotation]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[Y2R:SetBlockAlignment|SetBlockAlignment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| [[Y2R:GetBlockAlignment|GetBlockAlignment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[Y2R:SetSpacialDithering|SetSpacialDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| [[Y2R:GetSpacialDithering|GetSpacialDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| [[Y2R:SetTemporalDithering|SetTemporalDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| [[Y2R:GetTemporalDithering|GetTemporalDithering]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[Y2R:SetTransferEndInterrupt|SetTransferEndInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[Y2R:GetTransferEndInterrupt|GetTransferEndInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| [[Y2R:GetTransferEndEvent|GetTransferEndEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100102&lt;br /&gt;
| [[Y2R:SetSendingY|SetSendingY]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110102&lt;br /&gt;
| [[Y2R:SetSendingU|SetSendingU]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120102&lt;br /&gt;
| [[Y2R:SetSendingV|SetSendingV]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130102&lt;br /&gt;
| [[Y2R:SetSendingYuv|SetSendingYuv]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[Y2R:IsFinishedSendingYuv|IsFinishedSendingYuv]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150000&lt;br /&gt;
| [[Y2R:IsFinishedSendingY|IsFinishedSendingY]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| [[Y2R:IsFinishedSendingU|IsFinishedSendingU]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170000&lt;br /&gt;
| [[Y2R:IsFinishedSendingV|IsFinishedSendingV]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180102&lt;br /&gt;
| [[Y2R:SetReceiving|SetReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190000&lt;br /&gt;
| [[Y2R:IsFinishedReceiving|IsFinishedReceiving]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0040&lt;br /&gt;
| [[Y2R:SetInputLineWidth|SetInputLineWidth]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0000&lt;br /&gt;
| [[Y2R:GetInputLineWidth|GetInputLineWidth]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0040&lt;br /&gt;
| [[Y2R:SetInputLines|SetInputLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0000&lt;br /&gt;
| [[Y2R:GetInputLines|GetInputLines]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0100&lt;br /&gt;
| [[Y2R:SetCoefficientParams|SetCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0000&lt;br /&gt;
| [[Y2R:GetCoefficientParams|GetCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200040&lt;br /&gt;
| [[Y2R:SetStandardCoefficient|SetStandardCoefficient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210040&lt;br /&gt;
| [[Y2R:GetStandardCoefficientParams|GetStandardCoefficientParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220040&lt;br /&gt;
| [[Y2R:SetAlpha|SetAlpha]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| [[Y2R:GetAlpha|GetAlpha]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240200&lt;br /&gt;
| [[Y2R:SetDitheringWeightParams|SetDitheringWeightParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| [[Y2R:GetDitheringWeightParams|GetDitheringWeightParams]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| [[Y2R:StartConversion|StartConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| [[Y2R:StopConversion|StopConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| [[Y2R:IsBusyConversion|IsBusyConversion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002901C0&lt;br /&gt;
| [[Y2R:SetPackageParameter|SetPackageParameter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| [[Y2R:PingProcess|PingProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| [[Y2R:DriverInitialize|DriverInitialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| [[Y2R:DriverFinalize|DriverFinalize]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[Y2R:GetPackageParameter|GetPackageParameter]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===InputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_INDIV_8&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV420_INDIV_8&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_INDIV_16&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV420_INDIV_16&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| INPUT_YUV422_BATCH&lt;br /&gt;
| 0x4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OutputFormat===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_32&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_24&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_16_555&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_RGB_16_565&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rotation===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_NONE&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_90&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_180&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| ROTATION_CLOCKWISE_270&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BlockAlignment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enum&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLOCK_LINE&lt;br /&gt;
| 0x0&lt;br /&gt;
| Output buffer&#039;s pixels are arranged linearly. Used when outputting to the framebuffer.&lt;br /&gt;
|-&lt;br /&gt;
| BLOCK_8_BY_8&lt;br /&gt;
| 0x1&lt;br /&gt;
| Output buffer&#039;s pixels are morton swizzled. Used when outputting to a GPU texture.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CoefficientParams===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| Y_A&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| R_V&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_V&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_U&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| B_U&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| R_Offset&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| G_Offset&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| B_Offset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===StandardCoefficient===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Enum&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_601&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_709&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_601_SCALING&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| COEFFICIENT_ITU_R_BT_709_SCALING&lt;br /&gt;
| 0x3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===DitheringWeightParams===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w0_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w1_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w2_xOdd_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xEven_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xOdd_yEven&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xEven_yOdd&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| w3_xOdd_yOdd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PackageParameter===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#InputFormat|InputFormat]] inputFormat&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#OutputFormat_2|OutputFormat]] outputFormat&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#Rotation|Rotation]] rotation&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#BlockAlignment|BlockAlignment]] blockAlignment&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| inputLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| inputLines&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| [[Camera_Services#StandardCoefficient|StandardCoefficient]] standardCoefficient&lt;br /&gt;
|-&lt;br /&gt;
| u8&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| s16&lt;br /&gt;
| alpha&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21301</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21301"/>
		<updated>2020-06-15T04:41:15Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */ Generated using corgi3ds&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Published by&lt;br /&gt;
!  Subscribed by&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| &lt;br /&gt;
| Not Needed&lt;br /&gt;
| This indicates that the recipient must terminate.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| PTM&lt;br /&gt;
| NS&lt;br /&gt;
| Signaled on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x102&lt;br /&gt;
| PTM&lt;br /&gt;
| NS&lt;br /&gt;
| Sleep Mode related? &lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| PTM&lt;br /&gt;
| NS, CSND, NWM, AC, NIM&lt;br /&gt;
| Fired on sleep mode entry (Kernel state is modified by PTM after publishing this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| PTM&lt;br /&gt;
| &lt;br /&gt;
| This indicates that the system is entering sleep mode. (Kernel state is modified by PTM before publishing this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| PTM&lt;br /&gt;
| NS, DSP, CSND, GSP, CODEC, CAMERA, HID, QTM, MIC, IR, NWM, FRIENDS, AC, CECD, ACT, NDM, NIM&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| PTM&lt;br /&gt;
| NS, MIC, AC, NEWS, CECD, BOSS&lt;br /&gt;
| Fired after sleep mode exit.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| PTM&lt;br /&gt;
| NWM, CECD, BOSS, NDM, NIM, NEWS&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| PTM&lt;br /&gt;
| GSP, QTM&lt;br /&gt;
| System is going to Power Down.&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| CFG&lt;br /&gt;
| GSP&lt;br /&gt;
| ? &lt;br /&gt;
|-&lt;br /&gt;
| 0x10B&lt;br /&gt;
| CFG&lt;br /&gt;
| CAMERA&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| PM&lt;br /&gt;
| &lt;br /&gt;
| A Regular application has started.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| PM&lt;br /&gt;
| NS&lt;br /&gt;
| Sent on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| PM&lt;br /&gt;
| PTM, NS&lt;br /&gt;
| All processes other than PTM and NS have terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
|&lt;br /&gt;
| NS&lt;br /&gt;
| Signaled just before sleep mode is exited from.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| MCU&lt;br /&gt;
| NS&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| MCU / NWM&lt;br /&gt;
| NWM&lt;br /&gt;
| The physical Wi-Fi slider state changed&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
|&lt;br /&gt;
| MENU&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
|&lt;br /&gt;
| MENU&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
|&lt;br /&gt;
| NS, MENU&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
|&lt;br /&gt;
| NS, MENU&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
|&lt;br /&gt;
| NS, MENU&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| MCU&lt;br /&gt;
| PTM&lt;br /&gt;
| Published on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| MCU&lt;br /&gt;
| GSP&lt;br /&gt;
| Charger plugged out.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| MCU&lt;br /&gt;
| GSP&lt;br /&gt;
| Charger plugged in. &lt;br /&gt;
|-&lt;br /&gt;
| 0x20F&lt;br /&gt;
| MCU&lt;br /&gt;
| &lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x8000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|- &lt;br /&gt;
| 0x210&lt;br /&gt;
| MCU&lt;br /&gt;
| &lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x4000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| PTM&lt;br /&gt;
|&lt;br /&gt;
| Battery very low (5%)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| PTM&lt;br /&gt;
|&lt;br /&gt;
| Battery low (10%)&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
|&lt;br /&gt;
| CODEC, HID, GSP, CAMERA, MIC, NDM, QTM, PTM &lt;br /&gt;
| Signaled after exiting sleep mode and early during system boot. GSP powers LCD on in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
|&lt;br /&gt;
| CODEC, HID, GSP, CAMERA, MIC, NDM, QTM, PTM.&lt;br /&gt;
| Signaled before entering sleep mode. GSP shutdowns LCD in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| AC&lt;br /&gt;
| NDM, MENU&lt;br /&gt;
| Signaled after sleep mode exit and during system boot.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| AC&lt;br /&gt;
| FRIENDS, NDM&lt;br /&gt;
| Signaled just before sleep mode is exited from.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| NWM&lt;br /&gt;
| NDM, SOCKET, FRIENDS, AC&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
|&lt;br /&gt;
| CECD, NDM&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
|&lt;br /&gt;
| CECD, NDM, SOCKET&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=SOCU:poll&amp;diff=21100</id>
		<title>SOCU:poll</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=SOCU:poll&amp;diff=21100"/>
		<updated>2019-11-24T11:05:01Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Events */ Fix values for flags and add new flags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Request=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code [0x00140084]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| nfds_t nfds&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| int timeout&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Value 0x20 (processID header)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ProcessID set by the ARM11 kernel.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| (insize&amp;lt;&amp;lt;14)  &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0x2802&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Pointer to input pollfd struct array&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following is located 0x100-bytes after the beginning of the above command buffer:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| (outsize&amp;lt;&amp;lt;14)  &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 2&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Pointer to output pollfd struct array&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Response=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Result code&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| POSIX return value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=pollfd struct=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| fd&lt;br /&gt;
| Socket handle&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| events&lt;br /&gt;
| Events to poll for (input)&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| revents&lt;br /&gt;
| Events received (output)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
Events are a bitwise set of these flags.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| POLLRDNORM&lt;br /&gt;
| Normal data can be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| POLLRDBAND&lt;br /&gt;
| Priority Band Data can be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| POLLPRI&lt;br /&gt;
| Urgent data can be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| POLLWRNORM&lt;br /&gt;
| Normal data can be written.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| POLLWRBAND&lt;br /&gt;
| Priority data can be written.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| POLLERR&lt;br /&gt;
| Socket has an error condition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| POLLHUP&lt;br /&gt;
| Socket has been disconnected.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| POLLNVAL&lt;br /&gt;
| Invalid socket handle. This is set if you use fd=-1, which is non-standard behavior.&lt;br /&gt;
|-&lt;br /&gt;
| POLLRDNORM &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; POLLRDBAND&lt;br /&gt;
| POLLIN&lt;br /&gt;
| Data can be read.&lt;br /&gt;
|-&lt;br /&gt;
| POLLWRNORM&lt;br /&gt;
| POLLOUT&lt;br /&gt;
| Data can be written.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21076</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21076"/>
		<updated>2019-10-14T12:36:58Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| This indicates that the recipient must terminate. Does not require subscription.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| Signaled to NS on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x102&lt;br /&gt;
| Sleep Mode related? Published by PTM&lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| Fired on sleep mode entry, subscribed to by NS, CSND, NWM, AC and NIM. (Kernel state is modified by PTM after publishing this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| This indicates that the system is entering sleep mode. (Kernel state is modified by PTM before publishing this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| Fired after sleep mode exit, subscribed to by NS, MIC, AC, NEWS, CECD and BOSS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| System is going to Power Down. Published by PTM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| ? (Subscribed to by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| Sent by PM after it starts a regular application.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| Sent to NS on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by NS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| This is signaled by [[NWMEXT:ControlWirelessEnabled]] and when the physical Wi-Fi slider is enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| mcu-module publishes this on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| Charger plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| Charger plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x20F&lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x8000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|- &lt;br /&gt;
| 0x210&lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x4000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
| Signaled after exiting sleep mode and early during system boot. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP powers LCD on in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
| Signaled before entering sleep mode. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP shutdowns LCD in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| Signaled after sleep mode exit and during system boot, subscribed to by NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by FRIENDS and NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| Unknown. Signaled by nwm/AC module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21075</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21075"/>
		<updated>2019-10-14T11:51:53Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */ 0x108 -&amp;gt; System is going to Power down&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| This indicates that the recipient must terminate. Does not require subscription.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| Signaled to NS on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x102&lt;br /&gt;
| Sleep Mode related? Published by PTM&lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| Fired on sleep mode entry, subscribed to by NS, CSND, NWM, AC and NIM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| This indicates that the system is entering sleep mode. (PTM:NotifySleepPreparationComplete needed for this and the following?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| Fired after sleep mode exit, subscribed to by NS, MIC, AC, NEWS, CECD and BOSS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| System is going to Power Down. Published by PTM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| ? (Subscribed to by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| Sent by PM after it starts a regular application.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| Sent to NS on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by NS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| This is signaled by [[NWMEXT:ControlWirelessEnabled]] and when the physical Wi-Fi slider is enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| mcu-module publishes this on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| Charger plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| Charger plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x20F&lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x8000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|- &lt;br /&gt;
| 0x210&lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x4000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
| Signaled after exiting sleep mode and early during system boot. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP powers LCD on in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
| Signaled before entering sleep mode. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP shutdowns LCD in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| Signaled after sleep mode exit and during system boot, subscribed to by NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by FRIENDS and NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| Unknown. Signaled by nwm/AC module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21074</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21074"/>
		<updated>2019-10-14T11:24:32Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */ Include some information about notifs 0x210 and 0x20F&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| This indicates that the recipient must terminate. Does not require subscription.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| Signaled to NS on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x102&lt;br /&gt;
| Sleep Mode related? Published by PTM&lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| Fired on sleep mode entry, subscribed to by NS, CSND, NWM, AC and NIM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| This indicates that the system is entering sleep mode. (PTM:NotifySleepPreparationComplete needed for this and the following?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| Fired after sleep mode exit, subscribed to by NS, MIC, AC, NEWS, CECD and BOSS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| error at boot?&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| ? (Subscribed to by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| Sent by PM after it starts a regular application.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| Sent to NS on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by NS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| This is signaled by [[NWMEXT:ControlWirelessEnabled]] and when the physical Wi-Fi slider is enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| mcu-module publishes this on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| Charger plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| Charger plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x20F&lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x8000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|- &lt;br /&gt;
| 0x210&lt;br /&gt;
| Published by the mcu module when (bitmask &amp;amp; 0x4000) is true. This bitmask is obtained by reading i2c register 0x10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
| Signaled after exiting sleep mode and early during system boot. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP powers LCD on in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
| Signaled before entering sleep mode. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP shutdowns LCD in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| Signaled after sleep mode exit and during system boot, subscribed to by NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by FRIENDS and NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| Unknown. Signaled by nwm/AC module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Configuration_Memory&amp;diff=21071</id>
		<title>Configuration Memory</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Configuration_Memory&amp;diff=21071"/>
		<updated>2019-10-13T12:40:06Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Shared Memory Page For ARM11 Processes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ARM11 Kernel Configuration Memory =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  NAME&lt;br /&gt;
!  PROCESS VIRTUAL ADDRESS&lt;br /&gt;
!  WIDTH&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_?&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONREVISION&lt;br /&gt;
| 0x1FF80001&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONMINOR&lt;br /&gt;
| 0x1FF80002&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONMAJOR&lt;br /&gt;
| 0x1FF80003&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| UPDATEFLAG&lt;br /&gt;
| 0x1FF80004&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| NSTID&lt;br /&gt;
| 0x1FF80008&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| SYSCOREVER&lt;br /&gt;
| 0x1FF80010&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ENVINFO&lt;br /&gt;
| 0x1FF80014&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| UNITINFO&lt;br /&gt;
| 0x1FF80015&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| PREV_FIRM&lt;br /&gt;
| 0x1FF80016&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_CTRSDKVERSION&lt;br /&gt;
| 0x1FF80018&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| APPMEMTYPE&lt;br /&gt;
| 0x1FF80030&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| APPMEMALLOC&lt;br /&gt;
| 0x1FF80040&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| SYSMEMALLOC&lt;br /&gt;
| 0x1FF80044&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| BASEMEMALLOC&lt;br /&gt;
| 0x1FF80048&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_?&lt;br /&gt;
| 0x1FF80060&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONREVISION&lt;br /&gt;
| 0x1FF80061&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONMINOR&lt;br /&gt;
| 0x1FF80062&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONMAJOR&lt;br /&gt;
| 0x1FF80063&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_SYSCOREVER&lt;br /&gt;
| 0x1FF80064&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_CTRSDKVERSION&lt;br /&gt;
| 0x1FF80068&lt;br /&gt;
| 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This memory page is mapped as &amp;quot;shared device&amp;quot; (it is thus uncached) and [[Memory_layout|read-only]] for ARM11 processes. This memory and the kernel code for it only exists under NATIVE_FIRM/SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
The FIRM_* fields are by default identical to the KERNEL_* fields. However, the FIRM_* fields can be overridden via FIRM-launch parameters, see [[FIRM|here]].&lt;br /&gt;
&lt;br /&gt;
Besides mem-region related fields, the data written here by the old 3DS/new 3DS kernels is identical.&lt;br /&gt;
&lt;br /&gt;
= Shared Memory Page For ARM11 Processes =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  NAME&lt;br /&gt;
!  PROCESS VIRTUAL ADDRESS&lt;br /&gt;
!  WIDTH&lt;br /&gt;
|-&lt;br /&gt;
| bit0 selects DATETIME_0 or DATETIME_1.&lt;br /&gt;
| 0x1FF81000&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RUNNING_HW (1=product, 2=devboard, 3=debugger, 4=capture, 5=?)&lt;br /&gt;
| 0x1FF81004&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| MCU_HW_INFO&lt;br /&gt;
| 0x1FF81005&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| ? (Set by PTM) Possibe values are 2, 4, 6, 7, 8 and 9&lt;br /&gt;
| 0x1FF81006&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| DATETIME_0 {(u64)MillisecondsSinceFirstJan1900,(u64)SystemTickLastTimeThisWasUpdated,(u32)unk(set to 0xFFB0FF0 by PTM),(u32)Set to 0 by PTM,(u32)Set to 0 by PTM,(u32)set to 0 by PTM}&lt;br /&gt;
| 0x1FF81020&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| DATETIME_1&lt;br /&gt;
| 0x1FF81040&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_MACADDR&lt;br /&gt;
| 0x1FF81060&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_LINKLEVEL Ranges from 0-3; 0 stands for no or a poor network connection; 3 stands for a good connection. This corresponds with the number of wifi bars displayed by [[Home Menu]].&lt;br /&gt;
| 0x1FF81066&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_STATE The network state displayed by [[Home Menu]]. 2: Internet, 3/4/6: Local, 7: Disabled, Everything else: Enabled&lt;br /&gt;
| 0x1FF81067&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 3D_SLIDERSTATE&lt;br /&gt;
| 0x1FF81080&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 3D_LEDSTATE&lt;br /&gt;
| 0x1FF81084&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| BATTERY_LEDSTATE&lt;br /&gt;
| 0x1FF81085&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| On startup, and under certain conditions, NS will continuously call svcSleepThread(1000*1000) as long as bit0 of this field is clear. ptmInitialize() sets this after writing MCU unit info to sharedmem.&lt;br /&gt;
| 0x1FF81086&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| MENUTID&lt;br /&gt;
| 0x1FF810A0&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| ACTIVEMENUTID&lt;br /&gt;
| 0x1FF810A8&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| Signed? Headsets connected?&lt;br /&gt;
| 0x1FF810C0&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This memory page is normally read-only for ARM11 processes, write-access is [[Memory_layout|determined]] by the process exheader kernel &amp;quot;shared page writing&amp;quot; flag. It is mapped as &amp;quot;shared device&amp;quot; (it is thus uncached) in both cases.&lt;br /&gt;
&lt;br /&gt;
This memory only exists under NATIVE_FIRM/SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
= ARM11 Kernel Config Fields =&lt;br /&gt;
&lt;br /&gt;
== 0x1FF80000 / 0x1FF80060 ==&lt;br /&gt;
Unknown, this is normally value 0.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONREVISION / FIRM_VERSIONREVISION ==&lt;br /&gt;
This is the version-revision for the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONMINOR ==&lt;br /&gt;
This is the version-minor from ((title-version &amp;amp; 0x3FF) &amp;gt;&amp;gt; 4), for the currently running [[FIRM]]. The values from KERNEL_VERSIONMINOR and KERNEL_VERSIONMAJOR can be stored in applications&#039; [[NCCH#CXI|CXI]] exheader.&lt;br /&gt;
&lt;br /&gt;
== FIRM_VERSIONMINOR ==&lt;br /&gt;
This is the same as KERNEL_VERSIONMINOR. After [[AM:InstallNATIVEFIRM]] checks FIRM_SYSCOREVER, [[AM:InstallNATIVEFIRM]] then compares FIRM_VERSIONMINOR with the NATIVE_FIRM ((title-version &amp;amp; 0x3FF) &amp;gt;&amp;gt; 4), when the latter is larger than FIRM_VERSIONMINOR [[AM:InstallNATIVEFIRM]] will trigger a [[FIRM]] install.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONMAJOR / FIRM_VERSIONMAJOR ==&lt;br /&gt;
This is the version-major for the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
The kernel initializes KERNEL_VERSIONMAJOR and SYSCOREVER with the same constant value.&lt;br /&gt;
&lt;br /&gt;
== UPDATEFLAG ==&lt;br /&gt;
Normally this flag is zero. When the ARM11 kernel is booting on non-factory FIRM it will set this flag to 1, when bit0 from the data which field 0x1FF80016 is loaded from is clear, if the following [[PAD]] buttons are pressed: L, R, A, Up. When this flag is set, [[NS]] will launch the [[System_Settings#System_Updater|System Updater]] title instead of [[Home Menu]].&lt;br /&gt;
&lt;br /&gt;
== NSTID ==&lt;br /&gt;
This field contains the titleID of the first title to launch from CTR-NAND after the [[FIRM]] system processes are loaded. The [[Process_Manager_Services|PM]] module launches this title. If this field titleID is all-zero, the system will not attempt to launch the title. The regular ARM11 kernel sets this to the regular [[NS]] titleID, while the SAFE_MODE ARM11 kernel sets this to the SAFE_MODE NS titleID. The factory FIRM ARM11-kernel sets this to the NS TID from [[Factory_Setup|here]].&lt;br /&gt;
&lt;br /&gt;
== SYSCOREVER ==&lt;br /&gt;
This field is initialized by the ARM11 kernel, this is the programID-low of the running FIRM. When launching [[NCCH#CXI|CXIs]], the value stored here must match the core version field stored in the CXI exheader. If they do not match, the [[Process_Manager_Services|PM]] module will refuse to launch the ARM11 process.&lt;br /&gt;
&lt;br /&gt;
With [[Factory_Setup|factory]] NATIVE_FIRM, this is set to 0x0, even though the FIRM programID-low is 0x2. However, the factory system-titles have core-version set to 0x2. Hence, this config-mem SYSCOREVER field might not be used by factory system processes?&lt;br /&gt;
&lt;br /&gt;
== FIRM_SYSCOREVER ==&lt;br /&gt;
Normally this is the same as SYSCOREVER. This used by [[AM:InstallNATIVEFIRM]] for comparing with the NATIVE_FIRM titleID-low. When the low u8 from the NATIVE_FIRM titleID-low is larger than FIRMSYSCOREVER, [[AM:InstallNATIVEFIRM]] will trigger FIRM installing. When that u8 is not larger than FIRM_SYSCOREVER, and these two values don&#039;t match, [[AM:InstallNATIVEFIRM]] will return an error.&lt;br /&gt;
&lt;br /&gt;
== ENVINFO ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bit&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Clear for developer unit, set for retail.(See 0x1FF80015)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| IsJtagConnected&lt;br /&gt;
|-&lt;br /&gt;
| 2-7&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bit1 in this field is set by the ARM11 kernel when ARM debug CP14 DSCR bit14 is set (halting debug-mode enabled). [[NS]] loads the menu TID from MENUTID when bits 1-7 of this field are clear. [[ErrDisp]] will display development error info when bit0 is clear.&lt;br /&gt;
&lt;br /&gt;
== UNITINFO ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Value&lt;br /&gt;
!  Boot Env&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Prod&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Dev&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Debugger&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Firm&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The ARM11 loads the value of [[CONFIG_Registers#CFG_UNITINFO|CFG_UNITINFO]] from 0x1FFFFFF0+1 during startup, which is written by the ARM9 during ARM9&amp;lt;&amp;gt;ARM11 kernel sync.&lt;br /&gt;
&lt;br /&gt;
When this field is zero, bit0 for ENVINFO is set for retail. When this field is non-zero, bit0 for ENVINFO is clear for dev/debug units, and an ARM11 kernel state flag which enables debugging is set. JTAG is only enabled for debugger and &amp;quot;firm&amp;quot; modes (bit1).&lt;br /&gt;
&lt;br /&gt;
== PREV_FIRM ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Cold Boot&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Reset from CTR mode&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Reset from TWL mode&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Reset from NTR mode&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Reset from AGB mode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The ARM11 loads this value from 0x1FFFFFF0+2 during startup, which is written by the ARM9 during ARM9&amp;lt;&amp;gt;ARM11 kernel sync.&lt;br /&gt;
&lt;br /&gt;
This originates from the low 8-bits of register [[CONFIG|0x10010000]]. When bit0 is set, the ARM11 kernel will not set the UPDATEFLAG to value 1.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_CTRSDKVERSION / FIRM_CTRSDKVERSION ==&lt;br /&gt;
This is the CTR-SDK version which was used to build the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
== APPMEMTYPE ==&lt;br /&gt;
The value of this field determines the size for APPMEMALLOC. The retail type(value0) is used when the type is not values 2-5. See [[Memory_layout]] for the table of values for this and the mem-region sizes.&lt;br /&gt;
&lt;br /&gt;
== APPMEMALLOC ==&lt;br /&gt;
This contains the total size of the memory that can be allocated with the APPLICATION [[SVC|memory-region]], see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
== SYSMEMALLOC ==&lt;br /&gt;
Same as APPMEMALLOC except for the SYSTEM mem-region, see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
== BASEMEMALLOC ==&lt;br /&gt;
Same as APPMEMALLOC except for the BASE mem-region, see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
= Shared Memory Page Fields =&lt;br /&gt;
&lt;br /&gt;
== WIFI_MACADDR ==&lt;br /&gt;
This is the WiFi MAC address for the 3DS. This is initialized by the [[NWM_Services|NWM]] module, it&#039;s unknown where the MAC address written here was originally loaded from.&lt;br /&gt;
&lt;br /&gt;
== 3D_SLIDERSTATE ==&lt;br /&gt;
This float contains the state of the 3D slider. The range of this float is value 0.0f for &amp;quot;off&amp;quot;, and 1.0f for max.&lt;br /&gt;
&lt;br /&gt;
This is written/updated by [[HID_Services|HID]] module.&lt;br /&gt;
&lt;br /&gt;
== 3D_LEDSTATE ==&lt;br /&gt;
When non-zero, the 3D LED is disabled. See [[GSPGPU:SetLedForceOff]].&lt;br /&gt;
&lt;br /&gt;
== BATTERY_LEDSTATE ==&lt;br /&gt;
Bit[0] is set when the adapter is connected. Bit[1] is set when the battery is charging. Bit[2:4] is the value of [[PTM:GetBatteryLevel|battery level]]. If the connection bit is set but the charging bit is clear, it means the battery is already fully charged but still with adapter connected.&lt;br /&gt;
&lt;br /&gt;
== MENUTID ==&lt;br /&gt;
Unknown, contains the menu TID (used by [[NS]])&lt;br /&gt;
&lt;br /&gt;
== ACTIVEMENUTID ==&lt;br /&gt;
This contains the titleID of the currently running menu launched by [[NS]].&lt;br /&gt;
&lt;br /&gt;
= NATIVE_FIRM Versions =&lt;br /&gt;
&lt;br /&gt;
See [[FIRM#NATIVE_FIRM|FIRM]].&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21067</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21067"/>
		<updated>2019-10-08T07:38:03Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| This indicates that the recipient must terminate. Does not require subscription.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| Signaled to NS on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x102&lt;br /&gt;
| Sleep Mode related? Published by PTM&lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| Fired on sleep mode entry, subscribed to by NS, CSND, NWM, AC and NIM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| This indicates that the system is entering sleep mode. (PTM:NotifySleepPreparationComplete needed for this and the following?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| Fired after sleep mode exit, subscribed to by NS, MIC, AC, NEWS, CECD and BOSS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| error at boot?&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| ? (Subscribed to by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| Sent by PM after it starts a regular application.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| Sent to NS on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by NS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| This is signaled by [[NWMEXT:ControlWirelessEnabled]] and when the physical Wi-Fi slider is enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| mcu-module publishes this on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| Charger plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| Charger plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
| Signaled after exiting sleep mode and early during system boot. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP powers LCD on in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
| Signaled before entering sleep mode. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP shutdowns LCD in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| Signaled after sleep mode exit and during system boot, subscribed to by NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by FRIENDS and NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| Unknown. Signaled by nwm/AC module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21066</id>
		<title>MCU Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21066"/>
		<updated>2019-10-08T06:10:27Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MCU service &amp;quot;mcu::RTC&amp;quot; */ 0x2E0000 -&amp;gt; SetPowerModeIndicatorState&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Only one session can be open per service at a time. If a session is already open for a service, MCU module will wait for the thread handling the session to terminate(triggered by the session being closed by the user process), then it accepts the new session. The commands for each service are handled by separate threads.&lt;br /&gt;
&lt;br /&gt;
=MCU camera service &amp;quot;mcu::CAM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| WriteCameraLedState (writes i2c register 0x2B)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| ReadCameraLedState (reads i2c register 0x2B)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU GPU service &amp;quot;mcu::GPU&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetLcdPowerState. This writes the value of I2C-MCU register 0xf bit6 to u8 cmdreply[2], and the value of bit5 from that register to u8 cmdreply[3].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| SetLcdPowerState. This writes the upper LCD bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetGpuLcdInterfaceState. This writes the value of I2C-MCU register 0xf bit7 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| SetGpuLcdInterfaceState. This writes the lower two bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| GetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080080&lt;br /&gt;
| GetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| GetMcuFwVerHigh. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| GetMcuFwVerLow. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| Set3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| Get3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuGpuEventHandle. Event handle written to TLS+0x8c. MCU notifications 24 to 29 signal this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetMcuGpuEventReason. Writes some value to TLS+0x88. Called by GSP module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU HID service &amp;quot;mcu::HID&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| ??? test register 0x40 bit0, and writes result to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| ??? writes IPC+4 to register 0x41&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| ??? reads register 0x44 to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050080&lt;br /&gt;
| ??? writes IPC+4 to register 0x43 and IPC+8 to register 0x44&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| ReadGyroscopeValues (reads 3x s16 gyro ADC values into IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| GetRaw3DSliderPosition (u8 position in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| GetMcuHidEventHandle. MCU notifications 11 and 12 signal this. Handle is written to IPC+12&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuHidEventReason. This reads an internal flield into IPC+8 and clears it.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[MCUHID:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| EnableAccelerometerInterrupt(int enable). 1 = enable, 0 = disable accelerometer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
While before these functions are handled, the MCU interrupt with bitmask 0x800 is enabled, then after the commands were handled the MCU interrupt bits 0x1800 get cleared.&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::RTC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| [[MCURTC:SetRTC|SetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCURTC:GetRTC|GetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| SetRTCSeconds(u8 seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetRTCSeconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetRTCMinutes(u8 minutes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetRTCMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetRTCHours(u8 hours)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetRTCHours&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| SetRTCDayOfWeek(u8 dayno)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| u8 GetRTCDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| SetRTCDayOfMonth(u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| u8 GetRTCDayOfMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetRTCMonth(u8 month)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| u8 GetRTCMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| SetRTCYear(u8 year) where year = year - 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| u8 GetRTCYear where year = result + 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| SetRTCLeapYearCounter(u8 leap)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| u8 GetRTCLeapYearCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130080&lt;br /&gt;
| [[MCURTC:SetRTCAlarm|SetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[MCURTC:GetRTCAlarm|GetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150040&lt;br /&gt;
| SetRTCAlarmComponent[0] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| u8 GetRTCAlarmComponent[0]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170040&lt;br /&gt;
| SetRTCAlarmComponent[1] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| u8 GetRTCAlarmComponent[1]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190040&lt;br /&gt;
| SetRTCAlarmComponent[2] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[2]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| SetRTCAlarmComponent[3] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[3]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0040&lt;br /&gt;
| SetRTCAlarmComponent[4] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[4]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0040&lt;br /&gt;
| SetPedometerRecordingMode(u8 mode)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| u8 GetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| u8 GetStepCount (for the current day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220042&lt;br /&gt;
| ReadRegister4Fh(u32 unused_size, translation_param size=0x156 &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x156] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| void ??? writes 1 to register 0x4E which is not writable&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240000&lt;br /&gt;
| Handle GetPowerEventHandle. MCU notifications 1, 8, 9, 10, 13, 14 and 15 signal this.&lt;br /&gt;
see [[I2C_Registers#Device_3|Register 0x18]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| u32 GetPowerInterruptHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| bool CheckRegister02hBit0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| void ClearRegister02hBit0 (does nothing since the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| bool CheckRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| void ClearRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| bool GetShellState. This writes the value of I2C-MCU register 0xf bit1 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| bool GetAdapterState. This writes the value of I2C-MCU register 0xf bit3 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| bool GetBatteryChargeState. This writes the value of I2C-MCU register 0xf bit4 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[MCURTC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E0000&lt;br /&gt;
| u8 SetPowerModeIndicatorState (see [[I2C_Registers#Device_3|Register 0x29]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0000&lt;br /&gt;
| u8 GetBatteryEmptyPatternByte0_safe™&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300040&lt;br /&gt;
| SetLEDBrightness(u8 brightness) (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310000&lt;br /&gt;
| u8 GetLEDBrightness (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| void PowerOff (writes 0x1 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00330000&lt;br /&gt;
| void HardwareReboot (writes 0x4 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340000&lt;br /&gt;
| WriteRegister reg=0x23 value=0x72 (writing to read-only registers does nothing)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350000&lt;br /&gt;
| Writes 0x10 to i2c MCU device, reg 0x20 (this bit of the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| SetWatchdogTimer(u8 timer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370000&lt;br /&gt;
| u8 GetWatchdogTimer&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380042&lt;br /&gt;
| ReadI2CRegister7Fh(u32 unused_size, translation_param size &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x13] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390082&lt;br /&gt;
| WriteLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0082&lt;br /&gt;
| ReadLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0640&lt;br /&gt;
| [[MCURTC:SetInfoLEDPattern|SetInfoLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0040&lt;br /&gt;
| [[MCURTC:SetInfoLEDPatternHeader|SetInfoLEDPatternHeader]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0000&lt;br /&gt;
| [[MCURTC:GetInfoLEDStatus|GetInfoLEDStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| WriteRegister50h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0000&lt;br /&gt;
| u8 ReadRegister50h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00400040&lt;br /&gt;
| WriteRegister51h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410000&lt;br /&gt;
| u8 ReadRegister51h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| [[MCURTC:SetBatteryEmptyLEDPattern|SetBatteryEmptyLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430040&lt;br /&gt;
| SetScreenFlickerTop(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| u8 GetScreenFlickerTop&lt;br /&gt;
|-&lt;br /&gt;
| 0x00450040&lt;br /&gt;
| SetScreenFlickerBottom(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00460000&lt;br /&gt;
| u8 GetScreenFlickerBottom&lt;br /&gt;
|-&lt;br /&gt;
| 0x00470080&lt;br /&gt;
| SetVolumeSliderBounds(u8 low, u8 high) (see [[I2C_Registers#Device_3|Register 0x58]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00480000&lt;br /&gt;
| u8 low, u8 high GetVolumeSliderBounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00490040&lt;br /&gt;
| SetInterruptMask(u32 mask) (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004A0000&lt;br /&gt;
| u32 GetInterruptMask (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004B0000&lt;br /&gt;
| void ExitExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C0000&lt;br /&gt;
| void EnterExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004D0000&lt;br /&gt;
| [[MCURTC:ReadInterrupt|ReadInterrupt]] (see [[I2C_Registers#Device_3|Register 0x10]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004E0040&lt;br /&gt;
| [[MCURTC:PublishNotifications|TriggerInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x004F0040&lt;br /&gt;
| SetMCUFirmUpdated(u32 flag) used by PTM module&lt;br /&gt;
|-&lt;br /&gt;
| 0x00500000&lt;br /&gt;
| u32 IsMCUFirmUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 0x00510040&lt;br /&gt;
| [[MCURTC:SetSoftwareClosedFlag|SetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00520000&lt;br /&gt;
| [[MCURTC:GetSoftwareClosedFlag|GetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00530040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00540000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00550040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00560000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00570040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00580000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00590040&lt;br /&gt;
| [[MCURTC:SetLegacyJumpProhibitedFlag|SetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005A0000&lt;br /&gt;
| [[MCURTC:GetLegacyJumpProhibitedFlag|GetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005B0040&lt;br /&gt;
| SetUUIDClockSequence &lt;br /&gt;
|-&lt;br /&gt;
| 0x005C0000&lt;br /&gt;
| GetUUIDClockSequence&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU sound service &amp;quot;mcu::SND&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| GetSoundVolume, writes volume slider value (0-63) to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| Set...&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetRegister25h, cmdbuf[2] is 0 on n3ds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU wifi service &amp;quot;mcu::NWM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001....&lt;br /&gt;
| SetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002....&lt;br /&gt;
| GetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003....&lt;br /&gt;
| Sets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004....&lt;br /&gt;
| Gets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005....&lt;br /&gt;
| SetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006....&lt;br /&gt;
| GetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007....&lt;br /&gt;
| [[MCUNWM:SetWirelessDisabledFlag|SetWirelessDisabledFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008....&lt;br /&gt;
| [[MCUNWM:GetWirelessDisabledFlag|GetWirelessDisabledFlag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::HWC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[MCUHWC:ReadRegister|ReadRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020082&lt;br /&gt;
| [[MCUHWC:WriteRegister|WriteRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030042&lt;br /&gt;
| [[MCUHWC:GetInfoRegisters|GetInfoRegisters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[MCUHWC:GetBatteryVoltage|GetBatteryVoltage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[MCUHWC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[MCUHWC:SetPowerLEDPattern|SetPowerLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[MCUHWC:SetWifiLEDState|SetWifiLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[MCUHWC:SetCameraLEDPattern|SetCameraLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[MCUHWC:Set3DLEDState|Set3DLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0640&lt;br /&gt;
| This is the same as [[MCURTC:SetInfoLEDPattern]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[MCUHWC:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F00C0&lt;br /&gt;
| GetRtcTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| GetMcuFwVerHigh&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| GetMcuFwVerLow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::PLS&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;Beg the sysmodule to return the datetime registers in decimal form instead of as a Binary Coded Decimal&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetDatetime (returns registers 0x30-0x36 in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCUPLS:GetSeconds|GetSeconds]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| u8 GetMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetHour&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| u8 GetDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetDay&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| u8 GetMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetYear&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| u16 GetTickCounter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU codec service &amp;quot;mcu::CDC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=New3DS=&lt;br /&gt;
The Old3DS/New3DS MCU sysmodules are identical except that the MCU firmware binary written via I2C is different. The size of that binary is the same. The only different words in .text are for the version of that MCU fw binary.&lt;br /&gt;
&lt;br /&gt;
=MCU firmware versions=&lt;br /&gt;
&lt;br /&gt;
These reside in mcu sysmodule .rodata, are uploaded to MCU register 0x05 and are usually 0x4003 bytes in size (the actual firmware is 0x4000 bytes preceeded by a 3 byte magic header &amp;quot;&amp;lt;code&amp;gt;jhl&amp;lt;/code&amp;gt;&amp;quot; which switches the I2C comms into flash write mode).  &lt;br /&gt;
Switching requires register 0x05 (at address &amp;lt;code&amp;gt;0xFFBA9&amp;lt;/code&amp;gt;) to contain 0x6A (&#039;&amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;&#039;), register 0x06 containing 0x68 (&#039;&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;&#039;), and writing 0x6C (&#039;&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;&#039;) to register 0x07. The actual flashing sequence is only signaled (code at 0x3312-0x331A) when writing register 0x07, it&#039;s skipped otherwise. Register 0x07 gets written anyways, just the actual signaling is skipped if the conditions aren&#039;t met.&lt;br /&gt;
&lt;br /&gt;
Before the upload could commence, external MCU interrupts are turned off via GPIO command 0x00020080(0, 0x40000), then after the upload completed, the sysmodule waits exactly one second for the MCU to reboot, then turns external MCU interrupts back on via &amp;lt;code&amp;gt;gpio:MCU&amp;lt;/code&amp;gt; command 0x00020080(0x40000, 0x40000).&lt;br /&gt;
&lt;br /&gt;
There exists an alternate code path in very old MCU_FIRM versions where uploading is done using register 0x3B (if register 0x0F is zero and 0x10 is 1). Register 0x3B is part of the RTC alarm registers on recent versions of MCU.&lt;br /&gt;
&lt;br /&gt;
On dev-units, the user-facing representation of this firmware version is displayed by first subtracting 0x10 from the major field (raw register 0x00). It is these user-facing versions that are displayed in the table below. It is unknown what bit4 (0x10) actually represents, but it is seemingly always set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Title version&lt;br /&gt;
!  Firmware&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v9216 (New2DSXL)&lt;br /&gt;
| 3.65&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v8192/safe v9217 (latest)&lt;br /&gt;
| 3.56&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v6145 to v8192 (latest)&lt;br /&gt;
| 2.37&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v5122&lt;br /&gt;
| 2.35&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v4102&lt;br /&gt;
| 2.30&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v3072&lt;br /&gt;
| 2.16&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v2048&lt;br /&gt;
| 1.52&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v1026&lt;br /&gt;
| 1.51&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v0/safe v0&lt;br /&gt;
| 1.20&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS factory&lt;br /&gt;
| 1.07&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21065</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=21065"/>
		<updated>2019-10-08T05:39:15Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */ Add notif 0x102&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| This indicates that the recipient must terminate. Does not require subscription.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| Signaled to NS on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x102&lt;br /&gt;
| Sleep Mode related? Published by PTM&lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| Fired on sleep mode entry, subscribed to by NS, CSND, NWM, AC and NIM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| This indicates that the system is entering sleep mode. (PTM:NotifySleepPreparationComplete needed for this and the following?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| Fired after sleep mode exit, subscribed to by NS, MIC, AC, NEWS, CECD and BOSS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| error at boot?&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| ? (Subscribed to by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| Sent by PM after it starts a regular application.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| Sent to NS on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by NS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| This is signaled by [[NWMEXT:ControlWirelessEnabled]] and when the physical Wi-Fi slider is enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| mcu-module publishes this on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| Charger plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| Charger plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
| Signaled after exiting sleep mode and early during system boot. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP powers LCD on in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
| Signaled before entering sleep mode. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP shutdowns LCD in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| Signaled after sleep mode exit and during system boot, subscribed to by NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by FRIENDS and NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| Unknown. Signaled by nwm/AC module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Configuration_Memory&amp;diff=21064</id>
		<title>Configuration Memory</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Configuration_Memory&amp;diff=21064"/>
		<updated>2019-10-08T04:52:58Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Shared Memory Page For ARM11 Processes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ARM11 Kernel Configuration Memory =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  NAME&lt;br /&gt;
!  PROCESS VIRTUAL ADDRESS&lt;br /&gt;
!  WIDTH&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_?&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONREVISION&lt;br /&gt;
| 0x1FF80001&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONMINOR&lt;br /&gt;
| 0x1FF80002&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONMAJOR&lt;br /&gt;
| 0x1FF80003&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| UPDATEFLAG&lt;br /&gt;
| 0x1FF80004&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| NSTID&lt;br /&gt;
| 0x1FF80008&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| SYSCOREVER&lt;br /&gt;
| 0x1FF80010&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ENVINFO&lt;br /&gt;
| 0x1FF80014&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| UNITINFO&lt;br /&gt;
| 0x1FF80015&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| PREV_FIRM&lt;br /&gt;
| 0x1FF80016&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_CTRSDKVERSION&lt;br /&gt;
| 0x1FF80018&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| APPMEMTYPE&lt;br /&gt;
| 0x1FF80030&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| APPMEMALLOC&lt;br /&gt;
| 0x1FF80040&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| SYSMEMALLOC&lt;br /&gt;
| 0x1FF80044&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| BASEMEMALLOC&lt;br /&gt;
| 0x1FF80048&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_?&lt;br /&gt;
| 0x1FF80060&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONREVISION&lt;br /&gt;
| 0x1FF80061&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONMINOR&lt;br /&gt;
| 0x1FF80062&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONMAJOR&lt;br /&gt;
| 0x1FF80063&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_SYSCOREVER&lt;br /&gt;
| 0x1FF80064&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_CTRSDKVERSION&lt;br /&gt;
| 0x1FF80068&lt;br /&gt;
| 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This memory page is mapped as &amp;quot;shared device&amp;quot; (it is thus uncached) and [[Memory_layout|read-only]] for ARM11 processes. This memory and the kernel code for it only exists under NATIVE_FIRM/SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
The FIRM_* fields are by default identical to the KERNEL_* fields. However, the FIRM_* fields can be overridden via FIRM-launch parameters, see [[FIRM|here]].&lt;br /&gt;
&lt;br /&gt;
Besides mem-region related fields, the data written here by the old 3DS/new 3DS kernels is identical.&lt;br /&gt;
&lt;br /&gt;
= Shared Memory Page For ARM11 Processes =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  NAME&lt;br /&gt;
!  PROCESS VIRTUAL ADDRESS&lt;br /&gt;
!  WIDTH&lt;br /&gt;
|-&lt;br /&gt;
| bit0 selects DATETIME_0 or DATETIME_1.&lt;br /&gt;
| 0x1FF81000&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RUNNING_HW (1=product, 2=devboard, 3=debugger, 4=capture, 5=?)&lt;br /&gt;
| 0x1FF81004&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| MCU_HW_INFO&lt;br /&gt;
| 0x1FF81005&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| ? (Set by PTM) Possibe values are 2, 4, 6, 7, 8 and 9&lt;br /&gt;
| 0x1FF81006&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| DATETIME_0 {(u64)MillisecondsSinceFirstJan1900,(u64)SystemTickLastTimeThisWasUpdated,(u32)unk,(u32)unk,(u32)unk,(u32)unk}&lt;br /&gt;
| 0x1FF81020&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| DATETIME_1&lt;br /&gt;
| 0x1FF81040&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_MACADDR&lt;br /&gt;
| 0x1FF81060&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_LINKLEVEL Ranges from 0-3; 0 stands for no or a poor network connection; 3 stands for a good connection. This corresponds with the number of wifi bars displayed by [[Home Menu]].&lt;br /&gt;
| 0x1FF81066&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_STATE The network state displayed by [[Home Menu]]. 2: Internet, 3/4/6: Local, 7: Disabled, Everything else: Enabled&lt;br /&gt;
| 0x1FF81067&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 3D_SLIDERSTATE&lt;br /&gt;
| 0x1FF81080&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 3D_LEDSTATE&lt;br /&gt;
| 0x1FF81084&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| BATTERY_LEDSTATE&lt;br /&gt;
| 0x1FF81085&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| On startup, and under certain conditions, NS will continuously call svcSleepThread(1000*1000) as long as bit0 of this field is clear. ptmInitialize() sets this after writing MCU unit info to sharedmem.&lt;br /&gt;
| 0x1FF81086&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| MENUTID&lt;br /&gt;
| 0x1FF810A0&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| ACTIVEMENUTID&lt;br /&gt;
| 0x1FF810A8&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| Signed? Headsets connected?&lt;br /&gt;
| 0x1FF810C0&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This memory page is normally read-only for ARM11 processes, write-access is [[Memory_layout|determined]] by the process exheader kernel &amp;quot;shared page writing&amp;quot; flag. It is mapped as &amp;quot;shared device&amp;quot; (it is thus uncached) in both cases.&lt;br /&gt;
&lt;br /&gt;
This memory only exists under NATIVE_FIRM/SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
= ARM11 Kernel Config Fields =&lt;br /&gt;
&lt;br /&gt;
== 0x1FF80000 / 0x1FF80060 ==&lt;br /&gt;
Unknown, this is normally value 0.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONREVISION / FIRM_VERSIONREVISION ==&lt;br /&gt;
This is the version-revision for the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONMINOR ==&lt;br /&gt;
This is the version-minor from ((title-version &amp;amp; 0x3FF) &amp;gt;&amp;gt; 4), for the currently running [[FIRM]]. The values from KERNEL_VERSIONMINOR and KERNEL_VERSIONMAJOR can be stored in applications&#039; [[NCCH#CXI|CXI]] exheader.&lt;br /&gt;
&lt;br /&gt;
== FIRM_VERSIONMINOR ==&lt;br /&gt;
This is the same as KERNEL_VERSIONMINOR. After [[AM:InstallNATIVEFIRM]] checks FIRM_SYSCOREVER, [[AM:InstallNATIVEFIRM]] then compares FIRM_VERSIONMINOR with the NATIVE_FIRM ((title-version &amp;amp; 0x3FF) &amp;gt;&amp;gt; 4), when the latter is larger than FIRM_VERSIONMINOR [[AM:InstallNATIVEFIRM]] will trigger a [[FIRM]] install.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONMAJOR / FIRM_VERSIONMAJOR ==&lt;br /&gt;
This is the version-major for the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
The kernel initializes KERNEL_VERSIONMAJOR and SYSCOREVER with the same constant value.&lt;br /&gt;
&lt;br /&gt;
== UPDATEFLAG ==&lt;br /&gt;
Normally this flag is zero. When the ARM11 kernel is booting on non-factory FIRM it will set this flag to 1, when bit0 from the data which field 0x1FF80016 is loaded from is clear, if the following [[PAD]] buttons are pressed: L, R, A, Up. When this flag is set, [[NS]] will launch the [[System_Settings#System_Updater|System Updater]] title instead of [[Home Menu]].&lt;br /&gt;
&lt;br /&gt;
== NSTID ==&lt;br /&gt;
This field contains the titleID of the first title to launch from CTR-NAND after the [[FIRM]] system processes are loaded. The [[Process_Manager_Services|PM]] module launches this title. If this field titleID is all-zero, the system will not attempt to launch the title. The regular ARM11 kernel sets this to the regular [[NS]] titleID, while the SAFE_MODE ARM11 kernel sets this to the SAFE_MODE NS titleID. The factory FIRM ARM11-kernel sets this to the NS TID from [[Factory_Setup|here]].&lt;br /&gt;
&lt;br /&gt;
== SYSCOREVER ==&lt;br /&gt;
This field is initialized by the ARM11 kernel, this is the programID-low of the running FIRM. When launching [[NCCH#CXI|CXIs]], the value stored here must match the core version field stored in the CXI exheader. If they do not match, the [[Process_Manager_Services|PM]] module will refuse to launch the ARM11 process.&lt;br /&gt;
&lt;br /&gt;
With [[Factory_Setup|factory]] NATIVE_FIRM, this is set to 0x0, even though the FIRM programID-low is 0x2. However, the factory system-titles have core-version set to 0x2. Hence, this config-mem SYSCOREVER field might not be used by factory system processes?&lt;br /&gt;
&lt;br /&gt;
== FIRM_SYSCOREVER ==&lt;br /&gt;
Normally this is the same as SYSCOREVER. This used by [[AM:InstallNATIVEFIRM]] for comparing with the NATIVE_FIRM titleID-low. When the low u8 from the NATIVE_FIRM titleID-low is larger than FIRMSYSCOREVER, [[AM:InstallNATIVEFIRM]] will trigger FIRM installing. When that u8 is not larger than FIRM_SYSCOREVER, and these two values don&#039;t match, [[AM:InstallNATIVEFIRM]] will return an error.&lt;br /&gt;
&lt;br /&gt;
== ENVINFO ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bit&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Clear for developer unit, set for retail.(See 0x1FF80015)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| IsJtagConnected&lt;br /&gt;
|-&lt;br /&gt;
| 2-7&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bit1 in this field is set by the ARM11 kernel when ARM debug CP14 DSCR bit14 is set (halting debug-mode enabled). [[NS]] loads the menu TID from MENUTID when bits 1-7 of this field are clear. [[ErrDisp]] will display development error info when bit0 is clear.&lt;br /&gt;
&lt;br /&gt;
== UNITINFO ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Value&lt;br /&gt;
!  Boot Env&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Prod&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Dev&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Debugger&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Firm&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The ARM11 loads the value of [[CONFIG_Registers#CFG_UNITINFO|CFG_UNITINFO]] from 0x1FFFFFF0+1 during startup, which is written by the ARM9 during ARM9&amp;lt;&amp;gt;ARM11 kernel sync.&lt;br /&gt;
&lt;br /&gt;
When this field is zero, bit0 for ENVINFO is set for retail. When this field is non-zero, bit0 for ENVINFO is clear for dev/debug units, and an ARM11 kernel state flag which enables debugging is set. JTAG is only enabled for debugger and &amp;quot;firm&amp;quot; modes (bit1).&lt;br /&gt;
&lt;br /&gt;
== PREV_FIRM ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Cold Boot&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Reset from CTR mode&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Reset from TWL mode&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Reset from NTR mode&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Reset from AGB mode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The ARM11 loads this value from 0x1FFFFFF0+2 during startup, which is written by the ARM9 during ARM9&amp;lt;&amp;gt;ARM11 kernel sync.&lt;br /&gt;
&lt;br /&gt;
This originates from the low 8-bits of register [[CONFIG|0x10010000]]. When bit0 is set, the ARM11 kernel will not set the UPDATEFLAG to value 1.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_CTRSDKVERSION / FIRM_CTRSDKVERSION ==&lt;br /&gt;
This is the CTR-SDK version which was used to build the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
== APPMEMTYPE ==&lt;br /&gt;
The value of this field determines the size for APPMEMALLOC. The retail type(value0) is used when the type is not values 2-5. See [[Memory_layout]] for the table of values for this and the mem-region sizes.&lt;br /&gt;
&lt;br /&gt;
== APPMEMALLOC ==&lt;br /&gt;
This contains the total size of the memory that can be allocated with the APPLICATION [[SVC|memory-region]], see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
== SYSMEMALLOC ==&lt;br /&gt;
Same as APPMEMALLOC except for the SYSTEM mem-region, see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
== BASEMEMALLOC ==&lt;br /&gt;
Same as APPMEMALLOC except for the BASE mem-region, see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
= Shared Memory Page Fields =&lt;br /&gt;
&lt;br /&gt;
== WIFI_MACADDR ==&lt;br /&gt;
This is the WiFi MAC address for the 3DS. This is initialized by the [[NWM_Services|NWM]] module, it&#039;s unknown where the MAC address written here was originally loaded from.&lt;br /&gt;
&lt;br /&gt;
== 3D_SLIDERSTATE ==&lt;br /&gt;
This float contains the state of the 3D slider. The range of this float is value 0.0f for &amp;quot;off&amp;quot;, and 1.0f for max.&lt;br /&gt;
&lt;br /&gt;
This is written/updated by [[HID_Services|HID]] module.&lt;br /&gt;
&lt;br /&gt;
== 3D_LEDSTATE ==&lt;br /&gt;
When non-zero, the 3D LED is disabled. See [[GSPGPU:SetLedForceOff]].&lt;br /&gt;
&lt;br /&gt;
== BATTERY_LEDSTATE ==&lt;br /&gt;
Bit[0] is set when the adapter is connected. Bit[1] is set when the battery is charging. Bit[2:4] is the value of [[PTM:GetBatteryLevel|battery level]]. If the connection bit is set but the charging bit is clear, it means the battery is already fully charged but still with adapter connected.&lt;br /&gt;
&lt;br /&gt;
== MENUTID ==&lt;br /&gt;
Unknown, contains the menu TID (used by [[NS]])&lt;br /&gt;
&lt;br /&gt;
== ACTIVEMENUTID ==&lt;br /&gt;
This contains the titleID of the currently running menu launched by [[NS]].&lt;br /&gt;
&lt;br /&gt;
= NATIVE_FIRM Versions =&lt;br /&gt;
&lt;br /&gt;
See [[FIRM#NATIVE_FIRM|FIRM]].&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Configuration_Memory&amp;diff=21063</id>
		<title>Configuration Memory</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Configuration_Memory&amp;diff=21063"/>
		<updated>2019-10-08T04:45:28Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Shared Memory Page For ARM11 Processes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ARM11 Kernel Configuration Memory =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  NAME&lt;br /&gt;
!  PROCESS VIRTUAL ADDRESS&lt;br /&gt;
!  WIDTH&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_?&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONREVISION&lt;br /&gt;
| 0x1FF80001&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONMINOR&lt;br /&gt;
| 0x1FF80002&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_VERSIONMAJOR&lt;br /&gt;
| 0x1FF80003&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| UPDATEFLAG&lt;br /&gt;
| 0x1FF80004&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| NSTID&lt;br /&gt;
| 0x1FF80008&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| SYSCOREVER&lt;br /&gt;
| 0x1FF80010&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ENVINFO&lt;br /&gt;
| 0x1FF80014&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| UNITINFO&lt;br /&gt;
| 0x1FF80015&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| PREV_FIRM&lt;br /&gt;
| 0x1FF80016&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| KERNEL_CTRSDKVERSION&lt;br /&gt;
| 0x1FF80018&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| APPMEMTYPE&lt;br /&gt;
| 0x1FF80030&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| APPMEMALLOC&lt;br /&gt;
| 0x1FF80040&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| SYSMEMALLOC&lt;br /&gt;
| 0x1FF80044&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| BASEMEMALLOC&lt;br /&gt;
| 0x1FF80048&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_?&lt;br /&gt;
| 0x1FF80060&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONREVISION&lt;br /&gt;
| 0x1FF80061&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONMINOR&lt;br /&gt;
| 0x1FF80062&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_VERSIONMAJOR&lt;br /&gt;
| 0x1FF80063&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_SYSCOREVER&lt;br /&gt;
| 0x1FF80064&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| FIRM_CTRSDKVERSION&lt;br /&gt;
| 0x1FF80068&lt;br /&gt;
| 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This memory page is mapped as &amp;quot;shared device&amp;quot; (it is thus uncached) and [[Memory_layout|read-only]] for ARM11 processes. This memory and the kernel code for it only exists under NATIVE_FIRM/SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
The FIRM_* fields are by default identical to the KERNEL_* fields. However, the FIRM_* fields can be overridden via FIRM-launch parameters, see [[FIRM|here]].&lt;br /&gt;
&lt;br /&gt;
Besides mem-region related fields, the data written here by the old 3DS/new 3DS kernels is identical.&lt;br /&gt;
&lt;br /&gt;
= Shared Memory Page For ARM11 Processes =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  NAME&lt;br /&gt;
!  PROCESS VIRTUAL ADDRESS&lt;br /&gt;
!  WIDTH&lt;br /&gt;
|-&lt;br /&gt;
| bit0 selects DATETIME_0 or DATETIME_1.&lt;br /&gt;
| 0x1FF81000&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RUNNING_HW (1=product, 2=devboard, 3=debugger, 4=capture)&lt;br /&gt;
| 0x1FF81004&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| MCU_HW_INFO&lt;br /&gt;
| 0x1FF81005&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| ? (Set by PTM)&lt;br /&gt;
| 0x1FF81006&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| DATETIME_0 {(u64)MillisecondsSinceFirstJan1900,(u64)SystemTickLastTimeThisWasUpdated,(u32)unk,(u32)unk,(u32)unk,(u32)unk}&lt;br /&gt;
| 0x1FF81020&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| DATETIME_1&lt;br /&gt;
| 0x1FF81040&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_MACADDR&lt;br /&gt;
| 0x1FF81060&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| WIFI_LINKLEVEL Ranges from 0-3; 0 stands for no or a poor network connection; 3 stands for a good connection. This corresponds with the number of wifi bars displayed by [[Home Menu]].&lt;br /&gt;
| 0x1FF81066&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_STATE The network state displayed by [[Home Menu]]. 2: Internet, 3/4/6: Local, 7: Disabled, Everything else: Enabled&lt;br /&gt;
| 0x1FF81067&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 3D_SLIDERSTATE&lt;br /&gt;
| 0x1FF81080&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 3D_LEDSTATE&lt;br /&gt;
| 0x1FF81084&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| BATTERY_LEDSTATE&lt;br /&gt;
| 0x1FF81085&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| On startup, and under certain conditions, NS will continuously call svcSleepThread(1000*1000) as long as bit0 of this field is clear. ptmInitialize() sets this after writing MCU unit info to sharedmem.&lt;br /&gt;
| 0x1FF81086&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| MENUTID&lt;br /&gt;
| 0x1FF810A0&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| ACTIVEMENUTID&lt;br /&gt;
| 0x1FF810A8&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| Signed? Headsets connected?&lt;br /&gt;
| 0x1FF810C0&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This memory page is normally read-only for ARM11 processes, write-access is [[Memory_layout|determined]] by the process exheader kernel &amp;quot;shared page writing&amp;quot; flag. It is mapped as &amp;quot;shared device&amp;quot; (it is thus uncached) in both cases.&lt;br /&gt;
&lt;br /&gt;
This memory only exists under NATIVE_FIRM/SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
= ARM11 Kernel Config Fields =&lt;br /&gt;
&lt;br /&gt;
== 0x1FF80000 / 0x1FF80060 ==&lt;br /&gt;
Unknown, this is normally value 0.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONREVISION / FIRM_VERSIONREVISION ==&lt;br /&gt;
This is the version-revision for the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONMINOR ==&lt;br /&gt;
This is the version-minor from ((title-version &amp;amp; 0x3FF) &amp;gt;&amp;gt; 4), for the currently running [[FIRM]]. The values from KERNEL_VERSIONMINOR and KERNEL_VERSIONMAJOR can be stored in applications&#039; [[NCCH#CXI|CXI]] exheader.&lt;br /&gt;
&lt;br /&gt;
== FIRM_VERSIONMINOR ==&lt;br /&gt;
This is the same as KERNEL_VERSIONMINOR. After [[AM:InstallNATIVEFIRM]] checks FIRM_SYSCOREVER, [[AM:InstallNATIVEFIRM]] then compares FIRM_VERSIONMINOR with the NATIVE_FIRM ((title-version &amp;amp; 0x3FF) &amp;gt;&amp;gt; 4), when the latter is larger than FIRM_VERSIONMINOR [[AM:InstallNATIVEFIRM]] will trigger a [[FIRM]] install.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_VERSIONMAJOR / FIRM_VERSIONMAJOR ==&lt;br /&gt;
This is the version-major for the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
The kernel initializes KERNEL_VERSIONMAJOR and SYSCOREVER with the same constant value.&lt;br /&gt;
&lt;br /&gt;
== UPDATEFLAG ==&lt;br /&gt;
Normally this flag is zero. When the ARM11 kernel is booting on non-factory FIRM it will set this flag to 1, when bit0 from the data which field 0x1FF80016 is loaded from is clear, if the following [[PAD]] buttons are pressed: L, R, A, Up. When this flag is set, [[NS]] will launch the [[System_Settings#System_Updater|System Updater]] title instead of [[Home Menu]].&lt;br /&gt;
&lt;br /&gt;
== NSTID ==&lt;br /&gt;
This field contains the titleID of the first title to launch from CTR-NAND after the [[FIRM]] system processes are loaded. The [[Process_Manager_Services|PM]] module launches this title. If this field titleID is all-zero, the system will not attempt to launch the title. The regular ARM11 kernel sets this to the regular [[NS]] titleID, while the SAFE_MODE ARM11 kernel sets this to the SAFE_MODE NS titleID. The factory FIRM ARM11-kernel sets this to the NS TID from [[Factory_Setup|here]].&lt;br /&gt;
&lt;br /&gt;
== SYSCOREVER ==&lt;br /&gt;
This field is initialized by the ARM11 kernel, this is the programID-low of the running FIRM. When launching [[NCCH#CXI|CXIs]], the value stored here must match the core version field stored in the CXI exheader. If they do not match, the [[Process_Manager_Services|PM]] module will refuse to launch the ARM11 process.&lt;br /&gt;
&lt;br /&gt;
With [[Factory_Setup|factory]] NATIVE_FIRM, this is set to 0x0, even though the FIRM programID-low is 0x2. However, the factory system-titles have core-version set to 0x2. Hence, this config-mem SYSCOREVER field might not be used by factory system processes?&lt;br /&gt;
&lt;br /&gt;
== FIRM_SYSCOREVER ==&lt;br /&gt;
Normally this is the same as SYSCOREVER. This used by [[AM:InstallNATIVEFIRM]] for comparing with the NATIVE_FIRM titleID-low. When the low u8 from the NATIVE_FIRM titleID-low is larger than FIRMSYSCOREVER, [[AM:InstallNATIVEFIRM]] will trigger FIRM installing. When that u8 is not larger than FIRM_SYSCOREVER, and these two values don&#039;t match, [[AM:InstallNATIVEFIRM]] will return an error.&lt;br /&gt;
&lt;br /&gt;
== ENVINFO ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bit&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Clear for developer unit, set for retail.(See 0x1FF80015)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| IsJtagConnected&lt;br /&gt;
|-&lt;br /&gt;
| 2-7&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bit1 in this field is set by the ARM11 kernel when ARM debug CP14 DSCR bit14 is set (halting debug-mode enabled). [[NS]] loads the menu TID from MENUTID when bits 1-7 of this field are clear. [[ErrDisp]] will display development error info when bit0 is clear.&lt;br /&gt;
&lt;br /&gt;
== UNITINFO ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Value&lt;br /&gt;
!  Boot Env&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Prod&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Dev&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Debugger&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Firm&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The ARM11 loads the value of [[CONFIG_Registers#CFG_UNITINFO|CFG_UNITINFO]] from 0x1FFFFFF0+1 during startup, which is written by the ARM9 during ARM9&amp;lt;&amp;gt;ARM11 kernel sync.&lt;br /&gt;
&lt;br /&gt;
When this field is zero, bit0 for ENVINFO is set for retail. When this field is non-zero, bit0 for ENVINFO is clear for dev/debug units, and an ARM11 kernel state flag which enables debugging is set. JTAG is only enabled for debugger and &amp;quot;firm&amp;quot; modes (bit1).&lt;br /&gt;
&lt;br /&gt;
== PREV_FIRM ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Cold Boot&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Reset from CTR mode&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Reset from TWL mode&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Reset from NTR mode&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Reset from AGB mode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The ARM11 loads this value from 0x1FFFFFF0+2 during startup, which is written by the ARM9 during ARM9&amp;lt;&amp;gt;ARM11 kernel sync.&lt;br /&gt;
&lt;br /&gt;
This originates from the low 8-bits of register [[CONFIG|0x10010000]]. When bit0 is set, the ARM11 kernel will not set the UPDATEFLAG to value 1.&lt;br /&gt;
&lt;br /&gt;
== KERNEL_CTRSDKVERSION / FIRM_CTRSDKVERSION ==&lt;br /&gt;
This is the CTR-SDK version which was used to build the currently running [[FIRM]].&lt;br /&gt;
&lt;br /&gt;
== APPMEMTYPE ==&lt;br /&gt;
The value of this field determines the size for APPMEMALLOC. The retail type(value0) is used when the type is not values 2-5. See [[Memory_layout]] for the table of values for this and the mem-region sizes.&lt;br /&gt;
&lt;br /&gt;
== APPMEMALLOC ==&lt;br /&gt;
This contains the total size of the memory that can be allocated with the APPLICATION [[SVC|memory-region]], see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
== SYSMEMALLOC ==&lt;br /&gt;
Same as APPMEMALLOC except for the SYSTEM mem-region, see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
== BASEMEMALLOC ==&lt;br /&gt;
Same as APPMEMALLOC except for the BASE mem-region, see [[Memory_layout|here]].&lt;br /&gt;
&lt;br /&gt;
= Shared Memory Page Fields =&lt;br /&gt;
&lt;br /&gt;
== WIFI_MACADDR ==&lt;br /&gt;
This is the WiFi MAC address for the 3DS. This is initialized by the [[NWM_Services|NWM]] module, it&#039;s unknown where the MAC address written here was originally loaded from.&lt;br /&gt;
&lt;br /&gt;
== 3D_SLIDERSTATE ==&lt;br /&gt;
This float contains the state of the 3D slider. The range of this float is value 0.0f for &amp;quot;off&amp;quot;, and 1.0f for max.&lt;br /&gt;
&lt;br /&gt;
This is written/updated by [[HID_Services|HID]] module.&lt;br /&gt;
&lt;br /&gt;
== 3D_LEDSTATE ==&lt;br /&gt;
When non-zero, the 3D LED is disabled. See [[GSPGPU:SetLedForceOff]].&lt;br /&gt;
&lt;br /&gt;
== BATTERY_LEDSTATE ==&lt;br /&gt;
Bit[0] is set when the adapter is connected. Bit[1] is set when the battery is charging. Bit[2:4] is the value of [[PTM:GetBatteryLevel|battery level]]. If the connection bit is set but the charging bit is clear, it means the battery is already fully charged but still with adapter connected.&lt;br /&gt;
&lt;br /&gt;
== MENUTID ==&lt;br /&gt;
Unknown, contains the menu TID (used by [[NS]])&lt;br /&gt;
&lt;br /&gt;
== ACTIVEMENUTID ==&lt;br /&gt;
This contains the titleID of the currently running menu launched by [[NS]].&lt;br /&gt;
&lt;br /&gt;
= NATIVE_FIRM Versions =&lt;br /&gt;
&lt;br /&gt;
See [[FIRM#NATIVE_FIRM|FIRM]].&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21062</id>
		<title>MCU Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21062"/>
		<updated>2019-10-08T03:12:37Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MCU service &amp;quot;mcu::RTC&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Only one session can be open per service at a time. If a session is already open for a service, MCU module will wait for the thread handling the session to terminate(triggered by the session being closed by the user process), then it accepts the new session. The commands for each service are handled by separate threads.&lt;br /&gt;
&lt;br /&gt;
=MCU camera service &amp;quot;mcu::CAM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| WriteCameraLedState (writes i2c register 0x2B)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| ReadCameraLedState (reads i2c register 0x2B)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU GPU service &amp;quot;mcu::GPU&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetLcdPowerState. This writes the value of I2C-MCU register 0xf bit6 to u8 cmdreply[2], and the value of bit5 from that register to u8 cmdreply[3].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| SetLcdPowerState. This writes the upper LCD bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetGpuLcdInterfaceState. This writes the value of I2C-MCU register 0xf bit7 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| SetGpuLcdInterfaceState. This writes the lower two bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| GetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080080&lt;br /&gt;
| GetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| GetMcuFwVerHigh. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| GetMcuFwVerLow. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| Set3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| Get3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuGpuEventHandle. Event handle written to TLS+0x8c. MCU notifications 24 to 29 signal this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetMcuGpuEventReason. Writes some value to TLS+0x88. Called by GSP module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU HID service &amp;quot;mcu::HID&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| ??? test register 0x40 bit0, and writes result to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| ??? writes IPC+4 to register 0x41&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| ??? reads register 0x44 to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050080&lt;br /&gt;
| ??? writes IPC+4 to register 0x43 and IPC+8 to register 0x44&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| ReadGyroscopeValues (reads 3x s16 gyro ADC values into IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| GetRaw3DSliderPosition (u8 position in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| GetMcuHidEventHandle. MCU notifications 11 and 12 signal this. Handle is written to IPC+12&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuHidEventReason. This reads an internal flield into IPC+8 and clears it.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[MCUHID:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| EnableAccelerometerInterrupt(int enable). 1 = enable, 0 = disable accelerometer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
While before these functions are handled, the MCU interrupt with bitmask 0x800 is enabled, then after the commands were handled the MCU interrupt bits 0x1800 get cleared.&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::RTC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| [[MCURTC:SetRTC|SetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCURTC:GetRTC|GetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| SetRTCSeconds(u8 seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetRTCSeconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetRTCMinutes(u8 minutes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetRTCMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetRTCHours(u8 hours)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetRTCHours&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| SetRTCDayOfWeek(u8 dayno)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| u8 GetRTCDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| SetRTCDayOfMonth(u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| u8 GetRTCDayOfMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetRTCMonth(u8 month)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| u8 GetRTCMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| SetRTCYear(u8 year) where year = year - 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| u8 GetRTCYear where year = result + 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| SetRTCLeapYearCounter(u8 leap)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| u8 GetRTCLeapYearCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130080&lt;br /&gt;
| [[MCURTC:SetRTCAlarm|SetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[MCURTC:GetRTCAlarm|GetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150040&lt;br /&gt;
| SetRTCAlarmComponent[0] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| u8 GetRTCAlarmComponent[0]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170040&lt;br /&gt;
| SetRTCAlarmComponent[1] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| u8 GetRTCAlarmComponent[1]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190040&lt;br /&gt;
| SetRTCAlarmComponent[2] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[2]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| SetRTCAlarmComponent[3] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[3]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0040&lt;br /&gt;
| SetRTCAlarmComponent[4] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[4]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0040&lt;br /&gt;
| SetPedometerRecordingMode(u8 mode)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| u8 GetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| u8 GetStepCount (for the current day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220042&lt;br /&gt;
| ReadRegister4Fh(u32 unused_size, translation_param size=0x156 &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x156] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| void ??? writes 1 to register 0x4E which is not writable&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240000&lt;br /&gt;
| Handle GetPowerEventHandle. MCU notifications 1, 8, 9, 10, 13, 14 and 15 signal this.&lt;br /&gt;
see [[I2C_Registers#Device_3|Register 0x18]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| u32 GetPowerInterruptHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| bool CheckRegister02hBit0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| void ClearRegister02hBit0 (does nothing since the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| bool CheckRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| void ClearRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| bool GetShellState. This writes the value of I2C-MCU register 0xf bit1 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| bool GetAdapterState. This writes the value of I2C-MCU register 0xf bit3 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| bool GetBatteryChargeState. This writes the value of I2C-MCU register 0xf bit4 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[MCURTC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E0000&lt;br /&gt;
| u8 Set......&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0000&lt;br /&gt;
| u8 GetBatteryEmptyPatternByte0_safe™&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300040&lt;br /&gt;
| SetLEDBrightness(u8 brightness) (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310000&lt;br /&gt;
| u8 GetLEDBrightness (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| void PowerOff (writes 0x1 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00330000&lt;br /&gt;
| void HardwareReboot (writes 0x4 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340000&lt;br /&gt;
| WriteRegister reg=0x23 value=0x72 (writing to read-only registers does nothing)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350000&lt;br /&gt;
| Writes 0x10 to i2c MCU device, reg 0x20 (this bit of the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| SetWatchdogTimer(u8 timer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370000&lt;br /&gt;
| u8 GetWatchdogTimer&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380042&lt;br /&gt;
| ReadI2CRegister7Fh(u32 unused_size, translation_param size &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x13] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390082&lt;br /&gt;
| WriteLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0082&lt;br /&gt;
| ReadLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0640&lt;br /&gt;
| [[MCURTC:SetInfoLEDPattern|SetInfoLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0040&lt;br /&gt;
| [[MCURTC:SetInfoLEDPatternHeader|SetInfoLEDPatternHeader]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0000&lt;br /&gt;
| [[MCURTC:GetInfoLEDStatus|GetInfoLEDStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| WriteRegister50h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0000&lt;br /&gt;
| u8 ReadRegister50h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00400040&lt;br /&gt;
| WriteRegister51h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410000&lt;br /&gt;
| u8 ReadRegister51h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| [[MCURTC:SetBatteryEmptyLEDPattern|SetBatteryEmptyLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430040&lt;br /&gt;
| SetScreenFlickerTop(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| u8 GetScreenFlickerTop&lt;br /&gt;
|-&lt;br /&gt;
| 0x00450040&lt;br /&gt;
| SetScreenFlickerBottom(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00460000&lt;br /&gt;
| u8 GetScreenFlickerBottom&lt;br /&gt;
|-&lt;br /&gt;
| 0x00470080&lt;br /&gt;
| SetVolumeSliderBounds(u8 low, u8 high) (see [[I2C_Registers#Device_3|Register 0x58]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00480000&lt;br /&gt;
| u8 low, u8 high GetVolumeSliderBounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00490040&lt;br /&gt;
| SetInterruptMask(u32 mask) (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004A0000&lt;br /&gt;
| u32 GetInterruptMask (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004B0000&lt;br /&gt;
| void ExitExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C0000&lt;br /&gt;
| void EnterExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004D0000&lt;br /&gt;
| [[MCURTC:ReadInterrupt|ReadInterrupt]] (see [[I2C_Registers#Device_3|Register 0x10]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004E0040&lt;br /&gt;
| [[MCURTC:PublishNotifications|TriggerInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x004F0040&lt;br /&gt;
| SetMCUFirmUpdated(u32 flag) used by PTM module&lt;br /&gt;
|-&lt;br /&gt;
| 0x00500000&lt;br /&gt;
| u32 IsMCUFirmUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 0x00510040&lt;br /&gt;
| [[MCURTC:SetSoftwareClosedFlag|SetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00520000&lt;br /&gt;
| [[MCURTC:GetSoftwareClosedFlag|GetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00530040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00540000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00550040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00560000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00570040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00580000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00590040&lt;br /&gt;
| [[MCURTC:SetLegacyJumpProhibitedFlag|SetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005A0000&lt;br /&gt;
| [[MCURTC:GetLegacyJumpProhibitedFlag|GetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005B0040&lt;br /&gt;
| SetUUIDClockSequence &lt;br /&gt;
|-&lt;br /&gt;
| 0x005C0000&lt;br /&gt;
| GetUUIDClockSequence&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU sound service &amp;quot;mcu::SND&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| GetSoundVolume, writes volume slider value (0-63) to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| Set...&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetRegister25h, cmdbuf[2] is 0 on n3ds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU wifi service &amp;quot;mcu::NWM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001....&lt;br /&gt;
| SetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002....&lt;br /&gt;
| GetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003....&lt;br /&gt;
| Sets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004....&lt;br /&gt;
| Gets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005....&lt;br /&gt;
| SetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006....&lt;br /&gt;
| GetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007....&lt;br /&gt;
| [[MCUNWM:SetWirelessDisabledFlag|SetWirelessDisabledFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008....&lt;br /&gt;
| [[MCUNWM:GetWirelessDisabledFlag|GetWirelessDisabledFlag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::HWC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[MCUHWC:ReadRegister|ReadRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020082&lt;br /&gt;
| [[MCUHWC:WriteRegister|WriteRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030042&lt;br /&gt;
| [[MCUHWC:GetInfoRegisters|GetInfoRegisters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[MCUHWC:GetBatteryVoltage|GetBatteryVoltage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[MCUHWC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[MCUHWC:SetPowerLEDPattern|SetPowerLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[MCUHWC:SetWifiLEDState|SetWifiLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[MCUHWC:SetCameraLEDPattern|SetCameraLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[MCUHWC:Set3DLEDState|Set3DLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0640&lt;br /&gt;
| This is the same as [[MCURTC:SetInfoLEDPattern]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[MCUHWC:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F00C0&lt;br /&gt;
| GetRtcTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| GetMcuFwVerHigh&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| GetMcuFwVerLow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::PLS&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;Beg the sysmodule to return the datetime registers in decimal form instead of as a Binary Coded Decimal&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetDatetime (returns registers 0x30-0x36 in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCUPLS:GetSeconds|GetSeconds]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| u8 GetMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetHour&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| u8 GetDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetDay&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| u8 GetMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetYear&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| u16 GetTickCounter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU codec service &amp;quot;mcu::CDC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=New3DS=&lt;br /&gt;
The Old3DS/New3DS MCU sysmodules are identical except that the MCU firmware binary written via I2C is different. The size of that binary is the same. The only different words in .text are for the version of that MCU fw binary.&lt;br /&gt;
&lt;br /&gt;
=MCU firmware versions=&lt;br /&gt;
&lt;br /&gt;
These reside in mcu sysmodule .rodata, are uploaded to MCU register 0x05 and are usually 0x4003 bytes in size (the actual firmware is 0x4000 bytes preceeded by a 3 byte magic header &amp;quot;&amp;lt;code&amp;gt;jhl&amp;lt;/code&amp;gt;&amp;quot; which switches the I2C comms into flash write mode).  &lt;br /&gt;
Switching requires register 0x05 (at address &amp;lt;code&amp;gt;0xFFBA9&amp;lt;/code&amp;gt;) to contain 0x6A (&#039;&amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;&#039;), register 0x06 containing 0x68 (&#039;&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;&#039;), and writing 0x6C (&#039;&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;&#039;) to register 0x07. The actual flashing sequence is only signaled (code at 0x3312-0x331A) when writing register 0x07, it&#039;s skipped otherwise. Register 0x07 gets written anyways, just the actual signaling is skipped if the conditions aren&#039;t met.&lt;br /&gt;
&lt;br /&gt;
Before the upload could commence, external MCU interrupts are turned off via GPIO command 0x00020080(0, 0x40000), then after the upload completed, the sysmodule waits exactly one second for the MCU to reboot, then turns external MCU interrupts back on via &amp;lt;code&amp;gt;gpio:MCU&amp;lt;/code&amp;gt; command 0x00020080(0x40000, 0x40000).&lt;br /&gt;
&lt;br /&gt;
There exists an alternate code path in very old MCU_FIRM versions where uploading is done using register 0x3B (if register 0x0F is zero and 0x10 is 1). Register 0x3B is part of the RTC alarm registers on recent versions of MCU.&lt;br /&gt;
&lt;br /&gt;
On dev-units, the user-facing representation of this firmware version is displayed by first subtracting 0x10 from the major field (raw register 0x00). It is these user-facing versions that are displayed in the table below. It is unknown what bit4 (0x10) actually represents, but it is seemingly always set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Title version&lt;br /&gt;
!  Firmware&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v9216 (New2DSXL)&lt;br /&gt;
| 3.65&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v8192/safe v9217 (latest)&lt;br /&gt;
| 3.56&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v6145 to v8192 (latest)&lt;br /&gt;
| 2.37&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v5122&lt;br /&gt;
| 2.35&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v4102&lt;br /&gt;
| 2.30&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v3072&lt;br /&gt;
| 2.16&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v2048&lt;br /&gt;
| 1.52&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v1026&lt;br /&gt;
| 1.51&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v0/safe v0&lt;br /&gt;
| 1.20&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS factory&lt;br /&gt;
| 1.07&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21061</id>
		<title>MCU Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21061"/>
		<updated>2019-10-08T03:10:56Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MCU service &amp;quot;mcu::RTC&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Only one session can be open per service at a time. If a session is already open for a service, MCU module will wait for the thread handling the session to terminate(triggered by the session being closed by the user process), then it accepts the new session. The commands for each service are handled by separate threads.&lt;br /&gt;
&lt;br /&gt;
=MCU camera service &amp;quot;mcu::CAM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| WriteCameraLedState (writes i2c register 0x2B)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| ReadCameraLedState (reads i2c register 0x2B)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU GPU service &amp;quot;mcu::GPU&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetLcdPowerState. This writes the value of I2C-MCU register 0xf bit6 to u8 cmdreply[2], and the value of bit5 from that register to u8 cmdreply[3].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| SetLcdPowerState. This writes the upper LCD bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetGpuLcdInterfaceState. This writes the value of I2C-MCU register 0xf bit7 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| SetGpuLcdInterfaceState. This writes the lower two bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| GetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080080&lt;br /&gt;
| GetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| GetMcuFwVerHigh. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| GetMcuFwVerLow. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| Set3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| Get3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuGpuEventHandle. Event handle written to TLS+0x8c. MCU notifications 24 to 29 signal this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetMcuGpuEventReason. Writes some value to TLS+0x88. Called by GSP module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU HID service &amp;quot;mcu::HID&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| ??? test register 0x40 bit0, and writes result to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| ??? writes IPC+4 to register 0x41&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| ??? reads register 0x44 to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050080&lt;br /&gt;
| ??? writes IPC+4 to register 0x43 and IPC+8 to register 0x44&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| ReadGyroscopeValues (reads 3x s16 gyro ADC values into IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| GetRaw3DSliderPosition (u8 position in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| GetMcuHidEventHandle. MCU notifications 11 and 12 signal this. Handle is written to IPC+12&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuHidEventReason. This reads an internal flield into IPC+8 and clears it.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[MCUHID:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| EnableAccelerometerInterrupt(int enable). 1 = enable, 0 = disable accelerometer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
While before these functions are handled, the MCU interrupt with bitmask 0x800 is enabled, then after the commands were handled the MCU interrupt bits 0x1800 get cleared.&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::RTC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| [[MCURTC:SetRTC|SetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCURTC:GetRTC|GetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| SetRTCSeconds(u8 seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetRTCSeconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetRTCMinutes(u8 minutes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetRTCMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetRTCHours(u8 hours)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetRTCHours&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| SetRTCDayOfWeek(u8 dayno)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| u8 GetRTCDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| SetRTCDayOfMonth(u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| u8 GetRTCDayOfMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetRTCMonth(u8 month)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| u8 GetRTCMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| SetRTCYear(u8 year) where year = year - 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| u8 GetRTCYear where year = result + 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| SetRTCLeapYearCounter(u8 leap)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| u8 GetRTCLeapYearCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130080&lt;br /&gt;
| [[MCURTC:SetRTCAlarm|SetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[MCURTC:GetRTCAlarm|GetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150040&lt;br /&gt;
| SetRTCAlarmComponent[0] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| u8 GetRTCAlarmComponent[0]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170040&lt;br /&gt;
| SetRTCAlarmComponent[1] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| u8 GetRTCAlarmComponent[1]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190040&lt;br /&gt;
| SetRTCAlarmComponent[2] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[2]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| SetRTCAlarmComponent[3] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[3]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0040&lt;br /&gt;
| SetRTCAlarmComponent[4] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[4]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0040&lt;br /&gt;
| SetPedometerRecordingMode(u8 mode)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| u8 GetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| u8 GetStepCount (for the current day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220042&lt;br /&gt;
| ReadRegister4Fh(u32 unused_size, translation_param size=0x156 &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x156] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| void ??? writes 1 to register 0x4E which is not writable&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240000&lt;br /&gt;
| Handle GetPowerEventHandle. MCU notifications 1, 8, 9, 10, 13, 14 and 15 signal this.&lt;br /&gt;
see [[I2C_Registers#Device_3|Register 0x18]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| u32 GetPowerInterruptHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| bool CheckRegister02hBit0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| void ClearRegister02hBit0 (does nothing since the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| bool CheckRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| void ClearRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| bool GetShellState. This writes the value of I2C-MCU register 0xf bit1 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| bool GetAdapterState. This writes the value of I2C-MCU register 0xf bit3 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| bool GetBatteryChargeState. This writes the value of I2C-MCU register 0xf bit4 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[MCURTC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E0000&lt;br /&gt;
| u8 Set......&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0000&lt;br /&gt;
| u8 GetBatteryEmptyPatternByte0_safe™&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300040&lt;br /&gt;
| SetLEDBrightness(u8 brightness) (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310000&lt;br /&gt;
| u8 GetLEDBrightness (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| void PowerOff (writes 0x1 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00330000&lt;br /&gt;
| void HardwareReboot (writes 0x4 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340000&lt;br /&gt;
| WriteRegister reg=0x23 value=0x72 (writing to read-only registers does nothing)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350000&lt;br /&gt;
| Writes 0x10 to i2c MCU device, reg 0x20 (this bit of the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| SetWatchdogTimer(u8 timer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370000&lt;br /&gt;
| u8 GetWatchdogTimer&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380042&lt;br /&gt;
| ReadI2CRegister0x7F(u32 unused_size, translation_param size &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x13] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390082&lt;br /&gt;
| WriteLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0082&lt;br /&gt;
| ReadLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0640&lt;br /&gt;
| [[MCURTC:SetInfoLEDPattern|SetInfoLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0040&lt;br /&gt;
| [[MCURTC:SetInfoLEDPatternHeader|SetInfoLEDPatternHeader]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0000&lt;br /&gt;
| [[MCURTC:GetInfoLEDStatus|GetInfoLEDStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| WriteRegister50h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0000&lt;br /&gt;
| u8 ReadRegister50h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00400040&lt;br /&gt;
| WriteRegister51h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410000&lt;br /&gt;
| u8 ReadRegister51h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| [[MCURTC:SetBatteryEmptyLEDPattern|SetBatteryEmptyLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430040&lt;br /&gt;
| SetScreenFlickerTop(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| u8 GetScreenFlickerTop&lt;br /&gt;
|-&lt;br /&gt;
| 0x00450040&lt;br /&gt;
| SetScreenFlickerBottom(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00460000&lt;br /&gt;
| u8 GetScreenFlickerBottom&lt;br /&gt;
|-&lt;br /&gt;
| 0x00470080&lt;br /&gt;
| SetVolumeSliderBounds(u8 low, u8 high) (see [[I2C_Registers#Device_3|Register 0x58]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00480000&lt;br /&gt;
| u8 low, u8 high GetVolumeSliderBounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00490040&lt;br /&gt;
| SetInterruptMask(u32 mask) (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004A0000&lt;br /&gt;
| u32 GetInterruptMask (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004B0000&lt;br /&gt;
| void ExitExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C0000&lt;br /&gt;
| void EnterExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004D0000&lt;br /&gt;
| [[MCURTC:ReadInterrupt|ReadInterrupt]] (see [[I2C_Registers#Device_3|Register 0x10]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004E0040&lt;br /&gt;
| [[MCURTC:PublishNotifications|TriggerInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x004F0040&lt;br /&gt;
| SetMCUFirmUpdated(u32 flag) used by PTM module&lt;br /&gt;
|-&lt;br /&gt;
| 0x00500000&lt;br /&gt;
| u32 IsMCUFirmUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 0x00510040&lt;br /&gt;
| [[MCURTC:SetSoftwareClosedFlag|SetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00520000&lt;br /&gt;
| [[MCURTC:GetSoftwareClosedFlag|GetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00530040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00540000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00550040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00560000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00570040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00580000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00590040&lt;br /&gt;
| [[MCURTC:SetLegacyJumpProhibitedFlag|SetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005A0000&lt;br /&gt;
| [[MCURTC:GetLegacyJumpProhibitedFlag|GetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005B0040&lt;br /&gt;
| SetUUIDClockSequence &lt;br /&gt;
|-&lt;br /&gt;
| 0x005C0000&lt;br /&gt;
| GetUUIDClockSequence&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU sound service &amp;quot;mcu::SND&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| GetSoundVolume, writes volume slider value (0-63) to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| Set...&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetRegister25h, cmdbuf[2] is 0 on n3ds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU wifi service &amp;quot;mcu::NWM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001....&lt;br /&gt;
| SetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002....&lt;br /&gt;
| GetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003....&lt;br /&gt;
| Sets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004....&lt;br /&gt;
| Gets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005....&lt;br /&gt;
| SetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006....&lt;br /&gt;
| GetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007....&lt;br /&gt;
| [[MCUNWM:SetWirelessDisabledFlag|SetWirelessDisabledFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008....&lt;br /&gt;
| [[MCUNWM:GetWirelessDisabledFlag|GetWirelessDisabledFlag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::HWC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[MCUHWC:ReadRegister|ReadRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020082&lt;br /&gt;
| [[MCUHWC:WriteRegister|WriteRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030042&lt;br /&gt;
| [[MCUHWC:GetInfoRegisters|GetInfoRegisters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[MCUHWC:GetBatteryVoltage|GetBatteryVoltage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[MCUHWC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[MCUHWC:SetPowerLEDPattern|SetPowerLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[MCUHWC:SetWifiLEDState|SetWifiLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[MCUHWC:SetCameraLEDPattern|SetCameraLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[MCUHWC:Set3DLEDState|Set3DLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0640&lt;br /&gt;
| This is the same as [[MCURTC:SetInfoLEDPattern]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[MCUHWC:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F00C0&lt;br /&gt;
| GetRtcTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| GetMcuFwVerHigh&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| GetMcuFwVerLow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::PLS&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;Beg the sysmodule to return the datetime registers in decimal form instead of as a Binary Coded Decimal&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetDatetime (returns registers 0x30-0x36 in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCUPLS:GetSeconds|GetSeconds]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| u8 GetMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetHour&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| u8 GetDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetDay&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| u8 GetMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetYear&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| u16 GetTickCounter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU codec service &amp;quot;mcu::CDC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=New3DS=&lt;br /&gt;
The Old3DS/New3DS MCU sysmodules are identical except that the MCU firmware binary written via I2C is different. The size of that binary is the same. The only different words in .text are for the version of that MCU fw binary.&lt;br /&gt;
&lt;br /&gt;
=MCU firmware versions=&lt;br /&gt;
&lt;br /&gt;
These reside in mcu sysmodule .rodata, are uploaded to MCU register 0x05 and are usually 0x4003 bytes in size (the actual firmware is 0x4000 bytes preceeded by a 3 byte magic header &amp;quot;&amp;lt;code&amp;gt;jhl&amp;lt;/code&amp;gt;&amp;quot; which switches the I2C comms into flash write mode).  &lt;br /&gt;
Switching requires register 0x05 (at address &amp;lt;code&amp;gt;0xFFBA9&amp;lt;/code&amp;gt;) to contain 0x6A (&#039;&amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;&#039;), register 0x06 containing 0x68 (&#039;&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;&#039;), and writing 0x6C (&#039;&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;&#039;) to register 0x07. The actual flashing sequence is only signaled (code at 0x3312-0x331A) when writing register 0x07, it&#039;s skipped otherwise. Register 0x07 gets written anyways, just the actual signaling is skipped if the conditions aren&#039;t met.&lt;br /&gt;
&lt;br /&gt;
Before the upload could commence, external MCU interrupts are turned off via GPIO command 0x00020080(0, 0x40000), then after the upload completed, the sysmodule waits exactly one second for the MCU to reboot, then turns external MCU interrupts back on via &amp;lt;code&amp;gt;gpio:MCU&amp;lt;/code&amp;gt; command 0x00020080(0x40000, 0x40000).&lt;br /&gt;
&lt;br /&gt;
There exists an alternate code path in very old MCU_FIRM versions where uploading is done using register 0x3B (if register 0x0F is zero and 0x10 is 1). Register 0x3B is part of the RTC alarm registers on recent versions of MCU.&lt;br /&gt;
&lt;br /&gt;
On dev-units, the user-facing representation of this firmware version is displayed by first subtracting 0x10 from the major field (raw register 0x00). It is these user-facing versions that are displayed in the table below. It is unknown what bit4 (0x10) actually represents, but it is seemingly always set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Title version&lt;br /&gt;
!  Firmware&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v9216 (New2DSXL)&lt;br /&gt;
| 3.65&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v8192/safe v9217 (latest)&lt;br /&gt;
| 3.56&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v6145 to v8192 (latest)&lt;br /&gt;
| 2.37&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v5122&lt;br /&gt;
| 2.35&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v4102&lt;br /&gt;
| 2.30&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v3072&lt;br /&gt;
| 2.16&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v2048&lt;br /&gt;
| 1.52&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v1026&lt;br /&gt;
| 1.51&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v0/safe v0&lt;br /&gt;
| 1.20&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS factory&lt;br /&gt;
| 1.07&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Config_Savegame&amp;diff=21060</id>
		<title>Config Savegame</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Config_Savegame&amp;diff=21060"/>
		<updated>2019-10-07T17:48:21Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Configuration blocks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes the format of the [[Config_Services|Cfg]] [[System_SaveData|NAND]] savegame. These blocks can be accessed with the Cfg service commands.&lt;br /&gt;
&lt;br /&gt;
==Structure of save-file &amp;quot;/config&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x2&lt;br /&gt;
| Total entries&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| Data entries offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4558&lt;br /&gt;
| Block entries&lt;br /&gt;
|-&lt;br /&gt;
| 0x455C&lt;br /&gt;
| &lt;br /&gt;
| Data for the entries&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The filesize for this /config file is 0x8000-bytes.&lt;br /&gt;
&lt;br /&gt;
==Configuration block entry ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| BlkID&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Offset to the data for this block when size is &amp;gt;4, otherwise this word is the data for this block&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x2&lt;br /&gt;
| Size&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0x2&lt;br /&gt;
| Flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Configuration blocks==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  BlkID&lt;br /&gt;
!  Size&lt;br /&gt;
!  Flags&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| Config savegame version?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#RTC|RTC compensation value]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| 0x134&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#CDC|Codec]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| Leap Year Counter (read By PTM)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| User time offset (read by CECD)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030002&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Touch|Touch calibration]] (read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040001&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0xC&lt;br /&gt;
| Analog Stick Calibration Param?(read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040002&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Gyro|Gyroscope]] (read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040003&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Accel|Accelerometer]] (read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040004&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#CStick|CStick calibration data]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Screen_flicker|Screen flicker]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050001&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| Backlight controls (u8 ABL_powersave_enable, u8 brightness_level) (read by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050002&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#BLPWM|Backlight PWM]] (read by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050003&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ABL|Power saving mode (ABL) calibration]] (read by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050004&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ABL|Power saving mode (ABL) calibration]] &lt;br /&gt;
|-&lt;br /&gt;
| 0x00050005&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0xE&lt;br /&gt;
| Stereo display settings (HWCAL block 0x470)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050006&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ULCD_delay|3D switching delay]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050007&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050008&lt;br /&gt;
| 0x10C&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ABL_extra|Power saving mode (ABL) extra config]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050009&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| new3DS only(?) backlight control (5th byte: auto-brightness enable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| 0x96&lt;br /&gt;
| 0xC&lt;br /&gt;
| ??? (HWCAL block 0x500)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| 0x214&lt;br /&gt;
| 0xE&lt;br /&gt;
| [[Hardware_calibration#3D_filters|3D filters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070001&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xE&lt;br /&gt;
| Sound output mode (mono=0, stereo=1, surround=2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070002&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| [[Hardware_calibration#Microphone_echo_cancel|Microphone echo cancellation params]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| 0xC00&lt;br /&gt;
| 0xC&lt;br /&gt;
| WiFi configuration slot 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080001&lt;br /&gt;
| 0xC00&lt;br /&gt;
| 0xC&lt;br /&gt;
| WiFi configuration slot 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080002&lt;br /&gt;
| 0xC00&lt;br /&gt;
| 0xC&lt;br /&gt;
| WiFi configuration slot 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| This contains a u64 ID, used by processes using [[NWMUDS:InitializeWithVersion]]. The first word is the same as [[CfgS:GetLocalFriendCodeSeed|LocalFriendCodeSeed]], while the latter is a separate word.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| Same content as 0x0009000? This console-unique u64 is used by [[Cfg:GenHashConsoleUnique|GenHashConsoleUnique]]. It is generated by &amp;lt;code&amp;gt;((0x3FFFFFFFF) &amp;amp; LocalFriendCodeSeed) | (random16 &amp;lt;&amp;lt; 48))&amp;lt;/code&amp;gt;, where random16 is generated by [[PSPXI:GenerateRandomBytes|GenerateRandomBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090002&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| The first two bytes are the same random16 used in 0x00090001. The second two bytes are zeros.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0xE&lt;br /&gt;
| Username in UTF16&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0001&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xE&lt;br /&gt;
| Birthday (u8 month, u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0002&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xE&lt;br /&gt;
| Language&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| CountryInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0001&lt;br /&gt;
| 0x800&lt;br /&gt;
| 0xE&lt;br /&gt;
| Country name in UTF-16, every 0x80-bytes is an entry for each language, in the order of the Language table below (not all entries are set)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0002&lt;br /&gt;
| 0x800&lt;br /&gt;
| 0xE&lt;br /&gt;
| State name in UTF-16, every 0x80-bytes is an entry for each language&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0003&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| Coordinates. A pair of s16 represents latitude and longitude, respectively. One need to multiply both value by 180/32768 to get coordinates in degrees&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 0xE&lt;br /&gt;
| Restricted photo exchange data, and other info (includes a mirror of Parental Restrictions PIN/Secret Answer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0001&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0xE&lt;br /&gt;
| COPPACS restriction data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0002&lt;br /&gt;
| 0x200&lt;br /&gt;
| 0xE&lt;br /&gt;
| ? Contains the email address set during Parental Restriction setup.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| u16 at offset 0x0: [[SMDH#EULA_Version|EULA Version]] which was agreed to.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xE&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0xC&lt;br /&gt;
| Debug configuration, read by [[NS]] on dev-units: on startup, NS does &amp;lt;code&amp;gt;svcKernelSetState(6, 1, (u64)debug_flags &amp;amp; 1); &lt;br /&gt;
svcKernelSetState(6, 2, (u64)debug_flags &amp;amp; 2);&amp;lt;/code&amp;gt; (see [[SVC#KernelSetState|here]]) where &amp;lt;code&amp;gt;debug_flags&amp;lt;/code&amp;gt; is the u32 located at offset 0xC in this struct. Then it compares the u32 from +8 in this config-block with the [[Configuration_Memory#APPMEMTYPE|APPMEMTYPE]]. When those don&#039;t match NS starts a FIRM-launch (with the same FIRM titleID as the currently running one) to boot into a FIRM with the APPMEMTYPE value from this config-block. The byte at offset 0x0 is related to the memtype as well.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0003&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0004&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| The first u8 is the System-Model [[Cfg:GetSystemModel|value]], the last 3-bytes are unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0005&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| The first u8 indicates whether network updates are enabled (however, NIM only checks this flag with developer [[Configuration_Memory#ENVINFO|ENVINFO]]).&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0006&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100001&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0xC&lt;br /&gt;
| Stores Parental Restrictions PIN/Secret Answer and other info&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100002&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100003&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| The low u16 indicates whether the system setup is required, such as when the system is booted for the first time or after doing a [[System Settings|System Format]]: 0 = setup required, non-zero = no setup required&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| TitleID of the menu to launch, used by [[NS]] on dev units (this block can be edited on dev units with [[3DS Development Unit Software#Config|Config]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| Volume Slider Bounds (Read by HID and PTM)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| If response is 0x100 then debug mode is enabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150002&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| Unknown, first byte is used by config service-cmd [[Config_Services|0x00070040]]. (Unknown whether the last 3-bytes are used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| Miiverse (OLV) access key&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| QTM Infrared LED related, can be 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180001&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#QTM|QTM calibration data]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| Unknown. NFC-module checks for value1/non-value1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The developer unit TID block only exists on developer units.&lt;br /&gt;
&lt;br /&gt;
===Stereo Display Settings===&lt;br /&gt;
All values are hard-coded in cfg module.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| 62.0f&lt;br /&gt;
|assumed pupillary distance in mm?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| 289.0f&lt;br /&gt;
|assumed distance in mm between player&#039;s eyes and upper screen?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| 76.80f&lt;br /&gt;
|width in mm of (old) 3DS upper screen (doesn&#039;t vary for different models?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| 46.08f&lt;br /&gt;
|height in mm of (old) 3DS upper screen (doesn&#039;t vary for different models?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| 10.0f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| 5.0f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| 55.58f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| 21.57f&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| JP&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| EN&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| FR&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| DE&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| IT&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| ES&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| ZH&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| KO&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| NL&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| PT&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| RU&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| TW&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CountryInfo===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Byte&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| State/Province code.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Country code, same as DSi/Wii country codes. Value 0xFF is invalid.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===0x000A0000 Block===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Byte&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0-0x13&lt;br /&gt;
| UTF-16 username, with no NULL-terminator.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-17&lt;br /&gt;
| Usually zero?&lt;br /&gt;
|-&lt;br /&gt;
| 0x18-0x1B&lt;br /&gt;
| u32 NGWord version the username was last checked with. If this value is less than the u32 stored in the NGWord CFA &amp;quot;romfs:/version.dat&amp;quot;, the system then checks the username string with the bad-word list CFA again, then updates this field with the value from the CFA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===WiFi Slot Structure===&lt;br /&gt;
&lt;br /&gt;
====Network structure====&lt;br /&gt;
This is used twice in the actual WiFi slot structure.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether the network was set or not?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to use this network strucutre to connect?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether this structure is the first (0) or the second (1) in the larger WiFi slot structure?&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x20&lt;br /&gt;
| SSID of the network, without a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x1&lt;br /&gt;
| Length of the SSID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25&lt;br /&gt;
| 0x1&lt;br /&gt;
| [[Nintendo_Zone#Beacon_payload_format|AP crypto key type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| 0x2&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x40&lt;br /&gt;
| Plaintext of the passphrase of the network, without a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x20&lt;br /&gt;
| PBKDF2 of the passphrase and SSID (http://jorisvr.nl/wpapsk.html).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Actual structure====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x2&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| [https://github.com/lammertb/libcrc/blob/v2.0/src/crc16.c#L43-L76 CRC-16 checksum] of the next 0x410 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x88&lt;br /&gt;
| First network structure. Only set if the network was set &amp;quot;normally&amp;quot;, or was the last to be set using WPS during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 0x20&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x88&lt;br /&gt;
| Second network structure. Only set if the network was set using WPS, otherwise 0-filled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x134&lt;br /&gt;
| 0x20C&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x340&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to automatically get the IP address (use DHCP) or not, defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x341&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to automatically get the DNS or not, defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x342&lt;br /&gt;
| 0x2&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x344&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address, to use if 0x340 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x348&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address of the gateway, to use if 0x340 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Subnetwork mask, to use if 0x340 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x350&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address of the primary DNS , to use if 0x341 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x354&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address of the secondary DNS, to use if 0x341 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x358&lt;br /&gt;
| 0x4&lt;br /&gt;
| Always 0x01050000 ? Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35C&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address to use. Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x360&lt;br /&gt;
| 0x6&lt;br /&gt;
| MAC address of the AP. Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x366&lt;br /&gt;
| 0x1&lt;br /&gt;
| Channel. Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x367&lt;br /&gt;
| 0x1&lt;br /&gt;
| Padding ? Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x368&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to use a proxy or not, defaults to 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x369&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to use a basic authentication for the proxy, defaults to 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x36A&lt;br /&gt;
| 0x2&lt;br /&gt;
| Port to use for the proxy, defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x36C&lt;br /&gt;
| 0x30&lt;br /&gt;
| URL/address of the proxy, including a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39C&lt;br /&gt;
| 0x34&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D0&lt;br /&gt;
| 0x20&lt;br /&gt;
| Username to use for basic authentication, including a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F0&lt;br /&gt;
| 0x20&lt;br /&gt;
| Password to use for basic authentication, including a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x410&lt;br /&gt;
| 0x2&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x412&lt;br /&gt;
| 0x2&lt;br /&gt;
| MTU value, defaults to 1400 and ranges between 576 and 1500, inclusive.&lt;br /&gt;
|-&lt;br /&gt;
| 0x414&lt;br /&gt;
| 0x7EC&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LCD display config===&lt;br /&gt;
There seems to be some sort of LCD display configuration stored in this cfg. When using the cfg-save from an Old3DS on a New3DS without formatting the cfg first, the bottom-screen display is somewhat off(which is fixed by formatting the cfg-save).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Parental control Block 0x00100001===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Byte&lt;br /&gt;
!  Size in bytes&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0xD&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0x4&lt;br /&gt;
| PIN&lt;br /&gt;
|-&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x20&lt;br /&gt;
| Secret answer in UTF-16&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Parental Control setting block 0xC0000===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x04&lt;br /&gt;
| [[#Parental Control restriction bitmask|Parental Control restriction bitmask]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 0x04&lt;br /&gt;
| Parental Controls PIN code&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Parental Control restriction bitmask====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Restriction name&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Global Parental Controls enable&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Sharing Images/Audio/Video/Long Text Data&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Internet Browser&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| StreetPass&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Friend Registration&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| eShop&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Miiverse (view)&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| Miiverse (post)&lt;br /&gt;
|-&lt;br /&gt;
| 31&lt;br /&gt;
| &amp;quot;Child Online Privacy Protection&amp;quot; (see [[Cfg:GetRegionCanadaUSA|CFG:IsCoppacsSupported]])&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Config_Savegame&amp;diff=21059</id>
		<title>Config Savegame</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Config_Savegame&amp;diff=21059"/>
		<updated>2019-10-07T17:42:06Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Configuration blocks */ 0x30000 is Leap Year Counter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes the format of the [[Config_Services|Cfg]] [[System_SaveData|NAND]] savegame. These blocks can be accessed with the Cfg service commands.&lt;br /&gt;
&lt;br /&gt;
==Structure of save-file &amp;quot;/config&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x2&lt;br /&gt;
| Total entries&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| Data entries offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4558&lt;br /&gt;
| Block entries&lt;br /&gt;
|-&lt;br /&gt;
| 0x455C&lt;br /&gt;
| &lt;br /&gt;
| Data for the entries&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The filesize for this /config file is 0x8000-bytes.&lt;br /&gt;
&lt;br /&gt;
==Configuration block entry ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| BlkID&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Offset to the data for this block when size is &amp;gt;4, otherwise this word is the data for this block&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x2&lt;br /&gt;
| Size&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0x2&lt;br /&gt;
| Flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Configuration blocks==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  BlkID&lt;br /&gt;
!  Size&lt;br /&gt;
!  Flags&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| Config savegame version?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#RTC|RTC compensation value]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| 0x134&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#CDC|Codec]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| Leap Year Counter (read By PTM)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| User time offset (read by CECD)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030002&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Touch|Touch calibration]] (read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040001&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0xC&lt;br /&gt;
| Analog Stick Calibration Param?(read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040002&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Gyro|Gyroscope]] (read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040003&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Accel|Accelerometer]] (read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040004&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#CStick|CStick calibration data]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#Screen_flicker|Screen flicker]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050001&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| Backlight controls (u8 ABL_powersave_enable, u8 brightness_level) (read by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050002&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#BLPWM|Backlight PWM]] (read by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050003&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ABL|Power saving mode (ABL) calibration]] (read by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050004&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ABL|Power saving mode (ABL) calibration]] &lt;br /&gt;
|-&lt;br /&gt;
| 0x00050005&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0xE&lt;br /&gt;
| Stereo display settings (HWCAL block 0x470)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050006&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ULCD_delay|3D switching delay]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050007&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050008&lt;br /&gt;
| 0x10C&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#ABL_extra|Power saving mode (ABL) extra config]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050009&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| new3DS only(?) backlight control (5th byte: auto-brightness enable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| 0x96&lt;br /&gt;
| 0xC&lt;br /&gt;
| ??? (HWCAL block 0x500)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| 0x214&lt;br /&gt;
| 0xE&lt;br /&gt;
| [[Hardware_calibration#3D_filters|3D filters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070001&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xE&lt;br /&gt;
| Sound output mode (mono=0, stereo=1, surround=2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070002&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| [[Hardware_calibration#Microphone_echo_cancel|Microphone echo cancellation params]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| 0xC00&lt;br /&gt;
| 0xC&lt;br /&gt;
| WiFi configuration slot 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080001&lt;br /&gt;
| 0xC00&lt;br /&gt;
| 0xC&lt;br /&gt;
| WiFi configuration slot 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080002&lt;br /&gt;
| 0xC00&lt;br /&gt;
| 0xC&lt;br /&gt;
| WiFi configuration slot 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| This contains a u64 ID, used by processes using [[NWMUDS:InitializeWithVersion]]. The first word is the same as [[CfgS:GetLocalFriendCodeSeed|LocalFriendCodeSeed]], while the latter is a separate word.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xE&lt;br /&gt;
| Same content as 0x0009000? This console-unique u64 is used by [[Cfg:GenHashConsoleUnique|GenHashConsoleUnique]]. It is generated by &amp;lt;code&amp;gt;((0x3FFFFFFFF) &amp;amp; LocalFriendCodeSeed) | (random16 &amp;lt;&amp;lt; 48))&amp;lt;/code&amp;gt;, where random16 is generated by [[PSPXI:GenerateRandomBytes|GenerateRandomBytes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090002&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| The first two bytes are the same random16 used in 0x00090001. The second two bytes are zeros.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0xE&lt;br /&gt;
| Username in UTF16&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0001&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xE&lt;br /&gt;
| Birthday (u8 month, u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0002&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xE&lt;br /&gt;
| Language&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| CountryInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0001&lt;br /&gt;
| 0x800&lt;br /&gt;
| 0xE&lt;br /&gt;
| Country name in UTF-16, every 0x80-bytes is an entry for each language, in the order of the Language table below (not all entries are set)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0002&lt;br /&gt;
| 0x800&lt;br /&gt;
| 0xE&lt;br /&gt;
| State name in UTF-16, every 0x80-bytes is an entry for each language&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0003&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| Coordinates. A pair of s16 represents latitude and longitude, respectively. One need to multiply both value by 180/32768 to get coordinates in degrees&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 0xE&lt;br /&gt;
| Restricted photo exchange data, and other info (includes a mirror of Parental Restrictions PIN/Secret Answer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0001&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0xE&lt;br /&gt;
| COPPACS restriction data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0002&lt;br /&gt;
| 0x200&lt;br /&gt;
| 0xE&lt;br /&gt;
| ? Contains the email address set during Parental Restriction setup.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| u16 at offset 0x0: [[SMDH#EULA_Version|EULA Version]] which was agreed to.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xE&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0xC&lt;br /&gt;
| Debug configuration, read by [[NS]] on dev-units: on startup, NS does &amp;lt;code&amp;gt;svcKernelSetState(6, 1, (u64)debug_flags &amp;amp; 1); &lt;br /&gt;
svcKernelSetState(6, 2, (u64)debug_flags &amp;amp; 2);&amp;lt;/code&amp;gt; (see [[SVC#KernelSetState|here]]) where &amp;lt;code&amp;gt;debug_flags&amp;lt;/code&amp;gt; is the u32 located at offset 0xC in this struct. Then it compares the u32 from +8 in this config-block with the [[Configuration_Memory#APPMEMTYPE|APPMEMTYPE]]. When those don&#039;t match NS starts a FIRM-launch (with the same FIRM titleID as the currently running one) to boot into a FIRM with the APPMEMTYPE value from this config-block. The byte at offset 0x0 is related to the memtype as well.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0003&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0004&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| The first u8 is the System-Model [[Cfg:GetSystemModel|value]], the last 3-bytes are unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0005&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| The first u8 indicates whether network updates are enabled (however, NIM only checks this flag with developer [[Configuration_Memory#ENVINFO|ENVINFO]]).&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0006&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100001&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0xC&lt;br /&gt;
| Stores Parental Restrictions PIN/Secret Answer and other info&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100002&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100003&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| The low u16 indicates whether the system setup is required, such as when the system is booted for the first time or after doing a [[System Settings|System Format]]: 0 = setup required, non-zero = no setup required&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| TitleID of the menu to launch, used by [[NS]] on dev units (this block can be edited on dev units with [[3DS Development Unit Software#Config|Config]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#MCU|MCU volume slider related]] (read by HID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| If response is 0x100 then debug mode is enabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150001&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xC&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150002&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| Unknown, first byte is used by config service-cmd [[Config_Services|0x00070040]]. (Unknown whether the last 3-bytes are used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xE&lt;br /&gt;
| Miiverse (OLV) access key&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| QTM Infrared LED related, can be 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180001&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[Hardware_calibration#QTM|QTM calibration data]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190000&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0xC&lt;br /&gt;
| Unknown. NFC-module checks for value1/non-value1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The developer unit TID block only exists on developer units.&lt;br /&gt;
&lt;br /&gt;
===Stereo Display Settings===&lt;br /&gt;
All values are hard-coded in cfg module.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| 62.0f&lt;br /&gt;
|assumed pupillary distance in mm?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| 289.0f&lt;br /&gt;
|assumed distance in mm between player&#039;s eyes and upper screen?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| 76.80f&lt;br /&gt;
|width in mm of (old) 3DS upper screen (doesn&#039;t vary for different models?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| 46.08f&lt;br /&gt;
|height in mm of (old) 3DS upper screen (doesn&#039;t vary for different models?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| 10.0f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| 5.0f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| 55.58f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| 21.57f&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| JP&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| EN&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| FR&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| DE&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| IT&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| ES&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| ZH&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| KO&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| NL&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| PT&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| RU&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| TW&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CountryInfo===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Byte&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| State/Province code.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Country code, same as DSi/Wii country codes. Value 0xFF is invalid.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===0x000A0000 Block===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Byte&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0-0x13&lt;br /&gt;
| UTF-16 username, with no NULL-terminator.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-17&lt;br /&gt;
| Usually zero?&lt;br /&gt;
|-&lt;br /&gt;
| 0x18-0x1B&lt;br /&gt;
| u32 NGWord version the username was last checked with. If this value is less than the u32 stored in the NGWord CFA &amp;quot;romfs:/version.dat&amp;quot;, the system then checks the username string with the bad-word list CFA again, then updates this field with the value from the CFA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===WiFi Slot Structure===&lt;br /&gt;
&lt;br /&gt;
====Network structure====&lt;br /&gt;
This is used twice in the actual WiFi slot structure.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether the network was set or not?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to use this network strucutre to connect?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether this structure is the first (0) or the second (1) in the larger WiFi slot structure?&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x20&lt;br /&gt;
| SSID of the network, without a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x1&lt;br /&gt;
| Length of the SSID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25&lt;br /&gt;
| 0x1&lt;br /&gt;
| [[Nintendo_Zone#Beacon_payload_format|AP crypto key type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| 0x2&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x40&lt;br /&gt;
| Plaintext of the passphrase of the network, without a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x20&lt;br /&gt;
| PBKDF2 of the passphrase and SSID (http://jorisvr.nl/wpapsk.html).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Actual structure====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x2&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| [https://github.com/lammertb/libcrc/blob/v2.0/src/crc16.c#L43-L76 CRC-16 checksum] of the next 0x410 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x88&lt;br /&gt;
| First network structure. Only set if the network was set &amp;quot;normally&amp;quot;, or was the last to be set using WPS during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 0x20&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x88&lt;br /&gt;
| Second network structure. Only set if the network was set using WPS, otherwise 0-filled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x134&lt;br /&gt;
| 0x20C&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x340&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to automatically get the IP address (use DHCP) or not, defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x341&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to automatically get the DNS or not, defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x342&lt;br /&gt;
| 0x2&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x344&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address, to use if 0x340 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x348&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address of the gateway, to use if 0x340 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Subnetwork mask, to use if 0x340 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x350&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address of the primary DNS , to use if 0x341 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x354&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address of the secondary DNS, to use if 0x341 is false.&lt;br /&gt;
|-&lt;br /&gt;
| 0x358&lt;br /&gt;
| 0x4&lt;br /&gt;
| Always 0x01050000 ? Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35C&lt;br /&gt;
| 0x4&lt;br /&gt;
| IP address to use. Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x360&lt;br /&gt;
| 0x6&lt;br /&gt;
| MAC address of the AP. Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x366&lt;br /&gt;
| 0x1&lt;br /&gt;
| Channel. Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x367&lt;br /&gt;
| 0x1&lt;br /&gt;
| Padding ? Only set if the network was the last to be set during the session.&lt;br /&gt;
|-&lt;br /&gt;
| 0x368&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to use a proxy or not, defaults to 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x369&lt;br /&gt;
| 0x1&lt;br /&gt;
| Whether to use a basic authentication for the proxy, defaults to 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x36A&lt;br /&gt;
| 0x2&lt;br /&gt;
| Port to use for the proxy, defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x36C&lt;br /&gt;
| 0x30&lt;br /&gt;
| URL/address of the proxy, including a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39C&lt;br /&gt;
| 0x34&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D0&lt;br /&gt;
| 0x20&lt;br /&gt;
| Username to use for basic authentication, including a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F0&lt;br /&gt;
| 0x20&lt;br /&gt;
| Password to use for basic authentication, including a trailing nullbyte.&lt;br /&gt;
|-&lt;br /&gt;
| 0x410&lt;br /&gt;
| 0x2&lt;br /&gt;
| Padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x412&lt;br /&gt;
| 0x2&lt;br /&gt;
| MTU value, defaults to 1400 and ranges between 576 and 1500, inclusive.&lt;br /&gt;
|-&lt;br /&gt;
| 0x414&lt;br /&gt;
| 0x7EC&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LCD display config===&lt;br /&gt;
There seems to be some sort of LCD display configuration stored in this cfg. When using the cfg-save from an Old3DS on a New3DS without formatting the cfg first, the bottom-screen display is somewhat off(which is fixed by formatting the cfg-save).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Parental control Block 0x00100001===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Byte&lt;br /&gt;
!  Size in bytes&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0xD&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0x4&lt;br /&gt;
| PIN&lt;br /&gt;
|-&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x20&lt;br /&gt;
| Secret answer in UTF-16&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Parental Control setting block 0xC0000===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x04&lt;br /&gt;
| [[#Parental Control restriction bitmask|Parental Control restriction bitmask]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 0x04&lt;br /&gt;
| Parental Controls PIN code&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Parental Control restriction bitmask====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Restriction name&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Global Parental Controls enable&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Sharing Images/Audio/Video/Long Text Data&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Internet Browser&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| StreetPass&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Friend Registration&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| eShop&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Miiverse (view)&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| Miiverse (post)&lt;br /&gt;
|-&lt;br /&gt;
| 31&lt;br /&gt;
| &amp;quot;Child Online Privacy Protection&amp;quot; (see [[Cfg:GetRegionCanadaUSA|CFG:IsCoppacsSupported]])&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21058</id>
		<title>MCU Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=21058"/>
		<updated>2019-10-07T17:37:35Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MCU service &amp;quot;mcu::RTC&amp;quot; */ 0x00$F0040 is used by PTM module&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Only one session can be open per service at a time. If a session is already open for a service, MCU module will wait for the thread handling the session to terminate(triggered by the session being closed by the user process), then it accepts the new session. The commands for each service are handled by separate threads.&lt;br /&gt;
&lt;br /&gt;
=MCU camera service &amp;quot;mcu::CAM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| WriteCameraLedState (writes i2c register 0x2B)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| ReadCameraLedState (reads i2c register 0x2B)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU GPU service &amp;quot;mcu::GPU&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetLcdPowerState. This writes the value of I2C-MCU register 0xf bit6 to u8 cmdreply[2], and the value of bit5 from that register to u8 cmdreply[3].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| SetLcdPowerState. This writes the upper LCD bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetGpuLcdInterfaceState. This writes the value of I2C-MCU register 0xf bit7 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| SetGpuLcdInterfaceState. This writes the lower two bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| GetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080080&lt;br /&gt;
| GetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| GetMcuFwVerHigh. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| GetMcuFwVerLow. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| Set3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| Get3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuGpuEventHandle. Event handle written to TLS+0x8c. MCU notifications 24 to 29 signal this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetMcuGpuEventReason. Writes some value to TLS+0x88. Called by GSP module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU HID service &amp;quot;mcu::HID&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| ??? test register 0x40 bit0, and writes result to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| ??? writes IPC+4 to register 0x41&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| ??? reads register 0x44 to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050080&lt;br /&gt;
| ??? writes IPC+4 to register 0x43 and IPC+8 to register 0x44&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| ReadGyroscopeValues (reads 3x s16 gyro ADC values into IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| GetRaw3DSliderPosition (u8 position in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| GetMcuHidEventHandle. MCU notifications 11 and 12 signal this. Handle is written to IPC+12&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuHidEventReason. This reads an internal flield into IPC+8 and clears it.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[MCUHID:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| EnableAccelerometerInterrupt(int enable). 1 = enable, 0 = disable accelerometer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
While before these functions are handled, the MCU interrupt with bitmask 0x800 is enabled, then after the commands were handled the MCU interrupt bits 0x1800 get cleared.&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::RTC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| [[MCURTC:SetRTC|SetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCURTC:GetRTC|GetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| SetRTCSeconds(u8 seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetRTCSeconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetRTCMinutes(u8 minutes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetRTCMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetRTCHours(u8 hours)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetRTCHours&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| SetRTCDayOfWeek(u8 dayno)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| u8 GetRTCDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| SetRTCDayOfMonth(u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| u8 GetRTCDayOfMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetRTCMonth(u8 month)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| u8 GetRTCMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| SetRTCYear(u8 year) where year = year - 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| u8 GetRTCYear where year = result + 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| SetRTCLeapYearCounter(u8 leap)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| u8 GetRTCLeapYearCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130080&lt;br /&gt;
| [[MCURTC:SetRTCAlarm|SetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[MCURTC:GetRTCAlarm|GetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150040&lt;br /&gt;
| SetRTCAlarmComponent[0] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| u8 GetRTCAlarmComponent[0]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170040&lt;br /&gt;
| SetRTCAlarmComponent[1] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| u8 GetRTCAlarmComponent[1]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190040&lt;br /&gt;
| SetRTCAlarmComponent[2] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[2]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| SetRTCAlarmComponent[3] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[3]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0040&lt;br /&gt;
| SetRTCAlarmComponent[4] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[4]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0040&lt;br /&gt;
| SetPedometerRecordingMode(u8 mode)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| u8 GetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| u8 GetStepCount (for the current day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220042&lt;br /&gt;
| ReadRegister4Fh(u32 unused_size, translation_param size=0x156 &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x156] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| void ??? writes 1 to register 0x4E which is not writable&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240000&lt;br /&gt;
| Handle GetPowerEventHandle. MCU notifications 1, 8, 9, 10, 13, 14 and 15 signal this.&lt;br /&gt;
see [[I2C_Registers#Device_3|Register 0x18]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| u32 GetPowerInterruptHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| bool CheckRegister02hBit0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| void ClearRegister02hBit0 (does nothing since the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| bool CheckRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| void ClearRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| bool GetShellState. This writes the value of I2C-MCU register 0xf bit1 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| bool GetAdapterState. This writes the value of I2C-MCU register 0xf bit3 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| bool GetBatteryChargeState. This writes the value of I2C-MCU register 0xf bit4 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[MCURTC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E0000&lt;br /&gt;
| u8 Set......&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0000&lt;br /&gt;
| u8 GetBatteryEmptyPatternByte0_safe™&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300040&lt;br /&gt;
| SetLEDBrightness(u8 brightness) (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310000&lt;br /&gt;
| u8 GetLEDBrightness (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| void PowerOff (writes 0x1 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00330000&lt;br /&gt;
| void HardwareReboot (writes 0x4 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340000&lt;br /&gt;
| WriteRegister reg=0x23 value=0x72 (writing to read-only registers does nothing)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350000&lt;br /&gt;
| Writes 0x10 to i2c MCU device, reg 0x20 (this bit of the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| SetWatchdogTimer(u8 timer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370000&lt;br /&gt;
| u8 GetWatchdogTimer&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380042&lt;br /&gt;
| ReadInfoRegister(u32 unused_size, translation_param size &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x13] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390082&lt;br /&gt;
| WriteLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0082&lt;br /&gt;
| ReadLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0640&lt;br /&gt;
| [[MCURTC:SetInfoLEDPattern|SetInfoLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0040&lt;br /&gt;
| [[MCURTC:SetInfoLEDPatternHeader|SetInfoLEDPatternHeader]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0000&lt;br /&gt;
| [[MCURTC:GetInfoLEDStatus|GetInfoLEDStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| WriteRegister50h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0000&lt;br /&gt;
| u8 ReadRegister50h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00400040&lt;br /&gt;
| WriteRegister51h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410000&lt;br /&gt;
| u8 ReadRegister51h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| [[MCURTC:SetBatteryEmptyLEDPattern|SetBatteryEmptyLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430040&lt;br /&gt;
| SetScreenFlickerTop(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| u8 GetScreenFlickerTop&lt;br /&gt;
|-&lt;br /&gt;
| 0x00450040&lt;br /&gt;
| SetScreenFlickerBottom(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00460000&lt;br /&gt;
| u8 GetScreenFlickerBottom&lt;br /&gt;
|-&lt;br /&gt;
| 0x00470080&lt;br /&gt;
| SetVolumeSliderBounds(u8 low, u8 high) (see [[I2C_Registers#Device_3|Register 0x58]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00480000&lt;br /&gt;
| u8 low, u8 high GetVolumeSliderBounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00490040&lt;br /&gt;
| SetInterruptMask(u32 mask) (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004A0000&lt;br /&gt;
| u32 GetInterruptMask (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004B0000&lt;br /&gt;
| void ExitExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C0000&lt;br /&gt;
| void EnterExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004D0000&lt;br /&gt;
| [[MCURTC:ReadInterrupt|ReadInterrupt]] (see [[I2C_Registers#Device_3|Register 0x10]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004E0040&lt;br /&gt;
| [[MCURTC:PublishNotifications|TriggerInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x004F0040&lt;br /&gt;
| SetMCUFirmUpdated(u32 flag) used by PTM module&lt;br /&gt;
|-&lt;br /&gt;
| 0x00500000&lt;br /&gt;
| u32 IsMCUFirmUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 0x00510040&lt;br /&gt;
| [[MCURTC:SetSoftwareClosedFlag|SetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00520000&lt;br /&gt;
| [[MCURTC:GetSoftwareClosedFlag|GetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00530040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00540000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00550040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00560000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00570040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00580000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00590040&lt;br /&gt;
| [[MCURTC:SetLegacyJumpProhibitedFlag|SetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005A0000&lt;br /&gt;
| [[MCURTC:GetLegacyJumpProhibitedFlag|GetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005B0040&lt;br /&gt;
| SetUUIDClockSequence &lt;br /&gt;
|-&lt;br /&gt;
| 0x005C0000&lt;br /&gt;
| GetUUIDClockSequence&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU sound service &amp;quot;mcu::SND&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| GetSoundVolume, writes volume slider value (0-63) to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| Set...&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetRegister25h, cmdbuf[2] is 0 on n3ds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU wifi service &amp;quot;mcu::NWM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001....&lt;br /&gt;
| SetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002....&lt;br /&gt;
| GetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003....&lt;br /&gt;
| Sets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004....&lt;br /&gt;
| Gets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005....&lt;br /&gt;
| SetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006....&lt;br /&gt;
| GetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007....&lt;br /&gt;
| [[MCUNWM:SetWirelessDisabledFlag|SetWirelessDisabledFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008....&lt;br /&gt;
| [[MCUNWM:GetWirelessDisabledFlag|GetWirelessDisabledFlag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::HWC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[MCUHWC:ReadRegister|ReadRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020082&lt;br /&gt;
| [[MCUHWC:WriteRegister|WriteRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030042&lt;br /&gt;
| [[MCUHWC:GetInfoRegisters|GetInfoRegisters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[MCUHWC:GetBatteryVoltage|GetBatteryVoltage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[MCUHWC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[MCUHWC:SetPowerLEDPattern|SetPowerLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[MCUHWC:SetWifiLEDState|SetWifiLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[MCUHWC:SetCameraLEDPattern|SetCameraLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[MCUHWC:Set3DLEDState|Set3DLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0640&lt;br /&gt;
| This is the same as [[MCURTC:SetInfoLEDPattern]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[MCUHWC:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F00C0&lt;br /&gt;
| GetRtcTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| GetMcuFwVerHigh&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| GetMcuFwVerLow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::PLS&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;Beg the sysmodule to return the datetime registers in decimal form instead of as a Binary Coded Decimal&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetDatetime (returns registers 0x30-0x36 in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCUPLS:GetSeconds|GetSeconds]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| u8 GetMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetHour&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| u8 GetDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetDay&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| u8 GetMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetYear&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| u16 GetTickCounter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU codec service &amp;quot;mcu::CDC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=New3DS=&lt;br /&gt;
The Old3DS/New3DS MCU sysmodules are identical except that the MCU firmware binary written via I2C is different. The size of that binary is the same. The only different words in .text are for the version of that MCU fw binary.&lt;br /&gt;
&lt;br /&gt;
=MCU firmware versions=&lt;br /&gt;
&lt;br /&gt;
These reside in mcu sysmodule .rodata, are uploaded to MCU register 0x05 and are usually 0x4003 bytes in size (the actual firmware is 0x4000 bytes preceeded by a 3 byte magic header &amp;quot;&amp;lt;code&amp;gt;jhl&amp;lt;/code&amp;gt;&amp;quot; which switches the I2C comms into flash write mode).  &lt;br /&gt;
Switching requires register 0x05 (at address &amp;lt;code&amp;gt;0xFFBA9&amp;lt;/code&amp;gt;) to contain 0x6A (&#039;&amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;&#039;), register 0x06 containing 0x68 (&#039;&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;&#039;), and writing 0x6C (&#039;&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;&#039;) to register 0x07. The actual flashing sequence is only signaled (code at 0x3312-0x331A) when writing register 0x07, it&#039;s skipped otherwise. Register 0x07 gets written anyways, just the actual signaling is skipped if the conditions aren&#039;t met.&lt;br /&gt;
&lt;br /&gt;
Before the upload could commence, external MCU interrupts are turned off via GPIO command 0x00020080(0, 0x40000), then after the upload completed, the sysmodule waits exactly one second for the MCU to reboot, then turns external MCU interrupts back on via &amp;lt;code&amp;gt;gpio:MCU&amp;lt;/code&amp;gt; command 0x00020080(0x40000, 0x40000).&lt;br /&gt;
&lt;br /&gt;
There exists an alternate code path in very old MCU_FIRM versions where uploading is done using register 0x3B (if register 0x0F is zero and 0x10 is 1). Register 0x3B is part of the RTC alarm registers on recent versions of MCU.&lt;br /&gt;
&lt;br /&gt;
On dev-units, the user-facing representation of this firmware version is displayed by first subtracting 0x10 from the major field (raw register 0x00). It is these user-facing versions that are displayed in the table below. It is unknown what bit4 (0x10) actually represents, but it is seemingly always set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Title version&lt;br /&gt;
!  Firmware&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v9216 (New2DSXL)&lt;br /&gt;
| 3.65&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v8192/safe v9217 (latest)&lt;br /&gt;
| 3.56&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v6145 to v8192 (latest)&lt;br /&gt;
| 2.37&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v5122&lt;br /&gt;
| 2.35&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v4102&lt;br /&gt;
| 2.30&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v3072&lt;br /&gt;
| 2.16&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v2048&lt;br /&gt;
| 1.52&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v1026&lt;br /&gt;
| 1.51&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v0/safe v0&lt;br /&gt;
| 1.20&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS factory&lt;br /&gt;
| 1.07&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=20853</id>
		<title>MCU Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=20853"/>
		<updated>2018-11-09T04:27:10Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MCU service &amp;quot;mcu::RTC&amp;quot; */ PTM passes a `2` as an argument to this function. Not sure what it does though.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Only one session can be open per service at a time. If a session is already open for a service, MCU module will wait for the thread handling the session to terminate(triggered by the session being closed by the user process), then it accepts the new session. The commands for each service are handled by separate threads.&lt;br /&gt;
&lt;br /&gt;
=MCU camera service &amp;quot;mcu::CAM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| WriteCameraLedState (writes i2c register 0x2B)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| ReadCameraLedState (reads i2c register 0x2B)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU GPU service &amp;quot;mcu::GPU&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetLcdPowerState. This writes the value of I2C-MCU register 0xf bit6 to u8 cmdreply[2], and the value of bit5 from that register to u8 cmdreply[3].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| SetLcdPowerState. This writes the upper LCD bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetGpuLcdInterfaceState. This writes the value of I2C-MCU register 0xf bit7 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| SetGpuLcdInterfaceState. This writes the lower two bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| GetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080080&lt;br /&gt;
| GetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| GetMcuFwVerHigh. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| GetMcuFwVerLow. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| Set3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| Get3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuGpuEventHandle. Event handle written to TLS+0x8c. MCU notifications 24 to 29 signal this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetMcuGpuEventReason. Writes some value to TLS+0x88. Called by GSP module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU HID service &amp;quot;mcu::HID&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| ??? test register 0x40 bit0, and writes result to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| ??? writes IPC+4 to register 0x41&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| ??? reads register 0x44 to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050080&lt;br /&gt;
| ??? writes IPC+4 to register 0x43 and IPC+8 to register 0x44&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| ReadGyroscopeValues (reads gyroscopy with corrected values)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| GetRaw3DSliderPosition&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| GetMcuHidEventHandle. MCU notifications 11 and 12 signal this. Handle is written to IPC+12&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuHidEventReason. This reads an internal flield into IPC+8 and clears it.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[MCUHID:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| EnableAccelerometerInterrupt(int enable). 1 = enable, 0 = disable accelerometer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
While before these functions are handled, the MCU interrupt with bitmask 0x800 is enabled, then after the commands were handled the MCU interrupt bits 0x1800 get cleared.&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::RTC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| [[MCURTC:SetRTC|SetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCURTC:GetRTC|GetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| SetRTCSeconds(u8 seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetRTCSeconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetRTCMinutes(u8 minutes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetRTCMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetRTCHours(u8 hours)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetRTCHours&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| SetRTCDayOfWeek(u8 dayno)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| u8 GetRTCDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| SetRTCDayOfMonth(u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| u8 GetRTCDayOfMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetRTCMonth(u8 month)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| u8 GetRTCMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| SetRTCYear(u8 year) where year = year - 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| u8 GetRTCYear where year = result + 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| SetRTCLeapYearCounter(u8 leap)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| u8 GetRTCLeapYearCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130080&lt;br /&gt;
| [[MCURTC:SetRTCAlarm|SetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[MCURTC:GetRTCAlarm|GetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150040&lt;br /&gt;
| SetRTCAlarmComponent[0] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| u8 GetRTCAlarmComponent[0]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170040&lt;br /&gt;
| SetRTCAlarmComponent[1] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| u8 GetRTCAlarmComponent[1]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190040&lt;br /&gt;
| SetRTCAlarmComponent[2] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[2]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| SetRTCAlarmComponent[3] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[3]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0040&lt;br /&gt;
| SetRTCAlarmComponent[4] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[4]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0040&lt;br /&gt;
| SetPedometerRecordingMode(u8 mode)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| u8 GetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| u8 GetStepCount (for the current day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220042&lt;br /&gt;
| ReadRegister4Fh(u32 unused_size, translation_param size=0x156 &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x156] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| void ??? writes 1 to register 0x4E which is not writable&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240000&lt;br /&gt;
| Handle GetPowerEventHandle. MCU notifications 1, 8, 9, 10, 13, 14 and 15 signal this.&lt;br /&gt;
see [[I2C_Registers#Device_3|Register 0x18]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| u32 GetPowerInterruptHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| bool CheckRegister02hBit0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| void ClearRegister02hBit0 (does nothing since the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| bool CheckRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| void ClearRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| bool GetShellState. This writes the value of I2C-MCU register 0xf bit1 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| bool GetAdapterState. This writes the value of I2C-MCU register 0xf bit3 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| bool GetBatteryChargeState. This writes the value of I2C-MCU register 0xf bit4 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[MCURTC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E0000&lt;br /&gt;
| u8 Set......&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0000&lt;br /&gt;
| u8 GetBatteryEmptyPatternByte0_safe™&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300040&lt;br /&gt;
| SetLEDBrightness(u8 brightness) (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310000&lt;br /&gt;
| u8 GetLEDBrightness (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| void PowerOff (writes 0x1 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00330000&lt;br /&gt;
| void HardwareReboot (writes 0x4 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340000&lt;br /&gt;
| WriteRegister reg=0x23 value=0x72 (writing to read-only registers does nothing)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350000&lt;br /&gt;
| Writes 0x10 to i2c MCU device, reg 0x20 (this bit of the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| SetWatchdogTimer(u8 timer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370000&lt;br /&gt;
| u8 GetWatchdogTimer&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380042&lt;br /&gt;
| ReadInfoRegister(u32 unused_size, translation_param size &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x13] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390082&lt;br /&gt;
| WriteLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0082&lt;br /&gt;
| ReadLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0640&lt;br /&gt;
| [[MCURTC:SetInfoLEDPattern|SetInfoLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0040&lt;br /&gt;
| [[MCURTC:SetInfoLEDPatternHeader|SetInfoLEDPatternHeader]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0000&lt;br /&gt;
| [[MCURTC:GetInfoLEDStatus|GetInfoLEDStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| WriteRegister50h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0000&lt;br /&gt;
| u8 ReadRegister50h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00400040&lt;br /&gt;
| WriteRegister51h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410000&lt;br /&gt;
| u8 ReadRegister51h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| [[MCURTC:SetBatteryEmptyLEDPattern|SetBatteryEmptyLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430040&lt;br /&gt;
| SetScreenFlickerTop(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| u8 GetScreenFlickerTop&lt;br /&gt;
|-&lt;br /&gt;
| 0x00450040&lt;br /&gt;
| SetScreenFlickerBottom(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00460000&lt;br /&gt;
| u8 GetScreenFlickerBottom&lt;br /&gt;
|-&lt;br /&gt;
| 0x00470080&lt;br /&gt;
| SetVolumeSliderBounds(u8 low, u8 high) (see [[I2C_Registers#Device_3|Register 0x58]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00480000&lt;br /&gt;
| u8 low, u8 high GetVolumeSliderBounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00490040&lt;br /&gt;
| SetInterruptMask(u32 mask) (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004A0000&lt;br /&gt;
| u32 GetInterruptMask (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004B0000&lt;br /&gt;
| void ExitExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C0000&lt;br /&gt;
| void EnterExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004D0000&lt;br /&gt;
| [[MCURTC:ReadInterrupt|ReadInterrupt]] (see [[I2C_Registers#Device_3|Register 0x10]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004E0040&lt;br /&gt;
| [[MCURTC:PublishNotifications|TriggerInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x004F0040&lt;br /&gt;
| SetMCUFirmUpdated(u32 flag) not used by anything&lt;br /&gt;
|-&lt;br /&gt;
| 0x00500000&lt;br /&gt;
| u32 IsMCUFirmUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 0x00510040&lt;br /&gt;
| [[MCURTC:SetSoftwareClosedFlag|SetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00520000&lt;br /&gt;
| [[MCURTC:GetSoftwareClosedFlag|GetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00530040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00540000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00550040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00560000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00570040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00580000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00590040&lt;br /&gt;
| [[MCURTC:SetLegacyJumpProhibitedFlag|SetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005A0000&lt;br /&gt;
| [[MCURTC:GetLegacyJumpProhibitedFlag|GetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005B0040&lt;br /&gt;
| SetUUIDClockSequence &lt;br /&gt;
|-&lt;br /&gt;
| 0x005C0000&lt;br /&gt;
| GetUUIDClockSequence&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU sound service &amp;quot;mcu::SND&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| GetSoundVolume, writes volume slider value (0-63) to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| Set...&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetRegister25h, cmdbuf[2] is 0 on n3ds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU wifi service &amp;quot;mcu::NWM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001....&lt;br /&gt;
| SetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002....&lt;br /&gt;
| GetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003....&lt;br /&gt;
| Sets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004....&lt;br /&gt;
| Gets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005....&lt;br /&gt;
| SetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006....&lt;br /&gt;
| GetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007....&lt;br /&gt;
| [[MCUNWM:SetWirelessDisabledFlag|SetWirelessDisabledFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008....&lt;br /&gt;
| [[MCUNWM:GetWirelessDisabledFlag|GetWirelessDisabledFlag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::HWC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[MCUHWC:ReadRegister|ReadRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020082&lt;br /&gt;
| [[MCUHWC:WriteRegister|WriteRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030042&lt;br /&gt;
| [[MCUHWC:GetInfoRegisters|GetInfoRegisters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[MCUHWC:GetBatteryVoltage|GetBatteryVoltage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[MCUHWC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[MCUHWC:SetPowerLEDPattern|SetPowerLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[MCUHWC:SetWifiLEDState|SetWifiLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[MCUHWC:SetCameraLEDPattern|SetCameraLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[MCUHWC:Set3DLEDState|Set3DLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0640&lt;br /&gt;
| This is the same as [[MCURTC:SetInfoLEDPattern]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[MCUHWC:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F00C0&lt;br /&gt;
| GetRtcTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| GetMcuFwVerHigh&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| GetMcuFwVerLow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::PLS&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;Beg the sysmodule to return the datetime registers in decimal form instead of as a Binary Coded Decimal&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetDatetime (returns registers 0x30-0x36 in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCUPLS:GetSeconds|GetSeconds]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| u8 GetMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetHour&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| u8 GetDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetDay&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| u8 GetMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetYear&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| u16 GetTickCounter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU codec service &amp;quot;mcu::CDC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=New3DS=&lt;br /&gt;
The Old3DS/New3DS MCU sysmodules are identical except that the MCU firmware binary written via I2C is different. The size of that binary is the same. The only different words in .text are for the version of that MCU fw binary.&lt;br /&gt;
&lt;br /&gt;
=MCU firmware versions=&lt;br /&gt;
&lt;br /&gt;
These reside in mcu sysmodule .rodata, are uploaded to MCU register 0x05 and are usually 0x4003 bytes in size (the actual firmware is 0x4000 bytes preceeded by a 3 byte magic header &amp;quot;&amp;lt;code&amp;gt;jhl&amp;lt;/code&amp;gt;&amp;quot; which switches the I2C comms into flash write mode).  &lt;br /&gt;
Switching requires register 0x05 (at address &amp;lt;code&amp;gt;0xFFBA9&amp;lt;/code&amp;gt;) to contain 0x6A (&#039;&amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;&#039;), register 0x06 containing 0x68 (&#039;&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;&#039;), and writing 0x6C (&#039;&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;&#039;) to register 0x07. The actual flashing sequence is only signaled (code at 0x3312-0x331A) when writing register 0x07, it&#039;s skipped otherwise. Register 0x07 gets written anyways, just the actual signaling is skipped if the conditions aren&#039;t met.&lt;br /&gt;
&lt;br /&gt;
Before the upload could commence, external MCU interrupts are turned off via GPIO command 0x00020080(0, 0x40000), then after the upload completed, the sysmodule waits exactly one second for the MCU to reboot, then turns external MCU interrupts back on via &amp;lt;code&amp;gt;gpio:MCU&amp;lt;/code&amp;gt; command 0x00020080(0x40000, 0x40000).&lt;br /&gt;
&lt;br /&gt;
There exists an alternate code path in very old MCU_FIRM versions where uploading is done using register 0x3B (if register 0x0F is zero and 0x10 is 1). Register 0x3B is part of the RTC alarm registers on recent versions of MCU.&lt;br /&gt;
&lt;br /&gt;
On dev-units, the user-facing representation of this firmware version is displayed by first subtracting 0x10 from the major field (raw register 0x00). It is these user-facing versions that are displayed in the table below. It is unknown what bit4 (0x10) actually represents, but it is seemingly always set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Title version&lt;br /&gt;
!  Firmware&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v9216 (New2DSXL)&lt;br /&gt;
| 3.65&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v8192/safe v9217 (latest)&lt;br /&gt;
| 3.56&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v6145 to v8192 (latest)&lt;br /&gt;
| 2.37&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v5122&lt;br /&gt;
| 2.35&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v4102&lt;br /&gt;
| 2.30&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v3072&lt;br /&gt;
| 2.16&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v2048&lt;br /&gt;
| 1.52&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v1026&lt;br /&gt;
| 1.51&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v0/safe v0&lt;br /&gt;
| 1.20&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS factory&lt;br /&gt;
| 1.07&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Services&amp;diff=20852</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Services&amp;diff=20852"/>
		<updated>2018-11-08T15:58:06Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Notifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port &#039;&#039;srv:&#039;&#039; (&amp;quot;service manager&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.&lt;br /&gt;
&lt;br /&gt;
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]]. Other processes are limited to access services listed in their [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|service access control list]], as passed to [[SRVPM:RegisterProcess]].&lt;br /&gt;
&lt;br /&gt;
Attempting to use [[SRV:GetServiceHandle|GetServiceHandle]] with a service that the process has access to when that service isn&#039;t registered will block until it is registered.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Port &amp;quot;srv:&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| [[SRV:RegisterClient|RegisterClient]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[SRV:EnableNotification|EnableNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030100&lt;br /&gt;
| [[SRV:RegisterService|RegisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[SRV:UnregisterService|UnregisterService]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[SRV:GetServiceHandle|GetServiceHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000600C2&lt;br /&gt;
| [[SRV:RegisterPort|RegisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000700C0&lt;br /&gt;
| [[SRV:UnregisterPort|UnregisterPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080100&lt;br /&gt;
| [[SRV:GetPort|GetPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[SRV:Subscribe|Subscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| [[SRV:Unsubscribe|Unsubscribe]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[SRV:ReceiveNotification|ReceiveNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0080&lt;br /&gt;
| [[SRV:PublishToSubscriber|PublishToSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| [[SRV:PublishAndGetSubscriber|PublishAndGetSubscriber]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E00C0&lt;br /&gt;
| [[SRV:IsServiceRegistered|IsServiceRegistered]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It appears these &amp;quot;port&amp;quot; commands can be used for transferring arbitrary handles, however [[SRV:GetPort|GetPort]] still uses the same service-access-control validation as [[SRV:GetServiceHandle|GetServiceHandle]]. Despite this fact, it appears that a &amp;quot;port&amp;quot; and a service with the same name can coexist independently.&lt;br /&gt;
&lt;br /&gt;
==Service Manager Process-Manager Port/Service &amp;quot;srv:pm&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header (port), prior to [[7.0.0-13]]&lt;br /&gt;
!  Command Header (service), post [[7.0.0-13]]&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010042&lt;br /&gt;
| 0x00010042&lt;br /&gt;
| [[SRVPM:PublishToProcess|PublishToProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020040&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| [[SRVPM:PublishToAll|PublishToAll]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030082&lt;br /&gt;
| 0x00030082&lt;br /&gt;
| [[SRVPM:RegisterProcess|RegisterProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040040&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| [[SRVPM:UnregisterProcess|UnregisterProcess]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prior to to [[7.0.0-13]], the commands listed for &amp;quot;srv:&amp;quot; were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the &amp;quot;srv:pm&amp;quot; port was changed to a service. With this change, commandIDs for these commands were changed. &amp;quot;srv:pm&amp;quot; was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use &amp;quot;srv:pm&amp;quot;, however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses &amp;quot;srv:pm&amp;quot; is the [[Process_Manager_Services|Process Manager]].&lt;br /&gt;
&lt;br /&gt;
==Notifications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ID&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| This indicates that the recipient must terminate. Does not require subscription.&lt;br /&gt;
|-&lt;br /&gt;
| 0x101&lt;br /&gt;
| Signaled to NS on sleep mode entry.&lt;br /&gt;
|-&lt;br /&gt;
| 0x103&lt;br /&gt;
| Fired on sleep mode entry, subscribed to by NS, CSND, NWM, AC and NIM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| This indicates that the system is entering sleep mode. (PTM:NotifySleepPreparationComplete needed for this and the following?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x105&lt;br /&gt;
| This indicates that the system has exited sleep mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 &lt;br /&gt;
| Fired after sleep mode exit, subscribed to by NS, MIC, AC, NEWS, CECD and BOSS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x107&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| error at boot?&lt;br /&gt;
|-&lt;br /&gt;
| 0x109&lt;br /&gt;
| ? (Subscribed to by GSP)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| Sent by PM after it calls svcDebugActiveProcess on a title queued for debug.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110-0x11F&lt;br /&gt;
| Sent to NS on application exit. See [[PMApp:LaunchTitle#Launch_Flags|PM launch flags]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x179&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by NS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x202&lt;br /&gt;
| POWER button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x203&lt;br /&gt;
| POWER button held long&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| HOME button pressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x205&lt;br /&gt;
| HOME button released&lt;br /&gt;
|-&lt;br /&gt;
| 0x206&lt;br /&gt;
| This is signaled by [[NWMEXT:ControlWirelessEnabled]] and when the physical Wi-Fi slider is enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x207&lt;br /&gt;
| SD card inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| Game cartridge inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x209&lt;br /&gt;
| SD card removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A&lt;br /&gt;
| Game cartridge removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x211&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x212&lt;br /&gt;
| Battery Related? (Published by PTM module)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B&lt;br /&gt;
| Game cartridge inserted or removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| mcu-module publishes this on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this&lt;br /&gt;
|-&lt;br /&gt;
| 0x20D&lt;br /&gt;
| Charger plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x20E&lt;br /&gt;
| Charger plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x213&lt;br /&gt;
| Signaled after exiting sleep mode and early during system boot. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP powers LCD on in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x214&lt;br /&gt;
| Signaled before entering sleep mode. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP shutdowns LCD in receipt to this, etc. &lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| Signaled after sleep mode exit and during system boot, subscribed to by NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x301&lt;br /&gt;
| Signaled just before sleep mode is exited from, subscribed to by FRIENDS and NDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x302&lt;br /&gt;
| Unknown. Signaled by nwm/AC module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x303&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|-&lt;br /&gt;
| 0x304&lt;br /&gt;
| Unknown. Subscribed to by CECD module.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=20851</id>
		<title>MCU Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MCU_Services&amp;diff=20851"/>
		<updated>2018-11-08T12:21:17Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MCU service &amp;quot;mcu::RTC&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Only one session can be open per service at a time. If a session is already open for a service, MCU module will wait for the thread handling the session to terminate(triggered by the session being closed by the user process), then it accepts the new session. The commands for each service are handled by separate threads.&lt;br /&gt;
&lt;br /&gt;
=MCU camera service &amp;quot;mcu::CAM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| WriteCameraLedState (writes i2c register 0x2B)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| ReadCameraLedState (reads i2c register 0x2B)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU GPU service &amp;quot;mcu::GPU&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetLcdPowerState. This writes the value of I2C-MCU register 0xf bit6 to u8 cmdreply[2], and the value of bit5 from that register to u8 cmdreply[3].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| SetLcdPowerState. This writes the upper LCD bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetGpuLcdInterfaceState. This writes the value of I2C-MCU register 0xf bit7 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| SetGpuLcdInterfaceState. This writes the lower two bits of MCU register 0x22.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| GetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080080&lt;br /&gt;
| GetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| GetMcuFwVerHigh. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| GetMcuFwVerLow. Called by GSP module&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| Set3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| Get3dLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuGpuEventHandle. Event handle written to TLS+0x8c. MCU notifications 24 to 29 signal this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetMcuGpuEventReason. Writes some value to TLS+0x88. Called by GSP module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU HID service &amp;quot;mcu::HID&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| ??? test register 0x40 bit0, and writes result to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| ??? writes IPC+4 to register 0x41&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| ??? reads register 0x44 to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050080&lt;br /&gt;
| ??? writes IPC+4 to register 0x43 and IPC+8 to register 0x44&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| ReadGyroscopeValues (reads gyroscopy with corrected values)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| GetRaw3DSliderPosition&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| GetMcuHidEventHandle. MCU notifications 11 and 12 signal this. Handle is written to IPC+12&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| GetMcuHidEventReason. This reads an internal flield into IPC+8 and clears it.&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[MCUHID:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| EnableAccelerometerInterrupt(int enable). 1 = enable, 0 = disable accelerometer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
While before these functions are handled, the MCU interrupt with bitmask 0x800 is enabled, then after the commands were handled the MCU interrupt bits 0x1800 get cleared.&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::RTC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| [[MCURTC:SetRTC|SetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCURTC:GetRTC|GetRTC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| SetRTCSeconds(u8 seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetRTCSeconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetRTCMinutes(u8 minutes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetRTCMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| SetRTCHours(u8 hours)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetRTCHours&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| SetRTCDayOfWeek(u8 dayno)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| u8 GetRTCDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| SetRTCDayOfMonth(u8 day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| u8 GetRTCDayOfMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetRTCMonth(u8 month)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| u8 GetRTCMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0040&lt;br /&gt;
| SetRTCYear(u8 year) where year = year - 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| u8 GetRTCYear where year = result + 2000&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110040&lt;br /&gt;
| SetRTCLeapYearCounter(u8 leap)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120000&lt;br /&gt;
| u8 GetRTCLeapYearCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130080&lt;br /&gt;
| [[MCURTC:SetRTCAlarm|SetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| [[MCURTC:GetRTCAlarm|GetRTCAlarm]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150040&lt;br /&gt;
| SetRTCAlarmComponent[0] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| u8 GetRTCAlarmComponent[0]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170040&lt;br /&gt;
| SetRTCAlarmComponent[1] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| u8 GetRTCAlarmComponent[1]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190040&lt;br /&gt;
| SetRTCAlarmComponent[2] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[2]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| SetRTCAlarmComponent[3] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[3]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0040&lt;br /&gt;
| SetRTCAlarmComponent[4] (u8 val)&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0000&lt;br /&gt;
| u8 GetRTCAlarmComponent[4]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0040&lt;br /&gt;
| SetPedometerRecordingMode(u8 mode)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| u8 GetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210080&lt;br /&gt;
| u8 GetStepCount (for the current day)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220042&lt;br /&gt;
| ReadRegister4Fh(u32 unused_size, translation_param size=0x156 &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x156] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| void ??? writes 1 to register 0x4E which is not writable&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240000&lt;br /&gt;
| Handle GetPowerEventHandle. MCU notifications 1, 8, 9, 10, 13, 14 and 15 signal this.&lt;br /&gt;
see [[I2C_Registers#Device_3|Register 0x18]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| u32 GetPowerInterruptHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260000&lt;br /&gt;
| bool CheckRegister02hBit0&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| void ClearRegister02hBit0 (does nothing since the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| bool CheckRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| void ClearRegister02hBit1&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| bool GetShellState. This writes the value of I2C-MCU register 0xf bit1 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| bool GetAdapterState. This writes the value of I2C-MCU register 0xf bit3 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| bool GetBatteryChargeState. This writes the value of I2C-MCU register 0xf bit4 to u8 cmdreply[2].&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[MCURTC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E0000&lt;br /&gt;
| u8 GetBatteryEmptyPatternByte0&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0000&lt;br /&gt;
| u8 GetBatteryEmptyPatternByte0_safe™&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300040&lt;br /&gt;
| SetLEDBrightness(u8 brightness) (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310000&lt;br /&gt;
| u8 GetLEDBrightness (see [[I2C_Registers#Device_3|Register 0x28]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320000&lt;br /&gt;
| void PowerOff (writes 0x1 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00330000&lt;br /&gt;
| void HardwareReboot (writes 0x4 to i2c MCU device, [[I2C_Registers#Device_3|reg 0x20]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340000&lt;br /&gt;
| WriteRegister reg=0x23 value=0x72 (writing to read-only registers does nothing)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350000&lt;br /&gt;
| Writes 0x10 to i2c MCU device, reg 0x20 (this bit of the register is not writable)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00360040&lt;br /&gt;
| SetWatchdogTimer(u8 timer)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00370000&lt;br /&gt;
| u8 GetWatchdogTimer&lt;br /&gt;
|-&lt;br /&gt;
| 0x00380042&lt;br /&gt;
| ReadInfoRegister(u32 unused_size, translation_param size &amp;lt;&amp;lt; 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 0xC, u8[0x13] ptr)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00390082&lt;br /&gt;
| WriteLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003A0082&lt;br /&gt;
| ReadLoop (translation parameters too complex)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003B0640&lt;br /&gt;
| [[MCURTC:SetInfoLEDPattern|SetInfoLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0040&lt;br /&gt;
| [[MCURTC:SetInfoLEDPatternHeader|SetInfoLEDPatternHeader]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003D0000&lt;br /&gt;
| [[MCURTC:GetInfoLEDStatus|GetInfoLEDStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003E0040&lt;br /&gt;
| WriteRegister50h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0000&lt;br /&gt;
| u8 ReadRegister50h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00400040&lt;br /&gt;
| WriteRegister51h(u8 value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00410000&lt;br /&gt;
| u8 ReadRegister51h&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420040&lt;br /&gt;
| [[MCURTC:SetBatteryEmptyLEDPattern|SetBatteryEmptyLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00430040&lt;br /&gt;
| SetScreenFlickerTop(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00440000&lt;br /&gt;
| u8 GetScreenFlickerTop&lt;br /&gt;
|-&lt;br /&gt;
| 0x00450040&lt;br /&gt;
| SetScreenFlickerBottom(u8 flicker)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00460000&lt;br /&gt;
| u8 GetScreenFlickerBottom&lt;br /&gt;
|-&lt;br /&gt;
| 0x00470080&lt;br /&gt;
| SetVolumeSliderBounds(u8 low, u8 high) (see [[I2C_Registers#Device_3|Register 0x58]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00480000&lt;br /&gt;
| u8 low, u8 high GetVolumeSliderBounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x00490040&lt;br /&gt;
| SetInterruptMask(u32 mask) (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004A0000&lt;br /&gt;
| u32 GetInterruptMask (see [[I2C_Registers#Device_3|Register 0x18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004B0000&lt;br /&gt;
| void ExitExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C0000&lt;br /&gt;
| void EnterExclusiveInterruptMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x004D0000&lt;br /&gt;
| [[MCURTC:ReadInterrupt|ReadInterrupt]] (see [[I2C_Registers#Device_3|Register 0x10]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x004E0040&lt;br /&gt;
| [[MCURTC:PublishNotifications|TriggerInterrupt]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x004F0040&lt;br /&gt;
| SetMCUFirmUpdated(u32 flag) not used by anything&lt;br /&gt;
|-&lt;br /&gt;
| 0x00500000&lt;br /&gt;
| u32 IsMCUFirmUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 0x00510040&lt;br /&gt;
| [[MCURTC:SetSoftwareClosedFlag|SetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00520000&lt;br /&gt;
| [[MCURTC:GetSoftwareClosedFlag|GetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00530040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00540000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00550040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00560000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00570040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00580000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00590040&lt;br /&gt;
| [[MCURTC:SetLegacyJumpProhibitedFlag|SetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005A0000&lt;br /&gt;
| [[MCURTC:GetLegacyJumpProhibitedFlag|GetLegacyJumpProhibitedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x005B0040&lt;br /&gt;
| SetUUIDClockSequence &lt;br /&gt;
|-&lt;br /&gt;
| 0x005C0000&lt;br /&gt;
| GetUUIDClockSequence&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU sound service &amp;quot;mcu::SND&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| GetSoundVolume, writes volume slider value (0-63) to IPC+8&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020040&lt;br /&gt;
| Set...&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetRegister25h, cmdbuf[2] is 0 on n3ds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU wifi service &amp;quot;mcu::NWM&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001....&lt;br /&gt;
| SetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002....&lt;br /&gt;
| GetWirelessLedState&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003....&lt;br /&gt;
| Sets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004....&lt;br /&gt;
| Gets GPIO 0x20 high/low?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005....&lt;br /&gt;
| SetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006....&lt;br /&gt;
| GetEnableWifiGpio&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007....&lt;br /&gt;
| [[MCUNWM:SetWirelessDisabledFlag|SetWirelessDisabledFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008....&lt;br /&gt;
| [[MCUNWM:GetWirelessDisabledFlag|GetWirelessDisabledFlag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::HWC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[MCUHWC:ReadRegister|ReadRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020082&lt;br /&gt;
| [[MCUHWC:WriteRegister|WriteRegister]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030042&lt;br /&gt;
| [[MCUHWC:GetInfoRegisters|GetInfoRegisters]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[MCUHWC:GetBatteryVoltage|GetBatteryVoltage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[MCUHWC:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060040&lt;br /&gt;
| [[MCUHWC:SetPowerLEDPattern|SetPowerLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070040&lt;br /&gt;
| [[MCUHWC:SetWifiLEDState|SetWifiLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080040&lt;br /&gt;
| [[MCUHWC:SetCameraLEDPattern|SetCameraLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090040&lt;br /&gt;
| [[MCUHWC:Set3DLEDState|Set3DLEDState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0640&lt;br /&gt;
| This is the same as [[MCURTC:SetInfoLEDPattern]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[MCUHWC:GetSoundVolume|GetSoundVolume]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| SetTopScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetBottomScreenFlicker&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F00C0&lt;br /&gt;
| GetRtcTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| GetMcuFwVerHigh&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| GetMcuFwVerLow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU service &amp;quot;mcu::PLS&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;Beg the sysmodule to return the datetime registers in decimal form instead of as a Binary Coded Decimal&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| GetDatetime (returns registers 0x30-0x36 in IPC+8)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[MCUPLS:GetSeconds|GetSeconds]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| u8 GetMinutes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| u8 GetHour&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| u8 GetDayOfWeek&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| u8 GetDay&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| u8 GetMonth&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| u8 GetYear&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| u16 GetTickCounter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MCU codec service &amp;quot;mcu::CDC&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=New3DS=&lt;br /&gt;
The Old3DS/New3DS MCU sysmodules are identical except that the MCU firmware binary written via I2C is different. The size of that binary is the same. The only different words in .text are for the version of that MCU fw binary.&lt;br /&gt;
&lt;br /&gt;
=MCU firmware versions=&lt;br /&gt;
&lt;br /&gt;
These reside in mcu sysmodule .rodata, are uploaded to MCU register 0x05 and are usually 0x4003 bytes in size (the actual firmware is 0x4000 bytes preceeded by a 3 byte magic header &amp;quot;&amp;lt;code&amp;gt;jhl&amp;lt;/code&amp;gt;&amp;quot; which switches the I2C comms into flash write mode).  &lt;br /&gt;
Switching requires register 0x05 (at address &amp;lt;code&amp;gt;0xFFBA9&amp;lt;/code&amp;gt;) to contain 0x6A (&#039;&amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;&#039;), register 0x06 containing 0x68 (&#039;&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;&#039;), and writing 0x6C (&#039;&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;&#039;) to register 0x07. The actual flashing sequence is only signaled (code at 0x3312-0x331A) when writing register 0x07, it&#039;s skipped otherwise. Register 0x07 gets written anyways, just the actual signaling is skipped if the conditions aren&#039;t met.&lt;br /&gt;
&lt;br /&gt;
Before the upload could commence, external MCU interrupts are turned off via GPIO command 0x00020080(0, 0x40000), then after the upload completed, the sysmodule waits exactly one second for the MCU to reboot, then turns external MCU interrupts back on via &amp;lt;code&amp;gt;gpio:MCU&amp;lt;/code&amp;gt; command 0x00020080(0x40000, 0x40000).&lt;br /&gt;
&lt;br /&gt;
There exists an alternate code path in very old MCU_FIRM versions where uploading is done using register 0x3B (if register 0x0F is zero and 0x10 is 1). Register 0x3B is part of the RTC alarm registers on recent versions of MCU.&lt;br /&gt;
&lt;br /&gt;
On dev-units, the user-facing representation of this firmware version is displayed by first subtracting 0x10 from the major field (raw register 0x00). It is these user-facing versions that are displayed in the table below. It is unknown what bit4 (0x10) actually represents, but it is seemingly always set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Title version&lt;br /&gt;
!  Firmware&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v9216 (New2DSXL)&lt;br /&gt;
| 3.65&lt;br /&gt;
|-&lt;br /&gt;
| New3DS v8192/safe v9217 (latest)&lt;br /&gt;
| 3.56&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v6145 to v8192 (latest)&lt;br /&gt;
| 2.37&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v5122&lt;br /&gt;
| 2.35&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v4102&lt;br /&gt;
| 2.30&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v3072&lt;br /&gt;
| 2.16&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v2048&lt;br /&gt;
| 1.52&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v1026&lt;br /&gt;
| 1.51&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS v0/safe v0&lt;br /&gt;
| 1.20&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS factory&lt;br /&gt;
| 1.07&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20829</id>
		<title>3DS Userland Flaws</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20829"/>
		<updated>2018-09-18T08:54:53Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Non-system applications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists vulnerabilities / exploits for 3DS applications and applets. Exploiting these initially results in ROP, from that ROP one can then for example try exploiting [[3DS_System_Flaws|system]] flaw(s).&lt;br /&gt;
&lt;br /&gt;
=Non-system applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Application name&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Last app/system version this flaw was checked for&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this vuln was discovered&lt;br /&gt;
!  Vuln discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Cubic Ninja&lt;br /&gt;
| Map-data stack smash&lt;br /&gt;
| See [[Ninjhax|here]] regarding Ninjhax.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.4.0-29]].&lt;br /&gt;
| Ninjhax release&lt;br /&gt;
| July 2014&lt;br /&gt;
| [[User:smea|smea]]&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Ocarina of Time 3D&lt;br /&gt;
| UTF-16 name string buffer overflow via unchecked u8 length field&lt;br /&gt;
| The u8 at offset 0x2C in the savefile is the character-length of the UTF-16 string at offset 0x1C. When copying this string, it&#039;s essentially a memory-copy with lenval*2, not a string-copy. This can be used to trigger buffer overflows at various locations depending on the string length.&lt;br /&gt;
* When value is &amp;gt;=0x6E it crashes when saving the saveslot, this causes a stack-smash however it normally crashes before it returns from the function which had the stack-frame overwritten.&lt;br /&gt;
* With value &amp;gt;=0x9A, it crashes via stack-smash in-game once any dialogs are opened(touching buttons on the touch-screen can trigger it too).&lt;br /&gt;
* Length value&amp;gt;=0xCD causes a crash while loading the saveslot, via a heap buffer overflow. This buf-overflow overwrites a heap memchunk following the allocated buffer. When the first 16-bits overwriting that heap memchunk is not the memchunk magic-number(0x7373), the mem-alloc code will just return a NULL ptr which later results in a crash. When the magic-number is valid, the mem-alloc code will continue to attempt to parse the memchunk, which may crash depending on the data which overwrote the memchunk. This heap code is separate from the CTRSDK heap code. Exploiting this doesn&#039;t seem to be possible: since the heap code actually verifies that the magic-number for the next/prev memchunk ptrs are correct(unlike CTRSDK), it&#039;s not possible to change those ptrs to useful arbitrary addresses outside of savedata(like with triggering a write to a c++ object ptr which later is used with a vtable func-call, this is what one would do with CTRSDK heap here).&lt;br /&gt;
&lt;br /&gt;
On March 11, 2015, an exploit using this vuln was released, that one was intended for warez/etc. The following exploit wasn&#039;t released before then mainly because doing so would (presumably) result in the vuln being fixed. The following old exploit was released on March 14, 2015: [https://github.com/yellows8/oot3dhax].&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.6.0-31]].&lt;br /&gt;
| March 11, 2015&lt;br /&gt;
| Around October 22, 2012&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Super Smash Bros 3DS&lt;br /&gt;
| Buffer overflow in local-multiplayer beacon handling.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| App: v1.1.3&lt;br /&gt;
| See [[smashbroshax|here]]. System: [[10.3.0-28]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Super Mystery Dungeon&lt;br /&gt;
| Heap overflow within linear memory via unchecked save file length&lt;br /&gt;
| Pokemon Super Mystery Dungeon uses zlib compression for most of its save files, possibly due to the save files being larger than its predecessor, Gates to Infinity. When a save file is being prepared to be loaded and read from, only a 0x32000 large buffer is allocated for file reading, and a 0x3e800-large buffer for decompression is also allocated before the file is read. However, the game does not limit the size of the file read to this allocation bound, allowing for the file to overflow into the linear memory heap and into the next allocation. Since Pokemon Super Mystery Dungeon stores allocation memchunks directly before the allocation, overwriting the next memchunk with a corrupted one allows for arbitrary writes of linear heap pointers when the next buffer is allocated or arbitrary writes of any pointer within writable memory when the corrupted buffer is freed.&lt;br /&gt;
| None&lt;br /&gt;
| O3DS: [[11.3.0-36]]. N3DS: [[11.4.0-37]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 14, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| VVVVVV&lt;br /&gt;
| Buffer overflow in XML save file array parsing&lt;br /&gt;
| VVVVVV utilizes several XML files (renamed with a .vvv extension) to store level save data, stats and settings. Within these XML files are several tags containing an array of data which, when parsed, is not properly checked to be of proper length for the tag being parsed from. This allows for an overflow of 16-bit array values from the location where the array is parsed. With unlock.vvv, XML data is parsed to the stack, and with level saves the heap. This allows for the pointer where the level save worldmap tag array should be parsed into to be overwritten with a stack address, allowing for ROP from within the XML array parsing function on the next level load.&lt;br /&gt;
| App: v1.1&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 25, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| Citizens of Earth&lt;br /&gt;
| Save file read stack smash&lt;br /&gt;
| Citizens of Earth also uses &amp;quot;XML&amp;quot; files for saves, which are actually entirely binary data (not XML at all) with no checksums. These files are read from the filesystem on to a fixed size stack buffer which leads to an incredibly trivial stack smash. When using the autosave slot for this, the save is parsed when the user selects &amp;quot;continue&amp;quot;. When using one of the dedicated save slots (1-3), the save is parsed shortly after the company splash screens fade. Note that the save is read quite high (descending) on the stack - when exploiting this, one would likely need to move SP due to almost instantly overflowing the physical stack.&lt;br /&gt;
| None&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| May 5, 2016&lt;br /&gt;
| [[User:Dazzozo|Dazzozo]]&lt;br /&gt;
|-&lt;br /&gt;
| SmileBASIC 3.x&lt;br /&gt;
| Poor parameter validation on &amp;quot;BGSCREEN&amp;quot; command&lt;br /&gt;
| The SmileBASIC &amp;quot;BGSCREEN&amp;quot; command&#039;s second parameter is not properly validated as being within range.  As a result, one can set the screen size to an absurdly large value.  This means that the &amp;quot;BGGET&amp;quot; and &amp;quot;BGPUT&amp;quot; commands can then be used on out-of-range values to read and write a significant chunk of the interpreter&#039;s address space.&lt;br /&gt;
With a series of carefully-designed BGPUT commands, one can build a ROP chain and cause it to be executed.&lt;br /&gt;
| App: 3.3.2.&lt;br /&gt;
| System: [[11.0.0-33]].&lt;br /&gt;
| July 20, 2016&lt;br /&gt;
| Around June 26, 2016&lt;br /&gt;
| slackerSnail, 12Me12, incvoid&lt;br /&gt;
Exploited by MrNbaYoh and [[User:Plutooo|plutoo]].&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Tri Force Heroes&lt;br /&gt;
| [[3DS_System_Flaws#General.2FCTRSDK|CTRSDK]] CTPK buffer overflow combined with game&#039;s usage of SpotPass&lt;br /&gt;
| During the very first screen displayed by the game during boot(&amp;quot;Loading...&amp;quot;), just seconds after title launch, the game loads CTPK from the [[BOSS_Services|stored]] SpotPass content. Hence, this game could be exploited via the vulnerable CTRSDK CTPK code &#039;&#039;if&#039;&#039; one could get custom SpotPass data into extdata somehow(ctr-httpwn &amp;gt;=v1.2 with bosshaxx allows this).&lt;br /&gt;
&lt;br /&gt;
The code for this runs from a thread separate from the main-thread, with the stack in linearmem heap. This SpotPass handling triggers before the game ever opens the regular savedata archive. The extdata is opened at some point before this: it opens a file for checking if it exists, then immediately closes it.&lt;br /&gt;
&lt;br /&gt;
The two SpotPass URLs for this have always(?) returned HTTP 404 as of November 2016. It appears these were intended for use as textures for additional costumes(and never got used publicly), but this wasn&#039;t tested.&lt;br /&gt;
&lt;br /&gt;
This is used by [https://github.com/yellows8/ctpkpwn ctpkpwn_tfh].&lt;br /&gt;
| None&lt;br /&gt;
| App: v2.1.0&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| November 14, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pixel Paint&lt;br /&gt;
| Buffer overflow via unchecked extdata file length&lt;br /&gt;
| Pixel Paint loads pictures saved by the user from extdatas. The file is read to a fixed size buffer but the file length remains unchecked, so with a large enough file, one can overwrite pointers in memory and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| November 5, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Steel Diver : Sub Wars&lt;br /&gt;
| Heap overflow / arbitrary memcpy&lt;br /&gt;
| Savefile datas are stored as key/value pairs, a large enough string key makes the game overwrite a memcpy source/destination addresses and size arguments. So one can actually memcpy a rop on the stack and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around July 15, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]], Vegaroxas&lt;br /&gt;
|-&lt;br /&gt;
| 1001 Spikes&lt;br /&gt;
| Buffer overflow via unchecked array-indexes in XML savefile parsing&lt;br /&gt;
| The savefiles are stored as renamed .xml files, which contain several tags with attributes like &#039;array-index=&amp;quot;array-value&amp;quot;&#039;, where both of these are converted from ASCII strings to integers as signed-int32, and the array-value given blindly written to an array inside a structure using the (unchecked) index given. With several of these attributes, one can overwrite the stack starting from the stored lr of the function that does this parsing, and write a ROP chain there. Testing used the &amp;quot;LevelAttempts&amp;quot; tag which is the last such tag parsed in that function.&lt;br /&gt;
| None&lt;br /&gt;
| App: v1.2.0 (TMD v2096)&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around November 2, 2016&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| Secret base team name heap overflow&lt;br /&gt;
| When the player wants to edit the team name, it is copied over the heap, however its length is not verified. So with a large enough team name one can overwrite some pointers and get two arbitrary jumps and then get control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.2.0-35]].&lt;br /&gt;
| December 30, 2016&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Swapdoodle&lt;br /&gt;
| Heap buffer overflow via unchecked size&lt;br /&gt;
| The letter file format used by doodlebomb is composed of multiple chunks. Each chunks is described in the header of the file where the name, size and CRC of each chunk are stored. Some chunks are meant to be headers, every header&#039;s size should be 0x80, however the length of the STAHED1 chunk remains unchecked and the game memcpy the chunk to a 0x80 byte buffer with the length provided in the file. This way one is able to overwrite some pointers and get control of the execution flow.&lt;br /&gt;
| App: &amp;gt; v1.1.1&lt;br /&gt;
| App: v1.1.1&lt;br /&gt;
| April 24, 2017&lt;br /&gt;
| February, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Picross&lt;br /&gt;
| Arbitrary memcpy via unchecked size&lt;br /&gt;
| When reading the savefile, the game handles some lists of buffers that are copied to memory. These buffers should always be 0x14-bytes long but the game uses the size provided in the savefile to copy them. These buffers are copied in some structs and thus with a big enough length value, one can overwrite the next struct which contains a size and a destination address for a memcpy.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| May 29, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow on .bss section&lt;br /&gt;
| When loading a project, the game copies multiple chunks over the BSS section. However the number of chunks to copy is not checked, thus a large amount of chunk result in a buffer overflow. There&#039;s multiple way to exploit this flaw to gain an arbitrary memcpy or an arbitrary jump.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 28, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow via unchecked file size&lt;br /&gt;
| When loading a project, the game loads the file to a 0x200000 bytes long buffer. However the size remains unchecked, so with a big enough file one can overflow the buffer and overwrite a thread stack and then achieve ROP.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 29, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| PSS data heap/stack overflow&lt;br /&gt;
| When launching the game, multiple chunks from the save file are parsed and copied to a large heap buffer. When parsing PSS data (acquaintances, passerby) the game copies each entry to the heap buffer, the number of entries to copy is read from the end of the multiple pss data chunks and is not checked, leading to an overflow. The &amp;quot;PSS data - friends&amp;quot; chunk is vulnerable too, but the overflow occurs on the stack and unfortunately this isn&#039;t exploitable because of a 4 bytes uncontrolled value (in each entry) that gets written on sensitive data.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.6.0]].&lt;br /&gt;
| October 1, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| OOB write&lt;br /&gt;
| When handling events in a map, the indices of &amp;quot;buttons&amp;quot; are not checked. This results in an out of bound bit write, one can thus write a rop directly on the stack (bit by bit).&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 5, 2018&lt;br /&gt;
| &lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Unholy Heights&lt;br /&gt;
| Buffer overflow via unchecked string size&lt;br /&gt;
| The game stores some utf-16 messages in the savefile. Right before the message is the length(u32) for the string, the game uses this size to memcpy the message from the savefile to the stack without checking the length. This allows one to overwrite some function addresses on the stack and form a rop chain.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial Version&lt;br /&gt;
| September 13, 2018&lt;br /&gt;
| August, 2018&lt;br /&gt;
| Kartik&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Flipnote Studio 3D==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Flaw discovered by&lt;br /&gt;
|-&lt;br /&gt;
| KFH frame count overflow&lt;br /&gt;
| The KFH frame count field should not be &amp;gt;= 0x3E8, but it wasn&#039;t checked and so uncontrolled data were written over pointers, causing an unexploitable crash.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI paper color overflow&lt;br /&gt;
| Paper color field (and similar color fields) in KMI chunks was not checked, a too high value caused a jump to an uncontrolled location.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KSN BGM data size overflow&lt;br /&gt;
| The size of the BGM data in the KSN chunk was not checked, it was used in a memcpy so with a big enough size one could overwrite a thread stack on linear mem and achieve ROP (notehax v1).&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMC chunk unchecked&lt;br /&gt;
| The KMC chunk was not verified at all, the CRC32 and the size were not checked. A big enough size caused an integer overflow and made the game read the file backward.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI layer size unchecked&lt;br /&gt;
| The 3 layer size fields in KMI chunks were not checked, leading to some crashes in the editor.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Bad &amp;quot;queue&amp;quot; implementation&lt;br /&gt;
| When a KWZ was parsed, frames were copied in a kind of queue, bounds were not checked obviously, so with the KMI layer size flaw one was able to fill completely the queue, then write past the buffer and overwrite a heap chunk header (notehax v2). This is not possible anymore, the queue cannot be filled because layer sizes are checked. Moreover each time an element is removed from the queue, the whole content is memmoved *facepalm*.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Useless crashes / applications which were fuzzed==&lt;br /&gt;
* Pushmo (3DSWare), QR codes: level name is properly limited to 16 characters, game doesn&#039;t crash with a longer name. The only possible crashes are triggered by out-of-bounds array index values, these crashes are not exploitable due to the index value being 8bit.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids 2 (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/yellows8/mm3d_re The Legend of Zelda: Majora&#039;s Mask 3D]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;The Legend of Zelda: A Link Between Worlds&amp;quot; and &amp;quot;The Legend of Zelda: Tri Force Heroes&amp;quot;: these games don&#039;t crash at all when the entire save-file(minus constant header data) is overwritten with /dev/random output / 0xFF-bytes. All of the CRC32s were updated for this of course.  Note that this refers to the regular save file: Tri Force Heroes can be exploited via BOSS extdata - see above.&lt;br /&gt;
&lt;br /&gt;
* Pokemon Mystery Dungeon: Gates to Infinity has the same unchecked file bounds as Pokemon Super Mystery Dungeon, however since save compression was introduced in Pokemon Super Mystery Dungeon, it only allocates one buffer within the application heap instead of several within the linear heap, resulting in nothing to corrupt or overwrite even if the file&#039;s length is extended past its allocation.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Kid Icarus: Uprising&amp;quot;: Overwriting the entire savedata results in various crashes, nothing useful.&lt;br /&gt;
&lt;br /&gt;
* Savedata/extdata for &amp;quot;Super Smash Bros 3DS&amp;quot;: Overwriting the various files stored under savedata/extdata results in useless crashes.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;StarFox 64 3D&amp;quot;: Doesn&#039;t crash at all with the entire savedata overwritten.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Frogger 3D&amp;quot;: Overwriting a savefile with random-data results in *nothing* crashing.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Mutant Mudds&amp;quot;: Overwriting the savefile with random data results in a crash&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Worcle Worlds&amp;quot;: Overwriting the savefile with 0xFF results in a crash due to an out of bound read&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Animal Crossing: New Leaf&amp;quot;: Creating a QR code from random data results in a valid QR code and a random design. In some very rare cases(which aren&#039;t always reproducible?) a crash/etc may occur, but this isn&#039;t known to be useful.&lt;br /&gt;
&lt;br /&gt;
==Crashes needing investigation==&lt;br /&gt;
* Disney Infinity crashes when all savedata overwritten with /dev/urandom. No checksums. 0xFF bytes don&#039;t cause a crash.&lt;br /&gt;
&lt;br /&gt;
* Football Up Online / Soccer Up Online and Football Up 3D / Soccer Up 3D crash when teamname(UTF-16) length = 0x48 AND 0x20 null bytes are removed after just the name or if teamname length is way longer than 0x48.&lt;br /&gt;
&lt;br /&gt;
=System applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| 3DS [[System Settings]] DS profile string stack-smash&lt;br /&gt;
| Too long or corrupted strings (01Ah  2   Nickname length in characters     050h  2   Message length in characters) in the NVRAM DS user settings (System Settings-&amp;gt;Other Settings-&amp;gt;Profile-&amp;gt;Nintendo DS Profile) cause it to crash in 3DS-mode due to a stack-smash. The DSi is not vulnerable to this, DSi launcher(menu) and DSi System Settings will reset the NVRAM user-settings if the length field values are too long(same result as when the CRCs are invalid). TWL_FIRM also resets the NVRAM user-settings when the string-length(s) are too long.&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| 2012&lt;br /&gt;
| [[User:Ichfly|Ichfly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Nintendo 3DS Sound]]&lt;br /&gt;
| When a .m4a is loaded, the song name is copied to a 256 byte buffer. When the song name begins with a Unicode BOM marker, it memcpy&#039;s the tag using the user-provided length. This gives an arbitrary write which can be used to achieve ROP.&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| June/July 2016&lt;br /&gt;
| [[User:nedwill|nedwill]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=System applets=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Webkit/web-browser bugs&lt;br /&gt;
| spider has had at least three different code-execution exploits. Majority of them are use-after-free issues. See also [[browserhax|here]].&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 2013?&lt;br /&gt;
|&lt;br /&gt;
| A lot of people.&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS/New3DS [[Internet_Browser|Browser-version-check]] bypass&lt;br /&gt;
| When the browser-version-check code runs where the savedata for it was never initialized(such as when the user used the &amp;quot;Initialize savedata&amp;quot; option), it will use base_timestamp=0 instead of the timestamp loaded from savedata. This is then used with &amp;quot;if(cur_timestamp - base_timestamp &amp;gt;= &amp;lt;24h timestamp&amp;gt;){Run browser-version-check HTTPS request code}&amp;quot;.&lt;br /&gt;
Hence, if the savedata was just initialized, and if the system datetime is set to before January 2, 2000, the browser-version-check will be skipped. This includes January 1, 2000, 00:00, because that&#039;s the epoch(timestamp value 0x0) used with this timestamp.&lt;br /&gt;
&lt;br /&gt;
See [http://yls8.mtheall.com/3dsbrowserhax.php here] for bypass usage instructions.&lt;br /&gt;
&lt;br /&gt;
This was fixed with [[10.7.0-32|10.7.0-32]], see [[Internet_Browser|here]] for details.&lt;br /&gt;
| [[10.7.0-32|10.7.0-32]]&lt;br /&gt;
| &lt;br /&gt;
| [[9.9.0-26|9.9.0-26]]&lt;br /&gt;
| February 25, 2016&lt;br /&gt;
| November 2, 2015 (Exactly one week after the browser version pages were initially updated server-side)&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Skater - Bookmark OOB write&lt;br /&gt;
| Each bookmark has an id that should not exceed 0x63 (99), however ids are not checked, this results in an OOB write on the stack, but only the value 0x01 can be written.&lt;br /&gt;
| &lt;br /&gt;
| [[11.6.0-39|11.6.0-39]]&lt;br /&gt;
| &lt;br /&gt;
| May 21, 2018&lt;br /&gt;
| May 20, 2018&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| MicroSD Management - malformed security blob causes stack buffer overflow (mhax) &lt;br /&gt;
| The MicroSD Management application&#039;s parsing of Windows NTLM security blobs in the SMB/CIFS protocol doesn&#039;t verify that the client&#039;s specified NT domain name is less than 32 UTF-16 characters.  When it&#039;s longer, a stack buffer overrun occurs, leading to a ROP chain and complete control of the mcopy application.&lt;br /&gt;
&lt;br /&gt;
The malformed security blob can be sent by an attacker within the SMB_COM_SESSION_SETUP_ANDX (0x73) packet.&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[9.0.0-20|9.0.0-20]]&lt;br /&gt;
| August 12, 2018&lt;br /&gt;
| 2018&lt;br /&gt;
| smea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Home Menu==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| bossbannerhax&lt;br /&gt;
| After successfully loading [[Extended_Banner|extended-banner]] data(done when selecting an icon), Home Menu attempts to load &amp;quot;[[CBMD]]&amp;quot; data into a 0x100000-byte heap buffer from the [[BOSS_Services|stored]] SpotPass content. When successful and the magic-number is CBMD, Home Menu then decompresses the exbanner sections into another fixed-size heap buffer, without checking the outsize at all. The main CBMD CGFX code with ExeFS checks the size, but this code doesn&#039;t(however this is exbanner &amp;quot;CBMD&amp;quot;, not a &amp;quot;normal&amp;quot; CBMD).&lt;br /&gt;
&lt;br /&gt;
Used with menuhax as of v3.2.&lt;br /&gt;
| [[11.3.0-36|11.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[1.0.0-0|1.0.0-0]]&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| December 23, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| sdiconhax&lt;br /&gt;
| This is basically the same as nandiconhax, the vulnerable SD/NAND functions are &#039;&#039;identical&#039;&#039; minus the file-buffer offsets. Exploitation is different due to different heap-buffer location though. Unlike nandiconhax, the icon buffer for SD is located in linearmem(with recent Home Menu versions at least). This is used by [[menuhax]].&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| July 27, 2016&lt;br /&gt;
| October 23, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| [[System_SaveData|NAND-savedata]] Launcher.dat icons (nandiconhax)&lt;br /&gt;
| The homemenu code processing the titleid list @ launcherdat+8 copies those titleIDs to another buffer, where the offset relative to that buffer is calculated using the corresponding s8/s16 entries. Those two values are not range checked at all. Hence, one can use this to write u64(s) with arbitrary values to before/after this allocated output buffer. See [[Home_Menu|here]] regarding Launcher.dat structure.&lt;br /&gt;
&lt;br /&gt;
This can be exploited(with Launcher.dat loading at startup at least) by using a s16 for the icon entry with value 0xFFEC(-20)(and perhaps more icons with similar s16 values to write multiple u64s). The result is that the u64 value is written to outbuf-0xA0, which overwrites object+0(vtable) and object+4(doesn&#039;t matter here) for an object that gets used a bit after the vulnerable function triggers. The low 32bits of the u64 can then be set to the address of controlled memory(either outbuf in regular heap or the entire launcherdat buffer in linearmem), for use as a fake vtable in order to get control of PC. From there one can begin ROP via vtable funcptrs to do a stack-pivot(r4=objectaddr at the time the above object gets used).&lt;br /&gt;
&lt;br /&gt;
Originally this vuln could only be triggered via Launcher.dat at Home Menu startup, right after Launcher.dat gets loaded + memory gets allocated, once the file-format version code is finished running. Starting with v9.6 this can be triggered when loading layouts from SD extdata as well. The vuln itself triggers before the layout data is written to Launcher.dat, but it doesn&#039;t seem to be possible to overwrite anything which actually gets used before the function which writes Launcher.dat into the layout gets called.&lt;br /&gt;
&lt;br /&gt;
Home Menu has some sort of fail-safe system(or at least on v9.7) when Home Menu crashes due to Launcher.dat(this also applies for other things with Home Menu): after crashing once, Home Menu resets Launcher.dat to a state where it no longer crashes anymore. However, note that any exploits using this which hang/etc without crashing will still brick the system. &#039;&#039;&#039;Hence, attempting anything with this on physnand without hw-nand-access isn&#039;t really recommended.&#039;&#039;&#039;&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| May 14, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Theme-data decompression buffer overflow ([[menuhax|themehax]])&lt;br /&gt;
| The only func-call size parameter used by the theme decompression function is one for the compressed size, none for the decompressed size. The decompressed-size value from the LZ header is used by this function to check when to stop decompressing, but this function itself has nothing to verify the decompressed_size with. The code calling this function does not check or even use the decompressed size from the header either.&lt;br /&gt;
&lt;br /&gt;
This function is separate from the rest of the Home Menu code: the function used for decompressing themes is *only* used for decompressing themes, nothing else. There&#039;s a separate decompression function in Home Menu used for decompressing everything else.&lt;br /&gt;
&lt;br /&gt;
That other decompression function in Home Menu handles decompression size properly(decompressed size check for max buffer size is done by code calling the other function, not in the function itself). Unlike the other function, the theme function supports multiple LZ algorithms, but the one which actually gets used in official themes is the same one supported by the other function anyway.&lt;br /&gt;
&lt;br /&gt;
See also [[menuhax|here]].&lt;br /&gt;
&lt;br /&gt;
With [[10.2.0-28|10.2.0-X]] Home Menu, the only code change was that the following was added right after theme-load and before actual decompression: &amp;quot;if(&amp;lt;get_lzheader_decompressed_size&amp;gt;(compressed_buf) &amp;gt; 0x150000)&amp;lt;exit&amp;gt;;&amp;quot;. This fixed the vuln.&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| &amp;lt;Old3DS/New3DS version which added initial theme support&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| December 22, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]], [[User:Myria|Myria]] independently (~spring 2015)&lt;br /&gt;
|-&lt;br /&gt;
| Shuffle body-data buffer overflow ([[menuhax|shufflehax]])&lt;br /&gt;
| See [[menuhax|here]].&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[9.3.0-21|9.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| January 3, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Extdata file-data loading buffer overflow&lt;br /&gt;
| The extdata file-reading code allocates a fixed-size heap buffer for the expected filesize, then reads the filedata into this buffer using the actual FS filesize. Before v5.0 the filesize used here wasn&#039;t validated, hence if the filesize is larger than alloc_size a buffer overflow would occur. &#039;&#039;After&#039;&#039; doing the file-read it does validate that the actual_readsize matches the alloc_size, but at this point the buffer overflow has already occurred.&lt;br /&gt;
&lt;br /&gt;
This affected at least the following: SaveData.dat and Cache.dat.&lt;br /&gt;
&lt;br /&gt;
This can be triggered with SaveData.dat by installing a &amp;lt;v4.0 Home Menu version, with Home Menu extdata from &amp;gt;=v4.0 still on SD. When this is done with v2.0 Home Menu, a kernelpanic occurs when processing an AM command(it appears a buffer ptr which is then passed to a command was overwritten with 0x0 - of course other SaveData.dat filesizes may result in different behaviour).&lt;br /&gt;
| [[5.0.0-11|5.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[2.0.0-2|2.0.0-X]]&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The icon data arrays used with {sd/nand}iconhax were added to SaveData.dat/Launcher.dat with [[4.0.0-7|4.0.0-X]], hence the vulnerable functions were added with that same version.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;=v4.0 the SaveData.dat buffer is located in the regular heap. It&#039;s unknown when exactly it was moved to linearmem, which is where it&#039;s located with recent versions. It&#039;s located in linearmem for KOR &amp;gt;=v9.6 for example.&lt;br /&gt;
&lt;br /&gt;
The SaveData.dat/Launcher.dat icon vulns were fixed by doing various unsigned &amp;gt;=60/&amp;gt;=360 checks on the loaded values. When these checks fail, it just skips over handling this icon entry. Hence, the original value can&#039;t be negative / out-of-bounds any more.&lt;br /&gt;
&lt;br /&gt;
==Useless crashes==&lt;br /&gt;
Old3DS system web-browser:&lt;br /&gt;
* 2^32 characters long string(&#039;&#039;finally&#039;&#039; fixed with v10.6): this is similar to the vulnerability fixed [http://git.chromium.org/gitweb/?p=external/Webkit.git;a=commitdiff;h=ec471f16fbd1f879cb631f9b022fd16acd75f4d4 here], concat-large-strings-crash2.html triggers a crash which is about the same as the one triggered by a 2^32 string. Most of the time this vulnerability will cause a memory page permissions fault, since the WebKit code attempts to copy the string text data to the output buffer located in read-only [[CRO0|CRO]] heap memory. The only difference between a crash triggered by a 2^32 string and the concat-large-strings-crash2.html crash is at the former copies the string data using the original string length(like 1 text character for &amp;quot;x&amp;quot;, 4 for &amp;quot;xxxx&amp;quot;) while the latter attempts to copy &amp;gt;12MB. In some &#039;&#039;very&#039;&#039; rare cases a thread separate from the string data-copy thread will crash, this might be exploitable. However, this is mostly useless since it rarely crashes this way.&lt;br /&gt;
&lt;br /&gt;
* Trying to directly load a page via the browser &amp;quot;URL&amp;quot; option with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] setup, causes a crash to trigger in oss.cro due to an use-after-free being caught with webkitdebug. This is presumably some sort of realloc() issue in the libcurl version used by the &amp;lt;={v10.2-v10.3} browser. This happens with *every* *single* *page* one tries to load via the &amp;quot;URL&amp;quot; option, but not when loading links on the current page, hence this is probably useless. A different use-after-free with realloc triggers with loading any page at all regardless of method too(libcurl probably).&lt;br /&gt;
&lt;br /&gt;
* This WebKit build has &#039;&#039;a lot&#039;&#039; of crash-trigger bugs that only happen with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] completely setup(addr accesses near 0x0), with &#039;&#039;just&#039;&#039; trying to load any page at all.&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20828</id>
		<title>3DS Userland Flaws</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20828"/>
		<updated>2018-09-18T08:38:16Z</updated>

		<summary type="html">&lt;p&gt;Unknown: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists vulnerabilities / exploits for 3DS applications and applets. Exploiting these initially results in ROP, from that ROP one can then for example try exploiting [[3DS_System_Flaws|system]] flaw(s).&lt;br /&gt;
&lt;br /&gt;
=Non-system applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Application name&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Last app/system version this flaw was checked for&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this vuln was discovered&lt;br /&gt;
!  Vuln discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Cubic Ninja&lt;br /&gt;
| Map-data stack smash&lt;br /&gt;
| See [[Ninjhax|here]] regarding Ninjhax.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.4.0-29]].&lt;br /&gt;
| Ninjhax release&lt;br /&gt;
| July 2014&lt;br /&gt;
| [[User:smea|smea]]&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Ocarina of Time 3D&lt;br /&gt;
| UTF-16 name string buffer overflow via unchecked u8 length field&lt;br /&gt;
| The u8 at offset 0x2C in the savefile is the character-length of the UTF-16 string at offset 0x1C. When copying this string, it&#039;s essentially a memory-copy with lenval*2, not a string-copy. This can be used to trigger buffer overflows at various locations depending on the string length.&lt;br /&gt;
* When value is &amp;gt;=0x6E it crashes when saving the saveslot, this causes a stack-smash however it normally crashes before it returns from the function which had the stack-frame overwritten.&lt;br /&gt;
* With value &amp;gt;=0x9A, it crashes via stack-smash in-game once any dialogs are opened(touching buttons on the touch-screen can trigger it too).&lt;br /&gt;
* Length value&amp;gt;=0xCD causes a crash while loading the saveslot, via a heap buffer overflow. This buf-overflow overwrites a heap memchunk following the allocated buffer. When the first 16-bits overwriting that heap memchunk is not the memchunk magic-number(0x7373), the mem-alloc code will just return a NULL ptr which later results in a crash. When the magic-number is valid, the mem-alloc code will continue to attempt to parse the memchunk, which may crash depending on the data which overwrote the memchunk. This heap code is separate from the CTRSDK heap code. Exploiting this doesn&#039;t seem to be possible: since the heap code actually verifies that the magic-number for the next/prev memchunk ptrs are correct(unlike CTRSDK), it&#039;s not possible to change those ptrs to useful arbitrary addresses outside of savedata(like with triggering a write to a c++ object ptr which later is used with a vtable func-call, this is what one would do with CTRSDK heap here).&lt;br /&gt;
&lt;br /&gt;
On March 11, 2015, an exploit using this vuln was released, that one was intended for warez/etc. The following exploit wasn&#039;t released before then mainly because doing so would (presumably) result in the vuln being fixed. The following old exploit was released on March 14, 2015: [https://github.com/yellows8/oot3dhax].&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.6.0-31]].&lt;br /&gt;
| March 11, 2015&lt;br /&gt;
| Around October 22, 2012&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Super Smash Bros 3DS&lt;br /&gt;
| Buffer overflow in local-multiplayer beacon handling.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| App: v1.1.3&lt;br /&gt;
| See [[smashbroshax|here]]. System: [[10.3.0-28]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Super Mystery Dungeon&lt;br /&gt;
| Heap overflow within linear memory via unchecked save file length&lt;br /&gt;
| Pokemon Super Mystery Dungeon uses zlib compression for most of its save files, possibly due to the save files being larger than its predecessor, Gates to Infinity. When a save file is being prepared to be loaded and read from, only a 0x32000 large buffer is allocated for file reading, and a 0x3e800-large buffer for decompression is also allocated before the file is read. However, the game does not limit the size of the file read to this allocation bound, allowing for the file to overflow into the linear memory heap and into the next allocation. Since Pokemon Super Mystery Dungeon stores allocation memchunks directly before the allocation, overwriting the next memchunk with a corrupted one allows for arbitrary writes of linear heap pointers when the next buffer is allocated or arbitrary writes of any pointer within writable memory when the corrupted buffer is freed.&lt;br /&gt;
| None&lt;br /&gt;
| O3DS: [[11.3.0-36]]. N3DS: [[11.4.0-37]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 14, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| VVVVVV&lt;br /&gt;
| Buffer overflow in XML save file array parsing&lt;br /&gt;
| VVVVVV utilizes several XML files (renamed with a .vvv extension) to store level save data, stats and settings. Within these XML files are several tags containing an array of data which, when parsed, is not properly checked to be of proper length for the tag being parsed from. This allows for an overflow of 16-bit array values from the location where the array is parsed. With unlock.vvv, XML data is parsed to the stack, and with level saves the heap. This allows for the pointer where the level save worldmap tag array should be parsed into to be overwritten with a stack address, allowing for ROP from within the XML array parsing function on the next level load.&lt;br /&gt;
| App: v1.1&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 25, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| Citizens of Earth&lt;br /&gt;
| Save file read stack smash&lt;br /&gt;
| Citizens of Earth also uses &amp;quot;XML&amp;quot; files for saves, which are actually entirely binary data (not XML at all) with no checksums. These files are read from the filesystem on to a fixed size stack buffer which leads to an incredibly trivial stack smash. When using the autosave slot for this, the save is parsed when the user selects &amp;quot;continue&amp;quot;. When using one of the dedicated save slots (1-3), the save is parsed shortly after the company splash screens fade. Note that the save is read quite high (descending) on the stack - when exploiting this, one would likely need to move SP due to almost instantly overflowing the physical stack.&lt;br /&gt;
| None&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| May 5, 2016&lt;br /&gt;
| [[User:Dazzozo|Dazzozo]]&lt;br /&gt;
|-&lt;br /&gt;
| SmileBASIC 3.x&lt;br /&gt;
| Poor parameter validation on &amp;quot;BGSCREEN&amp;quot; command&lt;br /&gt;
| The SmileBASIC &amp;quot;BGSCREEN&amp;quot; command&#039;s second parameter is not properly validated as being within range.  As a result, one can set the screen size to an absurdly large value.  This means that the &amp;quot;BGGET&amp;quot; and &amp;quot;BGPUT&amp;quot; commands can then be used on out-of-range values to read and write a significant chunk of the interpreter&#039;s address space.&lt;br /&gt;
With a series of carefully-designed BGPUT commands, one can build a ROP chain and cause it to be executed.&lt;br /&gt;
| App: 3.3.2.&lt;br /&gt;
| System: [[11.0.0-33]].&lt;br /&gt;
| July 20, 2016&lt;br /&gt;
| Around June 26, 2016&lt;br /&gt;
| slackerSnail, 12Me12, incvoid&lt;br /&gt;
Exploited by MrNbaYoh and [[User:Plutooo|plutoo]].&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Tri Force Heroes&lt;br /&gt;
| [[3DS_System_Flaws#General.2FCTRSDK|CTRSDK]] CTPK buffer overflow combined with game&#039;s usage of SpotPass&lt;br /&gt;
| During the very first screen displayed by the game during boot(&amp;quot;Loading...&amp;quot;), just seconds after title launch, the game loads CTPK from the [[BOSS_Services|stored]] SpotPass content. Hence, this game could be exploited via the vulnerable CTRSDK CTPK code &#039;&#039;if&#039;&#039; one could get custom SpotPass data into extdata somehow(ctr-httpwn &amp;gt;=v1.2 with bosshaxx allows this).&lt;br /&gt;
&lt;br /&gt;
The code for this runs from a thread separate from the main-thread, with the stack in linearmem heap. This SpotPass handling triggers before the game ever opens the regular savedata archive. The extdata is opened at some point before this: it opens a file for checking if it exists, then immediately closes it.&lt;br /&gt;
&lt;br /&gt;
The two SpotPass URLs for this have always(?) returned HTTP 404 as of November 2016. It appears these were intended for use as textures for additional costumes(and never got used publicly), but this wasn&#039;t tested.&lt;br /&gt;
&lt;br /&gt;
This is used by [https://github.com/yellows8/ctpkpwn ctpkpwn_tfh].&lt;br /&gt;
| None&lt;br /&gt;
| App: v2.1.0&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| November 14, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pixel Paint&lt;br /&gt;
| Buffer overflow via unchecked extdata file length&lt;br /&gt;
| Pixel Paint loads pictures saved by the user from extdatas. The file is read to a fixed size buffer but the file length remains unchecked, so with a large enough file, one can overwrite pointers in memory and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| November 5, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Steel Diver : Sub Wars&lt;br /&gt;
| Heap overflow / arbitrary memcpy&lt;br /&gt;
| Savefile datas are stored as key/value pairs, a large enough string key makes the game overwrite a memcpy source/destination addresses and size arguments. So one can actually memcpy a rop on the stack and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around July 15, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]], Vegaroxas&lt;br /&gt;
|-&lt;br /&gt;
| 1001 Spikes&lt;br /&gt;
| Buffer overflow via unchecked array-indexes in XML savefile parsing&lt;br /&gt;
| The savefiles are stored as renamed .xml files, which contain several tags with attributes like &#039;array-index=&amp;quot;array-value&amp;quot;&#039;, where both of these are converted from ASCII strings to integers as signed-int32, and the array-value given blindly written to an array inside a structure using the (unchecked) index given. With several of these attributes, one can overwrite the stack starting from the stored lr of the function that does this parsing, and write a ROP chain there. Testing used the &amp;quot;LevelAttempts&amp;quot; tag which is the last such tag parsed in that function.&lt;br /&gt;
| None&lt;br /&gt;
| App: v1.2.0 (TMD v2096)&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around November 2, 2016&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| Secret base team name heap overflow&lt;br /&gt;
| When the player wants to edit the team name, it is copied over the heap, however its length is not verified. So with a large enough team name one can overwrite some pointers and get two arbitrary jumps and then get control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.2.0-35]].&lt;br /&gt;
| December 30, 2016&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Swapdoodle&lt;br /&gt;
| Heap buffer overflow via unchecked size&lt;br /&gt;
| The letter file format used by doodlebomb is composed of multiple chunks. Each chunks is described in the header of the file where the name, size and CRC of each chunk are stored. Some chunks are meant to be headers, every header&#039;s size should be 0x80, however the length of the STAHED1 chunk remains unchecked and the game memcpy the chunk to a 0x80 byte buffer with the length provided in the file. This way one is able to overwrite some pointers and get control of the execution flow.&lt;br /&gt;
| App: &amp;gt; v1.1.1&lt;br /&gt;
| App: v1.1.1&lt;br /&gt;
| April 24, 2017&lt;br /&gt;
| February, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Picross&lt;br /&gt;
| Arbitrary memcpy via unchecked size&lt;br /&gt;
| When reading the savefile, the game handles some lists of buffers that are copied to memory. These buffers should always be 0x14-bytes long but the game uses the size provided in the savefile to copy them. These buffers are copied in some structs and thus with a big enough length value, one can overwrite the next struct which contains a size and a destination address for a memcpy.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| May 29, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow on .bss section&lt;br /&gt;
| When loading a project, the game copies multiple chunks over the BSS section. However the number of chunks to copy is not checked, thus a large amount of chunk result in a buffer overflow. There&#039;s multiple way to exploit this flaw to gain an arbitrary memcpy or an arbitrary jump.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 28, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow via unchecked file size&lt;br /&gt;
| When loading a project, the game loads the file to a 0x200000 bytes long buffer. However the size remains unchecked, so with a big enough file one can overflow the buffer and overwrite a thread stack and then achieve ROP.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 29, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| PSS data heap/stack overflow&lt;br /&gt;
| When launching the game, multiple chunks from the save file are parsed and copied to a large heap buffer. When parsing PSS data (acquaintances, passerby) the game copies each entry to the heap buffer, the number of entries to copy is read from the end of the multiple pss data chunks and is not checked, leading to an overflow. The &amp;quot;PSS data - friends&amp;quot; chunk is vulnerable too, but the overflow occurs on the stack and unfortunately this isn&#039;t exploitable because of a 4 bytes uncontrolled value (in each entry) that gets written on sensitive data.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.6.0]].&lt;br /&gt;
| October 1, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| OOB write&lt;br /&gt;
| When handling events in a map, the indices of &amp;quot;buttons&amp;quot; are not checked. This results in an out of bound bit write, one can thus write a rop directly on the stack (bit by bit).&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 5, 2018&lt;br /&gt;
| &lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Unholy Heights&lt;br /&gt;
| Buffer overflow via unchecked string size&lt;br /&gt;
| The game stores some utf-16 messages in the savefile. Right before the message is the length(u32) for the string, the game uses this size to memcpy the message from the savefile to the stack without checking the length. This allows one to overwrite to some function addresses on the stack and form a rop chain.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial Version&lt;br /&gt;
| September 13, 2018&lt;br /&gt;
| August, 2018&lt;br /&gt;
| Kartik&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Flipnote Studio 3D==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Flaw discovered by&lt;br /&gt;
|-&lt;br /&gt;
| KFH frame count overflow&lt;br /&gt;
| The KFH frame count field should not be &amp;gt;= 0x3E8, but it wasn&#039;t checked and so uncontrolled data were written over pointers, causing an unexploitable crash.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI paper color overflow&lt;br /&gt;
| Paper color field (and similar color fields) in KMI chunks was not checked, a too high value caused a jump to an uncontrolled location.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KSN BGM data size overflow&lt;br /&gt;
| The size of the BGM data in the KSN chunk was not checked, it was used in a memcpy so with a big enough size one could overwrite a thread stack on linear mem and achieve ROP (notehax v1).&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMC chunk unchecked&lt;br /&gt;
| The KMC chunk was not verified at all, the CRC32 and the size were not checked. A big enough size caused an integer overflow and made the game read the file backward.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI layer size unchecked&lt;br /&gt;
| The 3 layer size fields in KMI chunks were not checked, leading to some crashes in the editor.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Bad &amp;quot;queue&amp;quot; implementation&lt;br /&gt;
| When a KWZ was parsed, frames were copied in a kind of queue, bounds were not checked obviously, so with the KMI layer size flaw one was able to fill completely the queue, then write past the buffer and overwrite a heap chunk header (notehax v2). This is not possible anymore, the queue cannot be filled because layer sizes are checked. Moreover each time an element is removed from the queue, the whole content is memmoved *facepalm*.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Useless crashes / applications which were fuzzed==&lt;br /&gt;
* Pushmo (3DSWare), QR codes: level name is properly limited to 16 characters, game doesn&#039;t crash with a longer name. The only possible crashes are triggered by out-of-bounds array index values, these crashes are not exploitable due to the index value being 8bit.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids 2 (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/yellows8/mm3d_re The Legend of Zelda: Majora&#039;s Mask 3D]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;The Legend of Zelda: A Link Between Worlds&amp;quot; and &amp;quot;The Legend of Zelda: Tri Force Heroes&amp;quot;: these games don&#039;t crash at all when the entire save-file(minus constant header data) is overwritten with /dev/random output / 0xFF-bytes. All of the CRC32s were updated for this of course.  Note that this refers to the regular save file: Tri Force Heroes can be exploited via BOSS extdata - see above.&lt;br /&gt;
&lt;br /&gt;
* Pokemon Mystery Dungeon: Gates to Infinity has the same unchecked file bounds as Pokemon Super Mystery Dungeon, however since save compression was introduced in Pokemon Super Mystery Dungeon, it only allocates one buffer within the application heap instead of several within the linear heap, resulting in nothing to corrupt or overwrite even if the file&#039;s length is extended past its allocation.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Kid Icarus: Uprising&amp;quot;: Overwriting the entire savedata results in various crashes, nothing useful.&lt;br /&gt;
&lt;br /&gt;
* Savedata/extdata for &amp;quot;Super Smash Bros 3DS&amp;quot;: Overwriting the various files stored under savedata/extdata results in useless crashes.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;StarFox 64 3D&amp;quot;: Doesn&#039;t crash at all with the entire savedata overwritten.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Frogger 3D&amp;quot;: Overwriting a savefile with random-data results in *nothing* crashing.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Mutant Mudds&amp;quot;: Overwriting the savefile with random data results in a crash&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Worcle Worlds&amp;quot;: Overwriting the savefile with 0xFF results in a crash due to an out of bound read&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Animal Crossing: New Leaf&amp;quot;: Creating a QR code from random data results in a valid QR code and a random design. In some very rare cases(which aren&#039;t always reproducible?) a crash/etc may occur, but this isn&#039;t known to be useful.&lt;br /&gt;
&lt;br /&gt;
==Crashes needing investigation==&lt;br /&gt;
* Disney Infinity crashes when all savedata overwritten with /dev/urandom. No checksums. 0xFF bytes don&#039;t cause a crash.&lt;br /&gt;
&lt;br /&gt;
* Football Up Online / Soccer Up Online and Football Up 3D / Soccer Up 3D crash when teamname(UTF-16) length = 0x48 AND 0x20 null bytes are removed after just the name or if teamname length is way longer than 0x48.&lt;br /&gt;
&lt;br /&gt;
=System applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| 3DS [[System Settings]] DS profile string stack-smash&lt;br /&gt;
| Too long or corrupted strings (01Ah  2   Nickname length in characters     050h  2   Message length in characters) in the NVRAM DS user settings (System Settings-&amp;gt;Other Settings-&amp;gt;Profile-&amp;gt;Nintendo DS Profile) cause it to crash in 3DS-mode due to a stack-smash. The DSi is not vulnerable to this, DSi launcher(menu) and DSi System Settings will reset the NVRAM user-settings if the length field values are too long(same result as when the CRCs are invalid). TWL_FIRM also resets the NVRAM user-settings when the string-length(s) are too long.&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| 2012&lt;br /&gt;
| [[User:Ichfly|Ichfly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Nintendo 3DS Sound]]&lt;br /&gt;
| When a .m4a is loaded, the song name is copied to a 256 byte buffer. When the song name begins with a Unicode BOM marker, it memcpy&#039;s the tag using the user-provided length. This gives an arbitrary write which can be used to achieve ROP.&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| June/July 2016&lt;br /&gt;
| [[User:nedwill|nedwill]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=System applets=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Webkit/web-browser bugs&lt;br /&gt;
| spider has had at least three different code-execution exploits. Majority of them are use-after-free issues. See also [[browserhax|here]].&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 2013?&lt;br /&gt;
|&lt;br /&gt;
| A lot of people.&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS/New3DS [[Internet_Browser|Browser-version-check]] bypass&lt;br /&gt;
| When the browser-version-check code runs where the savedata for it was never initialized(such as when the user used the &amp;quot;Initialize savedata&amp;quot; option), it will use base_timestamp=0 instead of the timestamp loaded from savedata. This is then used with &amp;quot;if(cur_timestamp - base_timestamp &amp;gt;= &amp;lt;24h timestamp&amp;gt;){Run browser-version-check HTTPS request code}&amp;quot;.&lt;br /&gt;
Hence, if the savedata was just initialized, and if the system datetime is set to before January 2, 2000, the browser-version-check will be skipped. This includes January 1, 2000, 00:00, because that&#039;s the epoch(timestamp value 0x0) used with this timestamp.&lt;br /&gt;
&lt;br /&gt;
See [http://yls8.mtheall.com/3dsbrowserhax.php here] for bypass usage instructions.&lt;br /&gt;
&lt;br /&gt;
This was fixed with [[10.7.0-32|10.7.0-32]], see [[Internet_Browser|here]] for details.&lt;br /&gt;
| [[10.7.0-32|10.7.0-32]]&lt;br /&gt;
| &lt;br /&gt;
| [[9.9.0-26|9.9.0-26]]&lt;br /&gt;
| February 25, 2016&lt;br /&gt;
| November 2, 2015 (Exactly one week after the browser version pages were initially updated server-side)&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Skater - Bookmark OOB write&lt;br /&gt;
| Each bookmark has an id that should not exceed 0x63 (99), however ids are not checked, this results in an OOB write on the stack, but only the value 0x01 can be written.&lt;br /&gt;
| &lt;br /&gt;
| [[11.6.0-39|11.6.0-39]]&lt;br /&gt;
| &lt;br /&gt;
| May 21, 2018&lt;br /&gt;
| May 20, 2018&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| MicroSD Management - malformed security blob causes stack buffer overflow (mhax) &lt;br /&gt;
| The MicroSD Management application&#039;s parsing of Windows NTLM security blobs in the SMB/CIFS protocol doesn&#039;t verify that the client&#039;s specified NT domain name is less than 32 UTF-16 characters.  When it&#039;s longer, a stack buffer overrun occurs, leading to a ROP chain and complete control of the mcopy application.&lt;br /&gt;
&lt;br /&gt;
The malformed security blob can be sent by an attacker within the SMB_COM_SESSION_SETUP_ANDX (0x73) packet.&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[9.0.0-20|9.0.0-20]]&lt;br /&gt;
| August 12, 2018&lt;br /&gt;
| 2018&lt;br /&gt;
| smea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Home Menu==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| bossbannerhax&lt;br /&gt;
| After successfully loading [[Extended_Banner|extended-banner]] data(done when selecting an icon), Home Menu attempts to load &amp;quot;[[CBMD]]&amp;quot; data into a 0x100000-byte heap buffer from the [[BOSS_Services|stored]] SpotPass content. When successful and the magic-number is CBMD, Home Menu then decompresses the exbanner sections into another fixed-size heap buffer, without checking the outsize at all. The main CBMD CGFX code with ExeFS checks the size, but this code doesn&#039;t(however this is exbanner &amp;quot;CBMD&amp;quot;, not a &amp;quot;normal&amp;quot; CBMD).&lt;br /&gt;
&lt;br /&gt;
Used with menuhax as of v3.2.&lt;br /&gt;
| [[11.3.0-36|11.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[1.0.0-0|1.0.0-0]]&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| December 23, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| sdiconhax&lt;br /&gt;
| This is basically the same as nandiconhax, the vulnerable SD/NAND functions are &#039;&#039;identical&#039;&#039; minus the file-buffer offsets. Exploitation is different due to different heap-buffer location though. Unlike nandiconhax, the icon buffer for SD is located in linearmem(with recent Home Menu versions at least). This is used by [[menuhax]].&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| July 27, 2016&lt;br /&gt;
| October 23, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| [[System_SaveData|NAND-savedata]] Launcher.dat icons (nandiconhax)&lt;br /&gt;
| The homemenu code processing the titleid list @ launcherdat+8 copies those titleIDs to another buffer, where the offset relative to that buffer is calculated using the corresponding s8/s16 entries. Those two values are not range checked at all. Hence, one can use this to write u64(s) with arbitrary values to before/after this allocated output buffer. See [[Home_Menu|here]] regarding Launcher.dat structure.&lt;br /&gt;
&lt;br /&gt;
This can be exploited(with Launcher.dat loading at startup at least) by using a s16 for the icon entry with value 0xFFEC(-20)(and perhaps more icons with similar s16 values to write multiple u64s). The result is that the u64 value is written to outbuf-0xA0, which overwrites object+0(vtable) and object+4(doesn&#039;t matter here) for an object that gets used a bit after the vulnerable function triggers. The low 32bits of the u64 can then be set to the address of controlled memory(either outbuf in regular heap or the entire launcherdat buffer in linearmem), for use as a fake vtable in order to get control of PC. From there one can begin ROP via vtable funcptrs to do a stack-pivot(r4=objectaddr at the time the above object gets used).&lt;br /&gt;
&lt;br /&gt;
Originally this vuln could only be triggered via Launcher.dat at Home Menu startup, right after Launcher.dat gets loaded + memory gets allocated, once the file-format version code is finished running. Starting with v9.6 this can be triggered when loading layouts from SD extdata as well. The vuln itself triggers before the layout data is written to Launcher.dat, but it doesn&#039;t seem to be possible to overwrite anything which actually gets used before the function which writes Launcher.dat into the layout gets called.&lt;br /&gt;
&lt;br /&gt;
Home Menu has some sort of fail-safe system(or at least on v9.7) when Home Menu crashes due to Launcher.dat(this also applies for other things with Home Menu): after crashing once, Home Menu resets Launcher.dat to a state where it no longer crashes anymore. However, note that any exploits using this which hang/etc without crashing will still brick the system. &#039;&#039;&#039;Hence, attempting anything with this on physnand without hw-nand-access isn&#039;t really recommended.&#039;&#039;&#039;&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| May 14, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Theme-data decompression buffer overflow ([[menuhax|themehax]])&lt;br /&gt;
| The only func-call size parameter used by the theme decompression function is one for the compressed size, none for the decompressed size. The decompressed-size value from the LZ header is used by this function to check when to stop decompressing, but this function itself has nothing to verify the decompressed_size with. The code calling this function does not check or even use the decompressed size from the header either.&lt;br /&gt;
&lt;br /&gt;
This function is separate from the rest of the Home Menu code: the function used for decompressing themes is *only* used for decompressing themes, nothing else. There&#039;s a separate decompression function in Home Menu used for decompressing everything else.&lt;br /&gt;
&lt;br /&gt;
That other decompression function in Home Menu handles decompression size properly(decompressed size check for max buffer size is done by code calling the other function, not in the function itself). Unlike the other function, the theme function supports multiple LZ algorithms, but the one which actually gets used in official themes is the same one supported by the other function anyway.&lt;br /&gt;
&lt;br /&gt;
See also [[menuhax|here]].&lt;br /&gt;
&lt;br /&gt;
With [[10.2.0-28|10.2.0-X]] Home Menu, the only code change was that the following was added right after theme-load and before actual decompression: &amp;quot;if(&amp;lt;get_lzheader_decompressed_size&amp;gt;(compressed_buf) &amp;gt; 0x150000)&amp;lt;exit&amp;gt;;&amp;quot;. This fixed the vuln.&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| &amp;lt;Old3DS/New3DS version which added initial theme support&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| December 22, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]], [[User:Myria|Myria]] independently (~spring 2015)&lt;br /&gt;
|-&lt;br /&gt;
| Shuffle body-data buffer overflow ([[menuhax|shufflehax]])&lt;br /&gt;
| See [[menuhax|here]].&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[9.3.0-21|9.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| January 3, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Extdata file-data loading buffer overflow&lt;br /&gt;
| The extdata file-reading code allocates a fixed-size heap buffer for the expected filesize, then reads the filedata into this buffer using the actual FS filesize. Before v5.0 the filesize used here wasn&#039;t validated, hence if the filesize is larger than alloc_size a buffer overflow would occur. &#039;&#039;After&#039;&#039; doing the file-read it does validate that the actual_readsize matches the alloc_size, but at this point the buffer overflow has already occurred.&lt;br /&gt;
&lt;br /&gt;
This affected at least the following: SaveData.dat and Cache.dat.&lt;br /&gt;
&lt;br /&gt;
This can be triggered with SaveData.dat by installing a &amp;lt;v4.0 Home Menu version, with Home Menu extdata from &amp;gt;=v4.0 still on SD. When this is done with v2.0 Home Menu, a kernelpanic occurs when processing an AM command(it appears a buffer ptr which is then passed to a command was overwritten with 0x0 - of course other SaveData.dat filesizes may result in different behaviour).&lt;br /&gt;
| [[5.0.0-11|5.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[2.0.0-2|2.0.0-X]]&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The icon data arrays used with {sd/nand}iconhax were added to SaveData.dat/Launcher.dat with [[4.0.0-7|4.0.0-X]], hence the vulnerable functions were added with that same version.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;=v4.0 the SaveData.dat buffer is located in the regular heap. It&#039;s unknown when exactly it was moved to linearmem, which is where it&#039;s located with recent versions. It&#039;s located in linearmem for KOR &amp;gt;=v9.6 for example.&lt;br /&gt;
&lt;br /&gt;
The SaveData.dat/Launcher.dat icon vulns were fixed by doing various unsigned &amp;gt;=60/&amp;gt;=360 checks on the loaded values. When these checks fail, it just skips over handling this icon entry. Hence, the original value can&#039;t be negative / out-of-bounds any more.&lt;br /&gt;
&lt;br /&gt;
==Useless crashes==&lt;br /&gt;
Old3DS system web-browser:&lt;br /&gt;
* 2^32 characters long string(&#039;&#039;finally&#039;&#039; fixed with v10.6): this is similar to the vulnerability fixed [http://git.chromium.org/gitweb/?p=external/Webkit.git;a=commitdiff;h=ec471f16fbd1f879cb631f9b022fd16acd75f4d4 here], concat-large-strings-crash2.html triggers a crash which is about the same as the one triggered by a 2^32 string. Most of the time this vulnerability will cause a memory page permissions fault, since the WebKit code attempts to copy the string text data to the output buffer located in read-only [[CRO0|CRO]] heap memory. The only difference between a crash triggered by a 2^32 string and the concat-large-strings-crash2.html crash is at the former copies the string data using the original string length(like 1 text character for &amp;quot;x&amp;quot;, 4 for &amp;quot;xxxx&amp;quot;) while the latter attempts to copy &amp;gt;12MB. In some &#039;&#039;very&#039;&#039; rare cases a thread separate from the string data-copy thread will crash, this might be exploitable. However, this is mostly useless since it rarely crashes this way.&lt;br /&gt;
&lt;br /&gt;
* Trying to directly load a page via the browser &amp;quot;URL&amp;quot; option with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] setup, causes a crash to trigger in oss.cro due to an use-after-free being caught with webkitdebug. This is presumably some sort of realloc() issue in the libcurl version used by the &amp;lt;={v10.2-v10.3} browser. This happens with *every* *single* *page* one tries to load via the &amp;quot;URL&amp;quot; option, but not when loading links on the current page, hence this is probably useless. A different use-after-free with realloc triggers with loading any page at all regardless of method too(libcurl probably).&lt;br /&gt;
&lt;br /&gt;
* This WebKit build has &#039;&#039;a lot&#039;&#039; of crash-trigger bugs that only happen with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] completely setup(addr accesses near 0x0), with &#039;&#039;just&#039;&#039; trying to load any page at all.&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20827</id>
		<title>3DS Userland Flaws</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20827"/>
		<updated>2018-09-18T08:36:46Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Non-system applications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists vulnerabilities / exploits for 3DS applications and applets. Exploiting these initially results in ROP, from that ROP one can then for example try exploiting [[3DS_System_Flaws|system]] flaw(s).&lt;br /&gt;
&lt;br /&gt;
=Non-system applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Application name&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Last app/system version this flaw was checked for&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this vuln was discovered&lt;br /&gt;
!  Vuln discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Cubic Ninja&lt;br /&gt;
| Map-data stack smash&lt;br /&gt;
| See [[Ninjhax|here]] regarding Ninjhax.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.4.0-29]].&lt;br /&gt;
| Ninjhax release&lt;br /&gt;
| July 2014&lt;br /&gt;
| [[User:smea|smea]]&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Ocarina of Time 3D&lt;br /&gt;
| UTF-16 name string buffer overflow via unchecked u8 length field&lt;br /&gt;
| The u8 at offset 0x2C in the savefile is the character-length of the UTF-16 string at offset 0x1C. When copying this string, it&#039;s essentially a memory-copy with lenval*2, not a string-copy. This can be used to trigger buffer overflows at various locations depending on the string length.&lt;br /&gt;
* When value is &amp;gt;=0x6E it crashes when saving the saveslot, this causes a stack-smash however it normally crashes before it returns from the function which had the stack-frame overwritten.&lt;br /&gt;
* With value &amp;gt;=0x9A, it crashes via stack-smash in-game once any dialogs are opened(touching buttons on the touch-screen can trigger it too).&lt;br /&gt;
* Length value&amp;gt;=0xCD causes a crash while loading the saveslot, via a heap buffer overflow. This buf-overflow overwrites a heap memchunk following the allocated buffer. When the first 16-bits overwriting that heap memchunk is not the memchunk magic-number(0x7373), the mem-alloc code will just return a NULL ptr which later results in a crash. When the magic-number is valid, the mem-alloc code will continue to attempt to parse the memchunk, which may crash depending on the data which overwrote the memchunk. This heap code is separate from the CTRSDK heap code. Exploiting this doesn&#039;t seem to be possible: since the heap code actually verifies that the magic-number for the next/prev memchunk ptrs are correct(unlike CTRSDK), it&#039;s not possible to change those ptrs to useful arbitrary addresses outside of savedata(like with triggering a write to a c++ object ptr which later is used with a vtable func-call, this is what one would do with CTRSDK heap here).&lt;br /&gt;
&lt;br /&gt;
On March 11, 2015, an exploit using this vuln was released, that one was intended for warez/etc. The following exploit wasn&#039;t released before then mainly because doing so would (presumably) result in the vuln being fixed. The following old exploit was released on March 14, 2015: [https://github.com/yellows8/oot3dhax].&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.6.0-31]].&lt;br /&gt;
| March 11, 2015&lt;br /&gt;
| Around October 22, 2012&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Super Smash Bros 3DS&lt;br /&gt;
| Buffer overflow in local-multiplayer beacon handling.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| App: v1.1.3&lt;br /&gt;
| See [[smashbroshax|here]]. System: [[10.3.0-28]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Super Mystery Dungeon&lt;br /&gt;
| Heap overflow within linear memory via unchecked save file length&lt;br /&gt;
| Pokemon Super Mystery Dungeon uses zlib compression for most of its save files, possibly due to the save files being larger than its predecessor, Gates to Infinity. When a save file is being prepared to be loaded and read from, only a 0x32000 large buffer is allocated for file reading, and a 0x3e800-large buffer for decompression is also allocated before the file is read. However, the game does not limit the size of the file read to this allocation bound, allowing for the file to overflow into the linear memory heap and into the next allocation. Since Pokemon Super Mystery Dungeon stores allocation memchunks directly before the allocation, overwriting the next memchunk with a corrupted one allows for arbitrary writes of linear heap pointers when the next buffer is allocated or arbitrary writes of any pointer within writable memory when the corrupted buffer is freed.&lt;br /&gt;
| None&lt;br /&gt;
| O3DS: [[11.3.0-36]]. N3DS: [[11.4.0-37]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 14, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| VVVVVV&lt;br /&gt;
| Buffer overflow in XML save file array parsing&lt;br /&gt;
| VVVVVV utilizes several XML files (renamed with a .vvv extension) to store level save data, stats and settings. Within these XML files are several tags containing an array of data which, when parsed, is not properly checked to be of proper length for the tag being parsed from. This allows for an overflow of 16-bit array values from the location where the array is parsed. With unlock.vvv, XML data is parsed to the stack, and with level saves the heap. This allows for the pointer where the level save worldmap tag array should be parsed into to be overwritten with a stack address, allowing for ROP from within the XML array parsing function on the next level load.&lt;br /&gt;
| App: v1.1&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 25, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| Citizens of Earth&lt;br /&gt;
| Save file read stack smash&lt;br /&gt;
| Citizens of Earth also uses &amp;quot;XML&amp;quot; files for saves, which are actually entirely binary data (not XML at all) with no checksums. These files are read from the filesystem on to a fixed size stack buffer which leads to an incredibly trivial stack smash. When using the autosave slot for this, the save is parsed when the user selects &amp;quot;continue&amp;quot;. When using one of the dedicated save slots (1-3), the save is parsed shortly after the company splash screens fade. Note that the save is read quite high (descending) on the stack - when exploiting this, one would likely need to move SP due to almost instantly overflowing the physical stack.&lt;br /&gt;
| None&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| May 5, 2016&lt;br /&gt;
| [[User:Dazzozo|Dazzozo]]&lt;br /&gt;
|-&lt;br /&gt;
| SmileBASIC 3.x&lt;br /&gt;
| Poor parameter validation on &amp;quot;BGSCREEN&amp;quot; command&lt;br /&gt;
| The SmileBASIC &amp;quot;BGSCREEN&amp;quot; command&#039;s second parameter is not properly validated as being within range.  As a result, one can set the screen size to an absurdly large value.  This means that the &amp;quot;BGGET&amp;quot; and &amp;quot;BGPUT&amp;quot; commands can then be used on out-of-range values to read and write a significant chunk of the interpreter&#039;s address space.&lt;br /&gt;
With a series of carefully-designed BGPUT commands, one can build a ROP chain and cause it to be executed.&lt;br /&gt;
| App: 3.3.2.&lt;br /&gt;
| System: [[11.0.0-33]].&lt;br /&gt;
| July 20, 2016&lt;br /&gt;
| Around June 26, 2016&lt;br /&gt;
| slackerSnail, 12Me12, incvoid&lt;br /&gt;
Exploited by MrNbaYoh and [[User:Plutooo|plutoo]].&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Tri Force Heroes&lt;br /&gt;
| [[3DS_System_Flaws#General.2FCTRSDK|CTRSDK]] CTPK buffer overflow combined with game&#039;s usage of SpotPass&lt;br /&gt;
| During the very first screen displayed by the game during boot(&amp;quot;Loading...&amp;quot;), just seconds after title launch, the game loads CTPK from the [[BOSS_Services|stored]] SpotPass content. Hence, this game could be exploited via the vulnerable CTRSDK CTPK code &#039;&#039;if&#039;&#039; one could get custom SpotPass data into extdata somehow(ctr-httpwn &amp;gt;=v1.2 with bosshaxx allows this).&lt;br /&gt;
&lt;br /&gt;
The code for this runs from a thread separate from the main-thread, with the stack in linearmem heap. This SpotPass handling triggers before the game ever opens the regular savedata archive. The extdata is opened at some point before this: it opens a file for checking if it exists, then immediately closes it.&lt;br /&gt;
&lt;br /&gt;
The two SpotPass URLs for this have always(?) returned HTTP 404 as of November 2016. It appears these were intended for use as textures for additional costumes(and never got used publicly), but this wasn&#039;t tested.&lt;br /&gt;
&lt;br /&gt;
This is used by [https://github.com/yellows8/ctpkpwn ctpkpwn_tfh].&lt;br /&gt;
| None&lt;br /&gt;
| App: v2.1.0&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| November 14, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pixel Paint&lt;br /&gt;
| Buffer overflow via unchecked extdata file length&lt;br /&gt;
| Pixel Paint loads pictures saved by the user from extdatas. The file is read to a fixed size buffer but the file length remains unchecked, so with a large enough file, one can overwrite pointers in memory and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| November 5, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Steel Diver : Sub Wars&lt;br /&gt;
| Heap overflow / arbitrary memcpy&lt;br /&gt;
| Savefile datas are stored as key/value pairs, a large enough string key makes the game overwrite a memcpy source/destination addresses and size arguments. So one can actually memcpy a rop on the stack and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around July 15, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]], Vegaroxas&lt;br /&gt;
|-&lt;br /&gt;
| 1001 Spikes&lt;br /&gt;
| Buffer overflow via unchecked array-indexes in XML savefile parsing&lt;br /&gt;
| The savefiles are stored as renamed .xml files, which contain several tags with attributes like &#039;array-index=&amp;quot;array-value&amp;quot;&#039;, where both of these are converted from ASCII strings to integers as signed-int32, and the array-value given blindly written to an array inside a structure using the (unchecked) index given. With several of these attributes, one can overwrite the stack starting from the stored lr of the function that does this parsing, and write a ROP chain there. Testing used the &amp;quot;LevelAttempts&amp;quot; tag which is the last such tag parsed in that function.&lt;br /&gt;
| None&lt;br /&gt;
| App: v1.2.0 (TMD v2096)&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around November 2, 2016&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| Secret base team name heap overflow&lt;br /&gt;
| When the player wants to edit the team name, it is copied over the heap, however its length is not verified. So with a large enough team name one can overwrite some pointers and get two arbitrary jumps and then get control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.2.0-35]].&lt;br /&gt;
| December 30, 2016&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Swapdoodle&lt;br /&gt;
| Heap buffer overflow via unchecked size&lt;br /&gt;
| The letter file format used by doodlebomb is composed of multiple chunks. Each chunks is described in the header of the file where the name, size and CRC of each chunk are stored. Some chunks are meant to be headers, every header&#039;s size should be 0x80, however the length of the STAHED1 chunk remains unchecked and the game memcpy the chunk to a 0x80 byte buffer with the length provided in the file. This way one is able to overwrite some pointers and get control of the execution flow.&lt;br /&gt;
| App: &amp;gt; v1.1.1&lt;br /&gt;
| App: v1.1.1&lt;br /&gt;
| April 24, 2017&lt;br /&gt;
| February, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Picross&lt;br /&gt;
| Arbitrary memcpy via unchecked size&lt;br /&gt;
| When reading the savefile, the game handles some lists of buffers that are copied to memory. These buffers should always be 0x14-bytes long but the game uses the size provided in the savefile to copy them. These buffers are copied in some structs and thus with a big enough length value, one can overwrite the next struct which contains a size and a destination address for a memcpy.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| May 29, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow on .bss section&lt;br /&gt;
| When loading a project, the game copies multiple chunks over the BSS section. However the number of chunks to copy is not checked, thus a large amount of chunk result in a buffer overflow. There&#039;s multiple way to exploit this flaw to gain an arbitrary memcpy or an arbitrary jump.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 28, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow via unchecked file size&lt;br /&gt;
| When loading a project, the game loads the file to a 0x200000 bytes long buffer. However the size remains unchecked, so with a big enough file one can overflow the buffer and overwrite a thread stack and then achieve ROP.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 29, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| PSS data heap/stack overflow&lt;br /&gt;
| When launching the game, multiple chunks from the save file are parsed and copied to a large heap buffer. When parsing PSS data (acquaintances, passerby) the game copies each entry to the heap buffer, the number of entries to copy is read from the end of the multiple pss data chunks and is not checked, leading to an overflow. The &amp;quot;PSS data - friends&amp;quot; chunk is vulnerable too, but the overflow occurs on the stack and unfortunately this isn&#039;t exploitable because of a 4 bytes uncontrolled value (in each entry) that gets written on sensitive data.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.6.0]].&lt;br /&gt;
| October 1, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| OOB write&lt;br /&gt;
| When handling events in a map, the indices of &amp;quot;buttons&amp;quot; are not checked. This results in an out of bound bit write, one can thus write a rop directly on the stack (bit by bit).&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 5, 2018&lt;br /&gt;
| &lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Flipnote Studio 3D==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Flaw discovered by&lt;br /&gt;
|-&lt;br /&gt;
| KFH frame count overflow&lt;br /&gt;
| The KFH frame count field should not be &amp;gt;= 0x3E8, but it wasn&#039;t checked and so uncontrolled data were written over pointers, causing an unexploitable crash.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI paper color overflow&lt;br /&gt;
| Paper color field (and similar color fields) in KMI chunks was not checked, a too high value caused a jump to an uncontrolled location.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KSN BGM data size overflow&lt;br /&gt;
| The size of the BGM data in the KSN chunk was not checked, it was used in a memcpy so with a big enough size one could overwrite a thread stack on linear mem and achieve ROP (notehax v1).&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMC chunk unchecked&lt;br /&gt;
| The KMC chunk was not verified at all, the CRC32 and the size were not checked. A big enough size caused an integer overflow and made the game read the file backward.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI layer size unchecked&lt;br /&gt;
| The 3 layer size fields in KMI chunks were not checked, leading to some crashes in the editor.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Bad &amp;quot;queue&amp;quot; implementation&lt;br /&gt;
| When a KWZ was parsed, frames were copied in a kind of queue, bounds were not checked obviously, so with the KMI layer size flaw one was able to fill completely the queue, then write past the buffer and overwrite a heap chunk header (notehax v2). This is not possible anymore, the queue cannot be filled because layer sizes are checked. Moreover each time an element is removed from the queue, the whole content is memmoved *facepalm*.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Unholy Heights&lt;br /&gt;
| Buffer overflow via unchecked string size&lt;br /&gt;
| The game stores some utf-16 messages in the savefile. Right before the message is the length(u32) for the string, the game uses this size to memcpy the message from the savefile to the stack without checking the length. This allows one to overwrite to some function addresses on the stack and form a rop chain.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial Version&lt;br /&gt;
| September 13, 2018&lt;br /&gt;
| August, 2018&lt;br /&gt;
| Kartik&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Useless crashes / applications which were fuzzed==&lt;br /&gt;
* Pushmo (3DSWare), QR codes: level name is properly limited to 16 characters, game doesn&#039;t crash with a longer name. The only possible crashes are triggered by out-of-bounds array index values, these crashes are not exploitable due to the index value being 8bit.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids 2 (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/yellows8/mm3d_re The Legend of Zelda: Majora&#039;s Mask 3D]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;The Legend of Zelda: A Link Between Worlds&amp;quot; and &amp;quot;The Legend of Zelda: Tri Force Heroes&amp;quot;: these games don&#039;t crash at all when the entire save-file(minus constant header data) is overwritten with /dev/random output / 0xFF-bytes. All of the CRC32s were updated for this of course.  Note that this refers to the regular save file: Tri Force Heroes can be exploited via BOSS extdata - see above.&lt;br /&gt;
&lt;br /&gt;
* Pokemon Mystery Dungeon: Gates to Infinity has the same unchecked file bounds as Pokemon Super Mystery Dungeon, however since save compression was introduced in Pokemon Super Mystery Dungeon, it only allocates one buffer within the application heap instead of several within the linear heap, resulting in nothing to corrupt or overwrite even if the file&#039;s length is extended past its allocation.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Kid Icarus: Uprising&amp;quot;: Overwriting the entire savedata results in various crashes, nothing useful.&lt;br /&gt;
&lt;br /&gt;
* Savedata/extdata for &amp;quot;Super Smash Bros 3DS&amp;quot;: Overwriting the various files stored under savedata/extdata results in useless crashes.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;StarFox 64 3D&amp;quot;: Doesn&#039;t crash at all with the entire savedata overwritten.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Frogger 3D&amp;quot;: Overwriting a savefile with random-data results in *nothing* crashing.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Mutant Mudds&amp;quot;: Overwriting the savefile with random data results in a crash&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Worcle Worlds&amp;quot;: Overwriting the savefile with 0xFF results in a crash due to an out of bound read&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Animal Crossing: New Leaf&amp;quot;: Creating a QR code from random data results in a valid QR code and a random design. In some very rare cases(which aren&#039;t always reproducible?) a crash/etc may occur, but this isn&#039;t known to be useful.&lt;br /&gt;
&lt;br /&gt;
==Crashes needing investigation==&lt;br /&gt;
* Disney Infinity crashes when all savedata overwritten with /dev/urandom. No checksums. 0xFF bytes don&#039;t cause a crash.&lt;br /&gt;
&lt;br /&gt;
* Football Up Online / Soccer Up Online and Football Up 3D / Soccer Up 3D crash when teamname(UTF-16) length = 0x48 AND 0x20 null bytes are removed after just the name or if teamname length is way longer than 0x48.&lt;br /&gt;
&lt;br /&gt;
=System applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| 3DS [[System Settings]] DS profile string stack-smash&lt;br /&gt;
| Too long or corrupted strings (01Ah  2   Nickname length in characters     050h  2   Message length in characters) in the NVRAM DS user settings (System Settings-&amp;gt;Other Settings-&amp;gt;Profile-&amp;gt;Nintendo DS Profile) cause it to crash in 3DS-mode due to a stack-smash. The DSi is not vulnerable to this, DSi launcher(menu) and DSi System Settings will reset the NVRAM user-settings if the length field values are too long(same result as when the CRCs are invalid). TWL_FIRM also resets the NVRAM user-settings when the string-length(s) are too long.&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| 2012&lt;br /&gt;
| [[User:Ichfly|Ichfly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Nintendo 3DS Sound]]&lt;br /&gt;
| When a .m4a is loaded, the song name is copied to a 256 byte buffer. When the song name begins with a Unicode BOM marker, it memcpy&#039;s the tag using the user-provided length. This gives an arbitrary write which can be used to achieve ROP.&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| June/July 2016&lt;br /&gt;
| [[User:nedwill|nedwill]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=System applets=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Webkit/web-browser bugs&lt;br /&gt;
| spider has had at least three different code-execution exploits. Majority of them are use-after-free issues. See also [[browserhax|here]].&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 2013?&lt;br /&gt;
|&lt;br /&gt;
| A lot of people.&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS/New3DS [[Internet_Browser|Browser-version-check]] bypass&lt;br /&gt;
| When the browser-version-check code runs where the savedata for it was never initialized(such as when the user used the &amp;quot;Initialize savedata&amp;quot; option), it will use base_timestamp=0 instead of the timestamp loaded from savedata. This is then used with &amp;quot;if(cur_timestamp - base_timestamp &amp;gt;= &amp;lt;24h timestamp&amp;gt;){Run browser-version-check HTTPS request code}&amp;quot;.&lt;br /&gt;
Hence, if the savedata was just initialized, and if the system datetime is set to before January 2, 2000, the browser-version-check will be skipped. This includes January 1, 2000, 00:00, because that&#039;s the epoch(timestamp value 0x0) used with this timestamp.&lt;br /&gt;
&lt;br /&gt;
See [http://yls8.mtheall.com/3dsbrowserhax.php here] for bypass usage instructions.&lt;br /&gt;
&lt;br /&gt;
This was fixed with [[10.7.0-32|10.7.0-32]], see [[Internet_Browser|here]] for details.&lt;br /&gt;
| [[10.7.0-32|10.7.0-32]]&lt;br /&gt;
| &lt;br /&gt;
| [[9.9.0-26|9.9.0-26]]&lt;br /&gt;
| February 25, 2016&lt;br /&gt;
| November 2, 2015 (Exactly one week after the browser version pages were initially updated server-side)&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Skater - Bookmark OOB write&lt;br /&gt;
| Each bookmark has an id that should not exceed 0x63 (99), however ids are not checked, this results in an OOB write on the stack, but only the value 0x01 can be written.&lt;br /&gt;
| &lt;br /&gt;
| [[11.6.0-39|11.6.0-39]]&lt;br /&gt;
| &lt;br /&gt;
| May 21, 2018&lt;br /&gt;
| May 20, 2018&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| MicroSD Management - malformed security blob causes stack buffer overflow (mhax) &lt;br /&gt;
| The MicroSD Management application&#039;s parsing of Windows NTLM security blobs in the SMB/CIFS protocol doesn&#039;t verify that the client&#039;s specified NT domain name is less than 32 UTF-16 characters.  When it&#039;s longer, a stack buffer overrun occurs, leading to a ROP chain and complete control of the mcopy application.&lt;br /&gt;
&lt;br /&gt;
The malformed security blob can be sent by an attacker within the SMB_COM_SESSION_SETUP_ANDX (0x73) packet.&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[9.0.0-20|9.0.0-20]]&lt;br /&gt;
| August 12, 2018&lt;br /&gt;
| 2018&lt;br /&gt;
| smea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Home Menu==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| bossbannerhax&lt;br /&gt;
| After successfully loading [[Extended_Banner|extended-banner]] data(done when selecting an icon), Home Menu attempts to load &amp;quot;[[CBMD]]&amp;quot; data into a 0x100000-byte heap buffer from the [[BOSS_Services|stored]] SpotPass content. When successful and the magic-number is CBMD, Home Menu then decompresses the exbanner sections into another fixed-size heap buffer, without checking the outsize at all. The main CBMD CGFX code with ExeFS checks the size, but this code doesn&#039;t(however this is exbanner &amp;quot;CBMD&amp;quot;, not a &amp;quot;normal&amp;quot; CBMD).&lt;br /&gt;
&lt;br /&gt;
Used with menuhax as of v3.2.&lt;br /&gt;
| [[11.3.0-36|11.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[1.0.0-0|1.0.0-0]]&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| December 23, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| sdiconhax&lt;br /&gt;
| This is basically the same as nandiconhax, the vulnerable SD/NAND functions are &#039;&#039;identical&#039;&#039; minus the file-buffer offsets. Exploitation is different due to different heap-buffer location though. Unlike nandiconhax, the icon buffer for SD is located in linearmem(with recent Home Menu versions at least). This is used by [[menuhax]].&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| July 27, 2016&lt;br /&gt;
| October 23, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| [[System_SaveData|NAND-savedata]] Launcher.dat icons (nandiconhax)&lt;br /&gt;
| The homemenu code processing the titleid list @ launcherdat+8 copies those titleIDs to another buffer, where the offset relative to that buffer is calculated using the corresponding s8/s16 entries. Those two values are not range checked at all. Hence, one can use this to write u64(s) with arbitrary values to before/after this allocated output buffer. See [[Home_Menu|here]] regarding Launcher.dat structure.&lt;br /&gt;
&lt;br /&gt;
This can be exploited(with Launcher.dat loading at startup at least) by using a s16 for the icon entry with value 0xFFEC(-20)(and perhaps more icons with similar s16 values to write multiple u64s). The result is that the u64 value is written to outbuf-0xA0, which overwrites object+0(vtable) and object+4(doesn&#039;t matter here) for an object that gets used a bit after the vulnerable function triggers. The low 32bits of the u64 can then be set to the address of controlled memory(either outbuf in regular heap or the entire launcherdat buffer in linearmem), for use as a fake vtable in order to get control of PC. From there one can begin ROP via vtable funcptrs to do a stack-pivot(r4=objectaddr at the time the above object gets used).&lt;br /&gt;
&lt;br /&gt;
Originally this vuln could only be triggered via Launcher.dat at Home Menu startup, right after Launcher.dat gets loaded + memory gets allocated, once the file-format version code is finished running. Starting with v9.6 this can be triggered when loading layouts from SD extdata as well. The vuln itself triggers before the layout data is written to Launcher.dat, but it doesn&#039;t seem to be possible to overwrite anything which actually gets used before the function which writes Launcher.dat into the layout gets called.&lt;br /&gt;
&lt;br /&gt;
Home Menu has some sort of fail-safe system(or at least on v9.7) when Home Menu crashes due to Launcher.dat(this also applies for other things with Home Menu): after crashing once, Home Menu resets Launcher.dat to a state where it no longer crashes anymore. However, note that any exploits using this which hang/etc without crashing will still brick the system. &#039;&#039;&#039;Hence, attempting anything with this on physnand without hw-nand-access isn&#039;t really recommended.&#039;&#039;&#039;&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| May 14, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Theme-data decompression buffer overflow ([[menuhax|themehax]])&lt;br /&gt;
| The only func-call size parameter used by the theme decompression function is one for the compressed size, none for the decompressed size. The decompressed-size value from the LZ header is used by this function to check when to stop decompressing, but this function itself has nothing to verify the decompressed_size with. The code calling this function does not check or even use the decompressed size from the header either.&lt;br /&gt;
&lt;br /&gt;
This function is separate from the rest of the Home Menu code: the function used for decompressing themes is *only* used for decompressing themes, nothing else. There&#039;s a separate decompression function in Home Menu used for decompressing everything else.&lt;br /&gt;
&lt;br /&gt;
That other decompression function in Home Menu handles decompression size properly(decompressed size check for max buffer size is done by code calling the other function, not in the function itself). Unlike the other function, the theme function supports multiple LZ algorithms, but the one which actually gets used in official themes is the same one supported by the other function anyway.&lt;br /&gt;
&lt;br /&gt;
See also [[menuhax|here]].&lt;br /&gt;
&lt;br /&gt;
With [[10.2.0-28|10.2.0-X]] Home Menu, the only code change was that the following was added right after theme-load and before actual decompression: &amp;quot;if(&amp;lt;get_lzheader_decompressed_size&amp;gt;(compressed_buf) &amp;gt; 0x150000)&amp;lt;exit&amp;gt;;&amp;quot;. This fixed the vuln.&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| &amp;lt;Old3DS/New3DS version which added initial theme support&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| December 22, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]], [[User:Myria|Myria]] independently (~spring 2015)&lt;br /&gt;
|-&lt;br /&gt;
| Shuffle body-data buffer overflow ([[menuhax|shufflehax]])&lt;br /&gt;
| See [[menuhax|here]].&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[9.3.0-21|9.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| January 3, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Extdata file-data loading buffer overflow&lt;br /&gt;
| The extdata file-reading code allocates a fixed-size heap buffer for the expected filesize, then reads the filedata into this buffer using the actual FS filesize. Before v5.0 the filesize used here wasn&#039;t validated, hence if the filesize is larger than alloc_size a buffer overflow would occur. &#039;&#039;After&#039;&#039; doing the file-read it does validate that the actual_readsize matches the alloc_size, but at this point the buffer overflow has already occurred.&lt;br /&gt;
&lt;br /&gt;
This affected at least the following: SaveData.dat and Cache.dat.&lt;br /&gt;
&lt;br /&gt;
This can be triggered with SaveData.dat by installing a &amp;lt;v4.0 Home Menu version, with Home Menu extdata from &amp;gt;=v4.0 still on SD. When this is done with v2.0 Home Menu, a kernelpanic occurs when processing an AM command(it appears a buffer ptr which is then passed to a command was overwritten with 0x0 - of course other SaveData.dat filesizes may result in different behaviour).&lt;br /&gt;
| [[5.0.0-11|5.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[2.0.0-2|2.0.0-X]]&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The icon data arrays used with {sd/nand}iconhax were added to SaveData.dat/Launcher.dat with [[4.0.0-7|4.0.0-X]], hence the vulnerable functions were added with that same version.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;=v4.0 the SaveData.dat buffer is located in the regular heap. It&#039;s unknown when exactly it was moved to linearmem, which is where it&#039;s located with recent versions. It&#039;s located in linearmem for KOR &amp;gt;=v9.6 for example.&lt;br /&gt;
&lt;br /&gt;
The SaveData.dat/Launcher.dat icon vulns were fixed by doing various unsigned &amp;gt;=60/&amp;gt;=360 checks on the loaded values. When these checks fail, it just skips over handling this icon entry. Hence, the original value can&#039;t be negative / out-of-bounds any more.&lt;br /&gt;
&lt;br /&gt;
==Useless crashes==&lt;br /&gt;
Old3DS system web-browser:&lt;br /&gt;
* 2^32 characters long string(&#039;&#039;finally&#039;&#039; fixed with v10.6): this is similar to the vulnerability fixed [http://git.chromium.org/gitweb/?p=external/Webkit.git;a=commitdiff;h=ec471f16fbd1f879cb631f9b022fd16acd75f4d4 here], concat-large-strings-crash2.html triggers a crash which is about the same as the one triggered by a 2^32 string. Most of the time this vulnerability will cause a memory page permissions fault, since the WebKit code attempts to copy the string text data to the output buffer located in read-only [[CRO0|CRO]] heap memory. The only difference between a crash triggered by a 2^32 string and the concat-large-strings-crash2.html crash is at the former copies the string data using the original string length(like 1 text character for &amp;quot;x&amp;quot;, 4 for &amp;quot;xxxx&amp;quot;) while the latter attempts to copy &amp;gt;12MB. In some &#039;&#039;very&#039;&#039; rare cases a thread separate from the string data-copy thread will crash, this might be exploitable. However, this is mostly useless since it rarely crashes this way.&lt;br /&gt;
&lt;br /&gt;
* Trying to directly load a page via the browser &amp;quot;URL&amp;quot; option with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] setup, causes a crash to trigger in oss.cro due to an use-after-free being caught with webkitdebug. This is presumably some sort of realloc() issue in the libcurl version used by the &amp;lt;={v10.2-v10.3} browser. This happens with *every* *single* *page* one tries to load via the &amp;quot;URL&amp;quot; option, but not when loading links on the current page, hence this is probably useless. A different use-after-free with realloc triggers with loading any page at all regardless of method too(libcurl probably).&lt;br /&gt;
&lt;br /&gt;
* This WebKit build has &#039;&#039;a lot&#039;&#039; of crash-trigger bugs that only happen with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] completely setup(addr accesses near 0x0), with &#039;&#039;just&#039;&#039; trying to load any page at all.&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20815</id>
		<title>3DS Userland Flaws</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=3DS_Userland_Flaws&amp;diff=20815"/>
		<updated>2018-08-20T23:25:06Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Useless crashes / applications which were fuzzed */ Add worcle worlds&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists vulnerabilities / exploits for 3DS applications and applets. Exploiting these initially results in ROP, from that ROP one can then for example try exploiting [[3DS_System_Flaws|system]] flaw(s).&lt;br /&gt;
&lt;br /&gt;
=Non-system applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Application name&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Last app/system version this flaw was checked for&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this vuln was discovered&lt;br /&gt;
!  Vuln discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Cubic Ninja&lt;br /&gt;
| Map-data stack smash&lt;br /&gt;
| See [[Ninjhax|here]] regarding Ninjhax.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.4.0-29]].&lt;br /&gt;
| Ninjhax release&lt;br /&gt;
| July 2014&lt;br /&gt;
| [[User:smea|smea]]&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Ocarina of Time 3D&lt;br /&gt;
| UTF-16 name string buffer overflow via unchecked u8 length field&lt;br /&gt;
| The u8 at offset 0x2C in the savefile is the character-length of the UTF-16 string at offset 0x1C. When copying this string, it&#039;s essentially a memory-copy with lenval*2, not a string-copy. This can be used to trigger buffer overflows at various locations depending on the string length.&lt;br /&gt;
* When value is &amp;gt;=0x6E it crashes when saving the saveslot, this causes a stack-smash however it normally crashes before it returns from the function which had the stack-frame overwritten.&lt;br /&gt;
* With value &amp;gt;=0x9A, it crashes via stack-smash in-game once any dialogs are opened(touching buttons on the touch-screen can trigger it too).&lt;br /&gt;
* Length value&amp;gt;=0xCD causes a crash while loading the saveslot, via a heap buffer overflow. This buf-overflow overwrites a heap memchunk following the allocated buffer. When the first 16-bits overwriting that heap memchunk is not the memchunk magic-number(0x7373), the mem-alloc code will just return a NULL ptr which later results in a crash. When the magic-number is valid, the mem-alloc code will continue to attempt to parse the memchunk, which may crash depending on the data which overwrote the memchunk. This heap code is separate from the CTRSDK heap code. Exploiting this doesn&#039;t seem to be possible: since the heap code actually verifies that the magic-number for the next/prev memchunk ptrs are correct(unlike CTRSDK), it&#039;s not possible to change those ptrs to useful arbitrary addresses outside of savedata(like with triggering a write to a c++ object ptr which later is used with a vtable func-call, this is what one would do with CTRSDK heap here).&lt;br /&gt;
&lt;br /&gt;
On March 11, 2015, an exploit using this vuln was released, that one was intended for warez/etc. The following exploit wasn&#039;t released before then mainly because doing so would (presumably) result in the vuln being fixed. The following old exploit was released on March 14, 2015: [https://github.com/yellows8/oot3dhax].&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[10.6.0-31]].&lt;br /&gt;
| March 11, 2015&lt;br /&gt;
| Around October 22, 2012&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Super Smash Bros 3DS&lt;br /&gt;
| Buffer overflow in local-multiplayer beacon handling.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| App: v1.1.3&lt;br /&gt;
| See [[smashbroshax|here]]. System: [[10.3.0-28]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| See [[smashbroshax|here]].&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Super Mystery Dungeon&lt;br /&gt;
| Heap overflow within linear memory via unchecked save file length&lt;br /&gt;
| Pokemon Super Mystery Dungeon uses zlib compression for most of its save files, possibly due to the save files being larger than its predecessor, Gates to Infinity. When a save file is being prepared to be loaded and read from, only a 0x32000 large buffer is allocated for file reading, and a 0x3e800-large buffer for decompression is also allocated before the file is read. However, the game does not limit the size of the file read to this allocation bound, allowing for the file to overflow into the linear memory heap and into the next allocation. Since Pokemon Super Mystery Dungeon stores allocation memchunks directly before the allocation, overwriting the next memchunk with a corrupted one allows for arbitrary writes of linear heap pointers when the next buffer is allocated or arbitrary writes of any pointer within writable memory when the corrupted buffer is freed.&lt;br /&gt;
| None&lt;br /&gt;
| O3DS: [[11.3.0-36]]. N3DS: [[11.4.0-37]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 14, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| VVVVVV&lt;br /&gt;
| Buffer overflow in XML save file array parsing&lt;br /&gt;
| VVVVVV utilizes several XML files (renamed with a .vvv extension) to store level save data, stats and settings. Within these XML files are several tags containing an array of data which, when parsed, is not properly checked to be of proper length for the tag being parsed from. This allows for an overflow of 16-bit array values from the location where the array is parsed. With unlock.vvv, XML data is parsed to the stack, and with level saves the heap. This allows for the pointer where the level save worldmap tag array should be parsed into to be overwritten with a stack address, allowing for ROP from within the XML array parsing function on the next level load.&lt;br /&gt;
| App: v1.1&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| April 25, 2016&lt;br /&gt;
| [[User:Shinyquagsire23|Shiny Quagsire]]&lt;br /&gt;
|-&lt;br /&gt;
| Citizens of Earth&lt;br /&gt;
| Save file read stack smash&lt;br /&gt;
| Citizens of Earth also uses &amp;quot;XML&amp;quot; files for saves, which are actually entirely binary data (not XML at all) with no checksums. These files are read from the filesystem on to a fixed size stack buffer which leads to an incredibly trivial stack smash. When using the autosave slot for this, the save is parsed when the user selects &amp;quot;continue&amp;quot;. When using one of the dedicated save slots (1-3), the save is parsed shortly after the company splash screens fade. Note that the save is read quite high (descending) on the stack - when exploiting this, one would likely need to move SP due to almost instantly overflowing the physical stack.&lt;br /&gt;
| None&lt;br /&gt;
| [[10.7.0-32]].&lt;br /&gt;
| Time of exploit release.&lt;br /&gt;
| May 5, 2016&lt;br /&gt;
| [[User:Dazzozo|Dazzozo]]&lt;br /&gt;
|-&lt;br /&gt;
| SmileBASIC 3.x&lt;br /&gt;
| Poor parameter validation on &amp;quot;BGSCREEN&amp;quot; command&lt;br /&gt;
| The SmileBASIC &amp;quot;BGSCREEN&amp;quot; command&#039;s second parameter is not properly validated as being within range.  As a result, one can set the screen size to an absurdly large value.  This means that the &amp;quot;BGGET&amp;quot; and &amp;quot;BGPUT&amp;quot; commands can then be used on out-of-range values to read and write a significant chunk of the interpreter&#039;s address space.&lt;br /&gt;
With a series of carefully-designed BGPUT commands, one can build a ROP chain and cause it to be executed.&lt;br /&gt;
| App: 3.3.2.&lt;br /&gt;
| System: [[11.0.0-33]].&lt;br /&gt;
| July 20, 2016&lt;br /&gt;
| Around June 26, 2016&lt;br /&gt;
| slackerSnail, 12Me12, incvoid&lt;br /&gt;
Exploited by MrNbaYoh and [[User:Plutooo|plutoo]].&lt;br /&gt;
|-&lt;br /&gt;
| The Legend of Zelda: Tri Force Heroes&lt;br /&gt;
| [[3DS_System_Flaws#General.2FCTRSDK|CTRSDK]] CTPK buffer overflow combined with game&#039;s usage of SpotPass&lt;br /&gt;
| During the very first screen displayed by the game during boot(&amp;quot;Loading...&amp;quot;), just seconds after title launch, the game loads CTPK from the [[BOSS_Services|stored]] SpotPass content. Hence, this game could be exploited via the vulnerable CTRSDK CTPK code &#039;&#039;if&#039;&#039; one could get custom SpotPass data into extdata somehow(ctr-httpwn &amp;gt;=v1.2 with bosshaxx allows this).&lt;br /&gt;
&lt;br /&gt;
The code for this runs from a thread separate from the main-thread, with the stack in linearmem heap. This SpotPass handling triggers before the game ever opens the regular savedata archive. The extdata is opened at some point before this: it opens a file for checking if it exists, then immediately closes it.&lt;br /&gt;
&lt;br /&gt;
The two SpotPass URLs for this have always(?) returned HTTP 404 as of November 2016. It appears these were intended for use as textures for additional costumes(and never got used publicly), but this wasn&#039;t tested.&lt;br /&gt;
&lt;br /&gt;
This is used by [https://github.com/yellows8/ctpkpwn ctpkpwn_tfh].&lt;br /&gt;
| None&lt;br /&gt;
| App: v2.1.0&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| November 14, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Pixel Paint&lt;br /&gt;
| Buffer overflow via unchecked extdata file length&lt;br /&gt;
| Pixel Paint loads pictures saved by the user from extdatas. The file is read to a fixed size buffer but the file length remains unchecked, so with a large enough file, one can overwrite pointers in memory and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: Initial version. System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| November 5, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Steel Diver : Sub Wars&lt;br /&gt;
| Heap overflow / arbitrary memcpy&lt;br /&gt;
| Savefile datas are stored as key/value pairs, a large enough string key makes the game overwrite a memcpy source/destination addresses and size arguments. So one can actually memcpy a rop on the stack and gain control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| System: [[11.2.0-35]].&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around July 15, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]], Vegaroxas&lt;br /&gt;
|-&lt;br /&gt;
| 1001 Spikes&lt;br /&gt;
| Buffer overflow via unchecked array-indexes in XML savefile parsing&lt;br /&gt;
| The savefiles are stored as renamed .xml files, which contain several tags with attributes like &#039;array-index=&amp;quot;array-value&amp;quot;&#039;, where both of these are converted from ASCII strings to integers as signed-int32, and the array-value given blindly written to an array inside a structure using the (unchecked) index given. With several of these attributes, one can overwrite the stack starting from the stored lr of the function that does this parsing, and write a ROP chain there. Testing used the &amp;quot;LevelAttempts&amp;quot; tag which is the last such tag parsed in that function.&lt;br /&gt;
| None&lt;br /&gt;
| App: v1.2.0 (TMD v2096)&lt;br /&gt;
| December 27, 2016&lt;br /&gt;
| Around November 2, 2016&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| Secret base team name heap overflow&lt;br /&gt;
| When the player wants to edit the team name, it is copied over the heap, however its length is not verified. So with a large enough team name one can overwrite some pointers and get two arbitrary jumps and then get control of the execution flow.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.2.0-35]].&lt;br /&gt;
| December 30, 2016&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Swapdoodle&lt;br /&gt;
| Heap buffer overflow via unchecked size&lt;br /&gt;
| The letter file format used by doodlebomb is composed of multiple chunks. Each chunks is described in the header of the file where the name, size and CRC of each chunk are stored. Some chunks are meant to be headers, every header&#039;s size should be 0x80, however the length of the STAHED1 chunk remains unchecked and the game memcpy the chunk to a 0x80 byte buffer with the length provided in the file. This way one is able to overwrite some pointers and get control of the execution flow.&lt;br /&gt;
| App: &amp;gt; v1.1.1&lt;br /&gt;
| App: v1.1.1&lt;br /&gt;
| April 24, 2017&lt;br /&gt;
| February, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Picross&lt;br /&gt;
| Arbitrary memcpy via unchecked size&lt;br /&gt;
| When reading the savefile, the game handles some lists of buffers that are copied to memory. These buffers should always be 0x14-bytes long but the game uses the size provided in the savefile to copy them. These buffers are copied in some structs and thus with a big enough length value, one can overwrite the next struct which contains a size and a destination address for a memcpy.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| May 29, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow on .bss section&lt;br /&gt;
| When loading a project, the game copies multiple chunks over the BSS section. However the number of chunks to copy is not checked, thus a large amount of chunk result in a buffer overflow. There&#039;s multiple way to exploit this flaw to gain an arbitrary memcpy or an arbitrary jump.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 28, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| Buffer overflow via unchecked file size&lt;br /&gt;
| When loading a project, the game loads the file to a 0x200000 bytes long buffer. However the size remains unchecked, so with a big enough file one can overflow the buffer and overwrite a thread stack and then achieve ROP.&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 29, 2017&lt;br /&gt;
| August, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Pokemon Omega Ruby/Alpha Sapphire&lt;br /&gt;
| PSS data heap/stack overflow&lt;br /&gt;
| When launching the game, multiple chunks from the save file are parsed and copied to a large heap buffer. When parsing PSS data (acquaintances, passerby) the game copies each entry to the heap buffer, the number of entries to copy is read from the end of the multiple pss data chunks and is not checked, leading to an overflow. The &amp;quot;PSS data - friends&amp;quot; chunk is vulnerable too, but the overflow occurs on the stack and unfortunately this isn&#039;t exploitable because of a 4 bytes uncontrolled value (in each entry) that gets written on sensitive data.&lt;br /&gt;
| None&lt;br /&gt;
| App: 1.4. System: [[11.6.0]].&lt;br /&gt;
| October 1, 2017&lt;br /&gt;
| June, 2016&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| RPG Maker Fes/Player&lt;br /&gt;
| OOB write&lt;br /&gt;
| When handling events in a map, the indices of &amp;quot;buttons&amp;quot; are not checked. This results in an out of bound bit write, one can thus write a rop directly on the stack (bit by bit).&lt;br /&gt;
| None?&lt;br /&gt;
| App: ?&lt;br /&gt;
| August 5, 2018&lt;br /&gt;
| &lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Flipnote Studio 3D==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in app/system version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Flaw discovered by&lt;br /&gt;
|-&lt;br /&gt;
| KFH frame count overflow&lt;br /&gt;
| The KFH frame count field should not be &amp;gt;= 0x3E8, but it wasn&#039;t checked and so uncontrolled data were written over pointers, causing an unexploitable crash.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI paper color overflow&lt;br /&gt;
| Paper color field (and similar color fields) in KMI chunks was not checked, a too high value caused a jump to an uncontrolled location.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KSN BGM data size overflow&lt;br /&gt;
| The size of the BGM data in the KSN chunk was not checked, it was used in a memcpy so with a big enough size one could overwrite a thread stack on linear mem and achieve ROP (notehax v1).&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMC chunk unchecked&lt;br /&gt;
| The KMC chunk was not verified at all, the CRC32 and the size were not checked. A big enough size caused an integer overflow and made the game read the file backward.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| KMI layer size unchecked&lt;br /&gt;
| The 3 layer size fields in KMI chunks were not checked, leading to some crashes in the editor.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| Bad &amp;quot;queue&amp;quot; implementation&lt;br /&gt;
| When a KWZ was parsed, frames were copied in a kind of queue, bounds were not checked obviously, so with the KMI layer size flaw one was able to fill completely the queue, then write past the buffer and overwrite a heap chunk header (notehax v2). This is not possible anymore, the queue cannot be filled because layer sizes are checked. Moreover each time an element is removed from the queue, the whole content is memmoved *facepalm*.&lt;br /&gt;
| System: 11.6&lt;br /&gt;
| September 20, 2017&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Useless crashes / applications which were fuzzed==&lt;br /&gt;
* Pushmo (3DSWare), QR codes: level name is properly limited to 16 characters, game doesn&#039;t crash with a longer name. The only possible crashes are triggered by out-of-bounds array index values, these crashes are not exploitable due to the index value being 8bit.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [[Pyramids 2 (3DSWare)]], QR codes: no strings. Only crashes are from out-of-bounds values (like background ID) and are not exploitable.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/yellows8/mm3d_re The Legend of Zelda: Majora&#039;s Mask 3D]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;The Legend of Zelda: A Link Between Worlds&amp;quot; and &amp;quot;The Legend of Zelda: Tri Force Heroes&amp;quot;: these games don&#039;t crash at all when the entire save-file(minus constant header data) is overwritten with /dev/random output / 0xFF-bytes. All of the CRC32s were updated for this of course.  Note that this refers to the regular save file: Tri Force Heroes can be exploited via BOSS extdata - see above.&lt;br /&gt;
&lt;br /&gt;
* Pokemon Mystery Dungeon: Gates to Infinity has the same unchecked file bounds as Pokemon Super Mystery Dungeon, however since save compression was introduced in Pokemon Super Mystery Dungeon, it only allocates one buffer within the application heap instead of several within the linear heap, resulting in nothing to corrupt or overwrite even if the file&#039;s length is extended past its allocation.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Kid Icarus: Uprising&amp;quot;: Overwriting the entire savedata results in various crashes, nothing useful.&lt;br /&gt;
&lt;br /&gt;
* Savedata/extdata for &amp;quot;Super Smash Bros 3DS&amp;quot;: Overwriting the various files stored under savedata/extdata results in useless crashes.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;StarFox 64 3D&amp;quot;: Doesn&#039;t crash at all with the entire savedata overwritten.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Frogger 3D&amp;quot;: Overwriting a savefile with random-data results in *nothing* crashing.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Mutant Mudds&amp;quot;: Overwriting the savefile with random data results in a crash&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Worcle Worlds&amp;quot;: Overwriting the savefile with 0xFF results in a crash due to an out of bound read&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Animal Crossing: New Leaf&amp;quot;: Creating a QR code from random data results in a valid QR code and a random design. In some very rare cases(which aren&#039;t always reproducible?) a crash/etc may occur, but this isn&#039;t known to be useful.&lt;br /&gt;
&lt;br /&gt;
==Crashes needing investigation==&lt;br /&gt;
* Disney Infinity crashes when all savedata overwritten with /dev/urandom. No checksums. 0xFF bytes don&#039;t cause a crash.&lt;br /&gt;
&lt;br /&gt;
* Football Up Online / Soccer Up Online and Football Up 3D / Soccer Up 3D crash when teamname(UTF-16) length = 0x48 AND 0x20 null bytes are removed after just the name or if teamname length is way longer than 0x48.&lt;br /&gt;
&lt;br /&gt;
=System applications=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| 3DS [[System Settings]] DS profile string stack-smash&lt;br /&gt;
| Too long or corrupted strings (01Ah  2   Nickname length in characters     050h  2   Message length in characters) in the NVRAM DS user settings (System Settings-&amp;gt;Other Settings-&amp;gt;Profile-&amp;gt;Nintendo DS Profile) cause it to crash in 3DS-mode due to a stack-smash. The DSi is not vulnerable to this, DSi launcher(menu) and DSi System Settings will reset the NVRAM user-settings if the length field values are too long(same result as when the CRCs are invalid). TWL_FIRM also resets the NVRAM user-settings when the string-length(s) are too long.&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| 2012&lt;br /&gt;
| [[User:Ichfly|Ichfly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Nintendo 3DS Sound]]&lt;br /&gt;
| When a .m4a is loaded, the song name is copied to a 256 byte buffer. When the song name begins with a Unicode BOM marker, it memcpy&#039;s the tag using the user-provided length. This gives an arbitrary write which can be used to achieve ROP.&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| June/July 2016&lt;br /&gt;
| [[User:nedwill|nedwill]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=System applets=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Webkit/web-browser bugs&lt;br /&gt;
| spider has had at least three different code-execution exploits. Majority of them are use-after-free issues. See also [[browserhax|here]].&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 2013?&lt;br /&gt;
|&lt;br /&gt;
| A lot of people.&lt;br /&gt;
|-&lt;br /&gt;
| Old3DS/New3DS [[Internet_Browser|Browser-version-check]] bypass&lt;br /&gt;
| When the browser-version-check code runs where the savedata for it was never initialized(such as when the user used the &amp;quot;Initialize savedata&amp;quot; option), it will use base_timestamp=0 instead of the timestamp loaded from savedata. This is then used with &amp;quot;if(cur_timestamp - base_timestamp &amp;gt;= &amp;lt;24h timestamp&amp;gt;){Run browser-version-check HTTPS request code}&amp;quot;.&lt;br /&gt;
Hence, if the savedata was just initialized, and if the system datetime is set to before January 2, 2000, the browser-version-check will be skipped. This includes January 1, 2000, 00:00, because that&#039;s the epoch(timestamp value 0x0) used with this timestamp.&lt;br /&gt;
&lt;br /&gt;
See [http://yls8.mtheall.com/3dsbrowserhax.php here] for bypass usage instructions.&lt;br /&gt;
&lt;br /&gt;
This was fixed with [[10.7.0-32|10.7.0-32]], see [[Internet_Browser|here]] for details.&lt;br /&gt;
| [[10.7.0-32|10.7.0-32]]&lt;br /&gt;
| &lt;br /&gt;
| [[9.9.0-26|9.9.0-26]]&lt;br /&gt;
| February 25, 2016&lt;br /&gt;
| November 2, 2015 (Exactly one week after the browser version pages were initially updated server-side)&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Skater - Bookmark OOB write&lt;br /&gt;
| Each bookmark has an id that should not exceed 0x63 (99), however ids are not checked, this results in an OOB write on the stack, but only the value 0x01 can be written.&lt;br /&gt;
| &lt;br /&gt;
| [[11.6.0-39|11.6.0-39]]&lt;br /&gt;
| &lt;br /&gt;
| May 21, 2018&lt;br /&gt;
| May 20, 2018&lt;br /&gt;
| [[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|-&lt;br /&gt;
| MicroSD Management - malformed security blob causes stack buffer overflow (mhax) &lt;br /&gt;
| The MicroSD Management application&#039;s parsing of Windows NTLM security blobs in the SMB/CIFS protocol doesn&#039;t verify that the client&#039;s specified NT domain name is less than 32 UTF-16 characters.  When it&#039;s longer, a stack buffer overrun occurs, leading to a ROP chain and complete control of the mcopy application.&lt;br /&gt;
&lt;br /&gt;
The malformed security blob can be sent by an attacker within the SMB_COM_SESSION_SETUP_ANDX (0x73) packet.&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[11.8.0-41|11.8.0-41]]&lt;br /&gt;
| [[9.0.0-20|9.0.0-20]]&lt;br /&gt;
| August 12, 2018&lt;br /&gt;
| 2018&lt;br /&gt;
| smea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Home Menu==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed in version&lt;br /&gt;
!  Last version this flaw was checked for&lt;br /&gt;
!  Introduced with version&lt;br /&gt;
!  Timeframe info related to this was added to wiki&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| bossbannerhax&lt;br /&gt;
| After successfully loading [[Extended_Banner|extended-banner]] data(done when selecting an icon), Home Menu attempts to load &amp;quot;[[CBMD]]&amp;quot; data into a 0x100000-byte heap buffer from the [[BOSS_Services|stored]] SpotPass content. When successful and the magic-number is CBMD, Home Menu then decompresses the exbanner sections into another fixed-size heap buffer, without checking the outsize at all. The main CBMD CGFX code with ExeFS checks the size, but this code doesn&#039;t(however this is exbanner &amp;quot;CBMD&amp;quot;, not a &amp;quot;normal&amp;quot; CBMD).&lt;br /&gt;
&lt;br /&gt;
Used with menuhax as of v3.2.&lt;br /&gt;
| [[11.3.0-36|11.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[1.0.0-0|1.0.0-0]]&lt;br /&gt;
| November 18, 2016&lt;br /&gt;
| December 23, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| sdiconhax&lt;br /&gt;
| This is basically the same as nandiconhax, the vulnerable SD/NAND functions are &#039;&#039;identical&#039;&#039; minus the file-buffer offsets. Exploitation is different due to different heap-buffer location though. Unlike nandiconhax, the icon buffer for SD is located in linearmem(with recent Home Menu versions at least). This is used by [[menuhax]].&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| July 27, 2016&lt;br /&gt;
| October 23, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| [[System_SaveData|NAND-savedata]] Launcher.dat icons (nandiconhax)&lt;br /&gt;
| The homemenu code processing the titleid list @ launcherdat+8 copies those titleIDs to another buffer, where the offset relative to that buffer is calculated using the corresponding s8/s16 entries. Those two values are not range checked at all. Hence, one can use this to write u64(s) with arbitrary values to before/after this allocated output buffer. See [[Home_Menu|here]] regarding Launcher.dat structure.&lt;br /&gt;
&lt;br /&gt;
This can be exploited(with Launcher.dat loading at startup at least) by using a s16 for the icon entry with value 0xFFEC(-20)(and perhaps more icons with similar s16 values to write multiple u64s). The result is that the u64 value is written to outbuf-0xA0, which overwrites object+0(vtable) and object+4(doesn&#039;t matter here) for an object that gets used a bit after the vulnerable function triggers. The low 32bits of the u64 can then be set to the address of controlled memory(either outbuf in regular heap or the entire launcherdat buffer in linearmem), for use as a fake vtable in order to get control of PC. From there one can begin ROP via vtable funcptrs to do a stack-pivot(r4=objectaddr at the time the above object gets used).&lt;br /&gt;
&lt;br /&gt;
Originally this vuln could only be triggered via Launcher.dat at Home Menu startup, right after Launcher.dat gets loaded + memory gets allocated, once the file-format version code is finished running. Starting with v9.6 this can be triggered when loading layouts from SD extdata as well. The vuln itself triggers before the layout data is written to Launcher.dat, but it doesn&#039;t seem to be possible to overwrite anything which actually gets used before the function which writes Launcher.dat into the layout gets called.&lt;br /&gt;
&lt;br /&gt;
Home Menu has some sort of fail-safe system(or at least on v9.7) when Home Menu crashes due to Launcher.dat(this also applies for other things with Home Menu): after crashing once, Home Menu resets Launcher.dat to a state where it no longer crashes anymore. However, note that any exploits using this which hang/etc without crashing will still brick the system. &#039;&#039;&#039;Hence, attempting anything with this on physnand without hw-nand-access isn&#039;t really recommended.&#039;&#039;&#039;&lt;br /&gt;
| [[11.1.0-34|11.1.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[4.0.0-7|4.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| May 14, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Theme-data decompression buffer overflow ([[menuhax|themehax]])&lt;br /&gt;
| The only func-call size parameter used by the theme decompression function is one for the compressed size, none for the decompressed size. The decompressed-size value from the LZ header is used by this function to check when to stop decompressing, but this function itself has nothing to verify the decompressed_size with. The code calling this function does not check or even use the decompressed size from the header either.&lt;br /&gt;
&lt;br /&gt;
This function is separate from the rest of the Home Menu code: the function used for decompressing themes is *only* used for decompressing themes, nothing else. There&#039;s a separate decompression function in Home Menu used for decompressing everything else.&lt;br /&gt;
&lt;br /&gt;
That other decompression function in Home Menu handles decompression size properly(decompressed size check for max buffer size is done by code calling the other function, not in the function itself). Unlike the other function, the theme function supports multiple LZ algorithms, but the one which actually gets used in official themes is the same one supported by the other function anyway.&lt;br /&gt;
&lt;br /&gt;
See also [[menuhax|here]].&lt;br /&gt;
&lt;br /&gt;
With [[10.2.0-28|10.2.0-X]] Home Menu, the only code change was that the following was added right after theme-load and before actual decompression: &amp;quot;if(&amp;lt;get_lzheader_decompressed_size&amp;gt;(compressed_buf) &amp;gt; 0x150000)&amp;lt;exit&amp;gt;;&amp;quot;. This fixed the vuln.&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| [[10.2.0-28|10.2.0-X]]&lt;br /&gt;
| &amp;lt;Old3DS/New3DS version which added initial theme support&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| December 22, 2014&lt;br /&gt;
| [[User:Yellows8|Yellows8]], [[User:Myria|Myria]] independently (~spring 2015)&lt;br /&gt;
|-&lt;br /&gt;
| Shuffle body-data buffer overflow ([[menuhax|shufflehax]])&lt;br /&gt;
| See [[menuhax|here]].&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[10.6.0-31|10.6.0-X]]&lt;br /&gt;
| [[9.3.0-21|9.3.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| January 3, 2015&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Extdata file-data loading buffer overflow&lt;br /&gt;
| The extdata file-reading code allocates a fixed-size heap buffer for the expected filesize, then reads the filedata into this buffer using the actual FS filesize. Before v5.0 the filesize used here wasn&#039;t validated, hence if the filesize is larger than alloc_size a buffer overflow would occur. &#039;&#039;After&#039;&#039; doing the file-read it does validate that the actual_readsize matches the alloc_size, but at this point the buffer overflow has already occurred.&lt;br /&gt;
&lt;br /&gt;
This affected at least the following: SaveData.dat and Cache.dat.&lt;br /&gt;
&lt;br /&gt;
This can be triggered with SaveData.dat by installing a &amp;lt;v4.0 Home Menu version, with Home Menu extdata from &amp;gt;=v4.0 still on SD. When this is done with v2.0 Home Menu, a kernelpanic occurs when processing an AM command(it appears a buffer ptr which is then passed to a command was overwritten with 0x0 - of course other SaveData.dat filesizes may result in different behaviour).&lt;br /&gt;
| [[5.0.0-11|5.0.0-X]]&lt;br /&gt;
| &lt;br /&gt;
| [[2.0.0-2|2.0.0-X]]&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| June 9, 2016&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The icon data arrays used with {sd/nand}iconhax were added to SaveData.dat/Launcher.dat with [[4.0.0-7|4.0.0-X]], hence the vulnerable functions were added with that same version.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;=v4.0 the SaveData.dat buffer is located in the regular heap. It&#039;s unknown when exactly it was moved to linearmem, which is where it&#039;s located with recent versions. It&#039;s located in linearmem for KOR &amp;gt;=v9.6 for example.&lt;br /&gt;
&lt;br /&gt;
The SaveData.dat/Launcher.dat icon vulns were fixed by doing various unsigned &amp;gt;=60/&amp;gt;=360 checks on the loaded values. When these checks fail, it just skips over handling this icon entry. Hence, the original value can&#039;t be negative / out-of-bounds any more.&lt;br /&gt;
&lt;br /&gt;
==Useless crashes==&lt;br /&gt;
Old3DS system web-browser:&lt;br /&gt;
* 2^32 characters long string(&#039;&#039;finally&#039;&#039; fixed with v10.6): this is similar to the vulnerability fixed [http://git.chromium.org/gitweb/?p=external/Webkit.git;a=commitdiff;h=ec471f16fbd1f879cb631f9b022fd16acd75f4d4 here], concat-large-strings-crash2.html triggers a crash which is about the same as the one triggered by a 2^32 string. Most of the time this vulnerability will cause a memory page permissions fault, since the WebKit code attempts to copy the string text data to the output buffer located in read-only [[CRO0|CRO]] heap memory. The only difference between a crash triggered by a 2^32 string and the concat-large-strings-crash2.html crash is at the former copies the string data using the original string length(like 1 text character for &amp;quot;x&amp;quot;, 4 for &amp;quot;xxxx&amp;quot;) while the latter attempts to copy &amp;gt;12MB. In some &#039;&#039;very&#039;&#039; rare cases a thread separate from the string data-copy thread will crash, this might be exploitable. However, this is mostly useless since it rarely crashes this way.&lt;br /&gt;
&lt;br /&gt;
* Trying to directly load a page via the browser &amp;quot;URL&amp;quot; option with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] setup, causes a crash to trigger in oss.cro due to an use-after-free being caught with webkitdebug. This is presumably some sort of realloc() issue in the libcurl version used by the &amp;lt;={v10.2-v10.3} browser. This happens with *every* *single* *page* one tries to load via the &amp;quot;URL&amp;quot; option, but not when loading links on the current page, hence this is probably useless. A different use-after-free with realloc triggers with loading any page at all regardless of method too(libcurl probably).&lt;br /&gt;
&lt;br /&gt;
* This WebKit build has &#039;&#039;a lot&#039;&#039; of crash-trigger bugs that only happen with [https://github.com/yellows8/3ds_browserhax_common webkitdebug] completely setup(addr accesses near 0x0), with &#039;&#039;just&#039;&#039; trying to load any page at all.&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=11.8.0-41&amp;diff=20775</id>
		<title>11.8.0-41</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=11.8.0-41&amp;diff=20775"/>
		<updated>2018-07-31T15:29:41Z</updated>

		<summary type="html">&lt;p&gt;Unknown: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Old3DS+New3DS 11.8.0-41 system update was released on July 30, 2018. This Old3DS+New3DS update was released for the following regions: USA, EUR, JPN, CHN, KOR, and TWN.&lt;br /&gt;
&lt;br /&gt;
Security flaws fixed: &amp;lt;fill this in manually later, see the updatedetails page from the ninupdates-report page(s) once available for now&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Change-log==&lt;br /&gt;
[https://en-americas-support.nintendo.com/app/answers/detail/a_id/667/p/430/c/267 Official] USA change-log:&lt;br /&gt;
* Further improvements to overall system stability and other minor adjustments have been made to enhance the user experience&lt;br /&gt;
&lt;br /&gt;
==System Titles==&lt;br /&gt;
&amp;lt;fill this in (manually) later&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Process9 ===&lt;br /&gt;
Actual code changed in Process9.&lt;br /&gt;
pxi:am9 command 0x6d0184 was added.&lt;br /&gt;
&lt;br /&gt;
=== AM ===&lt;br /&gt;
New am:net command 0x8290184 was added, this just calls the new pxi:am9 command. This is used by nim.&lt;br /&gt;
&lt;br /&gt;
=== Friends ===&lt;br /&gt;
fpdver version string bumped to 0xC&lt;br /&gt;
&lt;br /&gt;
=== nim ===&lt;br /&gt;
Added 2 new strings in the codebin: &amp;quot;X-Authentication-Key&amp;quot; and &amp;quot;X-Authentication-Data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Now uses new am:net command 0x8290184.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
System update report(s):&lt;br /&gt;
* [https://yls8.mtheall.com/ninupdates/reports.php?date=07-30-18_08-00-36&amp;amp;sys=ctr]&lt;br /&gt;
* [https://yls8.mtheall.com/ninupdates/reports.php?date=07-30-18_08-00-40&amp;amp;sys=ktr]&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=IDBE&amp;diff=20769</id>
		<title>IDBE</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=IDBE&amp;diff=20769"/>
		<updated>2018-07-31T04:04:51Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IDBE is Nintendo&#039;s title icon database. Entries contain title icon, region, and name (in various languages). Similar to the [[SMDH]]. All game titles are on the server (excluding DSiWare?), including demos and updates.&lt;br /&gt;
&lt;br /&gt;
== URLs ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://idbe-ctr.cdn.nintendo.net&amp;lt;/nowiki&amp;gt;/icondata/&#039;&#039;&#039;%02X&#039;&#039;&#039;/&#039;&#039;&#039;%016llX&#039;&#039;&#039;.idbe&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://idbe-ctr.cdn.nintendo.net&amp;lt;/nowiki&amp;gt;/icondata/&#039;&#039;&#039;%02X&#039;&#039;&#039;/&#039;&#039;&#039;%016llX&#039;&#039;&#039;-&#039;&#039;&#039;%d&#039;&#039;&#039;.idbe&lt;br /&gt;
&#039;&#039;&#039;%02X&#039;&#039;&#039; seems to always be 0x10 (?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;%016llX&#039;&#039;&#039; is the title id.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;%d&#039;&#039;&#039; is an optional title version.&lt;br /&gt;
== Encryption ==&lt;br /&gt;
The icon database is encrypted with AES-128 CBC. All icons use the same IV and one of 4 possible keys (as specified by the key index in the header).&lt;br /&gt;
&lt;br /&gt;
The IV/keys are hardcoded in the friend list applet. [http://wiiubrew.org/wiki/Nn_idbe.rpl#Encryption They are also on the WiiU].&lt;br /&gt;
&lt;br /&gt;
== Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Offset&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x0||0x1||? (usually zero)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1||0x1||Key index&lt;br /&gt;
|-&lt;br /&gt;
| 0x2||0x36D0||Encrypted data&lt;br /&gt;
|}&lt;br /&gt;
=== Encrypted Data ===&lt;br /&gt;
Icon data is uncompressed RGB565.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Offset&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x0||0x20||SHA256 hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x20||0x10||?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30||0x4||[[SMDH#Region_Lockout|Region lockout]] (u32 little endian)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34||0x1C||?&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 + &#039;&#039;i&#039;&#039; * 0x200||0x200||[[SMDH#Application_Titles|Title struct]] where &#039;&#039;i&#039;&#039; = language index&lt;br /&gt;
|-&lt;br /&gt;
| 0x2050||0x480||24x24 Icon data&lt;br /&gt;
|-&lt;br /&gt;
| 0x24D0||0x1200||48x48 Icon data&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=PTM_Services&amp;diff=20738</id>
		<title>PTM Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=PTM_Services&amp;diff=20738"/>
		<updated>2018-07-04T08:58:13Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* SysMenu PTM Service &amp;quot;ptm:sysm&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A total of 24 sessions can be open for each of these services combined. The commands for each service are handled by the PTM module main() thread.&lt;br /&gt;
&lt;br /&gt;
=User PTM Service &amp;quot;ptm:u&amp;quot; / PTM services=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| RegisterAlarmClient&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| SetRtcAlarm&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| GetRtcAlarm&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| CancelRtcAlarm&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[PTM:GetAdapterState|GetAdapterState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| [[PTM:GetShellState|GetShellState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| [[PTM:GetBatteryLevel|GetBatteryLevel]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| [[PTM:GetBatteryChargeState|GetBatteryChargeState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| [[PTM:GetPedometerState|GetPedometerState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0042&lt;br /&gt;
| GetStepHistoryEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B00C2&lt;br /&gt;
| [[PTM:GetStepHistory|GetStepHistory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| [[PTM:GetTotalStepCount|GetTotalStepCount]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0040&lt;br /&gt;
| SetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetPedometerRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0084&lt;br /&gt;
| GetStepHistoryAll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above commands are available for all PTM services, except the SetSystemTime service.&lt;br /&gt;
&lt;br /&gt;
=PlayHistory PTM Service &amp;quot;ptm:play&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08070082&lt;br /&gt;
| [[PTM:GetPlayHistory|GetPlayHistory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x08080000&lt;br /&gt;
| GetPlayHistoryStart&lt;br /&gt;
|-&lt;br /&gt;
| 0x08090000&lt;br /&gt;
| GetPlayHistoryLength&lt;br /&gt;
|-&lt;br /&gt;
| 0x080B0080&lt;br /&gt;
| CalcPlayHistoryStart&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=SystemControl PTM Service &amp;quot;ptm:s&amp;quot;=&lt;br /&gt;
Identical to the below &amp;quot;ptm:sysm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=SysMenu PTM Service &amp;quot;ptm:sysm&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x040100C0&lt;br /&gt;
| SetRtcAlarmEx&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020042&lt;br /&gt;
| ReplySleepQuery&lt;br /&gt;
|-&lt;br /&gt;
| 0x04030042&lt;br /&gt;
| NotifySleepPreparationComplete&lt;br /&gt;
|-&lt;br /&gt;
| 0x04040102&lt;br /&gt;
| SetWakeupTrigger&lt;br /&gt;
|-&lt;br /&gt;
| 0x04050000&lt;br /&gt;
| GetAwakeReason&lt;br /&gt;
|-&lt;br /&gt;
| 0x04060000&lt;br /&gt;
| RequestSleep&lt;br /&gt;
|-&lt;br /&gt;
| 0x040700C0&lt;br /&gt;
|  [[PTM:ShutdownAsync|ShutdownAsync]] &lt;br /&gt;
|-&lt;br /&gt;
| 0x04080000&lt;br /&gt;
| Awake&lt;br /&gt;
|-&lt;br /&gt;
| 0x04090080&lt;br /&gt;
| [[PTMSYSM:LaunchFIRMRebootSystem|RebootAsync]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x040A0000&lt;br /&gt;
| [[PTMSYSM:CheckNew3DS|CheckNew3DS]] (Added with [[8.0.0-18]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x08010640&lt;br /&gt;
| [[PTMSYSM:SetInfoLEDPattern|SetInfoLEDPattern]] (These 4 LED commands are used for the notification LED, see [[MCU]] regarding boot fail with invalid parameters)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08020040&lt;br /&gt;
| [[PTMSYSM:SetInfoLEDPatternHeader|SetInfoLEDPatternHeader]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x08030000&lt;br /&gt;
| [[PTMSYSM:GetInfoLEDStatus|GetInfoLEDStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x08040040&lt;br /&gt;
| [[PTMSYSM:SetBatteryEmptyLEDPattern|SetBatteryEmptyLEDPattern]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x08050000&lt;br /&gt;
| ClearStepHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x080600C2&lt;br /&gt;
| SetStepHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x08070082&lt;br /&gt;
| [[PTM:GetPlayHistory|GetPlayHistory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x08080000&lt;br /&gt;
| GetPlayHistoryStart&lt;br /&gt;
|-&lt;br /&gt;
| 0x08090000&lt;br /&gt;
| GetPlayHistoryLength&lt;br /&gt;
|-&lt;br /&gt;
| 0x080A0000&lt;br /&gt;
| ClearPlayHistory&lt;br /&gt;
|-&lt;br /&gt;
| 0x080B0080&lt;br /&gt;
| CalcPlayHistoryStart&lt;br /&gt;
|-&lt;br /&gt;
| 0x080C0080&lt;br /&gt;
| SetUserTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x080D0000&lt;br /&gt;
| InvalidateSystemTime&lt;br /&gt;
|-&lt;br /&gt;
| 0x080E0140&lt;br /&gt;
| [[PTMSYSM:NotifyPlayEvent|NotifyPlayEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x080F0000&lt;br /&gt;
| [[PTMSYSM:GetSoftwareClosedFlag|GetSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x08100000&lt;br /&gt;
| [[PTMSYSM:ClearSoftwareClosedFlag|ClearSoftwareClosedFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x08110000&lt;br /&gt;
| GetShellStatus&lt;br /&gt;
|-&lt;br /&gt;
| 0x08120000&lt;br /&gt;
| IsShutdownByBatteryEmpty&lt;br /&gt;
|-&lt;br /&gt;
| 0x08130000&lt;br /&gt;
| FormatSavedata&lt;br /&gt;
|-&lt;br /&gt;
| 0x08140000&lt;br /&gt;
| GetLegacyJumpProhibitedFlag&lt;br /&gt;
|- &lt;br /&gt;
| 0x08150040&lt;br /&gt;
| SetPlayHistoryRecordingMode&lt;br /&gt;
|-&lt;br /&gt;
| 0x0816....&lt;br /&gt;
| Abstraction for mcu::RTC::GetSystemClock&lt;br /&gt;
|-&lt;br /&gt;
| 0x0817....&lt;br /&gt;
| Abstraction for mcu::RTC::SetSystemClock&lt;br /&gt;
|-&lt;br /&gt;
| 0x08180040&lt;br /&gt;
| [[PTMSYSM:ConfigureNew3DSCPU|ConfigureNew3DSCPU]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=GetSystemTime PTM Service &amp;quot;ptm:gets&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04010000&lt;br /&gt;
| GetSystemTime&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=SetSystemTime PTM Service &amp;quot;ptm:sets&amp;quot;=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010080&lt;br /&gt;
| SetSystemTime&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=PTM [[System_SaveData]]=&lt;br /&gt;
During system boot PTM attempts to open the PTM savedata, if this fails it will repeatedly keep trying to open the archive. When opening the archive is failing due to savedata corruption, PTM eventually(during system boot) deletes the savedata then creates it again.&lt;br /&gt;
&lt;br /&gt;
Savedata contents:&lt;br /&gt;
* &amp;quot;/Pedometer.dat&amp;quot;&lt;br /&gt;
* &amp;quot;/PlayHistory.dat&amp;quot; Filesize is 0xD5DE8.&lt;br /&gt;
&lt;br /&gt;
==PlayHistory.dat==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Start entry index.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Total PlayHistory entries.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0xD5DE0&lt;br /&gt;
| 0x11D28 PlayHistory entries, 0xC-bytes each.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===PlayHistory entry===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| u64 programID&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32, probably timestamp.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MVDSTD:SetConfig&amp;diff=20735</id>
		<title>MVDSTD:SetConfig</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MVDSTD:SetConfig&amp;diff=20735"/>
		<updated>2018-06-30T14:53:41Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Request */ Fix Index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Request=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code [0x001E0044]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Size, normally 0x11C.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Value 0x0&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| KProcess handle&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| (Size&amp;lt;&amp;lt;4)  &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 10&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Input data ptr (see [[MVDSTD:GetConfig|here]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Response=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Resultcode&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MVD_Services&amp;diff=20734</id>
		<title>MVD Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MVD_Services&amp;diff=20734"/>
		<updated>2018-06-30T12:26:57Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MVD Service &amp;quot;l2b:u&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is for using the MVD hardware video decoder(unknown whether MVD can do more than decoding) + hardware color-format converter. The [[New_3DS]] [[Internet Browser]] uses mvd:STD for video decoding + YUV2RGB for decoded MJPEG frames.&lt;br /&gt;
&lt;br /&gt;
See [[Internet_Browser|here]] for the supported hardware decoder video codecs.&lt;br /&gt;
&lt;br /&gt;
There can only be one service session open at a time for each individual MVD service.&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;mvd:STD&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Available since system version &lt;br /&gt;
!  Description&lt;br /&gt;
!  Used by [[Internet_Browser|SKATER]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:Initialize|Initialize]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:Shutdown|Shutdown]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030300&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:CalculateWorkBufSize|CalculateWorkBufSize]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:CalculateImageSize|CalculateImageSize]]&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk0, s8 unk1, s8 unk2, u32 unk3) SKATER uses hard-coded value 0 for all of these params. Using different input data for this doesn&#039;t seem to affect video-processing output.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Used during shutdown with video-processing.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080142&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:ProcessNALUnit|ProcessNALUnit]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:ControlFrameRendering|ControlFrameRendering]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:GetStatus|GetStatus]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| GetStatusOther(unknown what this is used for). Same output size as [[MVDSTD:GetStatus|GetStatus]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0100&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (u8 unk0, s8 unk1, u32 unk2, u32 unk3) Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0202&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. The code for this appears to be similar to [[MVDSTD:ProcessNALUnit|ProcessNALUnit]], this DMAs data from the input buffer as well.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk, val0, handle) Unknown. Presumably the command 0x000E0202 version of [[MVDSTD:ControlFrameRendering]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. This writes 0x28-bytes of output starting at cmdreply[2].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x001200C0&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk0, u32 unk1, u32 unk2) Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x001400C2&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. The code for this appears to be similar to [[MVDSTD:ProcessNALUnit|ProcessNALUnit]], this DMAs data from the input buffer as well.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk, val0, handle) Unknown. Presumably the command 0x001400C2 version of [[MVDSTD:ControlFrameRendering]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. Used during initialization regardless of the operation mode(color-conversion/video-processing).&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. Used during shutdown regardless of the operation mode(color-conversion/video-processing).&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Used when doing color-format conversion. This triggers writing to the output buffer specified via config.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (u8 inval) Used during video-processing initialization. SKATER uses hard-coded value 1 for this. MVD-sysmodule checks that the input value is not 0 or higher than 11. The input value must be one of the following: 1, 6, 9, or 10. Using any of these values instead of 1 results in no data being written to the output buffer with normal video processing, without any errors being thrown.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Used during shutdown with video-processing.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:GetConfig|GetConfig]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0044&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:SetConfig|SetConfig]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0902&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:SetupOutputBuffers|SetupOutputBuffers]]&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200002&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (val0, handle) Unknown. This loads data from the table entry which has a field matching a certain value. This is the global table used by [[MVDSTD:SetupOutputBuffers|SetupOutputBuffers]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210100&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:OverrideOutputBuffers|OverrideOutputBuffers]]&lt;br /&gt;
| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This one uses the I/O mapped @ 0x10207000.&lt;br /&gt;
&lt;br /&gt;
This service is used by the [[New_3DS]] [[Internet Browser]]. SKATER runs the entire MVD initialization/shutdown each time the video player is entered/exited.&lt;br /&gt;
&lt;br /&gt;
Linear-memory vaddrs passed to this service should be in the 0x30* region, MVD-sysmodule doesn&#039;t support the 0x14* region.&lt;br /&gt;
&lt;br /&gt;
By default MVD does(?) various post-processing with the output image, this is controlled by the [[MVDSTD:GetConfig|configuration]]. This post-processing isn&#039;t done at all in certain cases.&lt;br /&gt;
&lt;br /&gt;
Initialization procedures:&lt;br /&gt;
* Color-conversion: Use command [[MVDSTD:Initialize]] with bufsize=1, then command 0x00180000.&lt;br /&gt;
* H.264: If needed, use [[MVDSTD:CalculateWorkBufSize]]. Then use [[MVDSTD:Initialize]]. Then use commands 0x00050100, 0x00180000, and 0x001B0040. Then use [[MVDSTD:ProcessNALUnit]] for each of the individual NAL-unit parameter sets(&amp;quot;Sequence Parameter Set&amp;quot; and &amp;quot;Picture Parameter Set&amp;quot;), with the main video processing starting afterwards.&lt;br /&gt;
&lt;br /&gt;
Shutdown procedures:&lt;br /&gt;
* Color-conversion: just use command 0x00190000, then [[MVDSTD:Shutdown]].&lt;br /&gt;
* H.264: Use command 0x00090042 in a loop, waiting for it to return a retval that isn&#039;t 0x00017002. Then use commands 0x001C0000, 0x00190000, and 0x00070000. Then use [[MVDSTD:Shutdown]].&lt;br /&gt;
&lt;br /&gt;
===MVDSTD configuration structure===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input format type, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| The default for this is 0x0. Must be &amp;lt;=5. When non-zero, the type value at offset 0x0 must be one of the following: 0x00020001, 0x00010001, 0x00010005, 0x00010006, or 0x00010007. Doesn&#039;t seem to have any visible affect on the output for video processing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| The default for this is 0x0. This must be &amp;lt;=1. Referred to as &amp;quot;H264 range&amp;quot; in SKATER. When 0x1 the output image is brighter than normal.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video width. Must be &amp;gt;=width_min and &amp;lt;width_max. This must be aligned: the low &amp;lt;dimensions_alignment&amp;gt;-bits must be clear.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video height. Must be &amp;gt;=height_min and &amp;lt;height_max. This must be aligned: the low &amp;lt;dimensions_alignment&amp;gt;-bits must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input data physical address, only set for color-conversion. This isn&#039;t used when the value at offset 0x4 is 0x1 or 0x5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, only used for color-conversion when the type value has bitmask 0x20000 set. This isn&#039;t used when the value at offset 0x4 is 0x1 or 0x5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, only used for color-conversion when the type value is 0x20000. This isn&#039;t used when the value at offset 0x4 is 0x1 or 0x5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, for color-conversion. This isn&#039;t used when the value at offset 0x4 is 0x0 or 0x4.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, only used for color-conversion when the type value has bitmask 0x20000 set. This isn&#039;t used when the value at offset 0x4 is 0x0 or 0x4.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown. Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x4&lt;br /&gt;
| When non-zero this enables some sort of color adjustment for the output?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x4&lt;br /&gt;
| Same affect as offset 0x2C? This must not be enabled at the same time as that field.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be &amp;lt;8 for video-processing? Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown. Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be &amp;lt;8 for video-processing? Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x4&lt;br /&gt;
| When non-zero this enables usage of the 4 words starting at offset 0x44. SKATER sets this to 0x0 for color-conversion, and 0x1 for video processing(this flag isn&#039;t mandatory for the latter).&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. The default for this is 0x0. u32 input_crop_x_pos. Must be &amp;lt;=widthval. Where widthval = &amp;lt;width value from the field at offset 0xC&amp;gt;. The low 4-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. The default for this is 0x0. u32 input_crop_y_pos. Must be &amp;lt;=heightval. Where heightval = &amp;lt;height value from the field at offset 0x10&amp;gt;. The low 4-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. u32 input_crop_height. Must be &amp;gt;=16 and &amp;lt;=heightval. Where heightval = &amp;lt;height value from the field at offset 0x10&amp;gt;. The low 3-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. u32 input_crop_width. Must be &amp;gt;=width_min and &amp;lt;=widthval. Where widthval = &amp;lt;width value from the field at offset 0xC&amp;gt;. The low 3-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| 0x4&lt;br /&gt;
| The default for this is 0x0. Must be &amp;lt;=5. For video processing, and when this value is non-zero, the type value at offset 0x0 must not be any of the following: 0x00010004, 0x00010001, 0x0x00100001, or 0x00200001. For video processing, the type value at offset 0x0 must not be 0x80000 when this value at offset 0x54 is non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output format type, see below. SKATER writes value 0x40002 here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video width. Must be &amp;gt;=16, and must be &amp;lt;somewidth_statefield.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video height. Must be &amp;gt;=16, and must be &amp;lt;someheight_statefield.&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output data physical address.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x4&lt;br /&gt;
| Additional output data physical address. This is only used when the output format type is value 0x00020001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output. Must be &amp;lt;3 for video-processing?&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown. Must be &amp;lt;=1 for video processing? Doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be zero for video-processing.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0x28&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be zero for video-processing.&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 0x28&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| 0x4&lt;br /&gt;
| This flag enables using the following 4 words when non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32 output_x_pos. Output X position in the output buffer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32 output_y_pos. Same as above except for the Y pos.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32 output_width_override. The low 2-bits must be clear. When the output width is less than this, this value is used to align the output image width to the specified value via value0-pixels. When this value is less than the output width, this value is used for the output width instead.&lt;br /&gt;
|-&lt;br /&gt;
| 0x114&lt;br /&gt;
| 0x4&lt;br /&gt;
| Same as the field at offset 0x110 except for the output height.&lt;br /&gt;
|-&lt;br /&gt;
| 0x118&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, when non-zero it seems the output buffer isn&#039;t written any more?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The size of this structure is fixed to 0x11C-bytes. The user process does the LINEAR-mem vaddr-&amp;gt;physaddr conversion for the above physaddrs, when modifying the config struct before using [[MVDSTD:SetConfig]]. For the above physaddrs that are checked/used, the physaddr must not be 0x0, and the physaddr must be 8-byte aligned(low 3-bits clear).&lt;br /&gt;
&lt;br /&gt;
For color-conversion, the output frame is split into two images via the two output physaddrs.&lt;br /&gt;
&lt;br /&gt;
For *_min/*_max/dimensions_alignment mentioned above: *_min = 16 for color-conversion, 48 for video processing. *_max = 2048 for color-conversion, 4672 for video processing. dimensions_alignment = 4 for color-conversion, 3 for video processing.&lt;br /&gt;
&lt;br /&gt;
The configuration doesn&#039;t seem to change at all while SKATER is running video processing(each [[MVDSTD:SetConfig]] input config appears to the same).&lt;br /&gt;
&lt;br /&gt;
====SKATER video processing config====&lt;br /&gt;
When processing video, SKATER [[MVDSTD:GetConfig|gets]] the config, updates all of the fields listed below, then uses [[MVDSTD:SetConfig]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
!  Written value&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input format type.&lt;br /&gt;
| 0x00020001(H.264), hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state. This is the &#039;range&#039; field in the following debug print: &amp;quot;H264 w=%d h=%d range=%d pics=%d multi=%d\n&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video width.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video height.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x4&lt;br /&gt;
| Flag&lt;br /&gt;
| 0x1, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output format type.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video width.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video height.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output data physical address.&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output data physical address, only set for color-conversion.&lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x1, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x1, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x114&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x118&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Loaded from unique input state&amp;quot; refers to the field being loaded from state seperate from the other fields used for this configuration structure.&lt;br /&gt;
&lt;br /&gt;
====Input formats====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Type value&lt;br /&gt;
!  Mode&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010001&lt;br /&gt;
| Color conversion&lt;br /&gt;
| yuyv422&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010004&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010005&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010006&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010007&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020001&lt;br /&gt;
| Video processing&lt;br /&gt;
| H.264&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020002&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| Video processing&lt;br /&gt;
| Same as 0x00020001, except with gray-scale?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080001&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180001&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Output formats====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Type value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010001&lt;br /&gt;
| See the input format type.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010005&lt;br /&gt;
| Unknown. A certain MVD state field must not be set to 0x8170 in order to use this. Some sort of 2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010006&lt;br /&gt;
| Unknown, see 0x00010005 for the usage requirement. Some sort of 2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010007&lt;br /&gt;
| Unknown, see 0x00010005 for the usage requirement. Some sort of 2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010008&lt;br /&gt;
| A certain MVD-module state field must not be set to 0x8170 in order to use this. Whether this can actually be used is determined by another MVD-module state field. 16bit format.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010009&lt;br /&gt;
| Unknown, see 0x00010008 for the usage requirements. Some non-2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001000A&lt;br /&gt;
| Unknown, see 0x00010008 for the usage requirements. Some non-2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001000B&lt;br /&gt;
| Unknown, see 0x00010008 for the usage requirements. Some non-2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020001&lt;br /&gt;
| Some sort of YUV format? 12bit format. The initial output is written to the normal output buffer, then the rest is written to the additional output buffer dedicated to this out-type.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| Unknown, doesn&#039;t write anything to the out-buffer when doing color-conversion.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040001&lt;br /&gt;
| Unknown 2-byte format.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040002&lt;br /&gt;
| BGR565&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040003&lt;br /&gt;
| Some sort of 2-byte format it seems?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040004&lt;br /&gt;
| RGB565&lt;br /&gt;
|-&lt;br /&gt;
| 0x00041000&lt;br /&gt;
| Unknown, doesn&#039;t write anything to the out-buffer when doing color-conversion.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00041001&lt;br /&gt;
| y400a?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00041002&lt;br /&gt;
| y400a?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;l2b:u&amp;quot;==&lt;br /&gt;
This one uses the I/O mapped @ 0x10130000.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header &lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010040&lt;br /&gt;
| SetInputFormat?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020080&lt;br /&gt;
| GetInputFormat?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| SetOutputFormat&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040080&lt;br /&gt;
| GetOutputFormat&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050040&lt;br /&gt;
| SetTransferEndInterrupt&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| GetTransferEndInterrupt&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070080&lt;br /&gt;
| GetL2BEndEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080102&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090080&lt;br /&gt;
| Waits on a DMA Handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0102&lt;br /&gt;
| MaybeSetRecieving&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0080&lt;br /&gt;
| isDoneRecieving&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| SetInputLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0080&lt;br /&gt;
| GetInputLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0040&lt;br /&gt;
| SetInputLines&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0080&lt;br /&gt;
| GetInputLines&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100040&lt;br /&gt;
| MaybeSetAlpha&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110080&lt;br /&gt;
| MaybeGetAlpha&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120040&lt;br /&gt;
| StartConversion&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130040&lt;br /&gt;
| StopConversion&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140080&lt;br /&gt;
| isBusyConversion&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150040&lt;br /&gt;
| SetPackageParameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160080&lt;br /&gt;
| GetPackageParameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170080&lt;br /&gt;
| PingProcess&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;l2b2:u&amp;quot;==&lt;br /&gt;
This uses the same command-handler as &amp;quot;l2b:u&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;y2r2:u&amp;quot;==&lt;br /&gt;
This is a exact copy of y2r camera service and hence named y2r2.&lt;br /&gt;
&lt;br /&gt;
==MVD Result-codes==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Result-code&lt;br /&gt;
!  Internal MVD status-code&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xD961710F&lt;br /&gt;
| &lt;br /&gt;
| Invalid [[MVDSTD:GetConfig|configuration]], mainly when setting the config.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD96170CA&lt;br /&gt;
| -2(~1)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE16170C9&lt;br /&gt;
| -1(~0)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xF96171C8&lt;br /&gt;
| -0xFB(~0xFA)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17000&lt;br /&gt;
| 0x0&lt;br /&gt;
| OK&lt;br /&gt;
|-&lt;br /&gt;
| 0x17001&lt;br /&gt;
| 0x1&lt;br /&gt;
| Returned after processing NAL-unit parameter-sets.&lt;br /&gt;
|-&lt;br /&gt;
| 0x17002&lt;br /&gt;
| 0x2&lt;br /&gt;
| Busy. When returned by command 0x00090042 during video processing, SKATER uses the {[[MVDSTD:GetConfig]], [[MVDSTD:SetConfig]], and 0x00090042} commands again(same config as before). The SKATER code for this includes this debug string: &amp;quot;H264 output %lld us corrected to %lld us\n&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x17003&lt;br /&gt;
| 0x3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17004&lt;br /&gt;
| 0x4&lt;br /&gt;
| Returned when not all of the input NAL-unit buffer was processed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x17005&lt;br /&gt;
| 0x5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17006&lt;br /&gt;
| 0x6&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17007&lt;br /&gt;
| 0x7&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17038&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported H.264 Levels and Profiles==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Level&lt;br /&gt;
! Baseline&lt;br /&gt;
! Main&lt;br /&gt;
! High&lt;br /&gt;
! High 10 (High10, High10p, Hi10p or 10-bit H.264)&lt;br /&gt;
! High 4:2:2 (High422p or High422)&lt;br /&gt;
! High 4:4:4 Predictive (Hi444PP)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1b&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1.1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1.2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1.3&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 2.1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 2.2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 3.1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 3.2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 4.1&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 4.2&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 5.1&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 5.2&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|}&lt;br /&gt;
created using the New 3DS Internet Browser, New 3DS Internet Browser Specs and the following test pages:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/baseline.html Baseline Profile Test]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/main.html Main Profile Test]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/high.html High Profile Test]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/high10.html High10 Profile Test]&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=MVD_Services&amp;diff=20733</id>
		<title>MVD Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=MVD_Services&amp;diff=20733"/>
		<updated>2018-06-30T05:00:21Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* MVD Service &amp;quot;y2r2:u&amp;quot; */ Mention that y2r2 is a copy of y2r service&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is for using the MVD hardware video decoder(unknown whether MVD can do more than decoding) + hardware color-format converter. The [[New_3DS]] [[Internet Browser]] uses mvd:STD for video decoding + YUV2RGB for decoded MJPEG frames.&lt;br /&gt;
&lt;br /&gt;
See [[Internet_Browser|here]] for the supported hardware decoder video codecs.&lt;br /&gt;
&lt;br /&gt;
There can only be one service session open at a time for each individual MVD service.&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;mvd:STD&amp;quot;==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Available since system version &lt;br /&gt;
!  Description&lt;br /&gt;
!  Used by [[Internet_Browser|SKATER]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010082&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:Initialize|Initialize]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:Shutdown|Shutdown]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030300&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:CalculateWorkBufSize|CalculateWorkBufSize]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000400C0&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:CalculateImageSize|CalculateImageSize]]&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050100&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk0, s8 unk1, s8 unk2, u32 unk3) SKATER uses hard-coded value 0 for all of these params. Using different input data for this doesn&#039;t seem to affect video-processing output.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Used during shutdown with video-processing.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080142&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:ProcessNALUnit|ProcessNALUnit]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:ControlFrameRendering|ControlFrameRendering]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:GetStatus|GetStatus]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| GetStatusOther(unknown what this is used for). Same output size as [[MVDSTD:GetStatus|GetStatus]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0100&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (u8 unk0, s8 unk1, u32 unk2, u32 unk3) Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0202&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. The code for this appears to be similar to [[MVDSTD:ProcessNALUnit|ProcessNALUnit]], this DMAs data from the input buffer as well.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk, val0, handle) Unknown. Presumably the command 0x000E0202 version of [[MVDSTD:ControlFrameRendering]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. This writes 0x28-bytes of output starting at cmdreply[2].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x001200C0&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk0, u32 unk1, u32 unk2) Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x001400C2&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. The code for this appears to be similar to [[MVDSTD:ProcessNALUnit|ProcessNALUnit]], this DMAs data from the input buffer as well.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (s8 unk, val0, handle) Unknown. Presumably the command 0x001400C2 version of [[MVDSTD:ControlFrameRendering]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown.&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. Used during initialization regardless of the operation mode(color-conversion/video-processing).&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Unknown. Used during shutdown regardless of the operation mode(color-conversion/video-processing).&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Used when doing color-format conversion. This triggers writing to the output buffer specified via config.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0040&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (u8 inval) Used during video-processing initialization. SKATER uses hard-coded value 1 for this. MVD-sysmodule checks that the input value is not 0 or higher than 11. The input value must be one of the following: 1, 6, 9, or 10. Using any of these values instead of 1 results in no data being written to the output buffer with normal video processing, without any errors being thrown.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0000&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| Used during shutdown with video-processing.&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0042&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:GetConfig|GetConfig]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0044&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:SetConfig|SetConfig]]&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0902&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:SetupOutputBuffers|SetupOutputBuffers]]&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200002&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| (val0, handle) Unknown. This loads data from the table entry which has a field matching a certain value. This is the global table used by [[MVDSTD:SetupOutputBuffers|SetupOutputBuffers]].&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210100&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
| [[MVDSTD:OverrideOutputBuffers|OverrideOutputBuffers]]&lt;br /&gt;
| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This one uses the I/O mapped @ 0x10207000.&lt;br /&gt;
&lt;br /&gt;
This service is used by the [[New_3DS]] [[Internet Browser]]. SKATER runs the entire MVD initialization/shutdown each time the video player is entered/exited.&lt;br /&gt;
&lt;br /&gt;
Linear-memory vaddrs passed to this service should be in the 0x30* region, MVD-sysmodule doesn&#039;t support the 0x14* region.&lt;br /&gt;
&lt;br /&gt;
By default MVD does(?) various post-processing with the output image, this is controlled by the [[MVDSTD:GetConfig|configuration]]. This post-processing isn&#039;t done at all in certain cases.&lt;br /&gt;
&lt;br /&gt;
Initialization procedures:&lt;br /&gt;
* Color-conversion: Use command [[MVDSTD:Initialize]] with bufsize=1, then command 0x00180000.&lt;br /&gt;
* H.264: If needed, use [[MVDSTD:CalculateWorkBufSize]]. Then use [[MVDSTD:Initialize]]. Then use commands 0x00050100, 0x00180000, and 0x001B0040. Then use [[MVDSTD:ProcessNALUnit]] for each of the individual NAL-unit parameter sets(&amp;quot;Sequence Parameter Set&amp;quot; and &amp;quot;Picture Parameter Set&amp;quot;), with the main video processing starting afterwards.&lt;br /&gt;
&lt;br /&gt;
Shutdown procedures:&lt;br /&gt;
* Color-conversion: just use command 0x00190000, then [[MVDSTD:Shutdown]].&lt;br /&gt;
* H.264: Use command 0x00090042 in a loop, waiting for it to return a retval that isn&#039;t 0x00017002. Then use commands 0x001C0000, 0x00190000, and 0x00070000. Then use [[MVDSTD:Shutdown]].&lt;br /&gt;
&lt;br /&gt;
===MVDSTD configuration structure===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input format type, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| The default for this is 0x0. Must be &amp;lt;=5. When non-zero, the type value at offset 0x0 must be one of the following: 0x00020001, 0x00010001, 0x00010005, 0x00010006, or 0x00010007. Doesn&#039;t seem to have any visible affect on the output for video processing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| The default for this is 0x0. This must be &amp;lt;=1. Referred to as &amp;quot;H264 range&amp;quot; in SKATER. When 0x1 the output image is brighter than normal.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video width. Must be &amp;gt;=width_min and &amp;lt;width_max. This must be aligned: the low &amp;lt;dimensions_alignment&amp;gt;-bits must be clear.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video height. Must be &amp;gt;=height_min and &amp;lt;height_max. This must be aligned: the low &amp;lt;dimensions_alignment&amp;gt;-bits must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input data physical address, only set for color-conversion. This isn&#039;t used when the value at offset 0x4 is 0x1 or 0x5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, only used for color-conversion when the type value has bitmask 0x20000 set. This isn&#039;t used when the value at offset 0x4 is 0x1 or 0x5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, only used for color-conversion when the type value is 0x20000. This isn&#039;t used when the value at offset 0x4 is 0x1 or 0x5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, for color-conversion. This isn&#039;t used when the value at offset 0x4 is 0x0 or 0x4.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x4&lt;br /&gt;
| Physical data address, only used for color-conversion when the type value has bitmask 0x20000 set. This isn&#039;t used when the value at offset 0x4 is 0x0 or 0x4.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown. Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x4&lt;br /&gt;
| When non-zero this enables some sort of color adjustment for the output?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x4&lt;br /&gt;
| Same affect as offset 0x2C? This must not be enabled at the same time as that field.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be &amp;lt;8 for video-processing? Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown. Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be &amp;lt;8 for video-processing? Doesn&#039;t seem to have any visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x4&lt;br /&gt;
| When non-zero this enables usage of the 4 words starting at offset 0x44. SKATER sets this to 0x0 for color-conversion, and 0x1 for video processing(this flag isn&#039;t mandatory for the latter).&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. The default for this is 0x0. u32 input_crop_x_pos. Must be &amp;lt;=widthval. Where widthval = &amp;lt;width value from the field at offset 0xC&amp;gt;. The low 4-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. The default for this is 0x0. u32 input_crop_y_pos. Must be &amp;lt;=heightval. Where heightval = &amp;lt;height value from the field at offset 0x10&amp;gt;. The low 4-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. u32 input_crop_height. Must be &amp;gt;=16 and &amp;lt;=heightval. Where heightval = &amp;lt;height value from the field at offset 0x10&amp;gt;. The low 3-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 0x4&lt;br /&gt;
| See offset 0x40. u32 input_crop_width. Must be &amp;gt;=width_min and &amp;lt;=widthval. Where widthval = &amp;lt;width value from the field at offset 0xC&amp;gt;. The low 3-bits of this value must be clear.&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| 0x4&lt;br /&gt;
| The default for this is 0x0. Must be &amp;lt;=5. For video processing, and when this value is non-zero, the type value at offset 0x0 must not be any of the following: 0x00010004, 0x00010001, 0x0x00100001, or 0x00200001. For video processing, the type value at offset 0x0 must not be 0x80000 when this value at offset 0x54 is non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output format type, see below. SKATER writes value 0x40002 here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video width. Must be &amp;gt;=16, and must be &amp;lt;somewidth_statefield.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video height. Must be &amp;gt;=16, and must be &amp;lt;someheight_statefield.&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output data physical address.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x4&lt;br /&gt;
| Additional output data physical address. This is only used when the output format type is value 0x00020001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output. Must be &amp;lt;3 for video-processing?&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown. Must be &amp;lt;=1 for video processing? Doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be zero for video-processing.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0x28&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, must be zero for video-processing.&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 0x28&lt;br /&gt;
| Unknown, doesn&#039;t seem to have a visible affect on the output.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| 0x4&lt;br /&gt;
| This flag enables using the following 4 words when non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32 output_x_pos. Output X position in the output buffer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32 output_y_pos. Same as above except for the Y pos.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32 output_width_override. The low 2-bits must be clear. When the output width is less than this, this value is used to align the output image width to the specified value via value0-pixels. When this value is less than the output width, this value is used for the output width instead.&lt;br /&gt;
|-&lt;br /&gt;
| 0x114&lt;br /&gt;
| 0x4&lt;br /&gt;
| Same as the field at offset 0x110 except for the output height.&lt;br /&gt;
|-&lt;br /&gt;
| 0x118&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown, when non-zero it seems the output buffer isn&#039;t written any more?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The size of this structure is fixed to 0x11C-bytes. The user process does the LINEAR-mem vaddr-&amp;gt;physaddr conversion for the above physaddrs, when modifying the config struct before using [[MVDSTD:SetConfig]]. For the above physaddrs that are checked/used, the physaddr must not be 0x0, and the physaddr must be 8-byte aligned(low 3-bits clear).&lt;br /&gt;
&lt;br /&gt;
For color-conversion, the output frame is split into two images via the two output physaddrs.&lt;br /&gt;
&lt;br /&gt;
For *_min/*_max/dimensions_alignment mentioned above: *_min = 16 for color-conversion, 48 for video processing. *_max = 2048 for color-conversion, 4672 for video processing. dimensions_alignment = 4 for color-conversion, 3 for video processing.&lt;br /&gt;
&lt;br /&gt;
The configuration doesn&#039;t seem to change at all while SKATER is running video processing(each [[MVDSTD:SetConfig]] input config appears to the same).&lt;br /&gt;
&lt;br /&gt;
====SKATER video processing config====&lt;br /&gt;
When processing video, SKATER [[MVDSTD:GetConfig|gets]] the config, updates all of the fields listed below, then uses [[MVDSTD:SetConfig]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
!  Written value&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input format type.&lt;br /&gt;
| 0x00020001(H.264), hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state. This is the &#039;range&#039; field in the following debug print: &amp;quot;H264 w=%d h=%d range=%d pics=%d multi=%d\n&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video width.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| Input video height.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x4&lt;br /&gt;
| Flag&lt;br /&gt;
| 0x1, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output format type.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video width.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output video height.&lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output data physical address.&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x4&lt;br /&gt;
| Output data physical address, only set for color-conversion.&lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x1, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x104&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x1, hard-coded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x108&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x110&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x114&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| Loaded from unique input state.&lt;br /&gt;
|-&lt;br /&gt;
| 0x118&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| 0x0, hard-coded.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Loaded from unique input state&amp;quot; refers to the field being loaded from state seperate from the other fields used for this configuration structure.&lt;br /&gt;
&lt;br /&gt;
====Input formats====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Type value&lt;br /&gt;
!  Mode&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010001&lt;br /&gt;
| Color conversion&lt;br /&gt;
| yuyv422&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010002&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010004&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010005&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010006&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010007&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| Color conversion&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020001&lt;br /&gt;
| Video processing&lt;br /&gt;
| H.264&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020002&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| Video processing&lt;br /&gt;
| Same as 0x00020001, except with gray-scale?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080001&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180001&lt;br /&gt;
| Video processing&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Output formats====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Type value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010001&lt;br /&gt;
| See the input format type.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010005&lt;br /&gt;
| Unknown. A certain MVD state field must not be set to 0x8170 in order to use this. Some sort of 2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010006&lt;br /&gt;
| Unknown, see 0x00010005 for the usage requirement. Some sort of 2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010007&lt;br /&gt;
| Unknown, see 0x00010005 for the usage requirement. Some sort of 2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010008&lt;br /&gt;
| A certain MVD-module state field must not be set to 0x8170 in order to use this. Whether this can actually be used is determined by another MVD-module state field. 16bit format.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010009&lt;br /&gt;
| Unknown, see 0x00010008 for the usage requirements. Some non-2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001000A&lt;br /&gt;
| Unknown, see 0x00010008 for the usage requirements. Some non-2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001000B&lt;br /&gt;
| Unknown, see 0x00010008 for the usage requirements. Some non-2-byte format it seems.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020001&lt;br /&gt;
| Some sort of YUV format? 12bit format. The initial output is written to the normal output buffer, then the rest is written to the additional output buffer dedicated to this out-type.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| Unknown, doesn&#039;t write anything to the out-buffer when doing color-conversion.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040001&lt;br /&gt;
| Unknown 2-byte format.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040002&lt;br /&gt;
| BGR565&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040003&lt;br /&gt;
| Some sort of 2-byte format it seems?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040004&lt;br /&gt;
| RGB565&lt;br /&gt;
|-&lt;br /&gt;
| 0x00041000&lt;br /&gt;
| Unknown, doesn&#039;t write anything to the out-buffer when doing color-conversion.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00041001&lt;br /&gt;
| y400a?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00041002&lt;br /&gt;
| y400a?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;l2b:u&amp;quot;==&lt;br /&gt;
This one uses the I/O mapped @ 0x10130000.&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;l2b2:u&amp;quot;==&lt;br /&gt;
This uses the same command-handler as &amp;quot;l2b:u&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==MVD Service &amp;quot;y2r2:u&amp;quot;==&lt;br /&gt;
This is a exact copy of y2r camera service and hence named y2r2.&lt;br /&gt;
&lt;br /&gt;
==MVD Result-codes==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Result-code&lt;br /&gt;
!  Internal MVD status-code&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xD961710F&lt;br /&gt;
| &lt;br /&gt;
| Invalid [[MVDSTD:GetConfig|configuration]], mainly when setting the config.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD96170CA&lt;br /&gt;
| -2(~1)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE16170C9&lt;br /&gt;
| -1(~0)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xF96171C8&lt;br /&gt;
| -0xFB(~0xFA)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17000&lt;br /&gt;
| 0x0&lt;br /&gt;
| OK&lt;br /&gt;
|-&lt;br /&gt;
| 0x17001&lt;br /&gt;
| 0x1&lt;br /&gt;
| Returned after processing NAL-unit parameter-sets.&lt;br /&gt;
|-&lt;br /&gt;
| 0x17002&lt;br /&gt;
| 0x2&lt;br /&gt;
| Busy. When returned by command 0x00090042 during video processing, SKATER uses the {[[MVDSTD:GetConfig]], [[MVDSTD:SetConfig]], and 0x00090042} commands again(same config as before). The SKATER code for this includes this debug string: &amp;quot;H264 output %lld us corrected to %lld us\n&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x17003&lt;br /&gt;
| 0x3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17004&lt;br /&gt;
| 0x4&lt;br /&gt;
| Returned when not all of the input NAL-unit buffer was processed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x17005&lt;br /&gt;
| 0x5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17006&lt;br /&gt;
| 0x6&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17007&lt;br /&gt;
| 0x7&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x17038&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported H.264 Levels and Profiles==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Level&lt;br /&gt;
! Baseline&lt;br /&gt;
! Main&lt;br /&gt;
! High&lt;br /&gt;
! High 10 (High10, High10p, Hi10p or 10-bit H.264)&lt;br /&gt;
! High 4:2:2 (High422p or High422)&lt;br /&gt;
! High 4:4:4 Predictive (Hi444PP)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1b&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1.1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1.2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 1.3&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 2.1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 2.2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 3.1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 3.2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Untested&lt;br /&gt;
| Untested&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 4.1&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 4.2&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 5.1&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|-&lt;br /&gt;
| 5.2&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
| No (untested)&lt;br /&gt;
|}&lt;br /&gt;
created using the New 3DS Internet Browser, New 3DS Internet Browser Specs and the following test pages:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/baseline.html Baseline Profile Test]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/main.html Main Profile Test]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/high.html High Profile Test]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://mtheall.com/~mtheall/pie/high10.html High10 Profile Test]&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=20732</id>
		<title>ARM11 Interrupts</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=20732"/>
		<updated>2018-06-29T08:15:41Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Hardware Interrupts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interrupts ==&lt;br /&gt;
&lt;br /&gt;
Interrupt priority is 0-0xF. A priority of 0xF means that the interrupt is disabled.&lt;br /&gt;
&lt;br /&gt;
= Private Interrupts =&lt;br /&gt;
&lt;br /&gt;
Each CPU core has 32 software interrupts that are private and belong to that core.  These interrupts are numbers 0-0x1F for each core.  The hardware interrupts are not core-specific and start at interrupt ID 0x20.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-0x3&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt. Not configured.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used to manage the performance counter.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Does apparently nothing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Extensively used by [[SVC|KernelSetState]] (and contains most of the actual code of the latter).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. See [[KCacheMaintenanceInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used for scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used when handling exceptions that require termination of a thread or a process, and in some cases by svcSetDebugThreadContext, to store VFP registers in the thread&#039;s register storage.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Kernel&lt;br /&gt;
| TLB operations interrupt, see [[KTLBOperationsInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB-0xE&lt;br /&gt;
|&lt;br /&gt;
| MPCore software-interrupt. Not configured.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| dmnt/debugger&lt;br /&gt;
| MPCore software-interrupt. Used to abstract FIQ (debug). This interrupt is never sent to core2 nor core3 on N3DS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore timer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore watchdog - set when the watchdog counter reaches 0 in timer mode, causes interrupt 30 to set as pending.  Only set on core 1 as core 1&#039;s timer is used for everything.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware Interrupts =&lt;br /&gt;
&lt;br /&gt;
There are 0x60 hardware interrupts starting at 0x20 and continuing up to 0x7F.  These are not private and are accessible from any core.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x29&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC0 (VBlank0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC1 (VBlank1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PPF&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| P3D&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| nwm&lt;br /&gt;
| WIFI SDIO Controller @ 0x10122000&lt;br /&gt;
|-&lt;br /&gt;
| 0x41&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| nwm_dev?&lt;br /&gt;
| WIFI SDIO Controller @ 0x10100000&lt;br /&gt;
|-&lt;br /&gt;
| 0x45&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x49&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A&lt;br /&gt;
| dsp&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B&lt;br /&gt;
| camera&lt;br /&gt;
| Y2R Conversion Finished&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| Y2R2 End Event&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| Related to mvd services&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Sync&lt;br /&gt;
|-&lt;br /&gt;
| 0x51&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x52&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Send Fifo Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x53&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Receive Fifo Not Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus0 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x55&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus1 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x56&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x57&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| Kernel&lt;br /&gt;
| PDN&lt;br /&gt;
|-&lt;br /&gt;
| 0x59&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| mic&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus2 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Shell opened&lt;br /&gt;
|-&lt;br /&gt;
| 0x62&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Shell closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x63&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Touchscreen&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Headphone jack plugged in/out&lt;br /&gt;
|-&lt;br /&gt;
| 0x66&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| IR&lt;br /&gt;
|-&lt;br /&gt;
| 0x69&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6E&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6F&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x71&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| MCU (HOME/POWER pressed/released or WiFi switch pressed)&lt;br /&gt;
|-&lt;br /&gt;
| 0x72&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x73&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard related&lt;br /&gt;
|-&lt;br /&gt;
| 0x75&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 to 0x7B&lt;br /&gt;
| Kernel&lt;br /&gt;
| Core 0-3 Performance monitor counter (any) overflow&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A to 0x82 (PDN_MPCORE_CFG bit2 set) or&lt;br /&gt;
0x7C to 0x84 (bit2 clear)&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
(interrupts from 0x80 and up can&#039;t be mapped in available builds of the kernel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 2 tables in the ARM11 kernel: the first has 32 * 2(or 32 * 4) 8-byte entries.  This table is for the private interrupts that belong to each core.  The data for each interrupt can be found by doing table_base + (core_num * 0x100) + (intr_num * 8).  The second table is for public hardware interrupts and the data for each interrupt can be retrieved by doing table_base + (intr_num * 8).&lt;br /&gt;
&lt;br /&gt;
= InterruptData =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| [[KBaseInterruptEvent]] *&lt;br /&gt;
| Pointer to the KBaseInterruptEvent object for this interrupt &lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt will be disabled by the IRQ handler as soon as it is acknowledged.&lt;br /&gt;
Ignored for FIQ: the FIQ handler always sets bit2 of [[PDN_Registers#PDN_FIQ_CNT|PDN_FIQ_CNT]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt is disabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| u8&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Interrupt Table (New3DS) =&lt;br /&gt;
(0xFFF318F4 in 10.3)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| InterruptData[224]&lt;br /&gt;
| Data for all hardware and software interrupts&lt;br /&gt;
|-&lt;br /&gt;
| 0x700&lt;br /&gt;
| [[KObjectMutex]]&lt;br /&gt;
| Mutex&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Corelink_DMA_Engines&amp;diff=20731</id>
		<title>Corelink DMA Engines</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Corelink_DMA_Engines&amp;diff=20731"/>
		<updated>2018-06-29T08:13:30Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* CDMA Peripheral IDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDMA cannot access the ARM9 bootrom at all.&lt;br /&gt;
&lt;br /&gt;
==DmaConfig==&lt;br /&gt;
Size of struct is 24 bytes.&lt;br /&gt;
&lt;br /&gt;
 struct DmaConfig {&lt;br /&gt;
     sint8_t channel_sel; // @0 Selects which DMA channel to use: 0-7, -1 = don&#039;t care.&lt;br /&gt;
     uint8_t endian_swap_size; // @1 Accepted values: 0=none, 2=16bit, 4=32bit, 8=64bit.&lt;br /&gt;
     uint8_t flags; // @2 bit0: SRC_IS_PERIPHERAL, bit1: DST_IS_PERIPHERAL, bit2: SHALL_BLOCK, bit3: KEEP_ALIVE, bit6: SRC_IS_RAM, bit7: DST_IS_RAM&lt;br /&gt;
     uint8_t padding;&lt;br /&gt;
     DmaSubConfig dst_cfg;&lt;br /&gt;
     DmaSubConfig src_cfg;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 struct DmaSubConfig {&lt;br /&gt;
     sint8_t peripheral_id; // @0 If not *_IS_RAM set, this must be &amp;lt; 0x1E.&lt;br /&gt;
     uint8_t allowed_burst_sizes; // @1 Accepted values: 4, 8, 4|8 = 12, 1|2|4|8 = 15 &lt;br /&gt;
     sint16_t gather_granule_size; // @2&lt;br /&gt;
     sint16_t gather_stride; // @4 Has to be &amp;gt;= 0, must not be 0 if peripheral_id == 0xFF.&lt;br /&gt;
     sint16_t scatter_granule_size; // @6&lt;br /&gt;
     sint16_t scatter_stride; // @8 Can be negative.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If SRC_IS_PERIPHERAL/SRC_IS_PERIPHERAL is set in the flags field, the configuration for src/dst is loaded from src_cfg/dst_cfg respectively and the transfer will be done from/to a fixed address. If the *_IS_RAM flag is set same thing goes, except byte0 of each cfg is forced to 0xFF (RAM) and the transfer will be done from/to an incrementing address. *_IS_RAM has priority over _IS_PERIPHERAL.&lt;br /&gt;
&lt;br /&gt;
If neither *_IS_PERIPHERAL or *_IS_RAM is set, default configuration is loaded:&lt;br /&gt;
&lt;br /&gt;
 .peripheral_id = 0xFF,&lt;br /&gt;
 .allowed_burst_sizes = 1 | 2 | 4 | 8,&lt;br /&gt;
 .gather_granule_size = 0x80,&lt;br /&gt;
 .gather_stride = 0,&lt;br /&gt;
 .scatter_granule_size = 0x80,&lt;br /&gt;
 .scatter_stride = 0,&lt;br /&gt;
&lt;br /&gt;
If SHALL_BLOCK is set, the thread will sleep until the DMA engine is ready. If not set, the SVC will return 0xD04007F0 if the DMA channel is busy.&lt;br /&gt;
&lt;br /&gt;
The generated bytecode starts with a FLUSHP on the peripheral_ids for src/dst (if specified). After that, it always moves 0 into DAR. Then it moves the src/dst addresses into SAR/DAR respectively...&lt;br /&gt;
&lt;br /&gt;
== CDMA Peripheral IDs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  ID&lt;br /&gt;
!  Module&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| camera (cam)&lt;br /&gt;
| Camera Port 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| camera (cam)&lt;br /&gt;
| Camera Port 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingY&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingU&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingV&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingYUYV&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetReceiving&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| fs&lt;br /&gt;
| HASH&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| TwlBg&lt;br /&gt;
| LGYFB0/1&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| TwlBg&lt;br /&gt;
| LGYFB0/1&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| mvd (y2r2)&lt;br /&gt;
| SetSendingY&lt;br /&gt;
|-&lt;br /&gt;
| 0x13&lt;br /&gt;
| mvd (y2r2)&lt;br /&gt;
| SetSendingU&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| mvd (y2r2)&lt;br /&gt;
| SetSendingV&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| mvd (y2r2)&lt;br /&gt;
| SetSendingYUV&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| mvd (y2r2)&lt;br /&gt;
| SetReceiving&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== XDMA Peripheral IDs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  ID&lt;br /&gt;
!  Module&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Process9&lt;br /&gt;
| CTRCARD&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Process9&lt;br /&gt;
| SHA&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Corelink_DMA_Engines&amp;diff=20730</id>
		<title>Corelink DMA Engines</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Corelink_DMA_Engines&amp;diff=20730"/>
		<updated>2018-06-29T01:37:30Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* CDMA Peripheral IDs */ 0x14 is related to y2r2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDMA cannot access the ARM9 bootrom at all.&lt;br /&gt;
&lt;br /&gt;
==DmaConfig==&lt;br /&gt;
Size of struct is 24 bytes.&lt;br /&gt;
&lt;br /&gt;
 struct DmaConfig {&lt;br /&gt;
     sint8_t channel_sel; // @0 Selects which DMA channel to use: 0-7, -1 = don&#039;t care.&lt;br /&gt;
     uint8_t endian_swap_size; // @1 Accepted values: 0=none, 2=16bit, 4=32bit, 8=64bit.&lt;br /&gt;
     uint8_t flags; // @2 bit0: SRC_IS_PERIPHERAL, bit1: DST_IS_PERIPHERAL, bit2: SHALL_BLOCK, bit3: KEEP_ALIVE, bit6: SRC_IS_RAM, bit7: DST_IS_RAM&lt;br /&gt;
     uint8_t padding;&lt;br /&gt;
     DmaSubConfig dst_cfg;&lt;br /&gt;
     DmaSubConfig src_cfg;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 struct DmaSubConfig {&lt;br /&gt;
     sint8_t peripheral_id; // @0 If not *_IS_RAM set, this must be &amp;lt; 0x1E.&lt;br /&gt;
     uint8_t allowed_burst_sizes; // @1 Accepted values: 4, 8, 4|8 = 12, 1|2|4|8 = 15 &lt;br /&gt;
     sint16_t gather_granule_size; // @2&lt;br /&gt;
     sint16_t gather_stride; // @4 Has to be &amp;gt;= 0, must not be 0 if peripheral_id == 0xFF.&lt;br /&gt;
     sint16_t scatter_granule_size; // @6&lt;br /&gt;
     sint16_t scatter_stride; // @8 Can be negative.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If SRC_IS_PERIPHERAL/SRC_IS_PERIPHERAL is set in the flags field, the configuration for src/dst is loaded from src_cfg/dst_cfg respectively and the transfer will be done from/to a fixed address. If the *_IS_RAM flag is set same thing goes, except byte0 of each cfg is forced to 0xFF (RAM) and the transfer will be done from/to an incrementing address. *_IS_RAM has priority over _IS_PERIPHERAL.&lt;br /&gt;
&lt;br /&gt;
If neither *_IS_PERIPHERAL or *_IS_RAM is set, default configuration is loaded:&lt;br /&gt;
&lt;br /&gt;
 .peripheral_id = 0xFF,&lt;br /&gt;
 .allowed_burst_sizes = 1 | 2 | 4 | 8,&lt;br /&gt;
 .gather_granule_size = 0x80,&lt;br /&gt;
 .gather_stride = 0,&lt;br /&gt;
 .scatter_granule_size = 0x80,&lt;br /&gt;
 .scatter_stride = 0,&lt;br /&gt;
&lt;br /&gt;
If SHALL_BLOCK is set, the thread will sleep until the DMA engine is ready. If not set, the SVC will return 0xD04007F0 if the DMA channel is busy.&lt;br /&gt;
&lt;br /&gt;
The generated bytecode starts with a FLUSHP on the peripheral_ids for src/dst (if specified). After that, it always moves 0 into DAR. Then it moves the src/dst addresses into SAR/DAR respectively...&lt;br /&gt;
&lt;br /&gt;
== CDMA Peripheral IDs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  ID&lt;br /&gt;
!  Module&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| camera (cam)&lt;br /&gt;
| Camera Port 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| camera (cam)&lt;br /&gt;
| Camera Port 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingY&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingU&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingV&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingYUYV&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetReceiving&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| fs&lt;br /&gt;
| HASH&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| TwlBg&lt;br /&gt;
| LGYFB0/1&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| TwlBg&lt;br /&gt;
| LGYFB0/1&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x13&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== XDMA Peripheral IDs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  ID&lt;br /&gt;
!  Module&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Process9&lt;br /&gt;
| CTRCARD&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Process9&lt;br /&gt;
| SHA&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Corelink_DMA_Engines&amp;diff=20729</id>
		<title>Corelink DMA Engines</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Corelink_DMA_Engines&amp;diff=20729"/>
		<updated>2018-06-29T01:09:00Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* CDMA Peripheral IDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDMA cannot access the ARM9 bootrom at all.&lt;br /&gt;
&lt;br /&gt;
==DmaConfig==&lt;br /&gt;
Size of struct is 24 bytes.&lt;br /&gt;
&lt;br /&gt;
 struct DmaConfig {&lt;br /&gt;
     sint8_t channel_sel; // @0 Selects which DMA channel to use: 0-7, -1 = don&#039;t care.&lt;br /&gt;
     uint8_t endian_swap_size; // @1 Accepted values: 0=none, 2=16bit, 4=32bit, 8=64bit.&lt;br /&gt;
     uint8_t flags; // @2 bit0: SRC_IS_PERIPHERAL, bit1: DST_IS_PERIPHERAL, bit2: SHALL_BLOCK, bit3: KEEP_ALIVE, bit6: SRC_IS_RAM, bit7: DST_IS_RAM&lt;br /&gt;
     uint8_t padding;&lt;br /&gt;
     DmaSubConfig dst_cfg;&lt;br /&gt;
     DmaSubConfig src_cfg;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 struct DmaSubConfig {&lt;br /&gt;
     sint8_t peripheral_id; // @0 If not *_IS_RAM set, this must be &amp;lt; 0x1E.&lt;br /&gt;
     uint8_t allowed_burst_sizes; // @1 Accepted values: 4, 8, 4|8 = 12, 1|2|4|8 = 15 &lt;br /&gt;
     sint16_t gather_granule_size; // @2&lt;br /&gt;
     sint16_t gather_stride; // @4 Has to be &amp;gt;= 0, must not be 0 if peripheral_id == 0xFF.&lt;br /&gt;
     sint16_t scatter_granule_size; // @6&lt;br /&gt;
     sint16_t scatter_stride; // @8 Can be negative.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If SRC_IS_PERIPHERAL/SRC_IS_PERIPHERAL is set in the flags field, the configuration for src/dst is loaded from src_cfg/dst_cfg respectively and the transfer will be done from/to a fixed address. If the *_IS_RAM flag is set same thing goes, except byte0 of each cfg is forced to 0xFF (RAM) and the transfer will be done from/to an incrementing address. *_IS_RAM has priority over _IS_PERIPHERAL.&lt;br /&gt;
&lt;br /&gt;
If neither *_IS_PERIPHERAL or *_IS_RAM is set, default configuration is loaded:&lt;br /&gt;
&lt;br /&gt;
 .peripheral_id = 0xFF,&lt;br /&gt;
 .allowed_burst_sizes = 1 | 2 | 4 | 8,&lt;br /&gt;
 .gather_granule_size = 0x80,&lt;br /&gt;
 .gather_stride = 0,&lt;br /&gt;
 .scatter_granule_size = 0x80,&lt;br /&gt;
 .scatter_stride = 0,&lt;br /&gt;
&lt;br /&gt;
If SHALL_BLOCK is set, the thread will sleep until the DMA engine is ready. If not set, the SVC will return 0xD04007F0 if the DMA channel is busy.&lt;br /&gt;
&lt;br /&gt;
The generated bytecode starts with a FLUSHP on the peripheral_ids for src/dst (if specified). After that, it always moves 0 into DAR. Then it moves the src/dst addresses into SAR/DAR respectively...&lt;br /&gt;
&lt;br /&gt;
== CDMA Peripheral IDs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  ID&lt;br /&gt;
!  Module&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| camera (cam)&lt;br /&gt;
| Camera Port 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| camera (cam)&lt;br /&gt;
| Camera Port 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingY&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingU&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingV&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetSendingYUYV&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| camera (y2r)&lt;br /&gt;
| SetReceiving&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| fs&lt;br /&gt;
| HASH&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| TwlBg&lt;br /&gt;
| LGYFB0/1&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| TwlBg&lt;br /&gt;
| LGYFB0/1&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x13&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| mvd&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| mvd&lt;br /&gt;
| Related to l2b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== XDMA Peripheral IDs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  ID&lt;br /&gt;
!  Module&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Process9&lt;br /&gt;
| CTRCARD&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Process9&lt;br /&gt;
| SHA&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=20728</id>
		<title>ARM11 Interrupts</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=20728"/>
		<updated>2018-06-27T23:14:23Z</updated>

		<summary type="html">&lt;p&gt;Unknown: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interrupts ==&lt;br /&gt;
&lt;br /&gt;
Interrupt priority is 0-0xF. A priority of 0xF means that the interrupt is disabled.&lt;br /&gt;
&lt;br /&gt;
= Private Interrupts =&lt;br /&gt;
&lt;br /&gt;
Each CPU core has 32 software interrupts that are private and belong to that core.  These interrupts are numbers 0-0x1F for each core.  The hardware interrupts are not core-specific and start at interrupt ID 0x20.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-0x3&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt. Not configured.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used to manage the performance counter.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Does apparently nothing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Extensively used by [[SVC|KernelSetState]] (and contains most of the actual code of the latter).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. See [[KCacheMaintenanceInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used for scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used when handling exceptions that require termination of a thread or a process, and in some cases by svcSetDebugThreadContext, to store VFP registers in the thread&#039;s register storage.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Kernel&lt;br /&gt;
| TLB operations interrupt, see [[KTLBOperationsInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB-0xE&lt;br /&gt;
|&lt;br /&gt;
| MPCore software-interrupt. Not configured.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| dmnt/debugger&lt;br /&gt;
| MPCore software-interrupt. Used to abstract FIQ (debug). This interrupt is never sent to core2 nor core3 on N3DS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore timer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore watchdog - set when the watchdog counter reaches 0 in timer mode, causes interrupt 30 to set as pending.  Only set on core 1 as core 1&#039;s timer is used for everything.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware Interrupts =&lt;br /&gt;
&lt;br /&gt;
There are 0x60 hardware interrupts starting at 0x20 and continuing up to 0x7F.  These are not private and are accessible from any core.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x29&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC0 (VBlank0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC1 (VBlank1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PPF&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| P3D&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| nwm&lt;br /&gt;
| WIFI SDIO Controller @ 0x10122000&lt;br /&gt;
|-&lt;br /&gt;
| 0x41&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| nwm_dev?&lt;br /&gt;
| WIFI SDIO Controller @ 0x10100000&lt;br /&gt;
|-&lt;br /&gt;
| 0x45&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x49&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A&lt;br /&gt;
| dsp&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B&lt;br /&gt;
| camera&lt;br /&gt;
| Y2R Conversion Finished&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| Related to mvd services&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Sync&lt;br /&gt;
|-&lt;br /&gt;
| 0x51&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x52&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Send Fifo Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x53&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Receive Fifo Not Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus0 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x55&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus1 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x56&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x57&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| Kernel&lt;br /&gt;
| PDN&lt;br /&gt;
|-&lt;br /&gt;
| 0x59&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| mic&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus2 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Shell opened&lt;br /&gt;
|-&lt;br /&gt;
| 0x62&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Shell closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x63&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Touchscreen&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Headphone jack plugged in/out&lt;br /&gt;
|-&lt;br /&gt;
| 0x66&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| IR&lt;br /&gt;
|-&lt;br /&gt;
| 0x69&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6E&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6F&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x71&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| MCU (HOME/POWER pressed/released or WiFi switch pressed)&lt;br /&gt;
|-&lt;br /&gt;
| 0x72&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x73&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard related&lt;br /&gt;
|-&lt;br /&gt;
| 0x75&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 to 0x7B&lt;br /&gt;
| Kernel&lt;br /&gt;
| Core 0-3 Performance monitor counter (any) overflow&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A to 0x82 (PDN_MPCORE_CFG bit2 set) or&lt;br /&gt;
0x7C to 0x84 (bit2 clear)&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
(interrupts from 0x80 and up can&#039;t be mapped in available builds of the kernel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 2 tables in the ARM11 kernel: the first has 32 * 2(or 32 * 4) 8-byte entries.  This table is for the private interrupts that belong to each core.  The data for each interrupt can be found by doing table_base + (core_num * 0x100) + (intr_num * 8).  The second table is for public hardware interrupts and the data for each interrupt can be retrieved by doing table_base + (intr_num * 8).&lt;br /&gt;
&lt;br /&gt;
= InterruptData =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| [[KBaseInterruptEvent]] *&lt;br /&gt;
| Pointer to the KBaseInterruptEvent object for this interrupt &lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt will be disabled by the IRQ handler as soon as it is acknowledged.&lt;br /&gt;
Ignored for FIQ: the FIQ handler always sets bit2 of [[PDN_Registers#PDN_FIQ_CNT|PDN_FIQ_CNT]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt is disabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| u8&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Interrupt Table (New3DS) =&lt;br /&gt;
(0xFFF318F4 in 10.3)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| InterruptData[224]&lt;br /&gt;
| Data for all hardware and software interrupts&lt;br /&gt;
|-&lt;br /&gt;
| 0x700&lt;br /&gt;
| [[KObjectMutex]]&lt;br /&gt;
| Mutex&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=20727</id>
		<title>ARM11 Interrupts</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=20727"/>
		<updated>2018-06-27T23:05:12Z</updated>

		<summary type="html">&lt;p&gt;Unknown: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interrupts ==&lt;br /&gt;
&lt;br /&gt;
Interrupt priority is 0-0xF. A priority of 0xF means that the interrupt is disabled.&lt;br /&gt;
&lt;br /&gt;
= Private Interrupts =&lt;br /&gt;
&lt;br /&gt;
Each CPU core has 32 software interrupts that are private and belong to that core.  These interrupts are numbers 0-0x1F for each core.  The hardware interrupts are not core-specific and start at interrupt ID 0x20.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-0x3&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt. Not configured.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used to manage the performance counter.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Does apparently nothing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Extensively used by [[SVC|KernelSetState]] (and contains most of the actual code of the latter).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. See [[KCacheMaintenanceInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used for scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used when handling exceptions that require termination of a thread or a process, and in some cases by svcSetDebugThreadContext, to store VFP registers in the thread&#039;s register storage.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Kernel&lt;br /&gt;
| TLB operations interrupt, see [[KTLBOperationsInterruptEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB-0xE&lt;br /&gt;
|&lt;br /&gt;
| MPCore software-interrupt. Not configured.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| dmnt/debugger&lt;br /&gt;
| MPCore software-interrupt. Used to abstract FIQ (debug). This interrupt is never sent to core2 nor core3 on N3DS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore timer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore watchdog - set when the watchdog counter reaches 0 in timer mode, causes interrupt 30 to set as pending.  Only set on core 1 as core 1&#039;s timer is used for everything.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware Interrupts =&lt;br /&gt;
&lt;br /&gt;
There are 0x60 hardware interrupts starting at 0x20 and continuing up to 0x7F.  These are not private and are accessible from any core.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x29&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC0 (VBlank0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC1 (VBlank1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PPF&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| P3D&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| nwm&lt;br /&gt;
| WIFI SDIO Controller @ 0x10122000&lt;br /&gt;
|-&lt;br /&gt;
| 0x41&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| nwm_dev?&lt;br /&gt;
| WIFI SDIO Controller @ 0x10100000&lt;br /&gt;
|-&lt;br /&gt;
| 0x45&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x49&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A&lt;br /&gt;
| dsp&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B&lt;br /&gt;
| camera&lt;br /&gt;
| Y2R Conversion Finished&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| Related to y2r2&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Sync&lt;br /&gt;
|-&lt;br /&gt;
| 0x51&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x52&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Send Fifo Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x53&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Receive Fifo Not Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus0 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x55&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus1 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x56&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x57&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| Kernel&lt;br /&gt;
| PDN&lt;br /&gt;
|-&lt;br /&gt;
| 0x59&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| mic&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| I2C Bus2 work done&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Shell opened&lt;br /&gt;
|-&lt;br /&gt;
| 0x62&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Shell closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x63&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Touchscreen&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Headphone jack plugged in/out&lt;br /&gt;
|-&lt;br /&gt;
| 0x66&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| IR&lt;br /&gt;
|-&lt;br /&gt;
| 0x69&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6E&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6F&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x71&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| MCU (HOME/POWER pressed/released or WiFi switch pressed)&lt;br /&gt;
|-&lt;br /&gt;
| 0x72&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x73&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard related&lt;br /&gt;
|-&lt;br /&gt;
| 0x75&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 to 0x7B&lt;br /&gt;
| Kernel&lt;br /&gt;
| Core 0-3 Performance monitor counter (any) overflow&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A to 0x82 (PDN_MPCORE_CFG bit2 set) or&lt;br /&gt;
0x7C to 0x84 (bit2 clear)&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
(interrupts from 0x80 and up can&#039;t be mapped in available builds of the kernel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 2 tables in the ARM11 kernel: the first has 32 * 2(or 32 * 4) 8-byte entries.  This table is for the private interrupts that belong to each core.  The data for each interrupt can be found by doing table_base + (core_num * 0x100) + (intr_num * 8).  The second table is for public hardware interrupts and the data for each interrupt can be retrieved by doing table_base + (intr_num * 8).&lt;br /&gt;
&lt;br /&gt;
= InterruptData =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| [[KBaseInterruptEvent]] *&lt;br /&gt;
| Pointer to the KBaseInterruptEvent object for this interrupt &lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt will be disabled by the IRQ handler as soon as it is acknowledged.&lt;br /&gt;
Ignored for FIQ: the FIQ handler always sets bit2 of [[PDN_Registers#PDN_FIQ_CNT|PDN_FIQ_CNT]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt is disabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| u8&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Interrupt Table (New3DS) =&lt;br /&gt;
(0xFFF318F4 in 10.3)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| InterruptData[224]&lt;br /&gt;
| Data for all hardware and software interrupts&lt;br /&gt;
|-&lt;br /&gt;
| 0x700&lt;br /&gt;
| [[KObjectMutex]]&lt;br /&gt;
| Mutex&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=CECD_Services&amp;diff=20660</id>
		<title>CECD Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=CECD_Services&amp;diff=20660"/>
		<updated>2018-03-18T14:05:04Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* CECD Service &amp;quot;cecd:u&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Services]]&lt;br /&gt;
&lt;br /&gt;
Streetpass stuff.&lt;br /&gt;
&lt;br /&gt;
= CECD Service &amp;quot;cecd:u&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x000100C2&lt;br /&gt;
| [[CECDU:OpenRawFile|OpenRawFile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020042&lt;br /&gt;
| [[CECDU:ReadRawFile|ReadRawFile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030104&lt;br /&gt;
| [[CECDU:ReadMessage|ReadMessage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040106&lt;br /&gt;
| [[CECDU:ReadMessageWithHMAC|ReadMessageWithHMAC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050042&lt;br /&gt;
| [[CECDU:WriteRawFile|WriteRawFile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060104&lt;br /&gt;
| [[CECDU:WriteMessage|WriteMessage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070106&lt;br /&gt;
| [[CECDU:WriteMessageWithHMAC|WriteMessageWithHMAC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080102&lt;br /&gt;
| [[CECDU:Delete|Delete]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000900C2&lt;br /&gt;
| ? (16*length+10 of CecMessageId buffer in cmdbuff[4] (always 16*8+10), CecMessageId* in cmdbuf[5])&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A00C4&lt;br /&gt;
| [[CECDU:GetSystemInfo|GetSystemInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0040&lt;br /&gt;
| RunCommand&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0040&lt;br /&gt;
| RunCommandAlt (seems to be the same as RunCommand besides some extra checks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0082&lt;br /&gt;
| GetCecInfoBuffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| GetCecStateAbbreviated (returns CecStateAbbreviated in cmdbuf[2])&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| GetCecInfoEventHandle (returns event handle in cmdbuf[3])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| GetChangeStateEventHandle (returns event handle in cmdbuf[3])&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110104&lt;br /&gt;
| [[CECDU:OpenAndWrite|OpenAndWrite]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120104&lt;br /&gt;
| [[CECDU:OpenAndRead|OpenAndRead]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E0082&lt;br /&gt;
| GetEventLog&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0000&lt;br /&gt;
| GetEventLogStart&lt;br /&gt;
|-&lt;br /&gt;
| 0x0020....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0021....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CecDataPathType ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Value&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_MBOX_LIST || 1&lt;br /&gt;
| data:/CEC/MBoxList____&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_MBOX_INFO || 2&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/MBoxInfo____&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_INBOX_INFO || 3&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/InBox___/BoxInfo_____&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_OUTBOX_INFO  || 4&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/OutBox__/BoxInfo_____&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_OUTBOX_INDEX  || 5&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/OutBox__/OBIndex_____&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_INBOX_MSG  || 6&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/InBox___/_&amp;lt;message_id&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_OUTBOX_MSG  || 7&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/OutBox__/_&amp;lt;message_id&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_ROOT_DIR  || 10&lt;br /&gt;
| data:/CEC&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_MBOX_DIR  || 11&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_INBOX_DIR  || 12&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/InBox___&lt;br /&gt;
|-&lt;br /&gt;
| CEC_PATH_OUTBOX_DIR  || 13&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/OutBox__&lt;br /&gt;
|-&lt;br /&gt;
| || 101 thru 199 (inclusive)&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/MBoxData.0&amp;lt;i-100&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| CECMESSAGE_BOX_ICON  || 101&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/MBoxData.001&lt;br /&gt;
|- &lt;br /&gt;
| CECMESSAGE_BOX_TITLE  || 110&lt;br /&gt;
| data:/CEC/&amp;lt;id&amp;gt;/MBoxData.010&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CecCommand ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Value&lt;br /&gt;
!  Notes&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_NONE&lt;br /&gt;
| 0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_START&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_RESET_START&lt;br /&gt;
| 2&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_READYSCAN&lt;br /&gt;
| 3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_READYSCANWAIT&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_STARTSCAN&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_RESCAN&lt;br /&gt;
| 6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_NDM_RESUME&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_NDM_SUSPEND&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_NDM_SUSPEND_IMMEDIATE&lt;br /&gt;
| 9&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_STOPWAIT&lt;br /&gt;
| 0xA&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_STOP&lt;br /&gt;
| 0xB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_STOP_FORCE&lt;br /&gt;
| 0xC&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_STOP_FORCE_WAIT&lt;br /&gt;
| 0xD&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_RESET_FILTER&lt;br /&gt;
| 0xE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_DAEMON_STOP&lt;br /&gt;
| 0xF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_DAEMON_START&lt;br /&gt;
| 0x10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_EXIT&lt;br /&gt;
| 0x11&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_OVER_BOSS&lt;br /&gt;
| 0x12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_OVER_BOSS_FORCE&lt;br /&gt;
| 0x13&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_OVER_BOSS_FORCE_WAIT&lt;br /&gt;
| 0x14&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| CEC_COMMAND_END&lt;br /&gt;
| 0x15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CecStateAbbreviated ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Value&lt;br /&gt;
!  Notes&lt;br /&gt;
|-&lt;br /&gt;
| CEC_STATE_ABBREV_IDLE&lt;br /&gt;
| 1&lt;br /&gt;
| Corresponds to CEC_STATE_IDLE&lt;br /&gt;
|-&lt;br /&gt;
| CEC_STATE_ABBREV_INACTIVE&lt;br /&gt;
| 2&lt;br /&gt;
| Corresponds to CEC_STATEs *FINISH*, *POST, and OVER_BOSS&lt;br /&gt;
|-&lt;br /&gt;
| CEC_STATE_ABBREV_SCANNING&lt;br /&gt;
| 3&lt;br /&gt;
| Corresponds to CEC_STATE_SCANNING&lt;br /&gt;
|-&lt;br /&gt;
| CEC_STATE_ABBREV_WLREADY?&lt;br /&gt;
| 4&lt;br /&gt;
| Corresponds to CEC_STATE_WIRELESS_READY when some unknown bool is true&lt;br /&gt;
|-&lt;br /&gt;
| CEC_STATE_ABBREV_OTHER&lt;br /&gt;
| 5&lt;br /&gt;
| Corresponds to CEC_STATEs besides *FINISH*, *POST, and OVER_BOSS and those listed here&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CecMessageId ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| char[8]&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CECD Service &amp;quot;cecd:s&amp;quot; =&lt;br /&gt;
&lt;br /&gt;
This contains a similar (probably the same) command handler from 0x0001.... to 0x0021.... as them in cecd:u. In addition, it also contains&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0401....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x04020002&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x040A....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x040B....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x040C0042&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x040D0082&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x040E....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x040F....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0410....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x04110042&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x041200C2&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0413....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0414....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0415....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x04160002&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0417....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CECD Service &amp;quot;cecd:ndm&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Initialize&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| Deinitialize&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| ResumeDaemon&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040040&lt;br /&gt;
| SuspendDaemon(bool immediately)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060042&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070042&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080042&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=NIM_Services&amp;diff=20659</id>
		<title>NIM Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=NIM_Services&amp;diff=20659"/>
		<updated>2018-03-18T13:17:06Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* NIM user service &amp;quot;nim:u&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Services]]&lt;br /&gt;
= NIM user service &amp;quot;nim:u&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Related to starting a sysupdate?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[NIMU:GetUpdateDownloadProgress|GetUpdateDownloadProgress]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[NIMU:FinishTitlesInstall|FinishTitlesInstall]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| This obtains an event handle. Home Menu will check whether a system update is available when this event is triggered.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007....&lt;br /&gt;
| This deletes and recreates the system save data 0x0001002C (NIM System SaveData)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008....&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| [[NIMU:CheckSysupdateAvailable|CheckSysupdateAvailable]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| GetState&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[NIMU:GetSystemTitleHash|GetSystemTitleHash]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0082&lt;br /&gt;
| UnregisterTask&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0042&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170042&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180080&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260200&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290246&lt;br /&gt;
| RegisterTask&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D00C0&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00480002&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= NIM server service &amp;quot;nim:s&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010200&lt;br /&gt;
| [[NIMS:StartDownloadSimple|StartDownloadSimple]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[NIMS:CancelDownload|CancelDownload]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030000&lt;br /&gt;
| [[NIMS:GetProgress|GetProgress]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050082&lt;br /&gt;
| [[NIMS:UnregisterTask|UnregisterTask]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060080&lt;br /&gt;
| [[NIMS:IsTaskRegistered|IsTaskRegistered]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| [[NIMS:CheckSysupdateAvailableSOAP|CheckSysupdateAvailableSOAP]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0084&lt;br /&gt;
| [[NIMS:SetAttribute|SetAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x0016020A&lt;br /&gt;
| [[NIMS:ListTitles|ListTitles]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220080&lt;br /&gt;
| AccountDeleteTitleETicketsSOAP. The SOAP request is sent only after the ticket for the specified titleID has been successfully deleted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| [[NIMS:AccountCheckBalanceSOAP|AccountCheckBalanceSOAP]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0042&lt;br /&gt;
| [[NIMS:DownloadTickets|DownloadTickets]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003C0002&lt;br /&gt;
| [[NIMS:RegisterSelf|RegisterSelf]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x003F0000&lt;br /&gt;
| GetInitializeResult. Checks whether nim is properly initialized or not. If it is not, the result code returned is non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00420240&lt;br /&gt;
| [[NIMS:StartDownload|StartDownload]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00550246&lt;br /&gt;
| [[NIMS:RegisterTask|RegisterTask]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00570082&lt;br /&gt;
| [[NIMS:ConnectNoTicketDownload|ConnectNoTicketDownload]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= NIM server service &amp;quot;nim:aoc&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030042&lt;br /&gt;
| SetApplicationId&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040042&lt;br /&gt;
| SetTin&lt;br /&gt;
|-&lt;br /&gt;
| 0x000902D0&lt;br /&gt;
| ListContentSetsEx&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180000&lt;br /&gt;
| GetBalance&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0000&lt;br /&gt;
| GetCustomerSupportCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210000&lt;br /&gt;
| Initialize&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240282&lt;br /&gt;
| CalculateContentsRequiredSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250000&lt;br /&gt;
| RefreshServerTime&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= NIM service &amp;quot;nim:ndm&amp;quot; =&lt;br /&gt;
&lt;br /&gt;
= kagiya server =&lt;br /&gt;
The nim system module communicates with a server called kagiya (kagiya-ctr.cdn.nintendo.net or kagiya-dev-ctr.cdn.nintendo.net for development units). It provides the 9.6 crypto seed in binary form for any given title ID under (HTTPS) kagiya-ctr.cdn.nintendo.net/title/0x%16llx/ext_key?country=%s, where %16llx is the title ID and %s is a country code as used in the [[EShop|eShop]].&lt;br /&gt;
&lt;br /&gt;
=New3DS=&lt;br /&gt;
NIM module only uses [[PTMSYSM:CheckNew3DS|CheckNew3DS]] for determining what heap sizes to use, in two functions. One is for the size of the 0x08000000 vmem heap, the other is probably for some buffer allocated on that heap. The New3DS version of these sizes are 0x1C000-bytes larger than the Old3DS sizes here.&lt;br /&gt;
&lt;br /&gt;
=HTTPS requests=&lt;br /&gt;
&lt;br /&gt;
==Trusted RootCAs==&lt;br /&gt;
During startup NIM-module creates two RootCertChains with [[HTTP_Services|HTTPC]]. Both of these only contain the same [[HTTPC:RootCertChainAddDefaultCert|default]] cert with ID 0x3. The first RootCertChain is used with NetUpdateSOAP. Requests such as the &amp;quot;notifications.json&amp;quot; page don&#039;t use these RootCertChains(in this case just [[HTTPC:AddDefaultCert|default]] certID 0xB is used).&lt;br /&gt;
&lt;br /&gt;
==SOAP==&lt;br /&gt;
&lt;br /&gt;
===NetUpdateSOAP===&lt;br /&gt;
There are exactly 3 types of network SOAP requests used with [https://nus.c.shop.nintendowifi.net/nus/services/NetUpdateSOAP NetUpdateSOAP] by NIM module, described below. This URL contained in NIM module itself is only used with GetSystemTitleHash. The other requests use an identical URL loaded from an ECommerceSOAP response instead.&lt;br /&gt;
&lt;br /&gt;
See also [https://github.com/yellows8/ninupdates here].&lt;br /&gt;
&lt;br /&gt;
====GetSystemUpdate====&lt;br /&gt;
Returns the current sysupdate title-listing. This also contains the SystemTitleHash returned by GetSystemTitleHash.&lt;br /&gt;
&lt;br /&gt;
====GetSystemTitleHash====&lt;br /&gt;
Returns the current SystemTitleHash for the current sysupdate title-listing.&lt;br /&gt;
&lt;br /&gt;
====GetSystemCommonETicket====&lt;br /&gt;
Returns the Base64-encoded cetk for each specified TitleId entry.&lt;br /&gt;
&lt;br /&gt;
This is only used when installing new titles. This means with CDN system-updates, tickets are never installed except when a title is being installed for the first time. For example, a system on the latest system-version that was only ever updated via CDN has the same NATIVE_FIRM ticket installed from the factory.&lt;br /&gt;
&lt;br /&gt;
=Sysupdate checking process=&lt;br /&gt;
This section describes the process used when checking whether a sysupdate is required.&lt;br /&gt;
&lt;br /&gt;
First the GetSystemTitleHash SOAP request is done. Then the SystemTitleHash in savedata hash.dat is compared with the received one. If they match and the SystemTitleHash flag is set to value 0x03, it will immediately return that no sysupdate is required. Otherwise it will start the GetSystemUpdate SOAP request handling.&lt;br /&gt;
&lt;br /&gt;
The GetSystemUpdate SOAP request contains a titlelist of all NAND system-titles. For GetSystemUpdate response parsing, it compares each SOAP title_entry with the NAND system titlelist. If a SOAP titleID isn&#039;t found in the NAND titlelist, this means NAND is missing a new title and hence a sysupdate is required for installing that title. If a NAND title_entry-version is less than the SOAP title_entry-version, this means the title needs updated and hence a sysupdate is required.&lt;br /&gt;
&lt;br /&gt;
At least one &amp;lt;TitleVersion&amp;gt; entry with valid data in the GetSystemUpdate response is required.&lt;br /&gt;
&lt;br /&gt;
The titleIDs sent in the GetSystemUpdate SOAP request are decimal, while the titleIDs in the response are hex.&lt;br /&gt;
&lt;br /&gt;
=NIM [[System_SaveData]]=&lt;br /&gt;
==hash.dat==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x1&lt;br /&gt;
| u8 flag used with the SystemTitleHash. 0x01 = latest sysupdate isn&#039;t installed as of last SOAP requests, 0x03 = latest sysupdate is installed as of last SOAP requests.&lt;br /&gt;
|-&lt;br /&gt;
| 0x61&lt;br /&gt;
| 0x21&lt;br /&gt;
| ASCII hex SystemTitleHash, including NUL-terminator. This is the latest SystemTitleHash which NIM module received from SOAP.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Types=&lt;br /&gt;
==InstallationMode==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Initial installation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Reinstallation&lt;br /&gt;
|}&lt;br /&gt;
==DownloadState==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Download initialized&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Downloading, verifying and installing TMD&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Initializing save data&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Downloading and installing contents&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Waiting before calling [[AM:CommitImportPrograms]]&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Running [[AM:CommitImportPrograms]]&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Title installation finished&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Unknown error regarding title version&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Creating the .ctx file (or error doing so)?&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Irrecoverable error encountered&lt;br /&gt;
|}&lt;br /&gt;
==TitleConfig==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Length&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| Title ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Title version&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown (always 0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x1&lt;br /&gt;
| Age rating for the HOME Menu parental controls&lt;br /&gt;
|-&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x1&lt;br /&gt;
| [[Filesystem_services#MediaType|Media Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x2&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| Unknown (always 0?)&lt;br /&gt;
|}&lt;br /&gt;
==TitleProgress==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Length&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#DownloadState|Download State]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Last result code in NIM related to the installation&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| Amount of bytes that have been downloaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| Total bytes that need to be downloaded&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=FRDA:AddFriendOnline&amp;diff=20656</id>
		<title>FRDA:AddFriendOnline</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=FRDA:AddFriendOnline&amp;diff=20656"/>
		<updated>2018-03-17T10:58:24Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* Request */ Oops. My bad, thanks for correcting me Wwylele!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Request=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code [0x04060042]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| principal_id&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0 (one copy handle translation descriptor)&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Event Handle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Response=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Result code&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=FRDA:RemoveFriend&amp;diff=20652</id>
		<title>FRDA:RemoveFriend</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=FRDA:RemoveFriend&amp;diff=20652"/>
		<updated>2018-03-15T16:55:47Z</updated>

		<summary type="html">&lt;p&gt;Unknown: Created page with &amp;quot;=Request= {| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; |- !  Index Word !  Description |- | 0 | Header code [0x04090100] |- | 1 | principal_id |- | 2..3 | u64 friend_code |}  =Response= {|...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Request=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code [0x04090100]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| principal_id&lt;br /&gt;
|-&lt;br /&gt;
| 2..3&lt;br /&gt;
| u64 friend_code&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Response=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Result code&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Friend_Services&amp;diff=20651</id>
		<title>Friend Services</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Friend_Services&amp;diff=20651"/>
		<updated>2018-03-15T16:52:34Z</updated>

		<summary type="html">&lt;p&gt;Unknown: /* &amp;quot;frd:a&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Services]]&lt;br /&gt;
= Friend Service &amp;quot;frd:u&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| [[FRDU:HasLoggedIn|HasLoggedIn]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| [[FRDU:IsOnline|IsOnline]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030002&lt;br /&gt;
| [[FRDU:Login|Login]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| [[FRDU:Logout|Logout]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00050000&lt;br /&gt;
| [[FRDU:GetMyFriendKey|GetMyFriendKey]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00060000&lt;br /&gt;
| [[FRDU:GetMyPreference|GetMyPreference]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00070000&lt;br /&gt;
| [[FRDU:GetMyProfile|GetMyProfile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| [[FRDU:GetMyPresence|GetMyPresence]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00090000&lt;br /&gt;
| [[FRDU:GetMyScreenName|GetMyScreenName]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| [[FRDU:GetMyMii|GetMyMii]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B0000&lt;br /&gt;
| [[FRDU:GetMyLocalAccountId|GetMyLocalAccountId]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| [[FRDU:GetMyPlayingGame|GetMyPlayingGame]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D0000&lt;br /&gt;
| [[FRDU:GetMyFavoriteGame|GetMyFavoriteGame]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E0000&lt;br /&gt;
| [[FRDU:GetMyNcPrincipalId|GetMyNcPrincipalId]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| [[FRDU:GetMyComment|GetMyComment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100040&lt;br /&gt;
| [[FRDU:GetMyPassword|GetMyPassword]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00110080&lt;br /&gt;
| [[FRDU:GetFriendKeyList|GetFriendKeyList]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00120042&lt;br /&gt;
| [[FRDU:GetFriendPresence|GetFriendPresence]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00130142&lt;br /&gt;
| [[FRDU:GetFriendScreenName|GetFriendScreenName]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00140044&lt;br /&gt;
| [[FRDU:GetFriendMii|GetFriendMii]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00150042&lt;br /&gt;
| [[FRDU:GetFriendProfile|GetFriendProfile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00160042&lt;br /&gt;
| [[FRDU:GetFriendRelationship|GetFriendRelationship]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00170042&lt;br /&gt;
| [[FRDU:GetFriendAttributeFlags|GetFriendAttributeFlags]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00180044&lt;br /&gt;
| [[FRDU:GetFriendPlayingGame|GetFriendPlayingGame]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00190042&lt;br /&gt;
| [[FRDU:GetFriendFavoriteGame|GetFriendFavoriteGame]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001A00C4&lt;br /&gt;
| [[FRDU:GetFriendInfo|GetFriendInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001B0080&lt;br /&gt;
| [[FRDU:IsIncludedInFriendList|IsIncludedInFriendList]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001C0042&lt;br /&gt;
| [[FRDU:UnscrambleLocalFriendCode|UnscrambleLocalFriendCode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001D0002&lt;br /&gt;
| [[FRDU:UpdateGameModeDescription|UpdateGameModeDescription]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001E02C2&lt;br /&gt;
| [[FRDU:UpdateGameMode|UpdateGameMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x001F0042&lt;br /&gt;
| [[FRDU:SendInvitation|SendInvitation]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00200002&lt;br /&gt;
| [[FRDU:AttachToEventNotification|AttachToEventNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00210040&lt;br /&gt;
| [[FRDU:SetNotificationMask|SetNotificationMask]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00220040&lt;br /&gt;
| [[FRDU:GetEventNotification|GetEventNotification]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00230000&lt;br /&gt;
| [[FRDU:GetLastResponseResult|GetLastResponseResult]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00240040&lt;br /&gt;
| [[FRDU:PrincipalIdToFriendCode|PrincipalIdToFriendCode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00250080&lt;br /&gt;
| [[FRDU:FriendCodeToPrincipalId|FriendCodeToPrincipalId]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00260080&lt;br /&gt;
| [[FRDU:IsValidFriendCode|IsValidFriendCode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00270040&lt;br /&gt;
| [[FRDU:ResultToErrorCode|ResultToErrorCode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00280244&lt;br /&gt;
| [[FRDU:RequestGameAuthentication|RequestGameAuthentication]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00290000&lt;br /&gt;
| [[FRDU:GetGameAuthenticationData|GetGameAuthenticationData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A0204&lt;br /&gt;
| [[FRDU:RequestServiceLocator|RequestServiceLocator]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002B0000&lt;br /&gt;
| [[FRDU:GetServiceLocatorData|GetServiceLocatorData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002C0002&lt;br /&gt;
| [[FRDU:DetectNatProperties|DetectNatProperties]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002D0000&lt;br /&gt;
| [[FRDU:GetNatProperties|GetNatProperties]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002E0000&lt;br /&gt;
| [[FRDU:GetServerTimeInterval|GetServerTimeInterval]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x002F0040&lt;br /&gt;
| [[FRDU:AllowHalfAwake|AllowHalfAwake]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00300000&lt;br /&gt;
| [[FRDU:GetServerTypes|GetServerTypes]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00310082&lt;br /&gt;
| [[FRDU:GetFriendComment|GetFriendComment]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00320042&lt;br /&gt;
| [[FRDU:SetClientSdkVersion|SetClientSdkVersion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00330000&lt;br /&gt;
| [[FRDU:GetMyApproachContext|GetMyApproachContext]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00340046&lt;br /&gt;
| [[FRDU:AddFriendWithApproach|AddFriendWithApproach]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x00350082&lt;br /&gt;
| [[FRDU:DecryptApproachContext|DecryptApproachContext]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= &amp;quot;frd:n&amp;quot; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00020000&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00030040&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x00040000&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= &amp;quot;frd:a&amp;quot; =&lt;br /&gt;
&lt;br /&gt;
This contains a similar (probably the same) command handler from 0x0001.... to 0x002F.... as them in frd:u. In addition, it also contains&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Command Header&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x04050000&lt;br /&gt;
| Used in creating the user Mii. No cmdbuff parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04060042&lt;br /&gt;
| [[FRDA:AddFriendOnline|AddFriendOnline]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x04090100&lt;br /&gt;
| [[FRDA:RemoveFriend|RemoveFriend]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x040B00C0&lt;br /&gt;
| UpdatePrefrences&lt;br /&gt;
|- &lt;br /&gt;
| 0x040C0800&lt;br /&gt;
| Used in creating the user Mii. 128-byte struct as cmdbuff parameters.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=HTTPS Requests=&lt;br /&gt;
&lt;br /&gt;
==Trusted RootCAs==&lt;br /&gt;
No RootCertChain(s) are used. For the nasc site, friends-module uses [[HTTPC:AddDefaultCert]] with the following certIDs: 0x1, 0x2, and 0x3.&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=FRDA:AddFriendOnline&amp;diff=20650</id>
		<title>FRDA:AddFriendOnline</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=FRDA:AddFriendOnline&amp;diff=20650"/>
		<updated>2018-03-15T16:48:35Z</updated>

		<summary type="html">&lt;p&gt;Unknown: Created page with &amp;quot;=Request= {| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; |- !  Index Word !  Description |- | 0 | Header code [0x04060042] |- | 1 | 0 |- | 2 | principal_id |}  =Response= {| class=&amp;quot;wikitable...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Request=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code [0x04060042]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| principal_id&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Response=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Index Word&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Header code&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Result code&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Unknown</name></author>
	</entry>
</feed>