Line 1: |
Line 1: |
| [[Category:Services]] | | [[Category:Services]] |
| | | |
− | QTM is the [[New_3DS]] system module in charge of handling head tracking. A maximum of three (only two until [[9.3.0-21]]) sessions can be opened for each QTM service. | + | QTM is the [[New_3DS]] system module in charge of handling head tracking. A maximum of three (only two until [[9.3.0-21]]) sessions for *all* QTM services combined. |
| | | |
| Head tracking is not usable when any other process is using any of the cameras, QTM returns error 0xC8A18008 for this. | | Head tracking is not usable when any other process is using any of the cameras, QTM returns error 0xC8A18008 for this. |
| + | |
| + | QTM only tracks the position of the user's two eyes, but does not track the area they are focusing at. Hence, "eye-tracking" is sometimes used to refer to this feature on 3DS, even though it means something else outside the 3DS hacking scene. |
| + | |
| + | Refer to this libctru commit for more details: https://github.com/devkitPro/libctru/commit/8e55cdf05d1f2c07f350ec678d0f0d6a7a2df214 |
| | | |
| =QTM services= | | =QTM services= |
− | {| class="wikitable" border="1" | + | |
− | |-
| + | = QTM user service "qtm:u" = |
− | ! Command Header | + | {| class="wikitable" |
− | ! Description | + | ! Command ID !! Description |
| |- | | |- |
− | | 0x00010080 | + | | 0x00010080 || GetRawTrackingDataEx |
− | | [[QTM:GetHeadtrackingInfoRaw|GetHeadtrackingInfoRaw]] | |
| |- | | |- |
− | | 0x00020080 | + | | 0x00020080 || GetTrackingDataEx |
− | | [[QTM:GetHeadtrackingInfo|GetHeadtrackingInfo]] | |
| |- | | |- |
− | | 0x00030000 | + | | 0x00030000 || EnableManualIrLedControl |
− | | | |
| |- | | |- |
− | | 0x00040000 | + | | 0x00040000 || DisableManualIrLedControl |
− | | | |
| |- | | |- |
− | | 0x00050040 | + | | 0x00050040 || SetIrLedStatus |
− | | (u8 input) | |
| |- | | |- |
− | | 0x00060000 | + | | 0x00060000 || IsCurrentAppBlacklisted |
− | | Writes an output u8 to cmdreply[2]. | |
| |} | | |} |
| | | |
− | The commands under this section are available for all QTM services except for "qtm:c".
| + | = QTM system service "qtm:s" = |
− | | + | "qtm:s" has access to all "qtm:u" commands and more: |
− | = QTM user service "qtm:u" =
| |
− | The commands available for this are exactly the same as the commands listed under the "QTM services" section.
| |
| | | |
− | = QTM system service "qtm:s" =
| + | {| class="wikitable" |
− | {| class="wikitable" border="1" | + | ! Command ID !! Description |
− | |-
| |
− | ! Command Header | |
− | ! Description | |
| |- | | |- |
− | | 0x04010040 | + | | 0x04010040 || SetCentralBarrierPosition |
− | | (float input) | |
| |- | | |- |
− | | 0x04020000 | + | | 0x04020000 || GetCameraLuminance |
− | | Writes float output to cmdreply[2]. | |
| |- | | |- |
− | | 0x04030000 | + | | 0x04030000 || EnableAutoBarrierControl |
− | | | |
| |- | | |- |
− | | 0x04040000 | + | | 0x04040000 || DisableAutoBarrierControl |
− | | | |
| |- | | |- |
− | | 0x04050040 | + | | 0x04050040 || SetBarrierPosition |
− | | (u8 input) | |
| |- | | |- |
− | | 0x04060000 | + | | 0x04060000 || GetCurrentBarrierPosition |
− | | Writes an u8 to cmdreply[2]. | |
| |- | | |- |
− | | 0x04070040 | + | | 0x04070040 || SetIrLedStatusOverride |
− | | (u8 input) | |
| |- | | |- |
− | | 0x040801C0 | + | | 0x040801C0 || SetCalibrationData |
− | | | |
| |- | | |- |
− | | 0x04090000 | + | | 0x04090000 || GetQtmStatus |
− | | Writes an u8 to cmdreply[2]. | |
| |- | | |- |
− | | 0x040A0040 | + | | 0x040A0040 || SetQtmStatus |
− | | (u8 input) | |
| |} | | |} |
| | | |
− | See also the "QTM services" section.
| + | = QTM service "qtm:sp" = |
| + | qtm:sp has access to all "qtm:u", "qtm:s" commands and more: |
| | | |
− | = QTM service "qtm:sp" =
| + | {| class="wikitable" |
− | {| class="wikitable" border="1" | + | ! Command ID !! Description |
| |- | | |- |
− | ! Command Header
| + | | 0x08010040 || NotifyTopLcdModeChange |
− | ! Description
| |
| |- | | |- |
− | | 0x08010040 | + | | 0x08020000 || NotifyTopLcdPowerOn |
− | | (u8 input) Internally compared with 2 | |
| |- | | |- |
− | | 0x08020000 | + | | 0x08030000 || IsExpanderInUse |
− | | Writes 1 to a flag | |
| |- | | |- |
− | | 0x08030040 | + | | 0x08040000 || NotifyTopLcdPowerOff |
− | | Returns a byte loaded from a flag
| |
− | |-
| |
− | | 0x08040000 | |
− | | Writes 1 to a flag | |
| |} | | |} |
| | | |
− | This service has all of the commands listed under the "QTM services" section and the "qtm:s" section, in addition to the above commands.
| + | GSP always keeps an handle to this service open. NS sometimes uses this service (to blacklist some internal test applications, see [[NS_CFA]]), but when it does it opens then immediately closes the session thereafter. |
| | | |
− | This service is used by [[NS]] and [[GSP_Services|GSP]]-module, hence no other processes can use this service until [[9.3.0-21]].
| + | = QTM "hardware check" service "qtm:c" = |
− | | + | {| class="wikitable" |
− | = QTM callibration service "qtm:c" = | + | ! Command ID !! Description |
− | {| class="wikitable" border="1" | |
− | |-
| |
− | ! Command Header | |
− | ! Description | |
| |- | | |- |
− | | 0x00010000 | + | | 0x00010000 || StartHardwareCheck |
− | | InitializeHardwareCheck (sets 0x1EB63410, 0x1EB6342B, 0x1EB6340A to 1) | |
| |- | | |- |
− | | 0x00020000 | + | | 0x00020000 || StopHardwareCheck |
− | | ? (sets 0x1EB6342B, 0x1EB6340A to 0) | |
| |- | | |- |
− | | 0x00030040 | + | | 0x00030040 || SetBarrierPattern |
− | | | |
| |- | | |- |
− | | 0x00040000 | + | | 0x00040000 || WaitAndCheckExpanderWorking |
− | | Writes an output u8 to cmdreply[2]. | |
| |- | | |- |
− | | 0x00050040 | + | | 0x00050040 || SetIrLedStatusOverride |
− | | SetIrLedCheck (u8 input) | |
| |} | | |} |
| | | |
− | The commands for this service are separate from the commands under the "QTM services" section. | + | The commands for this service are separate from all the other services documented above. |