Introducing twlnandtool, a C++ tool inspired from twltool and focused on performance+correctness, targeting TWL NAND and "modcrypt" decryption. Enjoy!
For your DS/DSi homebrew delectation and delight we bring you the latest iteration of our DS libraries now with support for threading and WPA2 capable wifi. See https://devkitpro.org/viewtopic.php?t=9662#p18269 for all the glorious details.
Thanks for your patience and continuing support. Have fun!
Ys X demo is an absolute banger. Looks good, runs well and is really fun.
The demo is also the full game, just cut short at approx 20% of the story with save expected to carry-over, which is insane for a free demo.
Luma3DS v13.2 has been released! Notable features include screen type detection, improving top IPS displays further and playing Super-Stable 3D (followup of my RE work).
tl;dr long post with lots of tech details, skip to bottom for libctru/3ds-examples/Luma3DS commits
So, for the past two weeks, I have been reverse engineering and then documenting the New 3DS's QTM module, responsible for "Super-Stable 3D" and eye tracking, mainly its API and how it interacts with hardware, in as much detail as possible.
eye detection is done by running the inner camera at 30FPS then using gyro data in-between camera samples to circumvent the low camera FPS limitation ; also, eye tracking data reporting API is hardware-agnostic (I think some of it was made with VR headsets in mind, but that's just mere supposition on my part)
"Super-Stable 3D" is just some trigonometry on top of eye tracking, with some assumption based on calibration data (and assuming IOD (interocular distance)=62mm like the rest of the system). Essentially, it computes the horizontal deviation of the midpoints of the positions of the user's eyes from the camera and adjusts the parallax barrier's mask from its center position (from calibration) by as many (iod / 12) = 5.2mm units as needed (assuming optimal viewing distance)
on the hardware side, N3DS SoC and screens work differently from O3DS (this is why downgrading N3DS below 8.x results in 3D not working properly). Using a TI TCA6416A expander (clearly visible in iFixit's teardown article) via I2C, QTM repeatedly writes the parallax barrier's mask pattern (12 bits) and polarity (1 bit), and the negation of both at the following iteration, which are then sent to the LCD controller via a dedicated ribbon cable (don't we all love ribbon cables?). Interestingly, the "O3DS-like" pattern used when SS3D is disabled has a lower slit width (5 iod/12 instead of 6 iod/12)
Following this reverse-engineering work, I've added support for all service commands of all QTM services in libctru, for which v2.4.0 has been released. You can find all the nitty-gritty details of my work by checking the documentation comments inside qtm.h and qtmc.h: https://github.com/devkitPro/libctru/commit/8e55cdf05d1f2c07f350ec678d0f0d6a7a2df214
Big thanks to mtheall for his help on understanding the eye tracking data structure in QMTU_GetTrackingData.
As for the examples, 3ds-examples have been updated (though proper off-axis stereoscopy example with dedicated c3d helper functions is yet to be done): https://github.com/devkitPro/3ds-examples/commit/44faa81d79d5781c0e149e4a7005f2e005edb736
As well as Luma3DS itself for SS3D toggle, barrier position testing and calibration: https://github.com/LumaTeam/Luma3DS/commit/1c737d499f61c67a99f50382ab85f42e2049d53a and https://github.com/LumaTeam/Luma3DS/commit/2aa2013318ff541b94493dd9c73142105324edee