Compare commits

..

608 Commits

Author SHA1 Message Date
yellows8
70ea18a477
ldn: Added *ActionFrame, ldnSetHomeChannel, *TxPower. 2025-06-30 15:48:05 -04:00
MasaGratoR
18002c9735
Update SetSysEdid to include different types of Extension blocks (#677) 2025-06-25 09:08:53 +01:00
ITotalJustice
f094767faf
add usbDsGetSpeed and missing speed enum entries. (#676) 2025-06-25 07:44:46 +01:00
yellows8
1ff513dc17
ldn: Updated docs. 2025-06-24 12:54:32 -04:00
Dave Murphy
2680749e8c
ensure libs rebuilt on code changes 2025-06-24 16:05:12 +01:00
yellows8
dfee0c8ba2
ldn: Added ldnSetProtocol. 2025-06-18 18:17:05 -04:00
Dave Murphy
0a4ac1b87c
remove unused dist-bin target 2025-06-12 16:06:29 +01:00
Dave Murphy
638624cf02
actually install libs too. Closes #681 2025-06-12 08:40:44 +01:00
Dave Murphy
2f471a1c26
remove unused version number in Makefile (#679)
* remove unused version number in Makefile
* add dist-src target using git tag
2025-06-10 18:01:55 +01:00
ndeadly
d1dbd8db51 btdrv: fix struct alignment issue in BtdrvBleEventInfo 2025-06-09 21:26:36 +02:00
XorTroll
de7cfeb3d9
nfp: Improve types and enums 2025-05-18 01:09:53 +02:00
ndeadly
2fc81d8f35 btdrv: label proto_mode field in data_report event info 2025-05-18 01:08:51 +02:00
Luis Scheurenbrand
29f6f4fa7a update capsdc for 18.0.0 2025-05-07 23:19:48 +02:00
ndeadly
b88afc509c btmsys: add missing 13.0.0 commands 2025-05-07 23:19:05 +02:00
ndeadly
ceb7ee1cbf set: update SetSysBluetoothDevicesSettings with new fields found in recent firmwares 2025-05-07 23:18:38 +02:00
ndeadly
0ba4f96bfe btdrv: document timeout parameter to btdrvTriggerConnection 2025-05-07 23:18:16 +02:00
Michael Scire
17bcd07095 fsp-pr: update RegisterProgram for 20.0.0 change 2025-05-07 23:17:19 +02:00
Michael Scire
ce6bc0c3e8 ldr/fsldr: update for 20.0.0 2025-05-07 23:17:19 +02:00
Michael Scire
8f1cce6946 libnx: fix compilation with gcc15 2025-05-07 21:09:09 +02:00
ndeadly
60bf943ec1 btdrv: complete definition of BtdrvBleAdvertisePacketData struct and add supporting enums 2025-01-26 18:57:17 +01:00
ndeadly
0ae0792770 btdrv: update gatt server event names to better reflect usage 2025-01-26 18:57:17 +01:00
ndeadly
953c1b7a8a btdrv: fixed swapped permissions and property parameters for btdrvAddGattCharacteristic function 2025-01-26 18:57:17 +01:00
ndeadly
5da574f852 btdrv: add notes about broken gatt server function implementations 2025-01-26 18:57:17 +01:00
ndeadly
b2d7022e1b btdrv: change argument from service id to server interface for gatt server functions 2025-01-26 18:57:17 +01:00
ndeadly
29a6691b66 hidsys: add commands for setting/checking state of joycons attached via rails 2025-01-26 18:56:58 +01:00
averne
88de3cbea7 nvfence: expose nvhost-ctrl fd 2025-01-25 18:10:36 +01:00
averne
218e3f3a04 nvchannel: fix submit ioctl 2025-01-25 18:10:22 +01:00
MasaGratoR
a063ceb19c Fix wrong names in SetSysModeLine 2024-12-08 20:48:22 +01:00
MasaGratoR
e79dd7ac52
Update setsysEdid struct (#654) 2024-11-26 21:34:21 +01:00
Dave Murphy
2e2b110668
use nproc for max jobs on github workflow (#652) 2024-11-25 00:55:17 +00:00
yellows8
432b4e3900
hid: Use the Npad-revision for 18.0.0+. 2024-11-24 19:34:53 -05:00
ndeadly
eef44aa5e1
btm: add audio profile (#650)
Co-authored-by: ndeadly <24677491+ndeadly@users.noreply.github.com>
2024-11-25 00:31:32 +01:00
yellows8
688e4dd14e
hiddbg: Fixed crash when accessing Hdls tmem. Closes #653. 2024-11-24 16:46:45 -05:00
yellows8
d4f5f4b145
audctl: Updated sysver checks. 2024-11-24 16:19:59 -05:00
yellows8
6c430b273a
capsc: Pass CapsApplicationId/u64 for input as required by sysver. 2024-11-24 15:48:35 -05:00
Michael Scire
58f1fc6561 caps: add fields to AlbumFileId, simplify old invoke 2024-11-24 21:44:07 +01:00
Michael Scire
65c643f149 capsc: account for new command sizes 2024-11-24 21:44:07 +01:00
Michael Scire
73d79d4a0f fs: add GetContentStorageInfoIndex 2024-11-24 21:44:07 +01:00
Michael Scire
163fdddabf fs: add new outsize parameter to fsDeviceOperatorGetGameCardDeviceCertificate 2024-11-24 21:44:07 +01:00
Michael Scire
c7c9617290 switch.ld: fix absolute addressing, incompatible with relr relocations 2024-11-24 21:44:07 +01:00
Michael Scire
250a5777f7 ldr:pm: Update ProgramInfo 2024-11-24 21:44:07 +01:00
Michael Scire
5d5d13c9d6 svc: WaitIfEqual64 is value 3 2024-11-24 21:44:07 +01:00
Michael Scire
2bbf49377e svc: add new info type 2024-11-24 21:44:07 +01:00
Michael Scire
81bed00b5b svc: update WaitForAddress 2024-11-24 21:44:07 +01:00
fincs
8cff58d5af
dynamic: add support for ELF packed relocations (relr) 2024-08-31 00:40:56 +02:00
Irne Racoonovich
d66e3aa487 spl: add missing service header 2024-08-29 21:14:38 +02:00
fincs
7b4e02be35
nwindowReleaseBuffers: cancel dequeued buffer instead of failing 2024-08-19 17:43:51 +02:00
ndeadly
3c851a3443
bt: fill in unknowns and update function parameters to match their btdrv counterparts (#644) 2024-06-28 13:48:22 +01:00
ndeadly
df0508200b
Add missing hid shared memory structures and accessor functions for system buttons (#647)
* hid: add missing shared memory format structures
* hid: add functions for getting the state of the home, sleep and capture buttons from shmem
2024-06-28 13:48:02 +01:00
Dave Murphy
c769852631
update Makefile version 2024-05-31 17:28:15 +01:00
Dave Murphy
e8341a00fe
4.7.0 changelog 2024-05-31 17:22:52 +01:00
Dave Murphy
e570e67704
add changelog for 4.6.0 2024-05-31 17:20:52 +01:00
Michael Scire
bb65fec6eb hidsys: use hosversionBetween 2024-05-30 21:41:06 +02:00
Michael Scire
510d85bf48 hidsys: add version checking to removed commands 2024-05-30 21:41:06 +02:00
Michael Scire
ff2e76daf9 ns: Add version checking for ns:dev commands 2024-05-30 21:41:06 +02:00
Michael Scire
c8c4406467 svc: Add new InfoTypes 2024-05-30 21:41:06 +02:00
Pablo Curiel
b69d2fa95e fs: add GetFileSystemAttribute cmd 2024-05-07 14:58:51 -04:00
averne
919e3d3938 Update for review 2024-02-04 00:57:09 +01:00
averne
b615b01d44 nvchannel: Implement GET_CLK_RATE and SET_SUBMIT_TIMEOUT 2024-02-04 00:57:09 +01:00
averne
be45a91b9c nvchannel: Fix SET_CLK_RATE 2024-02-04 00:57:09 +01:00
Rambo6Glaz
827c6b6ddf Implement IFSDeviceOperator "ChallengeCardExistence" and "GetGameCardDeviceCertificate" 2024-02-04 00:56:19 +01:00
MasaGratoR
ce1f87050d Update SetSysProductModel_Aula comment 2024-02-04 00:11:36 +01:00
Dave Murphy
99edb1c0f0
libnx 4.6.0 2023-12-17 20:21:05 +00:00
ThisALV
7d68ad6bd4
fix: avoid segfault at static dtors (#638) 2023-12-17 14:15:33 +00:00
ITotalJustice
fda4e6b105
add fsDeviceOperatorGetGameCardUpdatePartitionInfo (#635) 2023-11-23 20:46:29 +01:00
yellows8
8d10ef8745
nv: Added __nx_nv_service_type. Closes #633. 2023-11-20 14:12:52 -05:00
Ghabry
a215ae2da2 Add NX_ prefix to PACKED, NORETURN, IGNORE_ARG and DEPRECATED macros 2023-11-20 19:22:12 +01:00
Michael Scire
933c5a12f0 svc: fix query/insecure names 2023-11-01 19:06:56 +01:00
fincs
bb0ae8ac74
libnx v4.5.0 2023-10-27 23:48:15 +02:00
fincs
1bb5a21453
socket: automatically detect and use latest bsdsockets version (fix #551) 2023-10-27 23:46:40 +02:00
yellows8
9439b39631
ssl: Updated sslConnectionSetPrivateOption for 17.0.0. 2023-10-26 14:47:07 -04:00
SciresM
386118d16b
fs: add commands needed for 17.x SubmitFsInfo (#629) 2023-10-26 17:35:37 +02:00
Michael Scire
08373603f7 sf: fix service macro C++ compat 2023-10-25 20:30:24 +02:00
ndeadly
412c48eab5 btdrv: add missing ble definitions
(cherry picked from commit f60935fcc2afc82f20a921284a520dab9c61caab)
2023-10-25 19:21:12 +02:00
liamadvance
0094af6d29 crypto: fix aes-cbc individual block decryption 2023-10-21 21:20:57 +02:00
p-sam
ae491ce57b Add GetPossibleClockRates method for pcv and clkrst 2023-10-21 16:55:34 +02:00
yellows8
94cfa2be1c
ns: Added nsEstimateSizeToMove. 2023-10-20 18:53:41 -04:00
fincs
4ff1c52869 crt0/dynamic: refactoring + add support for reprotecting relro segment 2023-10-21 00:18:04 +02:00
fincs
3a5d0dae35 Linker script refactoring, see details:
- Added separate relro "segment" (introduced by [17.0.0+])
- Reordered sections to better reflect official layout
- Fixed handling of TLS segment alignment
2023-10-21 00:18:04 +02:00
Michael Scire
288a09c4eb uart: use hosversionBetween when possible 2023-10-21 00:18:04 +02:00
Michael Scire
3bb619f46e restrict gpio/uart commands on 17.0.0 2023-10-21 00:18:04 +02:00
Michael Scire
3cb556acb3 ts: update for 17.0.0 2023-10-21 00:18:04 +02:00
Michael Scire
140400d566 svc: add PermissionLocked attribute 2023-10-21 00:18:04 +02:00
Michael Scire
6f9bc920c9 add capsdcShrinkJpeg 2023-10-21 00:18:04 +02:00
Michael Scire
e322bdf82d fs: fix GetProgramId 2023-10-21 00:18:04 +02:00
Michael Scire
e6626a7825 fsldr: update OpenCodeFileSystem for 17.0.0 2023-10-21 00:18:04 +02:00
Michael Scire
25a8f21796 ncm/fs: add new 17.0.0 commands 2023-10-21 00:18:04 +02:00
Michael Scire
cb6f366a2a add static_assert to fs macros 2023-10-12 01:29:03 +02:00
Michael Scire
edc000928b service: Static assert arguments aren't pointers to prevent failure-to-deref 2023-10-12 01:29:03 +02:00
Narr the Reg
4fcdb6eb34 service: hidsys: Implement functions needed by QLaunch 2023-08-12 16:51:58 +02:00
german77
e2424fd8bf service: pctl: Implement functions used by Qlaunch 2023-08-09 18:10:59 +02:00
Narr the Reg
af5072c096 service: nfc: add mifare guard 2023-07-04 23:16:56 +02:00
german77
6bd6fa8907 service: nfc: Implement all interfaces and function calls 2023-06-14 20:40:43 +02:00
Dave Murphy
b954aaf35d
dereference pointer. Closes #612 2023-06-07 16:16:37 +01:00
Dave Murphy
8ce306b9b6
4.4.2 release 2023-05-27 15:24:25 +01:00
Dave Murphy
2e80cf9bba quote timezone to allow +/- & alphanumerics 2023-05-27 16:16:37 +02:00
Dave Murphy
95f973fe98 ensure correct address for __bss_start__ 2023-05-27 16:16:31 +02:00
Dave Murphy
6602c440b4
end compile_commmands generation when elf linked 2023-05-27 10:25:44 +01:00
Dave Murphy
99a29b97ca
ignore more generated files 2023-05-27 10:18:45 +01:00
Dave Murphy
dc0de47eb1
libnx 4.4.1 2023-05-07 22:13:45 +01:00
Dave Murphy
77c2d18046 add missing separator to local path 2023-05-07 18:09:12 +02:00
Dave Murphy
a6686ae27a
libnx 4.4.0 2023-05-07 03:18:32 +01:00
Dave Murphy
8747689be1
gcc 13 fixes (#610) 2023-05-07 03:04:58 +01:00
MasaGratoR
d219884bfa
tmem: Add tmemCloseHandle(), tmemWaitForPermission(), use those functions in nv.c to fix a race condition (#606) 2023-04-14 18:33:16 +02:00
Liam
db592d8aeb usbcomms: expose VID:PID configuration 2023-04-08 17:24:53 +02:00
Liam
9d1fd27b62 usbcomms: add async API 2023-04-08 17:24:53 +02:00
Liam
2e2284109b applet: add appletGetMessageEvent 2023-04-08 17:22:26 +02:00
Dave Murphy
dca4fb772a
Changelog for 4.3.0 2023-04-02 19:19:41 +01:00
Dave Murphy
cbb49e2ce0
libnx v4.3.0 2023-04-02 16:57:13 +01:00
Vinogradov Daniil
4c0991dd88
Added CMSG macros to /sys/socket.h (#605) 2023-04-02 16:43:42 +01:00
Michael Theall
ab2c2fb256 Avoid long connection hang in nxlink 2023-04-02 16:37:05 +02:00
yellows8
c09a21d87d
socket: Fix building without bsd-headers. 2023-03-10 12:30:55 -05:00
yellows8
3332ee2f6f
ssl: minor fix 2023-03-09 23:15:22 -05:00
yellows8
f64d2059c4
ssl: Add support for the new 16.0.0 functionality. 2023-03-09 23:14:40 -05:00
yellows8
8d9959010f
ssl: Updated SslCaCertificateId. 2023-03-09 01:30:45 -05:00
yellows8
f7af27cd21
ssl: Add ssl:s support and sslClearTls12FallbackFlag. 2023-03-09 01:09:21 -05:00
yellows8
c3e110988a
pdm: Updated/fixed sysver compat, updated structs. 2023-03-08 16:31:44 -05:00
yellows8
4ece4e5b8f
pl: Add 16.0.0 sysver checks, etc. 2023-03-07 18:35:32 -05:00
Michael Scire
ee873e34d0 vi: Add 16.x Manager commands
vi: fix duplicate decl of Indirect service

vi: fix style

vi: use s32 over int

vi: fix argument names for FatalDrawRectangle
2023-03-07 23:36:02 +01:00
Michael Scire
b5e47b6b67 fs: update bindings for 16.0.0 changes
fs: add new ContentAttributes enum

fs: add version check

fs: use hosversionBetween
2023-03-07 23:36:02 +01:00
Michael Scire
6175293d0f ncm: Add ActivateFsContentStorage
ncm: update bindings for 16.0.0 changes

ncm: fix missing rename on GetPatchContentMetaId

ncm: they broke serialization ordering by changing type alignment

ncm: remove alignment on content id/placeholder id
2023-03-07 23:36:02 +01:00
averne
ada230a882 audctl: add GetActiveOutputTarget 2023-02-04 16:45:15 +01:00
averne
4d59d366a1 auddev: add GetActiveAudioDeviceName 2023-02-04 16:45:15 +01:00
ndeadly
dcebe96e71
hiddbg: modify hiddbgAttachHdlsWorkBuffer to accept a user-supplied buffer and size (#601)
Co-authored-by: ndeadly <24677491+ndeadly@users.noreply.github.com>
2023-02-02 00:20:48 +01:00
yellows8
174b5066a5
usbhs: Use an user-specified buffer for tmem, etc. 2023-02-01 14:00:33 -05:00
yellows8
7549d3b124
usbhs: Expose the id param, and update a struct. 2023-02-01 13:16:32 -05:00
yellows8
e768ac74f9
usbhs: Added the remaining cmds and expose more functionality, etc. 2023-01-31 21:32:45 -05:00
averne
6ee5d8d148 audctl: fix TargetVolume functions 2023-01-31 21:06:01 -05:00
Pablo Curiel
7caf74af76
Update ncm_types to 15.0.0. (#597) 2022-12-06 12:45:23 +01:00
yellows8
3b2d72a427
error: Add note for errorApplicationCreate. 2022-11-02 22:56:30 -04:00
yellows8
75290f912e
applet: Updated for 15.0.0. Various fixes and added __nx_applet_init_timeout. 2022-11-01 14:27:32 -04:00
yellows8
cea3018de6
result: Add LibnxError_Timeout. 2022-11-01 14:24:22 -04:00
yellows8
5ca15e7696
wlaninf: Add sysver check since this was removed in 15.0.0. 2022-10-22 16:30:42 -04:00
Michael Scire
09338f80b2 bpc: fix GetSleepButtonState/GetPowerButton 2022-10-21 23:51:40 +02:00
fincs
c4c9a6af3c
libnx v4.2.2 2022-10-16 19:39:20 +02:00
yellows8
ac414d2bc5
pdm: Updated sysver checks for 15.0.0. 2022-10-16 12:45:58 -04:00
yellows8
ea145a8d3c
setsys: Updated sysver check for setsysNeedsToUpdateHeadphoneVolume. 2022-10-16 12:45:58 -04:00
fincs
8b77139a04
env: Add support for svc 0x80..0xBF hinting 2022-10-12 19:42:37 +02:00
Michael Scire
de4d19df1a MapDeviceAddressSpace svcs now take option, not perm 2022-10-12 09:03:04 -07:00
Michael Scire
1543e84627 svc: add MapInsecureMemory/UnmapInsecureMemory 2022-10-11 20:18:30 -07:00
yellows8
328d041c5c
swkbd: Fixed height value in swkbdInlineGetTouchRectangles. 2022-10-06 15:22:47 -04:00
averne
1a05cb20a2 Fix typos in swkbd.h 2022-10-06 19:49:54 +02:00
averne
97fef5e48d Fix calculation of the inline swkbd touch rectangle 2022-10-06 19:49:54 +02:00
notaz
d8a4f33192 cache: need an isb barrier on icache invalidate
I don't have a switch but on r-pi4 it's easy to reproduce problems
without this Instruction Synchronization Barrier. Better be safe than
having "fun" dealing with super rare crashes.
2022-08-02 23:06:52 +02:00
averne
8b17648d0b nv: Implement ioctl GET_GPU_TIME 2022-07-02 16:02:01 +02:00
Michael Scire
62755bebe0 svc: fix wrong ids for (Un)MapIoRegion 2022-06-27 17:34:41 +02:00
yellows8
bb42eab289
nifm: Added nifmSetWowlDelayedWakeTime. 2022-06-06 01:50:33 -04:00
yellows8
d33bb0ad6a
nifm/socket: Add nifmRequest sleep/register-socket cmds. 2022-05-31 20:09:26 -04:00
fincs
3a508e13b1
libnx v4.2.1 2022-05-22 16:36:06 +02:00
Dave Murphy
d14f931eab payload can never be NULL 2022-05-02 23:12:56 +01:00
Dave Murphy
bf50bfdbbe disable array bounds checking for __tls_start 2022-05-02 23:11:24 +01:00
yellows8
9865dbf921
btdrv: Updated sysver check for removed cmds in 14.x. 2022-04-07 22:12:26 -04:00
MasaGratoR
a1d6b3be43
ts: Update tsGetTemperatureMilliC (#588)
* ts: Update tsGetTemperatureMilliC for 14.0.0
2022-04-07 21:47:04 -04:00
Michael Scire
d42ddeff78 bpc: add 6.0.0 bpcGetPowerButton, update accessible-firmware comments. 2022-04-07 21:43:32 -04:00
Michael Scire
cdba7dc808 pm: update for 14.0.0 2022-04-07 21:43:32 -04:00
Michael Scire
f9a27d6cc7 svc: add new info type 2022-04-07 21:43:32 -04:00
Michael Scire
f60f82856a cache: set flag in tlr when doing maintenance 2022-04-07 21:43:32 -04:00
yellows8
0a88426a6a
svc: ret for svcCallSecureMonitor is void. 2022-03-06 14:00:40 -05:00
Morph
e6c7ac7c0b fs: Add fsOpenSaveDataInfoReaderWithFilter 2022-03-06 19:20:40 +01:00
yellows8
04aa28c436
nv: Added nvIoctl3, updated _nvGetSessionForRequest, and:
* Check hosver in nvIoctl2.
2022-02-26 12:54:26 -05:00
averne
3d9e1a9c7b Fix MemoryInfo field order 2022-01-29 16:38:34 +01:00
Michael Theall
6d8d9fd2fc Don't apply bold/faint to bg console 2022-01-08 01:07:56 +01:00
yellows8
32370bd19c
fs: Added fsCreate_TemporaryStorage + fixed fsOpen_TemporaryStorage. 2022-01-06 12:20:19 -05:00
yellows8
587115f10a
btm: Fixed backwards sysver check in _btmCmdGetEventOutFlag. 2021-12-09 01:02:47 -05:00
yellows8
4a33b32f43
nfc: Added more cmds, etc. 2021-12-09 01:01:32 -05:00
fincs
74c639ec3a
random.c: Avoid UB type punning that results in miscompilation 2021-12-05 19:31:42 +01:00
Michael Theall
16f8547f4c Add support for SGR 38 and 48
This supports the escape sequences used by fmtlib
2021-11-10 20:38:30 +01:00
yellows8
c208dd0a57
hid: Added the new controllers to HidDeviceType. 2021-11-01 18:15:11 -04:00
fincs
431c99465c
switch.ld: Merge .crt0 into .text 2021-11-01 01:34:06 +01:00
yellows8
93db7abb03
hid: Updated various enums/etc, + support for new controllers. 2021-10-27 16:27:32 -04:00
yellows8
65b8ed5582
Added BITL. 2021-10-27 16:23:56 -04:00
ndeadly
cee75bbe13 hidsys: add some missing unique pad service wrappers 2021-10-04 21:35:15 +02:00
fincs
748cf5ab98
libnx v4.2.0 2021-10-02 16:57:22 +02:00
yellows8
c6dcbdfffb
btm: Updated structs/params for 13.0.0. 2021-09-25 11:01:30 -04:00
ndeadly
b5714296d6 setsys: update SetSysBluetoothDevicesSettings for 13.0.0 2021-09-24 22:59:54 +02:00
yellows8
8db41edc43
psel: Added pselShowUserQualificationPromoter for 13.0.0. 2021-09-24 11:56:15 -04:00
ndeadly
bf2e48e22a
btm: update GetDeviceCondition and GetDeviceInfo service wrappers and related types for 13.0.0 (#576) 2021-09-24 17:35:11 +02:00
p-sam
b35d42faaa hiddbg: fix IsHdlsVirtualDeviceAttached for 13.0.0 2021-09-22 17:32:38 +02:00
yellows8
0cc2da720c
setsys: Updated SetSysNxControllerSettings. 2021-09-19 16:14:17 -04:00
Michael Scire
8daccdf35a ncm: add new 13.0.0 commands 2021-09-18 21:55:14 +02:00
Michael Scire
49507b86a8 svc: add 13.0.0 svc changes 2021-09-18 12:34:58 +02:00
yellows8
369bb31311
btdrv: Added 13.0.0 cmds + minor improvements. 2021-09-18 00:31:53 -04:00
yellows8
0a64ff5af0
setsys: 13.0.0 support 2021-09-17 16:02:49 -04:00
yellows8
4ac0a9ffdc
hidsys: use hosversionBetween 2021-09-17 11:48:09 -04:00
yellows8
8e93933157
hiddbg: hdls 13.0.0 support 2021-09-17 11:23:11 -04:00
yellows8
4ac3b0cec5
hidsys: Check sysver for the removed cmds with 13.0.0. 2021-09-17 01:50:31 -04:00
Sean Maas
960599c4b5 btdrv: fix btdrvRespondToSspRequest for 12.0.0 2021-09-15 12:19:30 -04:00
XorTroll
ade5038282 Fix ldr:ro/ro:1 initialization 2021-09-15 12:18:18 -04:00
fincs
fc2aaefb0f
framebufferCreate: actually set NWindow dimensions (fix #568) 2021-09-13 19:01:34 +02:00
Michael Scire
d90afaacde thread: set arguments/fields before CreateThread 2021-07-20 18:13:10 +02:00
fincs
bee27ba607
libnx v4.1.3 2021-06-25 19:27:05 +02:00
Vicki Pfau
0aba35b3ed Fix inet_pton by passing in base instead of getting it out (#557) 2021-06-24 22:59:28 +02:00
fincs
3c9a623b24
switch.specs: ensure main() is referenced first (fix devkitPro/pacman-packages#237) 2021-06-22 19:45:06 +02:00
fincs
982aef9ea5
sessionmgr: fix deadlock with multiple waiters (fix #556) 2021-06-20 12:39:42 +02:00
fincs
b17873d071
libnx v4.1.0 2021-06-12 16:34:48 +02:00
fincs
cfdd847f11
Add doxygen generation workflow on tag 2021-06-11 17:52:16 +02:00
Dave Murphy
84b92d9e64
use correct badge for github workflow (#555) 2021-06-10 19:47:45 +02:00
ndeadly
373b13b7c0 btm: add BtmDeviceCondition definitions
(cherry picked from commit a598dca0e1d8cb4c4f3c053494048832c05a79ed)
(cherry picked from commit 9736386850dc4b987b095a43eceefc469996b2fa)
2021-06-09 21:32:47 +02:00
ndeadly
58885db2cd btdrv: update bluetooth hid connection event info for 12.0.0 2021-06-02 17:56:55 +02:00
ndeadly
8c8bd9debf btdrv: add bluetooth event info definition for connection event on fw < 9.0.0
(cherry picked from commit 1e7abd975fc906d1a483b33fa86969cb15e93ece)
2021-06-02 17:56:55 +02:00
fincs
4a850437f2
audctl/audrec: fixup 2021-05-31 17:43:02 +02:00
plutoo
5421d1d716 audrec: Fix typo 2021-05-30 17:54:26 -07:00
plutoo
5d95e17f9b switch: Fix documentation comments 2021-05-30 17:53:33 -07:00
plutoo
4b2d111859 audctl: Fix prefix on enum 2021-05-30 17:46:49 -07:00
plutoo
f893c043f7 switch: Add audrec/audctl to default header 2021-05-30 17:33:39 -07:00
plutoo
6ce881b013 audrec: Initial commit 2021-05-30 17:33:26 -07:00
plutoo
a1ddefd3ca audctl: Initial commit 2021-05-30 17:33:11 -07:00
yellows8
f486127615
Bluetooth pr rebased (#552 and #540)
* btdrv: expand upon and refine event data definitions

* btdrv changes for 12.0.0

* btdrv: Various fixes, added enums, etc.

Co-authored-by: ndeadly <24677491+ndeadly@users.noreply.github.com>
2021-05-30 13:47:36 -04:00
Dave Murphy
5d448a1048 remove broken doozer builds 2021-05-24 19:28:05 +01:00
fincs
f47e1d26ec
Remove obsolete reference to 3dmoo carried over from libctru 2021-05-21 23:03:54 +02:00
Pablo Curiel
e604350e9c
crc: allow checksum calculation in blocks. (#550) 2021-05-21 00:07:35 +02:00
Dave Murphy
4bd7863364 add github workflow building 2021-05-20 08:27:51 +01:00
Morph
08e2b2d945
swkbd: Fix several swkbd enums and structs (#549)
* swkbd: Provide more accurate SwkbdInline State descriptions

* swkbd: Correct stringLenMaxExt to stringLenMin

* swkbd: Add setters for stringLenMax/Min in SwkbdAppearArg
2021-05-10 18:16:40 +02:00
Narr the Reg
e2c3ae8e44 hid: Correct some gesture errors
I recently did some RE on touch gestures with the help of a nro I made. I have found that those values where incorrect.
2021-05-04 17:34:34 +02:00
fincs
95fca6753d
virtmem: Allow rng algorithm override 2021-05-02 18:26:40 +02:00
fincs
137f6d1ddc
Make argvSetup overridable 2021-05-02 15:18:11 +02:00
TurtleP
00d1a696b9 add audrvVoiceIsPaused 2021-04-26 20:33:10 +02:00
Pablo Curiel
d6c6431a22
Fix unused parameter warnings in tipc.h when -Wextra is used. (#545)
Removes unused TipcService parameter in tipcMakeRequest and tipcParseResponse.
2021-04-20 20:43:50 +02:00
Michael Scire
f7df9d578c pgl: fix argument order for LaunchProgram on 12.x 2021-04-20 17:38:31 +02:00
yellows8
5509f8f14b
hiddbg: Fix IPC params from the previous commit, closes #543. 2021-04-19 10:33:03 -04:00
yellows8
d54c9f9cc8
hiddbg: hdls 12.0.0 support, closes #542. 2021-04-18 18:35:36 -04:00
averne
5d644b6e82 Fix mm:u on 1.0.0 2021-04-18 19:20:02 +02:00
yellows8
2e2cf43cf5
btdrv: Added support for the new 12.0.0 cmds. 2021-04-16 16:46:45 -04:00
fincs
0d32a2c0d5
sm: docufix 2021-04-11 14:07:42 +02:00
Michael Scire
d6a1ef0af4
pgl: convert to cmif/tipc polyglot 2021-04-11 12:20:08 +02:00
Michael Scire
eb8ee97f1c
smm: support tipc/cmif 2021-04-11 12:20:08 +02:00
fincs
7416b23ef9
sm: update for 12.0.0, tipc 2021-04-11 12:20:07 +02:00
Michael Scire
ebb54a1224
tipc: add cmif-like wrapper 2021-04-11 12:20:06 +02:00
fincs
de97b82bce
envSetup: detect Atmosphère environment using EntryType_HosVersion 2021-04-11 12:20:06 +02:00
Jeremy S. Postelnek
ca9d007bd4
friends: ability to get Friend Code (#539) 2021-04-10 23:14:24 +02:00
Jeremy S. Postelnek
c5a9a909a9
set:sys: add ProductModel enums (#538) 2021-04-02 19:34:40 +02:00
Vicki Pfau
7e29719263 psm: Fix charger definitions 2021-03-30 17:40:05 +02:00
SciresM
f365c9b2b5
htcs: implement hipc bindings (#530) 2021-03-16 23:42:50 +01:00
averne
05744823ac Const request 2021-03-07 19:59:46 +01:00
averne
3374db38a2 Add mm:u service wrappers 2021-03-07 19:59:46 +01:00
averne
3bb44d77b7 Fix nvioctlChannel_Submit syncpt writeback 2021-03-07 19:59:46 +01:00
averne
0716ed6ffd
Add some nvchannel ioctls (#534) 2021-02-28 21:17:57 +01:00
Michael Scire
ae6f69d339 bsd: fix bsdRegisterClient 2021-02-26 17:43:20 +01:00
Michael Scire
c8f8145195 bsd: allow user-specified tmem backing buffer 2021-02-24 17:41:52 +01:00
Michael Scire
38ee48032f sf: add serialization fixes necessary for htcs 2021-02-20 13:16:10 +01:00
yellows8
d4542ec9b0
hiddbg: Added support for SleepButton AutoPilot. 2021-02-13 14:20:44 -05:00
Michael Scire
ae3271ba4c fs: add fsOpenHostFileSystem(WithOption) 2021-02-13 16:46:49 +01:00
yellows8
0f4f0ed039
btdrv: Updated BtdrvFatalReason. 2021-02-12 13:11:57 -05:00
yellows8
3fce0d49e2
time: Fixed signedness issue with time calculation, closes #522. 2021-02-12 12:33:24 -05:00
Michael Scire
c71cd80bcf psc: fix dependency argument on init 2021-02-10 17:31:51 +01:00
yellows8
15a5d1c44f
btdrv: Updated params/docs for btdrvSetBleVisibility. 2021-02-04 11:47:50 -05:00
yellows8
531f9d7921
Updated/added bluetooth structs/enums. Updated docs.
Moved btm types into a dedicated .h.
2021-02-03 14:02:38 -05:00
yellows8
7751df9356
btdrv: Updated param names + docs. 2021-02-02 15:51:31 -05:00
SciresM
e48f1c339f
add hosversionIsAtmosphere (#525) 2021-01-27 23:20:41 +01:00
fincs
076657fd31
Allow user override of dynamic memory allocation functions throughout libnx 2021-01-22 18:37:46 +01:00
yellows8
d813bef54b
btdrv: Added/updated structs/enums for events, etc. 2021-01-19 20:02:01 -05:00
fincs
5057a1912e
nv: Allow user override of transfer memory creation 2021-01-18 20:46:50 +01:00
fincs
d53150f855
thread: Allow user override of automatic stack memory allocation 2021-01-17 17:48:08 +01:00
fincs
109bd683df
hid: Add HidKeyboardKey & hidKeyboardStateGetKey 2021-01-17 17:45:48 +01:00
fincs
649f308d4b
Delete old virtmem API 🦀🦀 2021-01-17 17:05:29 +01:00
fincs
637dd12b2d
Delete old HID API 🦀🦀 2021-01-17 17:05:21 +01:00
yellows8
c8fdae9189
btdrv: Updated/added structs/enums for events, etc. 2021-01-16 13:34:12 -05:00
Luis Scheurenbrand
9e52e55177 avm: fix buffer size for version list import 2021-01-06 20:53:52 +01:00
Luis Scheurenbrand
a1a69ebe09 avm: fix more merge errors 2021-01-06 18:27:12 +01:00
HookedBehemoth
43202cc829
add application version manager service wrapper (#519) 2021-01-06 17:25:29 +01:00
yellows8
110c2f0622
btdrv: Updated docs. 2021-01-05 01:36:29 -05:00
yellows8
348b21def2
btdrv: Updated names for BtdrvHidReportEvent*. 2021-01-03 02:07:17 -05:00
yellows8
2f6fcf7fb2
btdrv: Updated param names/docs. 2020-12-29 20:31:06 -05:00
yellows8
e9ee0b2421
btm/btdrv: Updated param names. 2020-12-29 14:46:10 -05:00
yellows8
a35321b360
hid: Minor Palma improvements. 2020-12-27 00:58:15 -05:00
fincs
73feb933ce
libnx v4.0.0 2020-12-19 17:03:29 +01:00
Tim Gates
8cbd1cf03c docs: fix simple typo, recieve -> receive
There is a small typo in nx/include/switch/runtime/devices/socket.h, nx/include/switch/services/bsd.h.

Should read `receive` rather than `recieve`.
2020-12-19 13:35:29 +01:00
yellows8
3c9e4e2ebc
ns: Use ns:ro if available. 2020-12-17 15:01:46 -05:00
yellows8
d4014bde62
miiLa: Added for support for 10.2.0 functionality + various fixes. 2020-12-17 00:21:47 -05:00
yellows8
0d5dcde5b9
swkbd: Added swkbdInlineGetMiniaturizedHeight. 2020-12-16 20:32:42 -05:00
yellows8
c51918a605
hidLa: 11.0 support and fixed the arg_size value. 2020-12-16 13:24:48 -05:00
yellows8
06d38571b4
libapplet: Added the new 11.0 funcs. 2020-12-15 22:10:58 -05:00
yellows8
55179074cc
web: Added 11.0 webConfigSetTransferMemory(). 2020-12-15 19:22:24 -05:00
Pablo Curiel
41fc8bb17c
fs: Added fsCreateSaveDataFileSystem(), fsDeleteSaveDataFileSystem() and fsDeleteSaveDataFileSystemBySaveDataAttribute(). #518 2020-12-15 17:48:00 +01:00
yellows8
ccec5bd36c
apm/applet: Updated names/docs.
Added AppletWindowOriginMode.
2020-12-15 11:14:35 -05:00
yellows8
d406db725d
applet: Added 11.0 cmds. 2020-12-14 15:32:54 -05:00
yellows8
13716b5e7b
hidsys: Updated ButtonConfig cmds for 11.0.
Removed an extra param from hidsysIsAnyCustomButtonConfigEnabled.
2020-12-12 12:38:13 -05:00
yellows8
c365c1ae68
hid: Minor adjustments. 2020-12-11 15:42:01 -05:00
yellows8
16fb73cc96
hid: Fixed hidKeyboard{Held/Down/Up}. 2020-12-11 15:15:58 -05:00
yellows8
3d003aef39
lp2p: Updated docs. 2020-12-10 23:37:56 -05:00
yellows8
9ede39d15d
lp2p: Updated docs. 2020-12-10 19:44:47 -05:00
fincs
767a7a295c
switch.specs: Disable .interp section, shrink .dynamic section 2020-12-08 21:43:05 +01:00
yellows8
af837185d0
hiddbg: Added HiddbgNpadButton. 2020-12-08 15:24:57 -05:00
masagrator
c3aeb885e7 Fix svcSetHeapSize error in comment section 2020-12-08 12:25:47 +01:00
yellows8
d91a2e22e7
hid: Updated docs. 2020-12-05 01:09:13 -05:00
yellows8
de5e158545
hid: Updated Palma docs. 2020-12-05 00:46:49 -05:00
SciresM
c3b63e8723
svc: add new InfoType_FreeThreadCount (#514) 2020-12-05 03:11:49 +01:00
Michael Theall
1e9fe9b199 usbDsWaitReady: use deadline timeout 2020-12-05 02:42:45 +01:00
HookedBehemoth
f82d97f88a
Add capmtp service wrapper [11.0.0+] (#510) 2020-12-04 21:53:44 +01:00
SciresM
21b0613fa4
usb: add UsbState enum (#512) 2020-12-04 21:13:30 +01:00
yellows8
e8a4f22063
ssl: Updated for 11.0.0. 2020-12-04 13:42:42 -05:00
yellows8
49d7fe81b8
usbds: Fixed usbDsInterface_AppendConfigurationData for 11.0.0. 2020-12-03 23:11:28 -05:00
yellows8
0f38ec8a3d
hidbus: Adjusted out-of-bounds size handling. 2020-12-03 18:03:32 -05:00
SciresM
1291966976
ectx: add ectxrPullContext (#511) 2020-12-03 22:09:06 +01:00
yellows8
0fbbea2c77
lp2p: Updated for [11.0.0+]. 2020-12-03 14:39:55 -05:00
SciresM
2d470ee2af
sm: add smDetachClient (#509) 2020-12-02 17:42:09 +01:00
SciresM
83dc9203dc
usb: update for 11.0.0 (#508) 2020-12-02 17:06:24 +01:00
fincs
ab71d6033a
hid: Read SystemExt/System first in hidScanInput for compatibility with old homebrew 2020-12-01 21:07:03 +01:00
fincs
676f254be1
pad: Fix logic typo 2020-12-01 16:37:01 +01:00
fincs
e904bb05d4
hid: Deprecate old input interface 2020-12-01 13:50:00 +01:00
fincs
d290697bfd
Add pad.h - new wrapper API for reading controller input 2020-12-01 13:50:00 +01:00
yellows8
5551d42b29
hid: Added/updated Palma structs/enums. 2020-12-01 13:50:00 +01:00
yellows8
09bcd32fbc
hid: Updated structs/enums. 2020-12-01 13:50:00 +01:00
yellows8
a45b951db2
hiddbg/hidsys: Updated structs. 2020-12-01 13:50:00 +01:00
yellows8
3a11e1d309
hidbus: Updated structs/enums. 2020-12-01 13:50:00 +01:00
yellows8
5aa8986505
hid: Added support for the Palma cmds. 2020-12-01 13:49:59 +01:00
yellows8
49183c9953
hidsys: Updated the {Home/Sleep/Capture}Button cmds. 2020-12-01 13:49:59 +01:00
yellows8
4010c70b1e
hiddbg: Added support for AutoPilot with the following:
DebugPad, TouchScreen, Mouse, Keyboard.
2020-12-01 13:49:59 +01:00
yellows8
b7e1ec852c
hid: Added DebugPad structs/enums. 2020-12-01 13:49:59 +01:00
yellows8
527b813bcf
notif: Use hidLaShowControllerFirmwareUpdate if needed. 2020-12-01 13:49:59 +01:00
yellows8
baa9dab747
hidsys: Added the following cmds:
hidsysSendKeyboardLockKeyEvent, hidsysGetNpadInterfaceType, hidsysGetNpadLeftRightInterfaceType, hidsysHasBattery, hidsysHasLeftRightBattery, hidsysIsUsbFullKeyControllerEnabled, hidsysEnableUsbFullKeyController, hidsysIsUsbConnected, hidsysIsFirmwareUpdateNeededForNotification.
2020-12-01 13:49:59 +01:00
yellows8
9bc156a42e
hid: Adjusted param for hidSetNpadCaptureButtonAssignment. 2020-12-01 13:49:58 +01:00
yellows8
27b43dc53b
hid: Updated docs. 2020-12-01 13:49:58 +01:00
yellows8
089f9f18ac
hid: Added the following cmds:
hidSendKeyboardLockKeyEvent, hidDisconnectNpad, hidGetPlayerLedPattern, hidSetNpadJoyAssignmentModeSingle, hidStartLrAssignmentMode, hidStopLrAssignmentMode, hidSwapNpadAssignment, hidEnableUnintendedHomeButtonInputProtection, hidSetNpadJoyAssignmentModeSingleWithDestination, hidSetNpadAnalogStickUseCenterClamp, hidSetNpadCaptureButtonAssignment, hidClearNpadCaptureButtonAssignment, hidIsUsbFullKeyControllerEnabled, hidEnableUsbFullKeyController, hidIsUsbFullKeyControllerConnected, hidGetNpadOfHighestBatteryLevel, hidSetNpadCommunicationMode, hidGetNpadCommunicationMode, hidSetTouchScreenConfiguration, hidIsFirmwareUpdateNeededForNotification.
2020-12-01 13:49:58 +01:00
yellows8
004d2f4f63
hid: Moved funcs to match cmd order. 2020-12-01 13:49:58 +01:00
yellows8
d4ccf6ab03
hid: Added the following cmds:
hidIsSixAxisSensorFusionEnabled, hidEnableSixAxisSensorFusion, hidIsSixAxisSensorAtRest, hidIsFirmwareUpdateAvailableForSixAxisSensor.

Minor adjustments.
2020-12-01 13:49:58 +01:00
fincs
eaeabad315
hid: Add hid{Set,Get}NpadHandheldActivationMode 2020-12-01 13:49:58 +01:00
yellows8
639ba8ef78
hidsys: Updated Hidcfg. 2020-12-01 13:49:57 +01:00
yellows8
73768fffa7
hid: Updated docs. 2020-12-01 13:49:57 +01:00
yellows8
d4b3b1e90f
hidbus: Updated HidbusJoyPollingMode. 2020-12-01 13:49:57 +01:00
yellows8
141f1b6e5d
hid: Updated enums. 2020-12-01 13:49:57 +01:00
yellows8
01457fb3b1
hid: Added hidBeginPermitVibrationSession/hidEndPermitVibrationSession. 2020-12-01 13:49:57 +01:00
yellows8
5c7118a003
hid: Added support for GcErm vibration. Minor adjustments. 2020-12-01 13:49:56 +01:00
yellows8
88cae40620
hid: Added/updated enums and updated HidVibrationDeviceInfo. 2020-12-01 13:49:56 +01:00
fincs
8e0c514044
hid: Added pre-made HidNpadStyleSet values for common style sets 2020-12-01 13:49:56 +01:00
yellows8
1aa4ec82fb
hid: Updated docs. 2020-12-01 13:49:56 +01:00
yellows8
a5799c87ed
hid(dbg): Updated docs + minor adjustments. 2020-12-01 13:49:56 +01:00
yellows8
7a8d397d81
hid: Added HidAnalogStickState and updated structs. 2020-12-01 13:49:56 +01:00
yellows8
f784c9a3f3
hid: Updated structs. 2020-12-01 13:49:55 +01:00
yellows8
ff2846e481
hid: Updated docs + minor struct adjustment. 2020-12-01 13:49:55 +01:00
yellows8
9b808793fb
hid: Updated docs + various adjustments. 2020-12-01 13:49:55 +01:00
yellows8
2b7c3fee90
hiddbg: Use structs for handles and various adjustments. 2020-12-01 13:49:55 +01:00
yellows8
215d62966e
hidsys: Added HidsysUniquePadId/HidsysUniquePadSerialNumber.
These are now used where needed. Various adjustments.
2020-12-01 13:49:55 +01:00
yellows8
012e84d7bd
hid: Updated docs. 2020-12-01 13:49:55 +01:00
yellows8
f9f23bef8f
hid: Replaced the lifo layouts/sixaxis arrays with individual fields.
Use the Lark/Lucia enum in the GetNpadStates funcs.
2020-12-01 13:49:54 +01:00
fincs
aa77de9f71
hid: Added HidNpadButton enum 2020-12-01 13:49:54 +01:00
yellows8
3c13d353b0
hid: Updated _hidGetNpadPowerInfo(). 2020-12-01 13:49:54 +01:00
yellows8
9a2fab817d
hid: Fixed docs. 2020-12-01 13:49:54 +01:00
yellows8
7c64b5b70b
hid: Updated HidNpadSystemProperties. 2020-12-01 13:49:54 +01:00
yellows8
912713bda0
hid: Added XcdDeviceHandle. 2020-12-01 13:49:54 +01:00
yellows8
5e03104d1d
hid: Updated structs. 2020-12-01 13:49:53 +01:00
yellows8
dab3750c50
hid: Updated HidMouseButton/HidKeyboardModifier. 2020-12-01 13:49:53 +01:00
yellows8
4149481608
hid: Fix comment. 2020-12-01 13:49:53 +01:00
yellows8
d3838b8e08
hid: Gesture support. Updated HidNpadSystemProperties. 2020-12-01 13:49:53 +01:00
yellows8
324a835b0c
hid: Various fixes. 2020-12-01 13:49:53 +01:00
yellows8
d28776e4d9
hid: Updated/added structs/enums. 2020-12-01 13:49:52 +01:00
yellows8
902af6cce0
hid: Updated structs. 2020-12-01 13:49:52 +01:00
fincs
967a5054a3
hid: Expose InitializeNpad/TouchScreen/Keyboard/Mouse
- Moved hidScanInput-specific initialization code to hidScanInput
- TouchScreen/Keyboard/Mouse are now activated during hidScanInput
  initialization (previously this was not done, which is technically UB)
- Removed hidDeactivateNpad (not called by retail software)
- Tweaks and adjustments to reduce code size when features are not used
2020-12-01 13:49:52 +01:00
yellows8
e4c701dc19
hid: Use _hidGetStates in hidGetSevenSixAxisSensorStates. 2020-12-01 13:49:52 +01:00
yellows8
d4c1d069f1
hid: Added hidGetKeyboardStates, which hidScanInput now uses.
Struct adjustments.
2020-12-01 13:49:52 +01:00
yellows8
52bf73e047
hid: Added hidGetMouseStates, which hidScanInput/etc now uses.
Struct adjustments.
2020-12-01 13:49:52 +01:00
yellows8
dc0bc2ab7b
hid: Fixed memset in hidJoystickRead(). 2020-12-01 13:49:51 +01:00
yellows8
1c82758c03
hid: Added hidGetTouchScreenStates, which hidScanInput now uses.
Struct adjustments.
2020-12-01 13:49:51 +01:00
fincs
2c26092608
hid: Implement hidSixAxisSensorValuesRead using hidGetSixAxisSensorStates + other minor adjustments 2020-12-01 13:49:51 +01:00
yellows8
e32acbeb9f
hid: Added hidGetSixAxisSensorStates.
Internal improvements, etc.
2020-12-01 13:49:51 +01:00
yellows8
16ff35faea
hid: Use structs for vibration/SixAxis handles.
Various internal improvements, andpass vibration handles by value where needed.
2020-12-01 13:49:51 +01:00
fincs
c0ef14fcaa
hid: Changed hidGetNpadStates* to return total_out directly instead of using an output var 2020-12-01 13:49:51 +01:00
fincs
0640c9da76
hid: Introduce HidNpadIdType, see details:
- Replaced most usages of HidControllerID with HidNpadIdType
- HidControllerID still exists for now, and the following functions
  keep accepting it for compatibility with most homebrew:
  - hidIsControllerConnected
  - hidKeysHeld/Down/Up
  - hidJoystickRead
  - hidSixAxisSensorValuesRead
- hidControllerIDTo/FromOfficial renamed to ToNpadIdType/FromNpadIdType
- Updated some comments that were left untouched during previous hid refactoring
- Partial internal refactor of hidGetNpadStates*
2020-12-01 13:49:50 +01:00
fincs
40e5b08f70
Split hidGetNpadControllerColor/PowerInfo into Single/Split variants 2020-12-01 13:49:50 +01:00
yellows8
3f4f6dba44
hid: Handle NULL with hidGetNpadStates*() total_out.
Use const for hidSetSupportedNpadIdType().
2020-12-01 13:49:50 +01:00
yellows8
82bc8bf648
hid: Updated docs. 2020-12-01 13:49:50 +01:00
yellows8
a924fac0ab
hid: Filled in the Gc trigger fields. 2020-12-01 13:49:50 +01:00
yellows8
5aaf6905dd
hid: Docs updated. 2020-12-01 13:49:50 +01:00
yellows8
9f13045546
hid: Added support for NpadGc.
Struct adjustments.
2020-12-01 13:49:49 +01:00
yellows8
7340772267
hid: Internal state reading improvements.
Struct adjustments.
2020-12-01 13:49:49 +01:00
yellows8
21647a76c8
hid: Added support for *Lark/Lucia.
Struct adjustments.
2020-12-01 13:49:49 +01:00
yellows8
ce20e14034
hid: Added hidGetNpadStatesPalma. 2020-12-01 13:49:49 +01:00
yellows8
46377bc180
hid: Added handling for NpadSystem(Ext).
Added hidGetNpadStatesSystemExt/hidGetNpadStatesSystem, and functionality for using these in hidScanInput().

Updated a struct.
2020-12-01 13:49:49 +01:00
yellows8
db39de34c5
hid: Replaced various funcs with versions which read from sharedmem.
* Various struct adjustments.
* Removed HidControllerLayoutType/hidSetControllerLayout/hidGetControllerLayout, since these are no longer used.
* Added HidNpadJoyAssignmentMode and hidGetNpadJoyAssignment.
* Replaced hidGetControllerFlags with hidGetNpadSystemProperties/hidGetNpadSystemButtonProperties.
* Added hidGetAppletFooterUiAttributesSet/hidGetAppletFooterUiTypes.
* hidScanInput() now uses hidGetNpadStates*() as determined by the output from hidGetNpadStyleSet().
2020-12-01 13:49:48 +01:00
yellows8
1e3145f81d
hid: Struct adjustments. 2020-12-01 13:49:48 +01:00
yellows8
54a296bc69
hid: Updated HidSharedMemory. 2020-12-01 13:49:48 +01:00
yellows8
c3a6d29cf4
hid: Added KEY_NES_HANDHELD_LEFT_B. 2020-12-01 13:49:48 +01:00
yellows8
991a262e19
hid: Replaced HidControllerType with HidNpadStyleTag.
HidNpadStyleTag now includes more controllers.

Replaced hidGetControllerType with hidGetNpadStyleSet().

Improved _hidGetDeviceHandles(), more controllers are now supported.
2020-12-01 13:49:48 +01:00
yellows8
e74c605a91
hid: Fixed HidNpadInterfaceType. 2020-12-01 13:49:48 +01:00
yellows8
ddc9538b69
hid: Updated/added structs and added hidGetNpadStates*(). 2020-12-01 13:49:47 +01:00
fincs
74b295827f
Add svcGetResourceLimitPeakValue [11.0.0+] 2020-12-01 13:49:15 +01:00
SciresM
8ce231e7c9
ldr: update SetProgramArguments for 11.0.0 abi change (#507) 2020-12-01 12:01:33 +01:00
Michael Scire
e5ae43f4c2 results: use R_VALUE for comparisons 2020-12-01 02:26:26 +01:00
Luis Scheurenbrand
c95b46c053 news: fix structs 2020-11-18 19:16:32 +01:00
averne
2fdae0db52
Add service wrappers for ins:r and ins:s (#502) 2020-11-08 00:28:20 +01:00
fincs
091f88915d
virtmemRemoveReservation: add forgotten mutex note to docs 2020-10-31 14:06:48 +01:00
fincs
22a3efcbe1
virtmem: Deprecate virtmemReserve/virtmemFree 2020-10-30 16:10:52 +01:00
fincs
8310f438ca
virtmem: Add memory reservation system
jit: Use virtmemFindCodeMemory on both codepaths; use virtmem reservations
in order to support the JitType_SetProcessMemoryPermission codepath
2020-10-30 16:07:38 +01:00
fincs
490d96e6eb
virtmem: Add virtmemFindCodeMemory to work around a quirk in 1.x kernel 2020-10-30 00:16:03 +01:00
fincs
eecf2a9d32
Add detectMesosphere() 2020-10-29 16:52:16 +01:00
fincs
970d982e57
Add diagAbortWithResult, see details:
- This is a (weak/overridable) function meant to be called when the
  program encounters an unrecoverable error, but it's not fatal enough
  to bring down the entire system with it.
- The default implementation uses svcBreak, passing the result code
  in the user buffer.
- Replaced all usages of fatalThrow with diagAbortWithResult throughout
  the entire library.
2020-10-29 13:40:35 +01:00
fincs
a05a44fca8
virtmem: Major rewrite to support ASLR, see details:
- Added virtmemLock/Unlock, needed for atomic find-and-map operations
- Added virtmemFindAslr, which looks for a random free area in AslrRegion
  - virtmemReserve still exists for legacy callers who rely on sequential
    allocation in order to avoid race conditions from concurrent uses
- Added virtmemFindStack, which searches within StackRegion instead
  - Removed virtmemReserveStack/FreeStack
- Changed shmem/thread/tmem/codememory-jit to use the new virtmem API
  - Legacy jit still uses virtmemReserve
2020-10-27 12:27:32 +01:00
fincs
e655b48c41
crt0: clean up/refactor; envSetup: properly detect NSO/NRO environment... 2020-10-27 12:27:32 +01:00
fincs
7c6d7849f5
Remove obsolete kernel detection code 2020-10-27 12:27:32 +01:00
fincs
8d51f7de1c
jit: Transfer the responsibility of detecting whether CodeMemory syscalls are available/usable to the homebrew environment 2020-10-27 12:27:31 +01:00
fincs
d0d64ce1ce
fatalThrow: use hosversion instead of kerneldetect (and remove old alias) 2020-10-27 12:27:31 +01:00
fincs
4c6abe1e41
svcBreak: fix prototype, add and use BreakReason enum 2020-10-27 12:27:31 +01:00
fincs
e0c1dfe2ce
Add light event synchronization primitive [4.0.0+] 2020-10-27 12:27:20 +01:00
Michael Scire
dee3a7a241 gpio: loosen sysver restriction on OpenSession 2020-10-26 11:55:03 +01:00
Michael Scire
0ff42ee69e gpio: implement majority of the service 2020-10-26 11:48:07 +01:00
yellows8
8718c145f6
lp2p: Updated docs. 2020-10-25 19:55:33 -04:00
yellows8
8a31abeea7
Added lp2p. 2020-10-25 14:00:44 -04:00
averne
022887ac2d Fix event handle retrieval in spl 2020-10-04 00:20:16 +02:00
Vicki Pfau
4afec4016d psm: Add more battery functions 2020-09-28 00:36:35 +02:00
yellows8
f01fb21da5
Added uart. 2020-09-12 18:53:30 -04:00
yellows8
ab59dfb5bb
btdrv: Updated docs for BtdrvBluetoothPropertyType_Unknown3. 2020-09-04 11:59:35 -04:00
yellows8
625616bd44
btm: Update the right struct, BtmDeviceInfoList. 2020-08-26 19:10:38 -04:00
yellows8
9febf780b1
btm: Updated BtmDevicePropertyList. 2020-08-26 19:03:55 -04:00
yellows8
cc2be8375a
btm: Updated BtmHostDeviceProperty. 2020-08-26 12:28:32 -04:00
yellows8
cccef0c525
audout: Properly pass the aruid in audoutOpenAudioOut, fixes #197. 2020-08-21 13:32:31 -04:00
yellows8
ac8ac4919e
set: Updated for [10.1.0+], added more cmds, use struct for nickname. 2020-08-20 23:20:10 -04:00
yellows8
797cdffb14 btdrv: Updated BtdrvBleScanResult. 2020-08-20 18:38:55 -04:00
yellows8
5820178f56 btdrv: Updated param order. 2020-08-20 18:38:55 -04:00
yellows8
89358ba98c btdrv: Use const for btdrvWriteHidData/btdrvSetHidReport. 2020-08-20 18:38:55 -04:00
yellows8
c669589a35 bluetooth: Updated params, improved docs, etc. 2020-08-20 18:38:55 -04:00
yellows8
8718ea3659 Added btdev. 2020-08-20 18:38:55 -04:00
yellows8
4fae8554f7 btdrv/btm: Updated/added various structs. 2020-08-20 18:38:55 -04:00
yellows8
4db3c621e8 set: Use BtdrvAddress. 2020-08-20 18:38:55 -04:00
yellows8
3b670bc652 btdrv: Added the remaining cmds, various fixes, and added a types .h. 2020-08-20 18:38:55 -04:00
yellows8
ab9ce7c330 btdrv: Added support for pre-4.0.0, etc. 2020-08-20 18:38:55 -04:00
yellows8
8789077bb8 btm: Added the aruid cmds. 2020-08-20 18:38:55 -04:00
yellows8
070e959609 btm: Added more cmds. 2020-08-20 18:38:55 -04:00
yellows8
abf3600724 Added btm, moved btmu structs into btm, and updated docs. 2020-08-20 18:38:55 -04:00
yellows8
5551fcfab6 btmu/btdrv: Use bool flag where needed and updated docs. 2020-08-20 18:38:55 -04:00
yellows8
1442280447 btmu: g_btdrvIBtmUserCore -> g_btmuIBtmUserCore 2020-08-20 18:38:55 -04:00
yellows8
e7fbdf9eb1 Added btmsys. 2020-08-20 18:38:55 -04:00
yellows8
6ad9bd15d5 btmu: Updated docs. 2020-08-20 18:38:55 -04:00
yellows8
4e0fcb105d btdrv/btmu: Updated structs. 2020-08-20 18:38:55 -04:00
yellows8
94464baf38 btdrv/btmu: Various improvements. 2020-08-20 18:38:55 -04:00
yellows8
9439243649 Added btmu and added btdrv structs. 2020-08-20 18:38:55 -04:00
yellows8
a771f06a0e btdrv: Fixed btdrvGetHidReport IPC, updated docs, and added an enum. 2020-08-20 18:38:55 -04:00
yellows8
354e7d84fd btdrv: Added btdrvTriggerConnection. 2020-08-20 18:38:55 -04:00
yellows8
bc16eb227b btdrv: Updated the BtdrvBleAdvertisePacketData struct. 2020-08-20 18:38:55 -04:00
yellows8
045f6477d9 btdrv: Added cmds:
btdrvSetBleVisibility, btdrvSetBleAdvertiseData, btdrvSetBleAdvertiseParameter, btdrvRegisterGattClient, btdrvUnregisterGattClient, btdrvUnregisterAllGattClients, btdrvGetGattAttribute, btdrvGetGattService, btdrvRegisterGattServer, btdrvUnregisterGattServer, btdrvConnectGattClient, btdrvDisconnectGattClient, btdrvAddGattService, btdrvEnableGattService, btdrvAddGattCharacteristic, btdrvAddGattDescriptor, btdrvGetBleManagedEventInfo, btdrvGetGattFirstCharacteristic, btdrvGetGattNextCharacteristic, btdrvGetGattFirstDescriptor, btdrvGetGattNextDescriptor, btdrvRegisterGattManagedDataPath, btdrvUnregisterGattManagedDataPath, btdrvRegisterGattHidDataPath, btdrvUnregisterGattHidDataPath, btdrvRegisterGattDataPath, btdrvUnregisterGattDataPath.
2020-08-20 18:38:55 -04:00
yellows8
e0ee2ffc86 btdrv: Added btdrvGetEventInfo/btdrvGetHidEventInfo, etc. 2020-08-20 18:38:55 -04:00
yellows8
0075672b93 btdrvGetLeEventInfo -> btdrvGetLeHidEventInfo 2020-08-20 18:38:55 -04:00
yellows8
b15a583b80 btdrv: Added more cmds and the required enum:
btdrvGetLatestPlr, btdrvEnableTxPowerBoostSetting, btdrvIsTxPowerBoostSettingEnabled, btdrvEnableAfhSetting, btdrvIsAfhSettingEnabled, btdrvGetChannelMap, btdrvMoveToSecondaryPiconet, btdrvIsManufacturingMode, btdrvEmulateBluetoothCrash, btdrvGetBleChannelMap.
2020-08-20 18:38:55 -04:00
yellows8
b18912980e btdrv: Added HidReportEventInfo support. 2020-08-20 18:38:55 -04:00
yellows8
2878b97f3a btdrv: Added cmds:
btdrvGetAdapterProperties, btdrvGetAdapterProperty, btdrvSetAdapterProperty, btdrvWriteHidData, btdrvWriteHidData2, btdrvSetHidReport, btdrvGetHidReport.

Added/updated the required enum/struct.

bt(drv): Updated docs.
2020-08-20 18:38:55 -04:00
yellows8
7e06e0e657 btdrv: Use InitializeBluetoothDriver during init. 2020-08-20 18:38:55 -04:00
yellows8
a5e8572019 Added initial bluetooth support. 2020-08-20 18:38:55 -04:00
yellows8
bcc0f86aa3
hidbus/ringcon: Fixed cleanup, this also fixed a crash. 2020-08-20 13:28:26 -04:00
HookedBehemoth
9a1e3aeb47
add news service wrapper (#493) 2020-08-04 19:37:34 +02:00
fincs
1b95c09a27
switch.ld: update init_array/fini_array handling for latest devkitA64 2020-07-25 18:26:33 +02:00
Adubbz
ed16b7f948 hiddbg: implement DeactivateHomeButton 2020-07-07 12:35:37 +02:00
SciresM
b8a095ac2f
fs: add missing AccessLog functions. (#491) 2020-07-03 00:03:36 +02:00
Michael Scire
e36c7a760f err: add ErrorContextType enum 2020-06-27 12:52:01 +02:00
yellows8
e2db987144
web: Added WebSession support. 2020-06-24 10:39:18 -04:00
yellows8
6620dfaa6f
applet: Added get-event funcs:
appletHolderGetExitEvent and expose appletHolderGetPopInteractiveOutDataEvent.
2020-06-24 10:35:30 -04:00
yellows8
a0ce273019
ssl: Improved docs. 2020-06-21 13:16:34 -04:00
Ezekiel Bethel
d0a7c6a2a5
fix return value of romfs_stat for non-existent files/directories (#488) 2020-06-18 10:58:12 +01:00
yellows8
044eac2f3d
web: Updated for 10.x. 2020-06-15 15:40:05 -04:00
yellows8
3d4f61735a
swkbd: Updated for 10.x and added:
swkbdInlineGetMaxHeight, swkbdInlineGetTouchRectangles, swkbdInlineIsUsedTouchPointByKeyboard.
2020-06-14 00:03:19 -04:00
yellows8
42568d6af8
swkbd: Adjusted the order in the .h. 2020-06-11 22:51:48 -04:00
yellows8
857e2f5c4d
swkbd: Added proper support for using SwkbdInlineMode_UserDisplay. 2020-06-11 22:40:14 -04:00
yellows8
29dd63e5db
Added support for nifmLa. Added nifmRequestGetAppletInfo. 2020-06-11 19:00:07 -04:00
yellows8
05badbdc29
miiLa: Minor docs adjustment. 2020-06-09 22:03:17 -04:00
yellows8
7940d8e9e1
Added support for the miiLa libapplet (MiiEdit). 2020-06-09 22:01:15 -04:00
yellows8
9dc185ba3c
Added support for libapplet nfpLa (amiibo). 2020-06-06 22:40:28 -04:00
HookedBehemoth
ac468913e4
add commands for accessing process storage (#485) 2020-06-06 15:13:23 +02:00
yellows8
eb9d377320
hid: Implemented the remaining functionality for supporting SevenSixAxisSensor, and added the required structs. Updated hidInitializeSevenSixAxisSensor for the [10.0.0+] change. 2020-06-01 12:11:24 -04:00
fincs
bce0ea871d
libnx v3.3.0 2020-05-27 16:52:38 +02:00
Dave Murphy
db795f42ad fix stat for romfs directories 2020-05-27 14:59:43 +02:00
Ezekiel Bethel
573e2f772c add lstat to fs_dev and romfs_dev 2020-05-26 17:32:54 +02:00
yellows8
17ebe4104a
ldn: Updated structs. 2020-05-24 12:34:43 -04:00
yellows8
ff931da962
ldn: Updated structs etc. 2020-05-19 17:30:50 -04:00
yellows8
6e92692043
ldn: Updated LdnNetworkInfo struct. 2020-05-18 22:46:53 -04:00
yellows8
07ba98b702
ldn: Filled in LdnAcceptPolicy, updated LdnNetworkInfo, and updated docs. 2020-05-18 16:02:41 -04:00
yellows8
2f25c57d0e
ldn: Updated structs. 2020-05-18 14:57:22 -04:00
yellows8
55c0205de0
ldn: Updated structs and docs. 2020-05-18 12:51:14 -04:00
yellows8
7bf43fefea
ldn: Updated structs/docs. 2020-05-17 19:54:25 -04:00
yellows8
02ed902558
Added support for ldn. 2020-05-17 15:49:23 -04:00
Michael Scire
3d726ed78c mutex: rewrite to optimize 2020-05-17 17:46:59 +02:00
yellows8
3c08ce6936
nifm: Added support for IRequest. 2020-05-12 23:32:20 -04:00
fincs
d1f4b11f9a
libnx v3.2.0 2020-05-11 20:28:37 +02:00
Michael Scire
4f401256b0 psc: correct version for pscPmModuleAcknowledge 2020-05-07 12:29:43 +02:00
yellows8
3971f3e053
ssl: Updated docs. 2020-05-05 21:51:40 -04:00
yellows8
de27e7b171
ssl: Improved docs. 2020-05-03 12:43:29 -04:00
Dave Murphy
c7130a785a fix string truncation warning 2020-05-03 00:58:03 +02:00
Dave Murphy
5b879cbb0e remove unreferenced struct 2020-05-03 00:58:03 +02:00
yellows8
2e41795194
ssl: Improved docs. 2020-05-02 12:02:22 -04:00
yellows8
bcdbd89292
ssl: Updated docs. 2020-05-01 22:49:51 -04:00
yellows8
8fcd1b2afa
ssl: Improved docs. 2020-04-30 12:26:43 -04:00
yellows8
ea77c1d4cb
ssl: Improved the SslVersion enum and updated the param type for sslCreateContext. 2020-04-29 12:26:44 -04:00
yellows8
3f5362a7bb
ssl: Updated docs. 2020-04-28 00:36:24 -04:00
fincs
b0494c1acb
Update outdated comments and naming in jit.h/c 2020-04-27 13:46:55 +02:00
Adubbz
dbc4b759e2 set: fix GetGyroscopeOffset 2020-04-26 16:52:28 +02:00
yellows8
3b2b3ebad4 socket-ssl: Updated docs. Check for output sockfd=-1 from the cmd with socketSslConnectionSetSocketDescriptor. 2020-04-24 16:39:22 -04:00
yellows8
41e90ef8b5 ssl: Updated params and docs + various improvements. Added sslConnectionGetServerCertDetail and the required structs. 2020-04-24 16:39:22 -04:00
yellows8
41aefdc5ee ssl/socket: Added socketSslConnectionSetSocketDescriptor/socketSslConnectionGetSocketDescriptor wrappers, and updated ssl for this. 2020-04-24 16:39:22 -04:00
yellows8
613fa855da ssl: Implemented the remaining ISslConnection cmds. Expose the total_out param for sslGetCertificates. Various improvements / updated docs. 2020-04-24 16:39:22 -04:00
yellows8
60e4ee04b0 Added initial support for the ssl service. 2020-04-24 16:39:22 -04:00
HookedBehemoth
8e245a0ba8
add capssc 1201-1203 debug calls (#408) 2020-04-24 22:10:42 +02:00
SciresM
8cbac97466
capssc: Add CaptureJpegScreenShot (#407) 2020-04-23 00:07:03 +02:00
yellows8
20fd5bb9a2
nacp: Updated the nacp struct, and added/updated structs for it. 2020-04-20 20:05:31 -04:00
yellows8
cc7fb493e1
hidsys: Added support for all of the [10.0.0+] ButtonConfig cmds, and the required enum/structs. 2020-04-20 18:46:42 -04:00
SciresM
06bebed819
caps: correct CapsScreenShotDecodeOption (#406) 2020-04-20 18:56:31 +02:00
Michael Scire
6fae441714 ns: fix appman getter funcs on 3.0.0-5.0.2 2020-04-20 12:36:50 +02:00
fincs
a1af4494bf
Add nvGpuChannelGetErrorInfo, see details:
- Rename NvError(Type) to NvNotification(Type)
- Introduce NvError struct (output of GetErrorInfo)
- Add nvioctlChannel_GetErrorInfo
2020-04-19 22:18:45 +02:00
fincs
f5e4615a40
nvChannelClose: cleanup fixes 2020-04-19 22:15:32 +02:00
fincs
dc20bf67e9
nvGpuChannelCreate: make channel priority configurable 2020-04-19 22:14:53 +02:00
yellows8
0de0dfdd8d
swkbd: Use appletHolderPresetLibraryAppletGpuTimeSliceZero on [10.0.0+] in _swkbdInlineLaunch. In _swkbdInlineLaunch, use appletHolderClose if needed when errors occur. 2020-04-18 13:25:21 -04:00
yellows8
1925e32c6d
applet: Added support for most of the [10.0.0+] cmds: appletCancelCpuBoostMode, appletActivateMigrationService, appletDeactivateMigrationService, appletCreateManagedDisplaySeparableLayer, appletSetManagedDisplayLayerSeparationMode, appletHolderPresetLibraryAppletGpuTimeSliceZero, appletRequestToSleep, appletApplicationRequestApplicationSoftReset, appletApplicationRestartApplicationTimer, appletSetApplicationMemoryReservation, appletShouldSetGpuTimeSliceManually, appletIsHealthWarningRequired, appletIsHomeButtonShortPressedBlocked. 2020-04-18 13:21:39 -04:00
shchmue
e79c8a2467
Add new 10.0.0 settings calls (#404) 2020-04-18 00:45:53 +02:00
yellows8
b1b80f5493
pdm: Updated for [10.0.0+]. 2020-04-17 14:17:30 -04:00
fincs
4b7921a221
Make nxlink stdio more flexible, see details:
- Added nxlinkConnectToHost with separate flags for redirecting stdout/err
- Added nxlinkStdioForDebug, which only redirects stderr
- (nxlinkStdio now just calls nxlinkConnectToHost)
2020-04-17 16:46:54 +02:00
fincs
4c9b2ac048
Separate debug console code from normal console code, see details:
- consoleDebugInit now lives in a separate source code file
- The devoptab for debugDevice_CONSOLE is now loaded weakly, so that
  normal console code isn't linked in by explicit means
- consoleInit no longer sets up stderr. If stderr to console is desired,
  explicitly use consoleDebugInit(debugDevice_CONSOLE)
- This change makes it possible to use debugDevice_SVC without linking
  in the entire console runtime, which in turn also enabled default
  native window handling (and this can be undesirable)
2020-04-17 16:46:40 +02:00
XorTroll
763b1694ec
Add mii and miiimg services (#402) 2020-04-17 01:28:53 +02:00
Michael Scire
0b93435a44 lr: add lrLrEraseProgramRedirection 2020-04-16 21:24:49 +02:00
Michael Scire
d4c278cf00 pm: rename EnableApplicationExtraThread 2020-04-16 21:24:49 +02:00
Michael Scire
f86dc2ceba pgl: implement full api 2020-04-16 21:24:49 +02:00
yellows8
db14e06fb2
Added a sysver-check for appletOpenMainApplication, it was removed with [10.0.0+]. Added a required-sysver comment for ldrPmSetEnabledProgramVerification. 2020-04-16 13:54:44 -04:00
yellows8
ab715a9a49
bpc: Added a required-sysver check for bpcGetSleepButtonState which was missing. 2020-04-16 13:46:55 -04:00
yellows8
3a22332630
ns: Added/updated required-sysver checks as needed by [10.0.0+], and added nsdevLaunchApplicationFromHost. 2020-04-16 12:38:46 -04:00
HookedBehemoth
a272fa75b9
make pl:s accessible (#400) 2020-04-15 18:18:14 +02:00
Michael Scire
7e581f6110 fix if spacing 2020-04-14 21:29:38 +02:00
Michael Scire
e09ce419ac svc: real definition for 10.x QueryIoMapping 2020-04-14 21:29:38 +02:00
Michael Scire
cb7c1f87a8 svc: QueryIoMapping ABI change in 10.x 2020-04-14 21:29:38 +02:00
Michael Scire
02e4aad9dc pgl: add pglTerminateProcess 2020-04-14 21:29:38 +02:00
Michael Scire
27b34533ac ldr: add ldrPmSetEnabledProgramVerification 2020-04-14 21:29:38 +02:00
Michael Scire
af051c8301 fsp-pr: SetEnabledProgramVerification removed in 10.0.0 2020-04-14 21:29:38 +02:00
Michael Scire
fa0234efff fsldr: update for 10.0.0 2020-04-14 21:29:38 +02:00
yellows8
ca6a48d2b6
irs: Fixed the sysver handling in _irsInitialize(), previously only the values for [4.0.0+] would be used when running on [4.0.0+]. 2020-04-11 23:16:20 -04:00
SciresM
966edb1f0f
set: fix SetRegion, setsysGetSerialNumber (#397) 2020-04-12 03:14:36 +02:00
yellows8
0a9f8261cb
svc: Fixed off-by-one in syscall-number docs. 2020-04-11 15:25:00 -04:00
yellows8
f4c3b288fd
nifm: Added nifmGetCurrentNetworkProfile, nifmGetNetworkProfile, nifmSetNetworkProfile, nifmGetCurrentIpConfigInfo. Internal nifmGetCurrentIpAddress improvements. Added structs: NifmIpV4Address, NifmIpAddressSetting, NifmDnsSetting, NifmProxySetting, NifmIpSettingData, NifmWirelessSettingData, NifmSfWirelessSettingData, NifmSfNetworkProfileData, NifmNetworkProfileData. Various improvements / improved docs. 2020-04-11 13:00:06 -04:00
fincs
fbd97a1fc3
time: minor cleanup in steady clock timepoint calculation 2020-04-11 00:20:21 +02:00
fincs
39629f5a67
timeGetCurrentTime: add shared memory support [6.0.0+] 2020-04-11 00:16:07 +02:00
fincs
b0d96342e8
time: Add timeGetStandardSteadyClockInternalOffset [3.0.0+] 2020-04-11 00:13:21 +02:00
fincs
b4db31e536
time: Expose TimeStandardSteadyClockTimePointType, correct TimeSystemClockContext 2020-04-11 00:08:12 +02:00
fincs
b18ae1c884
time: Add timeGetStandardSteadyClockTimePoint (uses sharedmem on 6.x+, ISteadyClock prior to 6.x) 2020-04-10 19:42:31 +02:00
fincs
2edfb7cc56
time: Retrieve and expose shared memory [6.0.0+] 2020-04-10 17:18:12 +02:00
fincs
bf5331d178
shmemMap: Fix invalid libnx result 2020-04-10 17:16:57 +02:00
yellows8
5e95507cbc
bsd/sockets: Added actual support for recvmsg/sendmsg and sendmmsg/recvmmsg, on [7.0.0+]. 2020-04-09 13:15:07 -04:00
SciresM
4746827513
thread: add threadGetSelf(), add main thread to thread list. (#392) 2020-04-07 01:47:06 +02:00
HookedBehemoth
7dbb90ee66
add remaining IAudioOut commands (#393) 2020-04-06 23:29:27 +02:00
XorTroll
77022a6d11
Fix nfp OpenApplicationArea command (#391) 2020-04-05 13:54:47 -04:00
fincs
d9c3593183
libnx v3.1.0 2020-04-04 23:43:23 +02:00
yellows8
0723df74dd
irs: Updated the IrsPointingProcessorMarkerState struct. 2020-04-04 14:12:26 -04:00
yellows8
c82c8b8760
fs/fs_dev: Added fsOpenReadOnlySaveDataFileSystem and fsOpen_SaveDataReadOnly/fsdevMountSaveDataReadOnly. Minor adjustments. 2020-04-03 19:58:40 -04:00
yellows8
fa52f9b046
fs/fs_dev: Added fsOpen_TemporaryStorage/fsOpen_CacheStorage and fsdevMountTemporaryStorage/fsdevMountCacheStorage. Minor adjustments. 2020-04-03 19:16:26 -04:00
yellows8
918fe2b4d6
fs/fs_dev: Added fsOpen_BcatSaveData/fsOpen_SystemBcatSaveData and fsdevMountBcatSaveData/fsdevMountSystemBcatSaveData. 2020-04-03 11:04:05 -04:00
yellows8
014b02db97
irs: Major overhaul, irs is now properly supported. Functionality for newer system-versions is now supported.
* Updated structs: IrsPackedMomentProcessorConfig, IrsImageTransferProcessorConfig, IrsPackedImageTransferProcessorConfig, IrsImageTransferProcessorState.

* The u32 IrCameraHandle was replaced with struct IrsIrCameraHandle.

* Added various enums/structs, etc. Improved docs.

* irsActivateIrsensor() and irsSuspendImageProcessor() are no longer exposed, these are now used automatically when needed.

* Added the following: irsGetIrCameraStatus, irsCheckFirmwareUpdateNecessity, irsGetImageProcessorStatus, irsStopImageProcessorAsync, irsRunMomentProcessor, irsGetMomentProcessorStates, irsCalculateMomentRegionStatistic, irsRunClusteringProcessor, irsGetClusteringProcessorStates, irsRunImageTransferExProcessor, irsRunPointingProcessor, irsGetPointingProcessorMarkerStates, irsGetPointingProcessorStates, irsRunTeraPluginProcessor, irsGetTeraPluginProcessorStates, irsRunIrLedProcessor, irsRunAdaptiveClusteringProcessor, irsRunHandAnalysis, irsGetMomentProcessorDefaultConfig, irsGetClusteringProcessorDefaultConfig, irsGetDefaultImageTransferProcessorExConfig, irsGetIrLedProcessorDefaultConfig.
2020-04-02 18:38:55 -04:00
yellows8
33425de627
Added UtilFloat3. 2020-04-02 14:42:51 -04:00
SciresM
75c3d2eca4
nim: add ListSystemUpdateTask/DestroySystemUpdateTask (#390) 2020-03-31 21:41:05 +02:00
Michael Scire
5d57c70a3e fix calls to svcSetThreadActivity 2020-03-29 18:42:19 +02:00
Michael Scire
43549f4596 svc: fix definitions to better match kernel 2020-03-29 18:42:19 +02:00
yellows8
b50ac5b322
Added ringcon. (#388)
* Added ringcon.
2020-03-24 22:18:56 -04:00
玻璃兔
3dbafe6183
More keyboard types (#387) 2020-03-20 17:43:44 +01:00
yellows8
f0f21507db
fs/fsdev: Added fsdevMountDeviceSaveData/fsOpen_DeviceSaveData, and minor other adjustments. 2020-03-18 22:33:15 -04:00
cathery
31f871a74f hid: Update the value for JOYSTICK_MIN 2020-03-16 21:02:05 +01:00
fincs
6535d6f871
Remove U64_MAX in favor of using UINT64_MAX 2020-03-16 16:21:33 +01:00
fincs
cacf8615a8
Remove arm/atomics.h (use C <stdatomic.h> or C++ <atomic> instead) 2020-03-16 12:51:07 +01:00
fincs
2c19f13f74
nvFence/nvGpu/nvMap: use service guard instead of unsafe atomic refcnt 2020-03-16 12:48:08 +01:00
yellows8
91b4efb6f5
hidbus: Updated HidbusBusType. 2020-03-14 16:24:29 -04:00
yellows8
83f406b5cb
Added hidbus. 2020-03-14 12:10:50 -04:00
CTCaer
d7e6207708 ts: Add temperature location comments
Avert some confusion about the locations.
HOS uses TMP451 IC's internal thermistor for PCB temp readings and external is connected to a thermistor to SoC's package temp pins, so SoC temp readings.
2020-03-11 16:05:21 +01:00
fincs
8421863c78
applet: appletSetFocusHandlingMode should only be used with Application 2020-03-10 17:42:00 +01:00
shchmue
7ce58f84e0
Complete and correct all Settings calls (#383) 2020-03-10 16:35:11 +01:00
fincs
ccb79ff4b6
NWindow: don't use bqDetachBuffer as it's unnecessary and in fact does nothing in the place it's called (reported by @Thog) 2020-03-10 00:07:04 +01:00
yellows8
bf8f6ae5f5
ns: Use 'static ... const' with servarray. 2020-03-08 17:42:25 -04:00
Michael Scire
afbf2c6f71 fs: be consistent about no stack temps in fsFs 2020-03-08 00:47:01 +01:00
SciresM
c3b0b63471
fs: add IsSignedSystemPartitionOnSdCardValid (#381) 2020-03-07 12:40:02 +01:00
3096
1b1620f7bb apm: add apmGetPerformanceMode 2020-03-06 18:12:10 +01:00
yellows8
44ec13169d
pl: Removed unneeded plExit call from _plInitialize on errors, which is not needed with new-ipc. 2020-03-05 10:39:29 -05:00
yellows8
c85dd5fe2f
ns: Added nsGetDynamicRightsInterface, nsGetReadOnlyApplicationRecordInterface, nsGetApplicationVersionInterface, nsGetAccountProxyInterface, nsGetDocumentInterface. 2020-03-03 16:27:44 -05:00
yellows8
f589c95214
ns: Added support for using the other services as fallback on [3.0.0+] when ns:am2 isn't available. 2020-03-03 14:47:22 -05:00
yellows8
af2b4ab7c3
ns: Added nsGetApplicationManagerInterface(), and removed automatic IApplicationManagerInterface init on [3.0.0+]. Updated all IApplicationManagerInterface cmds to use service-session IApplicationManagerInterface on pre-3.0.0, otherwise nsGetApplicationManagerInterface() is used. Apps which use nsGetServiceSession_ApplicationManagerInterface must now use nsGetApplicationManagerInterface if running on [3.0.0+]. 2020-03-01 15:06:15 -05:00
yellows8
763b32060a
ns: Added nsGetApplicationDesiredLanguage. 2020-02-29 22:39:43 -05:00
yellows8
7822accc22
ns: Added nsGetReadOnlyApplicationControlDataInterface. Use IReadOnlyApplicationControlDataInterface with nsGetApplicationControlData when needed. 2020-02-28 20:10:29 -05:00
yellows8
fdb6aa1f15
ns: Added nsGetECommerceInterface. Added cmds: nsRequestLinkDevice, nsRequestSyncRights, nsRequestUnlinkDevice. Minor adjustments. 2020-02-28 14:36:10 -05:00
HookedBehemoth
7e07d1edf0
add fan service (#376) 2020-02-28 19:23:10 +01:00
HookedBehemoth
abc3522724
lbl: more commands (#377) 2020-02-28 19:13:27 +01:00
HookedBehemoth
23852ad932
add tc (#378) 2020-02-28 17:59:31 +01:00
yellows8
3ff12e7337
ns: Added nsGetDownloadTaskInterface. Added NsDownloadTaskStatus. Added support for IDownloadTaskInterface. 2020-02-27 20:52:14 -05:00
yellows8
424cd0fefe
ns: Check sysver in nsGetFactoryResetInterface, and added nsGetContentManagementInterface. Use IContentManagementInterface with the relevant cmds when needed. Added struct NsApplicationOccupiedSize. Added cmds: nsCalculateApplicationOccupiedSize, nsCheckSdCardMountStatus, nsCountApplicationContentMeta, nsIsAnyApplicationRunning. 2020-02-26 22:38:13 -05:00
yellows8
8ae9b5e1a9
ns: Added nsGetFactoryResetInterface(). Added support for IFactoryResetInterface. Improved docs, etc. 2020-02-26 17:36:15 -05:00
yellows8
4a493775b4
ns: Added support for nsDeleteUserSaveDataAll()/NsProgressMonitorForDeleteUserSaveDataAll. Added struct NsProgressForDeleteUserSaveDataAll. 2020-02-25 15:07:47 -05:00
yellows8
524e910268
ns: Added nsListApplicationTitle and nsListApplicationIcon. 2020-02-22 23:58:27 -05:00
yellows8
129b3a95b8
Added support for NsProgressAsyncResult and nsRequestVerifyAddOnContentsRights/nsRequestVerifyApplication. Updated docs. 2020-02-20 22:17:13 -05:00
HookedBehemoth
d8a50a46cf
add caps:c (#375) 2020-02-19 23:32:01 +01:00
shchmue
86a5aa4466
Correct structs and finish adding all set:cal calls (#373) 2020-02-18 19:56:31 +01:00
yellows8
0db4f8a953
ns: Added structs: NsApplicationViewDeprecated, NsApplicationView, NsPromotionInfo, NsApplicationViewWithPromotionInfo. Added cmds: nsGetApplicationViewDeprecated, nsGetApplicationView, nsGetApplicationViewDownloadErrorContext, nsGetApplicationViewWithPromotionInfo, nsGetPromotionInfo. 2020-02-18 10:26:35 -05:00
Michael Scire
73047b09fd spl: fix rsa key accessors on >= 5.x 2020-02-17 23:20:45 +01:00
yellows8
c570cd0a2f
ns: Added NsApplicationRightsOnClient/nsGetApplicationRightsOnClient(). 2020-02-17 15:46:02 -05:00
yellows8
d8d931fe25
ns: Added support for the following cmds: nsRequestApplicationUpdateInfo, nsRequestUpdateApplication2, nsRequestDownloadApplicationControlData, nsRequestCheckGameCardRegistration, nsRequestGameCardRegistrationGoldPoint, nsRequestRegisterGameCard, nsRequestDownloadApplicationPrepurchasedRights, nsRequestNoDownloadRightsErrorResolution, nsRequestResolveNoDownloadRightsError. 2020-02-16 21:33:24 -05:00
yellows8
9bf745524d
nifm: Added NifmClientId and nifmGetClientId/nifmIsAnyInternetRequestAccepted. 2020-02-15 12:32:50 -05:00
fincs
c4ebdb4cd8
Fix #371 2020-02-12 00:47:03 +01:00
yellows8
68d6260d72
ns: Actually check the required sysver for nsListApplicationContentMetaStatus. Updated param types for nsGetTotalSpaceSize/nsGetFreeSpaceSize + minor other improvements. Added support for the following:
* NsRequestServerStopper/nsRequestServerStopperClose().
* nsGetApplicationRecordUpdateSystemEvent, nsDeleteApplicationEntity, nsDeleteApplicationCompletely, nsDeleteRedundantApplicationEntity, nsIsApplicationEntityMovable, nsMoveApplicationEntity, nsCancelApplicationDownload, nsResumeApplicationDownload, nsCheckApplicationLaunchVersion, nsCalculateApplicationDownloadRequiredSize, nsCleanupSdCard, nsGetSdCardMountStatusChangedEvent, nsGetGameCardUpdateDetectionEvent, nsDisableApplicationAutoDelete, nsEnableApplicationAutoDelete, nsSetApplicationTerminateResult, nsClearApplicationTerminateResult, nsGetLastSdCardMountUnexpectedResult.
* nsGetRequestServerStopper, nsCancelApplicationApplyDelta, nsResumeApplicationApplyDelta, nsCalculateApplicationApplyDeltaRequiredSize, nsResumeAll, nsGetStorageSize, nsDeleteUserSystemSaveData, nsDeleteSaveData, nsUnregisterNetworkServiceAccount, nsUnregisterNetworkServiceAccountWithUserSaveDataDeletion, nsGetGameCardMountFailureEvent, nsIsGameCardInserted, nsEnsureGameCardAccess, nsGetLastGameCardMountFailureResult, nsListApplicationIdOnGameCard, nsTouchApplication, nsIsApplicationUpdateRequested, nsWithdrawApplicationUpdateRequest, nsIsAnyApplicationEntityInstalled, nsCleanupUnavailableAddOnContents, nsFormatSdCard, nsNeedsSystemUpdateToFormatSdCard, nsGetLastSdCardFormatUnexpectedResult, nsGetApplicationTerminateResult.
2020-02-10 12:14:40 -05:00
yellows8
52a892ca31
ns: Fixed cmd order. 2020-02-06 20:07:02 -05:00
HookedBehemoth
2486175f55
add jpegdec/caps:dc (#369) 2020-01-31 17:53:07 +01:00
HookedBehemoth
c28d736ff0 fs: add fsOpenImageDirectoryFileSystem and FsImageDirectoryId 2020-01-28 20:39:41 -05:00
yellows8
6c706d910f
set: Fixed the required sysver for setsysGetHomeMenuScheme. 2020-01-25 13:47:39 -05:00
yellows8
b83ddf8157
hid: Updated the value for JOYSTICK_MAX. 2020-01-23 18:54:51 -05:00
fincs
04214ea441
romfs_dev: fix reading into buffers with device mappable attribute 2020-01-22 00:56:34 +01:00
yellows8
5a751ea0c3
Fixed definitions for ldrShellFlushArguments/ldrDmntFlushArguments and spl*GetServiceSession. Removed fsldrSetCurrentProcess from the .h. Closes #366. 2020-01-21 16:09:28 -05:00
SciresM
e5c501e5b6 svc: Add all missing SVC stubs (#364) 2020-01-18 21:39:05 +01:00
HookedBehemoth
446aaf2a55 add capsa IAlbumAccessorSession and more capsa calls (#363)
* add capsa IAlbumAccessorSession

* add documentation for capsa and change parameter order and names for image loading

* add CapsLoadAlbumScreenShotImageOutput for caps:a

* add remaining LoadAlbumScreenShot- calls

* add more calls, add structs and add doc

* fix query and use count instead of size for listing
2020-01-16 19:29:28 -05:00
fincs
7e6ff7e486
Simplify appletGetAppletResourceUserId and related logic 2020-01-17 00:18:55 +01:00
yellows8
9c4ab7f09d
hid: Fixed cmd order. 2020-01-14 21:48:18 -05:00
yellows8
c8b8c7b0f0
hid: Added enum HidGyroscopeZeroDriftMode. Added hidSetGyroscopeZeroDriftMode, hidGetGyroscopeZeroDriftMode, and hidResetGyroscopeZeroDriftMode. 2020-01-14 21:45:04 -05:00
yellows8
583d6bb92d
hid: Fixed vibration, toggling vibration-enable off->on is no longer needed. Properly closes #148. 2020-01-12 12:25:16 -05:00
yellows8
cbe9fae600
hid: Added hidSetSixAxisSensorFusionParameters, hidGetSixAxisSensorFusionParameters, and hidResetSixAxisSensorFusionParameters. 2020-01-11 22:37:07 -05:00
yellows8
f040706743
In _hidActivateConsoleSixAxisSensor, use cmd ActivateConsoleSixAxisSensor instead of ActivateSevenSixAxisSensor. 2020-01-09 18:42:06 -05:00
HookedBehemoth
f34de8fb54 added caps:a (#358)
* added caps:a

* change struct names
2020-01-09 15:32:34 -05:00
Pablo Curiel
1719eda9fb Update documentation about fsdevMountDevice() to inform about trailing colons in device names. (#362) 2020-01-02 02:20:32 +01:00
yellows8
1bb1aef2f7
Only init/exit apm from applet with AppletType_Application. Closes #360. 2019-12-23 10:50:52 -05:00
yellows8
f043307e7f
In __libnx_init_time(), use 'NX' for the tzname instead of the actual timezone-name. Using the original tzname causes issues with certain timezones. Closes #353. 2019-12-19 16:22:45 -05:00
yellows8
fb01dd8196
psel: Removed TODO comment. 2019-12-19 16:16:58 -05:00
fincs
ce394330a8
svcSignalProcessWideKey doesn't actually return anything 2019-12-18 00:40:27 +01:00
ITotalJustice
0881fb9e0b Add set:cal service with a few cal functions. (#356)
* Add set:cal service with a few functions
* Added more cal structs`
2019-12-16 16:20:00 -05:00
yellows8
d25bcc486a
Properly fixed __nx_applet_exit_mode handling, previously appletExit() called by _appletExitProcess didn't run since refcount was already 0. Closes #355. 2019-12-14 11:52:40 -05:00
fincs
2f7d9bf026
Delete old IPC 🎉 2019-12-12 02:25:05 +01:00
286 changed files with 44773 additions and 5250 deletions

View File

@ -1,34 +0,0 @@
{
"targets": {
"lib": {
"buildenv": "docker:devkitpro/devkita64",
"buildcmd": [
"sudo -E make -j${PARALLEL} -C nx install"
]
},
"docs": {
// This target build and upload docs and will be trigged from doozer's CD script
"auto": false,
"buildenv": "xenial-amd64",
"builddeps": [
"doxygen"
],
"buildcmd": [
"cd nx", "doxygen"
],
"artifacts": [{
"source": "nx/docs/html",
"destination": {
"type": "git",
"branch": "gh-pages"
}
}]
}
}
}

22
.github/workflows/build.yaml vendored Normal file
View File

@ -0,0 +1,22 @@
name: Build libnx
on:
push:
branches:
- master
pull_request:
jobs:
build:
name: Test build
runs-on: ubuntu-latest
container:
image: 'devkitpro/devkita64'
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: build
run: make -C nx -j$(nproc)

39
.github/workflows/doxygen.yaml vendored Normal file
View File

@ -0,0 +1,39 @@
name: Build documentation
on:
push:
tags: [ v* ]
jobs:
build:
name: Build documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
- name: Get current tag
id: vars
run: echo ::set-output name=tag::${GITHUB_REF/refs\/tags\//}
- name: Set up Doxygen
run: sudo apt-get install -y doxygen
- name: Display Doxygen version
run: echo "Doxygen version $(doxygen -v)"
- name: Build documentation
run: |
cd nx
LIBNX_VERSION=${{ steps.vars.outputs.tag }} doxygen Doxyfile
- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@3.7.1
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH: gh-pages
FOLDER: nx/docs/html
CLEAN: true
SINGLE_COMMIT: true

3
.gitignore vendored
View File

@ -8,7 +8,10 @@
*.pfs0
Thumbs.db
.*/
!.github/
debug/
release/
lib/
docs/
compile_commands.json
.clangd

View File

@ -1,5 +1,513 @@
# Changelog
## Version 4.7.0
#### system
* Basic support for 18.0.0
#### services
* fs: add GetFileSystemAttribute cmd
* fs: Implement "ChallengeCardExistence" and "GetGameCardDeviceCertificate"
#### graphics
* nvchannel: Fix SET_CLK_RATE, implement GET_CLK_RATE and SET_SUBMIT_TIMEOUT
#### miscellaneous
* Update SetSysProductModel_Aula comment
## Version 4.6.0
#### system
* svc: fix query/insecure names
#### miscellaneous
* add fsDeviceOperatorGetGameCardUpdatePartitionInfo
* Add NX_ prefix to PACKED, NORETURN, IGNORE_ARG and DEPRECATED macros
* Fix: avoid segfault at static destructors
## Version 4.5.0
#### services
* btdrv: Missing definitions for ble were added
* capsdc: Updated for [17.0.0+]
* hidsys: Support was added for many commands
* fs:
* Updated for [17.0.0+]
* Support was added for many fsDeviceOperator commands
* ncm: Updated for [17.0.0+]
* nfc: Support was added for all remaining commands
* ns: Added nsEstimateSizeToMove
* pctl: Support was added for many commands
* ssl: Updated sslConnectionSetPrivateOption for [17.0.0+]
* ts: Updated for [17.0.0+]
#### devices
* socket: Updated wrapper to automatically select latest available bsd service version (fixes multicast support)
#### miscellaneous
* The linker script/crt0 were updated to support relro
* A bug was fixed in aes-cbc block decryption
* A number of problems were corrected involving incorrect ipc serialization with pointer arguments
**Several issues were fixed, and usability and stability were improved.**
## Version 4.4.2
#### system
* ensure correct addresses for bss
#### miscellaneous
* fix timezone to allow +/- and alphanumrics
* end compile_commmands generation when elf linked
## Version 4.4.1
#### miscellaneous
* add missing separator to local path
**Several issues were fixed, and usability and stability were improved.**
## Version 4.4.0
#### services
* applet: add appletGetMessageEvent
* usbcomms: add async API
* usbcomms: expose VID:PID configuration
#### miscellaneous
* correct problems revealed by gcc 13
* mitigate race condition bug in nvservices
**Several issues were fixed, and usability and stability were improved.**
## Version 4.3.0
#### services
* applet: Updated for [15.0.0+]. Added `__nx_applet_init_timeout`
* audctl:
* Added audctlGetActiveOutputTarget.
* Fixed TargetVolume functions.
* auddev: Added auddevGetActiveAudioDeviceName.
* bpc: Fixed GetSleepButtonState/GetPowerButton.
* fs: Updated for [16.0.0+]
* hiddbg: Changed hiddbgAttachHdlsWorkBuffer to accept a user-supplied buffer and size.
* ncm: Updated for [15.0.0+] and [16.0.0+].
* pdm:
* Updated for [16.0.0+].
* Fixed pdmqryQueryAccountEvent on older sysvers.
* Updated structs.
* pl: Added [16.0.0+] sysver checks.
* ssl:
* Added support for new [16.0.0+] functionality.
* Added ssl:s support [15.0.0+].
* Added sslClearTls12FallbackFlag [14.0.0+].
* Updated SslCaCertificateId enum.
* usbhs: Added the remaining cmds and expose more functionality.
* vi: Added [16.0.0+] Manager commands.
* wlaninf: Added sysver check to account for its removal in \[15.0.0+\].
#### devices
* nxlinkConnectToHost: Added timeout to avoid long hang when -s isn't specified for nxlink.
#### miscellaneous
* Added CMSG macros to BSD headers.
**Several issues were fixed, and usability and stability were improved.**
## Version 4.2.2
#### system
* svc: Added svcMapInsecureMemory, svcUnmapInsecureMemory [15.0.0+].
* svc: Renamed perm parameter of svcMapDeviceAddressSpaceByForce and svcMapDeviceAddressSpaceAligned to option [15.0.0+].
* svc: Corrected svcMapIoRegion, svcUnmapIoRegion.
* env: Added HBABI support for hinting SVCs in the extended range 0x80..0xBF.
* cache: Added instruction barrier to armICacheInvalidate.
#### graphics
* Added nvGpuGetTimestamp, nvioctlNvhostCtrlGpu_GetGpuTime.
#### applets
* swkbd: Corrected several typos and incorrect floating point values.
#### network
* socket: Added socketNifmRequestRegisterSocketDescriptor, socketNifmRequestUnregisterSocketDescriptor.
* nifm: nifmRequestSetKeptInSleep, nifmRequestRegisterSocketDescriptor, nifmRequestUnregisterSocketDescriptor, nifmSetWowlDelayedWakeTime.
#### other services
* set:sys: setsysNeedsToUpdateHeadphoneVolume removed in [15.0.0].
* pdm:qry: pdmqryQueryRecentlyPlayedApplication, pdmqryGetRecentlyPlayedApplicationUpdateEvent removed in [15.0.0].
Several issues were fixed, and usability and stability were improved.
## Version 4.2.1
#### system
* cache: Adjusted cache maintenance ABI for [14.0.0+].
* svc: Added InfoType_IsSvcPermitted [14.0.0+].
* svc: Removed svcCallSecureMonitor's non-existent return type.
* svc: Fixed definition of MemoryInfo struct.
* ldscript: Generated ELFs now start with the `.text` section (required by GDB).
#### filesystem
* Added fsOpenSaveDataInfoReaderWithFilter.
* Added fsCreate_TemporaryStorage.
* Fixed bug in fsOpen_TemporaryStorage.
#### graphics
* Added nvIoctl3.
* Adjusted hos version requirements in nvIoctl2 [3.0.0+].
* Adjusted list of IOCTLs that use the cloned NV service session.
* console: Added support for SGR 38/48 escape sequences.
* console: Bold/Faint attributes no longer applied to the background.
#### input
* hid: Added hidGetNpadLagerType, hidGetNpadStatesLager.
* hid: Added HidNpadLagerType enum.
* hid: Added HidNpadLagerState struct.
* hid: Updated HidNpadStyleTag, HidNpadButton, HidDeviceTypeBits, HidDeviceType, HidAppletFooterUiType enums.
* hid: Updated HidNpadInternalState struct.
* hidsys: Added hidsysAcquireUniquePadConnectionEventHandle, hidsysGetUniquePadBluetoothAddress, hidsysDisconnectUniquePad, hidsysGetUniquePadType, hidsysGetUniquePadInterface, hidsysGetUniquePadControllerNumber.
* hidsys: Added HidsysUniquePadType enum.
#### other
* Added `BITL()` macro (unsigned long, i.e. 64-bit unsigned integer).
* bpc: Adjusted for removed commands in [14.0.0+].
* bpc: Added bpcGetPowerButton [6.0.0+].
* btdrv: Adjusted for removed commands in [14.0.0+].
* btm: Corrected inverted hos version check affecting several commands.
* nfc: Added nfcSendCommandByPassThrough, nfcKeepPassThroughSession, nfcReleasePassThroughSession.
* pm: Added support for [14.0.0+].
* ts: Adjusted for removed commands in [14.0.0+].
Several issues were fixed, and usability and stability were improved.
## Version 4.2.0
#### system
* Added new SVCs introduced in [13.0.0+].
* Thread structures are now pre-populated with information prior to creation.
#### input
* hidsys: Added support for [13.0.0+].
* hiddbg: Added support for [13.0.0+].
#### graphics
* Fixed crashes caused by arbitrary sizes in linear framebuffers.
#### other
* ncm: Added support for [13.0.0+].
* setsys: Added support for [13.0.0+].
* Filled in SetSysNxControllerSettings structure definition (which was previously unpopulated).
* btm: Added support for [13.0.0+].
* btdrv: Added support for [13.0.0+].
* Fixed btdrvRespondToSspRequest for [12.0.0+].
* psel: Added support for [13.0.0+] (pselShowUserQualificationPromoter).
* Corrected ldr:ro/ro:1 initialization.
Several issues were fixed, and usability and stability were improved.
## Version 4.1.3
#### input
* **Removed old deprecated HID API**.
#### network
* Fixed inet_pton implementation.
Several issues were fixed, and usability and stability were improved.
## Version 4.1.2
Several issues were fixed, and usability and stability were improved.
## Version 4.1.1
#### system
* Fixed deadlock issue when multi-threaded services (e.g. filesystem, sockets) are starved of free sessions.
Several issues were fixed, and usability and stability were improved.
## Version 4.1.0
#### system
* **Removed old virtmem API**.
* Added mechanism for overriding libnx's dynamic memory allocation behavior.
* This also added specific mechanisms for NV and BSD transfer memory handling.
* Added hosversionIsAtmosphere, together with support for receiving this information through HBABI.
* Added tipc (Tiny IPC) serialization support, introduced in [12.0.0+].
* Updated sm, sm:m and pgl wrappers for tipc support.
* Fixed certain serialization bug in cmif handling code.
* argv setup code can now be overriden.
* virtmem RNG algorithm can now be overriden.
* Added support for incremental CRC calculations.
#### fs
* Added fsOpenHostFileSystem(WithOption).
#### input
* Added HidKeyboardKey enum.
* Added hidKeyboardStateGetKey helper function.
* Added support for SleepButton AutoPilot in hiddbg.
* Updated hdls service wrapper for [12.0.0+].
* Corrected HidGestureAttribute, HidGestureState.
* Corrected several swkbd enums and structs.
* Minor Palma documentation improvements.
#### other services
* **Updated btdrv service wrapper for [12.0.0+]**, along with fixes and improved support.
* Added audctl service wrapper.
* Added audrec service wrapper.
* Added avm service wrapper.
* Added friends service wrapper (minimal functionality needed for retrieving the user's friend code).
* Added htcs service wrapper.
* Added mm:u service wrapper.
* Added new nvioctlChannel_\* wrappers: Submit, GetSyncpt, GetModuleClockRate, MapCommandBuffer, UnmapCommandBuffer.
* Added SetSysProductModel enum, now used by setsysGetProductModel.
* Added audrvVoiceIsPaused.
* Updated BtmDeviceCondition struct, including compatibility with all system versions.
* Corrected pscmGetPmModule prototype.
* Renamed ChargerType to PsmChargerType, corrected enum names.
* Fixed bug in time offset handling.
* Fixed bug in BSD (sockets) initialization.
**Several issues were fixed, and usability and stability were improved.**
## Version 4.0.0
#### system
* **Added support for the light event synchronization primitive** (needs [4.0.0+] or mesosphère).
* **The virtmem API was completely redesigned** to support ASLR and increase thread safety.
* **Added diagAbortWithResult**, an overridable user panic function which is intended to replace fatalThrow in order to stop homebrew from treating application errors as fatal system errors that bring the entire OS down.
* The default implementation uses svcBreak.
* Replaced calls to fatalThrow with diagAbortWithResult throughout libnx.
* Added detectMesosphere.
* Added svcGetResourceLimitPeakValue [11.0.0+].
* Added InfoType_FreeThreadCount [11.0.0+].
* Corrected svcBreak definition and added BreakReason enum.
* Removed obsolete kernel version detection code.
* fatal service wrapper now checks hosversion.
* Jit object wrapper now checks syscall hinting provided by the homebrew environment (requires nx-hbloader 2.4.0+).
* Miscellaneous crt0/linkscript fixes and optimizations.
#### input
* **Major refactor of the HID service**, including a redesigned API that follows official usage more accurately, allowing more flexibility and improved future maintainability. Summary of changes:
* Introduced HidNpadIdType, HidNpadStyleTag, HidNpadButton enums and others.
* Enums and structs were updated to more accurately reflect official names; this also affects all other hid related services.
* Everything which formerly took HidControllerID parameters now takes HidNpadIdType instead; this also affects all other hid related services.
* Handle types (such as vibration and sixaxis sensor handles) are now structs instead of bare integer values; this also affects all other hid related services.
* Introduced explicit initialization functions for Npad, TouchScreen, Mouse, Keyboard.
* Introduced (or renamed) functions for configuring or retrieving Npad input style and other associated behavior.
* Introduced the hidGetNpadStates{X} family of functions, which read the current state of a Npad in the given style.
* Likewise introduced hidGetTouchScreenStates, hidGetMouseStates, hidGetKeyboardStates, hidGetSixAxisSensorStates.
* Added support for most other miscellaneous hid service commands.
* Deprecated the entirety of the old API, including but not limited to: hidScanInput, hidGetKeysDown/Held/Up, hidTouchCount, hidTouchRead, etc.
* Removed hidSetControllerLayout/hidGetControllerLayout together with HidControllerLayoutType.
* Introduced a new wrapper Pad API that replaces the old API for application usage.
* Introduced PadRepeater API.
* **Added full support for GameCube, Palma (Poké Ball Plus), Lark (NES) and Lucia (SNES) controllers.**
* **Added support for gestures.**
* **Improved support for SevenSixAxisSensor.**
* Added hiddbg AutoPilot support for DebugPad, TouchScreen, Mouse, Keyboard.
* Added hiddbgDeactivateHomeButton.
* Added HiddbgNpadButton enum with Home/Capture buttons (exclusive to hiddbg pad state).
* Updated hidsys service wrapper for [11.0.0+], including new functionality.
* Added hidsysSendKeyboardLockKeyEvent, hidsysGetNpadInterfaceType, hidsysGetNpadLeftRightInterfaceType, hidsysHasBattery, hidsysHasLeftRightBattery, hidsysIsUsbFullKeyControllerEnabled, hidsysEnableUsbFullKeyController, hidsysIsUsbConnected, hidsysIsFirmwareUpdateNeededForNotification.
* Improved support for hidsys' Home/Sleep/Capture button commands.
* Added HidsysUniquePadSerialNumber struct.
* Fixed bug in hidbus/Ring-Con code that could cause a crash following cleanup.
#### applets
* Updated applet service wrapper for [11.0.0+], including new functionality.
* Renamed several members in the following enums to more accurately reflect official names: AppletOperationMode, AppletHookType, AppletMessage, AppletFocusState, AppletFocusHandlingMode, AppletId, AppletWirelessPriorityMode, AppletWindowOriginMode.
* Added appletHolderGetExitEvent, appletHolderGetPopInteractiveOutDataEvent.
* Added libappletRequestToLaunchApplication, libappletRequestJumpToStory [11.0.0+].
* Added webConfigSetTransferMemory.
* Added swkbdInlineGetMaxHeight, swkbdInlineGetTouchRectangles, swkbdInlineIsUsedTouchPointByKeyboard, swkbdInlineGetMiniaturizedHeight.
* Added nfpLa wrapper (amiibo).
* Added miiLa wrapper (Mii editor).
* Added nifmLa wrapper.
* Updated swkbd for [10.0.0+].
* Updated web for [10.0.0+].
* Updated hidLa for [11.0.0] + misc fixes.
* Implemented support for WebSession in web.
* Implemented support for UserDisplay mode in swkbd.
#### filesystem
* Added fsCreateSaveDataFileSystem, fsDeleteSaveDataFileSystem, fsDeleteSaveDataFileSystemBySaveDataAttribute.
* Added fsOpenDataFileSystemByCurrentProcess, fsOpenDataFileSystemByProgramId, fsOpenDataStorageByProgramId, fsOpenPatchDataStorageByCurrentProcess.
* Added fsOutputAccessLogToSdCard, fsGetProgramIndexForAccessLog.
* Added romfsMountDataStorageFromProgram.
* Fixed stat on romfs devices to report failure properly for non-existent files/directories.
#### other services
* Added Bluetooth (bt, btdrv, btm, btm:u, btm:sys) service wrappers.
* Added btdev wrapper API.
* Added ins:r and ins:s service wrappers.
* Added uart service wrapper.
* Added news service wrapper.
* Added lp2p service wrapper.
* Added ectx:r service wrapper [11.0.0+].
* Added capmtp service wrapper [11.0.0+].
* Added smDetachClient [11.0.0+].
* Added ErrorContextType enum.
* Updated gpio service wrapper to add most missing functionality.
* Updated psm service wrapper to add more battery functions.
* Updated loader service wrapper for [11.0.0+].
* Updated usb:ds service wrapper for [11.0.0+].
* Updated set service wrapper for [10.1.0+], including new functionality.
* Updated ns service wrapper to consider ns:ro if available [11.0.0+].
* Updated ssl service enum SslVersion for [11.0.0+].
* Renamed several members in the following enums to more accurately reflect official names: ApmPerformanceMode, ApmCpuBoostMode.
* Fixed bug in splCryptoGetSecurityEngineEvent service wrapper.
* Fixed audoutOpenAudioOut to properly pass aruid, making the service usable once again (and restoring compatibility with [1.0.0]).
* Reliability and usability fixes in usb:ds:
* Added UsbState enum (now returned by usbDsGetState).
* Fixed usbDsWaitReady to properly respect the given timeout.
**Several issues were fixed, and usability and stability were improved.**
## Version 3.3.0
#### system
* Mutex implementation has been rewritten/optimized to more closely match official software.
#### filesystem
* Added lstat support to both fsdev and romfsdev (does the same thing as regular stat, as symlinks don't exist on HOS).
* Fixed stat for romfs directories.
#### other services
* **ldn: Added service wrappers.**
* nifm: Added IRequest support.
## Version 3.2.0
#### system
* Added threadGetSelf.
* Added a Thread struct for the main thread.
* Corrected error code in shmemMap.
* Updated svcQueryIoMapping to match new 10.0.0+ ABI change. Old version still available as svcLegacyQueryIoMapping.
* Minor fixes in jit wrapper object.
#### network
* **Added support for the ssl service**.
* Added socketSslConnectionSetSocketDescriptor and socketSslConnectionGetSocketDescriptor (for usage with SSL).
* Added support for recvmsg/sendmsg and sendmmsg/recvmmsg [7.0.0+].
* Added nifmGetCurrentNetworkProfile, nifmGetNetworkProfile, nifmSetNetworkProfile, nifmGetCurrentIpConfigInfo.
* Added structs: NifmIpV4Address, NifmIpAddressSetting, NifmDnsSetting, NifmProxySetting, NifmIpSettingData, NifmWirelessSettingData, NifmSfWirelessSettingData, NifmSfNetworkProfileData, NifmNetworkProfileData.
#### devices
* Changed libnx console to only hook stdout. If stderr is necessary, use `consoleDebugInit(debugDevice_CONSOLE)` explicitly.
* Added nxlinkConnectToHost with separate flags for redirecting stdout/err.
* Added nxlinkStdioForDebug, which only redirects stderr and not stdout.
#### graphics
* Added priority parameter to nvGpuChannelCreate.
* Fixed cleanup logic in nvChannelClose.
* Added nvGpuChannelGetErrorInfo.
* Renamed NvError struct & NvErrorType enum to NvNotification/NvNotificationType.
#### other services
* applet: Support changes for 10.0.0+, including new command support.
* swkbd: appletHolderPresetLibraryAppletGpuTimeSliceZero is now called on 10.0.0+.
* audout: Added all remaining IAudioOut commands.
* bpc: Added hosversion check to bpcGetSleepButtonState.
* caps: Correct CapsScreenShotDecodeOption.
* capssc:
* Added capsscCaptureJpegScreenShot, capsscOpenRawScreenShotReadStream, capsscCloseRawScreenShotReadStream, capsscReadRawScreenShotReadStream.
* Changed capsscCaptureRawImageWithTimeout to use ViLayerStack enum.
* fsldr: Support changes for 10.0.0+, including new command support.
* fsp-pr + ldr: Support changes for 10.0.0+ (SetEnabledProgramVerification changed places).
* hidsys: Support changes for 10.0.0+, including new command support.
* irs: Corrected bug on initialization caused by invalid system version logic.
* lr: Added lrLrEraseProgramRedirection [5.0.0+].
* mii: Added service wrappers.
* miiimg: Added service wrappers.
* nfp: Corrected definition of nfpOpenApplicationArea.
* ns: Support changes for 10.0.0+, including new command support (also some other misc fixes).
* pdm: Support changes for 10.0.0+, including new command support.
* pgl: Added service wrappers [10.0.0+].
* pl: Added support for changing the service type (PlServiceType).
* pmshell: Renamed pmshellBoostSystemThreadResourceLimit to pmshellEnableApplicationExtraThread.
* psc: Corrected hosversion check in pscPmModuleAcknowledge.
* set:
* Added new 10.0.0+ commands.
* Corrected definition of SetRegion to match actual usage.
* Corrected setsysGetSerialNumber.
* Corrected setcalGetGyroscopeOffset to use the right struct.
* time:
* Added support for time shared memory [6.0.0+].
* Added timeGetStandardSteadyClockTimePoint.
* Added timeGetStandardSteadyClockInternalOffset [3.0.0+].
* Added TimeStandardSteadyClockTimePointType struct.
* Changed timeGetCurrentTime to use shared memory on 6.0.0+.
* vi: Added ViLayerStack enum.
#### miscellaneous
* Corrected and updated nacp structs.
* Further improvements to overall system stability and other minor adjustments have been made to enhance the user experience.
## Version 3.1.0
#### system
* **Deleted the old and deprecated IPC system**.
* **Added wrappers for all missing system calls**.
* Corrected signatures of many system calls.
* Removed `arm/atomics.h` (use C `<stdatomic.h>` or C++ `<atomic>` instead).
* Removed `U64_MAX` define (use `UINT64_MAX` instead).
* Added UtilFloat3 struct.
#### applet
* Fixed `__nx_applet_exit_mode` handling.
* `apm` is now only used/initialized for `AppletType_Application`.
* Simplified `appletGetAppletResourceUserId` to return the aruid directly, or 0 on "failure" (which is not really a failure condition).
* Changed `appletSetFocusHandlingMode` to return error if the applet type is not `AppletType_Application`.
* Added more fields to `SwkbdType` enum.
#### filesystem
* RomFS code now properly supports reading to uncached buffers.
* Added fsdev commands: fsdevMountDeviceSaveData, fsdevMountBcatSaveData, fsdevMountSystemBcatSaveData, fsdevMountTemporaryStorage, fsdevMountCacheStorage, fsdevMountSaveDataReadOnly.
* Added commands: fsOpenImageDirectoryFileSystem, fsOpenReadOnlySaveDataFileSystem, fsIsSignedSystemPartitionOnSdCardValid, fsOpen_DeviceSaveData, fsOpen_BcatSaveData, fsOpen_SystemBcatSaveData, fsOpen_TemporaryStorage, fsOpen_CacheStorage, fsOpen_SaveDataReadOnly.
* Added enum: FsImageDirectoryId.
* Removed path stack copy logic from fsFsQueryEntry.
#### graphics
* Removed bqDetachBuffer calls from nwindowReleaseBuffers as it does nothing in the place it's called.
* Fixed nvFence/nvGpu/nvMap to use service guard instead of unsafe reference counting.
#### hid
* **Fixed vibration handling**.
* **Added Ring-Con™ support**.
* Added hidbus service wrappers.
* Added commands: hidSetSixAxisSensorFusionParameters, hidGetSixAxisSensorFusionParameters, hidResetSixAxisSensorFusionParameters, hidSetGyroscopeZeroDriftMode, hidGetGyroscopeZeroDriftMode, hidResetGyroscopeZeroDriftMode.
* Majorly overhauled irs service support (infrared camera), with support for features introduced in later system versions.
* Added enum: HidGyroscopeZeroDriftMode.
* Corrected internal console six-axis sensor initialization function to actually use the right command.
* Corrected values of `JOYSTICK_MIN` and `JOYSTICK_MAX`.
#### other services
* Added apm command: apmGetPerformanceMode.
* Added caps:a service wrappers.
* Added caps:c service wrappers.
* Added caps:dc service wrappers.
* Added fan service wrappers.
* Added many missing lbl commands.
* Added nifm commands: nifmGetClientId (with corresponding NifmClientId struct), nifmIsAnyInternetRequestAccepted.
* Added nim service wrappers (only nimListSystemUpdateTask/nimDestroySystemUpdateTask for now).
* Majorly overhauled ns service support, with countless commands and structures.
* Added set:cal service wrappers.
* Completed and corrected all set:sys commands.
* Added tc service wrappers.
* Actually expose ldrShellFlushArguments, ldrDmntFlushArguments, spl\*GetServiceSession.
* Corrected minimum sysver for setsysGetHomeMenuScheme.
* Corrected minimum sysver for nsListApplicationContentMetaStatus.
* Fixed splSslLoadSecureExpModKey/splEsLoadSecureExpModKey/splRsaDecryptPrivateKey/splSslLoadSecureExpModKey/splEsLoadRsaOaepKey/splEsLoadSecureExpModKey/splFsLoadSecureExpModKey on 5.0+.
* Fixed plInitialize failure handling.
* Removed non-existent fsldrSetCurrentProcess.
#### miscellaneous
* Changed timezone support code to always report `NX` as the timezone name, fixing certain issues.
* Further improvements to overall system stability and other minor adjustments have been made to enhance the user experience.
## Version 3.0.0
#### system

View File

@ -1,7 +1,7 @@
# Nintendo Switch AArch64-only userland library.
Based on libctru.
[![Build status](https://doozer.io/badge/switchbrew/libnx/buildstatus/master)](https://doozer.io/switchbrew/libnx)
![Build status](https://github.com/switchbrew/libnx/actions/workflows/build.yaml/badge.svg)
# Install instructions
See [Switchbrew](https://switchbrew.org/wiki/Setting_up_Development_Environment).

View File

@ -38,7 +38,7 @@ PROJECT_NAME = "libnx"
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = "$(TRAVIS_TAG)"
PROJECT_NUMBER = "$(LIBNX_VERSION)"
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a

View File

@ -8,13 +8,6 @@ endif
include $(DEVKITPRO)/devkitA64/base_rules
export LIBNX_MAJOR := 3
export LIBNX_MINOR := 0
export LIBNX_PATCH := 0
VERSION := $(LIBNX_MAJOR).$(LIBNX_MINOR).$(LIBNX_PATCH)
#---------------------------------------------------------------------------------
# TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed
@ -90,22 +83,19 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
-I. \
-iquote $(CURDIR)/include/switch/
.PHONY: clean all
.PHONY: clean all lib/libnx.a lib/libnxd.a
#---------------------------------------------------------------------------------
all: lib/libnx.a lib/libnxd.a
dist-bin: all
@tar --exclude=*~ -cjf libnx-$(VERSION).tar.bz2 include lib default_icon.jpg switch_rules switch.ld switch.specs -C external/bsd include
install: lib/libnx.a lib/libnxd.a
@mkdir -p $(DESTDIR)$(DEVKITPRO)/libnx
@cp -v default_icon.jpg switch_rules switch.ld switch.specs $(DESTDIR)$(DEVKITPRO)/libnx/
@cp -rv include lib $(DESTDIR)$(DEVKITPRO)/libnx/
@cp -rv external/bsd/include $(DESTDIR)$(DEVKITPRO)/libnx/
dist-src:
@tar --exclude=*~ -cjf libnx-src-$(VERSION).tar.bz2 include source data external Makefile default_icon.jpg switch_rules switch.ld switch.specs
dist: dist-src dist-bin
install: dist-bin
mkdir -p $(DESTDIR)$(DEVKITPRO)/libnx
bzip2 -cd libnx-$(VERSION).tar.bz2 | tar -xf - -C $(DESTDIR)$(DEVKITPRO)/libnx
@tar -cjf libnx-`git describe --tags | sed 's/^v//'`.tar.bz2 include source data external Makefile default_icon.jpg switch_rules switch.ld switch.specs
#dox:
# @doxygen Doxyfile

View File

@ -437,8 +437,35 @@ struct cmsghdr {
/* followed by u_char cmsg_data[]; */
};
// socket credential stuff, we don't need this
// cmsg macros, uses some obscure macro
#define _ALIGNBYTES (sizeof(long) - 1)
#define _ALIGN(p) (((unsigned long)(p) + _ALIGNBYTES) & ~_ALIGNBYTES)
/* given pointer to struct cmsghdr, return pointer to data */
#define CMSG_DATA(cmsg) \
((unsigned char *)(cmsg) + _ALIGN(sizeof(struct cmsghdr)))
/* given pointer to struct cmsghdr, return pointer to next cmsghdr */
#define CMSG_NXTHDR(mhdr, cmsg) \
(((char *)(cmsg) + _ALIGN((cmsg)->cmsg_len) + \
_ALIGN(sizeof(struct cmsghdr)) > \
((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen) ? \
(struct cmsghdr *)NULL : \
(struct cmsghdr *)((char *)(cmsg) + _ALIGN((cmsg)->cmsg_len)))
/*
* RFC 2292 requires to check msg_controllen, in case that the kernel returns
* an empty list for some reasons.
*/
#define CMSG_FIRSTHDR(mhdr) \
((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
(struct cmsghdr *)(mhdr)->msg_control : \
(struct cmsghdr *)NULL)
/* Length of the contents of a control message of length len */
#define CMSG_LEN(len) (_ALIGN(sizeof(struct cmsghdr)) + (len))
/* Length of the space taken up by a padded control message of length len */
#define CMSG_SPACE(len) (_ALIGN(sizeof(struct cmsghdr)) + _ALIGN(len))
/* "Socket"-level control message types: */
#define SCM_RIGHTS 0x01 /* access rights (array of int) */

View File

@ -17,7 +17,6 @@ extern "C" {
#include "switch/arm/tls.h"
#include "switch/arm/cache.h"
#include "switch/arm/atomics.h"
#include "switch/arm/counter.h"
#include "switch/kernel/svc.h"
@ -26,6 +25,7 @@ extern "C" {
#include "switch/kernel/shmem.h"
#include "switch/kernel/mutex.h"
#include "switch/kernel/event.h"
#include "switch/kernel/levent.h"
#include "switch/kernel/uevent.h"
#include "switch/kernel/utimer.h"
#include "switch/kernel/rwlock.h"
@ -36,13 +36,13 @@ extern "C" {
#include "switch/kernel/detect.h"
#include "switch/kernel/random.h"
#include "switch/kernel/jit.h"
#include "switch/kernel/ipc.h" // Deprecated
#include "switch/kernel/barrier.h"
#include "switch/sf/hipc.h"
#include "switch/sf/cmif.h"
#include "switch/sf/service.h"
#include "switch/sf/sessionmgr.h"
#include "switch/sf/tipc.h"
#include "switch/services/sm.h"
#include "switch/services/smm.h"
@ -53,8 +53,10 @@ extern "C" {
#include "switch/services/apm.h"
#include "switch/services/applet.h"
#include "switch/services/async.h"
#include "switch/services/audctl.h"
#include "switch/services/audin.h"
#include "switch/services/audout.h"
#include "switch/services/audrec.h"
#include "switch/services/audren.h"
#include "switch/services/auddev.h"
#include "switch/services/hwopus.h"
@ -62,19 +64,24 @@ extern "C" {
#include "switch/services/lbl.h"
#include "switch/services/i2c.h"
#include "switch/services/gpio.h"
#include "switch/services/uart.h"
#include "switch/services/bpc.h"
#include "switch/services/pcv.h"
#include "switch/services/clkrst.h"
#include "switch/services/fan.h"
#include "switch/services/pgl.h"
#include "switch/services/psm.h"
#include "switch/services/spsm.h"
//#include "switch/services/bsd.h" Use <sys/socket.h> instead
//#include "switch/services/sfdnsres.h" Use <netdb.h> instead
//#include "switch/services/htcs.h"
#include "switch/services/fatal.h"
#include "switch/services/time.h"
#include "switch/services/usb.h"
#include "switch/services/usbds.h"
#include "switch/services/usbhs.h"
#include "switch/services/hid.h"
#include "switch/services/hidbus.h"
#include "switch/services/hiddbg.h"
#include "switch/services/hidsys.h"
#include "switch/services/irs.h"
@ -82,20 +89,32 @@ extern "C" {
#include "switch/services/vi.h"
#include "switch/services/nv.h"
#include "switch/services/nifm.h"
#include "switch/services/nim.h"
#include "switch/services/ns.h"
#include "switch/services/ldr.h"
#include "switch/services/ro.h"
#include "switch/services/tc.h"
#include "switch/services/ts.h"
#include "switch/services/pm.h"
#include "switch/services/set.h"
#include "switch/services/ssl.h"
#include "switch/services/lr.h"
#include "switch/services/bt.h"
#include "switch/services/btdrv.h"
#include "switch/services/btm.h"
#include "switch/services/btmu.h"
#include "switch/services/btmsys.h"
#include "switch/services/spl.h"
#include "switch/services/ncm.h"
#include "switch/services/psc.h"
#include "switch/services/caps.h"
#include "switch/services/capsa.h"
#include "switch/services/capsc.h"
#include "switch/services/capsdc.h"
#include "switch/services/capsu.h"
#include "switch/services/capssc.h"
#include "switch/services/capssu.h"
#include "switch/services/capmtp.h"
#include "switch/services/nfc.h"
#include "switch/services/wlaninf.h"
#include "switch/services/pctl.h"
@ -103,6 +122,15 @@ extern "C" {
#include "switch/services/grc.h"
#include "switch/services/friends.h"
#include "switch/services/notif.h"
#include "switch/services/mii.h"
#include "switch/services/miiimg.h"
#include "switch/services/ldn.h"
#include "switch/services/lp2p.h"
#include "switch/services/news.h"
#include "switch/services/ins.h"
#include "switch/services/ectx.h"
#include "switch/services/avm.h"
#include "switch/services/mm.h"
#include "switch/display/binder.h"
#include "switch/display/parcel.h"
@ -125,6 +153,9 @@ extern "C" {
#include "switch/applets/album_la.h"
#include "switch/applets/friends_la.h"
#include "switch/applets/hid_la.h"
#include "switch/applets/mii_la.h"
#include "switch/applets/nfp_la.h"
#include "switch/applets/nifm_la.h"
#include "switch/applets/pctlauth.h"
#include "switch/applets/psel.h"
#include "switch/applets/error.h"
@ -133,8 +164,12 @@ extern "C" {
#include "switch/runtime/env.h"
#include "switch/runtime/hosversion.h"
#include "switch/runtime/diag.h"
#include "switch/runtime/nxlink.h"
#include "switch/runtime/resolver.h"
#include "switch/runtime/pad.h"
#include "switch/runtime/ringcon.h"
#include "switch/runtime/btdev.h"
#include "switch/runtime/util/utf.h"

View File

@ -25,9 +25,18 @@ typedef struct {
u32 desc; ///< The error description.
} ErrorCode;
/// Error type for ErrorContext.type
typedef enum {
ErrorContextType_None = 0, ///< None
ErrorContextType_Http = 1, ///< Http
ErrorContextType_FileSystem = 2, ///< FileSystem
ErrorContextType_WebMediaPlayer = 3, ///< WebMediaPlayer
ErrorContextType_LocalContentShare = 4, ///< LocalContentShare
} ErrorContextType;
/// Error context.
typedef struct {
u8 type; ///< Type
u8 type; ///< Type, see \ref ErrorContextType.
u8 pad[7]; ///< Padding
u8 data[0x1f4]; ///< Data
Result res; ///< Result
@ -102,7 +111,7 @@ typedef struct {
u64 languageCode; ///< See set.h.
char dialogMessage[0x800]; ///< UTF-8 Dialog message.
char fullscreenMessage[0x800]; ///< UTF-8 Fullscreen message (displayed when the user clicks on "Details").
} PACKED ErrorApplicationArg;
} NX_PACKED ErrorApplicationArg;
/// Error application config.
typedef struct {
@ -274,6 +283,7 @@ void errorSystemSetContext(ErrorSystemConfig* c, const ErrorContext* ctx);
* @param fullscreen_message UTF-8 fullscreen message, displayed when the user clicks on "Details". Optional, can be NULL (which disables displaying Details).
* @note Sets the following fields: jumpFlag=1, {strings}, and uses ::ErrorType_Application. The rest are cleared.
* @note On pre-5.0.0 this will initialize languageCode by using: setInitialize(), setMakeLanguageCode(SetLanguage_ENUS, ...), and setExit(). This is needed since an empty languageCode wasn't supported until [5.0.0+] (which would also use SetLanguage_ENUS).
* @note With [10.0.0+] this must only be used when running under an Application, since otherwise the applet will trigger a fatalerr.
* @warning This applet creates an error report that is logged in the system. Proceed at your own risk!
*/
Result errorApplicationCreate(ErrorApplicationConfig* c, const char* dialog_message, const char* fullscreen_message);

View File

@ -10,9 +10,10 @@
/// Mode values for HidLaControllerSupportArgPrivate::mode.
typedef enum {
HidLaControllerSupportMode_ShowControllerSupport = 0, ///< ShowControllerSupport
HidLaControllerSupportMode_ShowControllerStrapGuide = 1, ///< [3.0.0+] ShowControllerStrapGuide
HidLaControllerSupportMode_ShowControllerFirmwareUpdate = 2, ///< [3.0.0+] ShowControllerFirmwareUpdate
HidLaControllerSupportMode_ShowControllerSupport = 0, ///< ShowControllerSupport
HidLaControllerSupportMode_ShowControllerStrapGuide = 1, ///< [3.0.0+] ShowControllerStrapGuide
HidLaControllerSupportMode_ShowControllerFirmwareUpdate = 2, ///< [3.0.0+] ShowControllerFirmwareUpdate
HidLaControllerSupportMode_ShowControllerKeyRemappingForSystem = 4, ///< [11.0.0+] ShowControllerKeyRemappingForSystem
} HidLaControllerSupportMode;
/// ControllerSupportCaller
@ -75,11 +76,18 @@ typedef struct {
u8 pad[3]; ///< Padding.
} HidLaControllerFirmwareUpdateArg;
/// ControllerKeyRemappingArg
typedef struct {
u64 unk_x0; ///< Unknown
u32 unk_x8; ///< Unknown
u8 pad[0x4]; ///< Padding
} HidLaControllerKeyRemappingArg;
/// ControllerSupportResultInfo. First 8-bytes from the applet output storage.
typedef struct {
s8 player_count; ///< playerCount.
u8 pad[3]; ///< Padding.
u32 selected_id; ///< \ref HidControllerID, selectedId.
u32 selected_id; ///< \ref HidNpadIdType, selectedId.
} HidLaControllerSupportResultInfo;
/// Struct for the applet output storage.
@ -103,6 +111,13 @@ void hidLaCreateControllerSupportArg(HidLaControllerSupportArg *arg);
*/
void hidLaCreateControllerFirmwareUpdateArg(HidLaControllerFirmwareUpdateArg *arg);
/**
* @brief Initializes a \ref HidLaControllerKeyRemappingArg with the defaults.
* @note This just uses memset() with the arg.
* @param[out] arg \ref HidLaControllerKeyRemappingArg
*/
void hidLaCreateControllerKeyRemappingArg(HidLaControllerKeyRemappingArg *arg);
/**
* @brief Sets the ExplainText for the specified player and \ref HidLaControllerSupportArg.
* @note This string is displayed in the UI box for the player.
@ -111,7 +126,7 @@ void hidLaCreateControllerFirmwareUpdateArg(HidLaControllerFirmwareUpdateArg *ar
* @param[in] str Input ExplainText UTF-8 string, max length is 0x80 excluding NUL-terminator.
+ @oaram[in] id Player controller, must be <8.
*/
Result hidLaSetExplainText(HidLaControllerSupportArg *arg, const char *str, HidControllerID id);
Result hidLaSetExplainText(HidLaControllerSupportArg *arg, const char *str, HidNpadIdType id);
/**
* @brief Launches the applet for ControllerSupport.
@ -150,3 +165,11 @@ Result hidLaShowControllerSupportForSystem(HidLaControllerSupportResultInfo *res
*/
Result hidLaShowControllerFirmwareUpdateForSystem(const HidLaControllerFirmwareUpdateArg *arg, HidLaControllerSupportCaller caller);
/**
* @brief Launches the applet for ControllerKeyRemappingForSystem.
* @note Only available on [11.0.0+].
* @param[in] arg \ref HidLaControllerKeyRemappingArg
* @param[in] caller \ref HidLaControllerSupportCaller
*/
Result hidLaShowControllerKeyRemappingForSystem(const HidLaControllerKeyRemappingArg *arg, HidLaControllerSupportCaller caller);

View File

@ -7,6 +7,7 @@
#pragma once
#include "../types.h"
#include "../services/applet.h"
#include "../services/acc.h"
/// CommonArguments
typedef struct {
@ -114,3 +115,22 @@ Result libappletRequestHomeMenu(void);
/// Equivalent to entering "System Update" under System Settings. When leaving this, it returns to the main Home Menu.
Result libappletRequestJumpToSystemUpdate(void);
/**
* @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this.
* @note Only available on [11.0.0+].
* @param[in] application_id ApplicationId
* @param[in] uid \ref AccountUid
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size.
* @param[in] sender LaunchApplicationRequestSender
*/
Result libappletRequestToLaunchApplication(u64 application_id, AccountUid uid, const void* buffer, size_t size, u32 sender);
/**
* @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this.
* @note Only available on [11.0.0+].
* @param[in] uid \ref AccountUid
* @param[in] application_id Optional ApplicationId, can be 0.
*/
Result libappletRequestJumpToStory(AccountUid uid, u64 application_id);

View File

@ -0,0 +1,101 @@
/**
* @file mii_la.h
* @brief Wrapper for using the MiiEdit LibraryApplet.
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../services/mii.h"
/// AppletMode
typedef enum {
MiiLaAppletMode_ShowMiiEdit = 0, ///< ShowMiiEdit
MiiLaAppletMode_AppendMii = 1, ///< AppendMii
MiiLaAppletMode_AppendMiiImage = 2, ///< AppendMiiImage
MiiLaAppletMode_UpdateMiiImage = 3, ///< UpdateMiiImage
MiiLaAppletMode_CreateMii = 4, ///< [10.2.0+] CreateMii
MiiLaAppletMode_EditMii = 5, ///< [10.2.0+] EditMii
} MiiLaAppletMode;
/// AppletInput
typedef struct {
s32 version; ///< Version
u32 mode; ///< \ref MiiLaAppletMode
s32 special_key_code; ///< \ref MiiSpecialKeyCode
union {
Uuid valid_uuid_array[8]; ///< ValidUuidArray. Only used with \ref MiiLaAppletMode ::NfpLaMiiLaAppletMode_AppendMiiImage / ::NfpLaMiiLaAppletMode_UpdateMiiImage.
struct {
MiiCharInfo char_info; ///< \ref MiiCharInfo
u8 unused_x64[0x28]; ///< Unused
} char_info;
};
Uuid used_uuid; ///< UsedUuid. Only used with \ref MiiLaAppletMode ::NfpLaMiiLaAppletMode_UpdateMiiImage.
u8 unk_x9C[0x64]; ///< Unused
} MiiLaAppletInput;
/// AppletOutput
typedef struct {
u32 res; ///< Result: 0 = Success, 1 = Cancel.
s32 index; ///< Index. Only set when Result is Success, where \ref MiiLaAppletMode isn't ::NfpLaMiiLaAppletMode_ShowMiiEdit.
u8 unk_x8[0x18]; ///< Unused
} MiiLaAppletOutput;
/// AppletOutputForCharInfoEditing
typedef struct {
u32 res; ///< MiiLaAppletOutput::res
MiiCharInfo char_info; ///< \ref MiiCharInfo
u8 unused[0x24]; ///< Unused
} MiiLaAppletOutputForCharInfoEditing;
/**
* @brief Launches the applet for ShowMiiEdit.
* @param[in] special_key_code \ref MiiSpecialKeyCode
*/
Result miiLaShowMiiEdit(MiiSpecialKeyCode special_key_code);
/**
* @brief Launches the applet for AppendMii.
* @param[in] special_key_code \ref MiiSpecialKeyCode
* @param[out] index Output Index.
*/
Result miiLaAppendMii(MiiSpecialKeyCode special_key_code, s32 *index);
/**
* @brief Launches the applet for AppendMiiImage.
* @param[in] special_key_code \ref MiiSpecialKeyCode
* @param[in] valid_uuid_array Input array of Uuid.
* @param[in] count Total entries for the valid_uuid_array. Must be 0-8.
* @param[out] index Output Index.
*/
Result miiLaAppendMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, s32 *index);
/**
* @brief Launches the applet for UpdateMiiImage.
* @param[in] special_key_code \ref MiiSpecialKeyCode
* @param[in] valid_uuid_array Input array of Uuid.
* @param[in] count Total entries for the valid_uuid_array. Must be 0-8.
* @param[in] used_uuid UsedUuid
* @param[out] index Output Index.
*/
Result miiLaUpdateMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, Uuid used_uuid, s32 *index);
/**
* @brief Launches the applet for CreateMii.
* @note This creates a Mii and returns it, without saving it in the database.
* @note Only available on [10.2.0+].
* @param[in] special_key_code \ref MiiSpecialKeyCode
* @param[out] out_char \ref MiiCharInfo
*/
Result miiLaCreateMii(MiiSpecialKeyCode special_key_code, MiiCharInfo *out_char);
/**
* @brief Launches the applet for EditMii.
* @note This edits the specified Mii and returns it, without saving it in the database.
* @note Only available on [10.2.0+].
* @param[in] special_key_code \ref MiiSpecialKeyCode
* @param[in] in_char \ref MiiCharInfo
* @param[out] out_char \ref MiiCharInfo
*/
Result miiLaEditMii(MiiSpecialKeyCode special_key_code, const MiiCharInfo *in_char, MiiCharInfo *out_char);

View File

@ -0,0 +1,89 @@
/**
* @file nfp_la.h
* @brief Wrapper for using the cabinet (amiibo) LibraryApplet.
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../services/nfc.h"
/// Values for NfpLaStartParamForAmiiboSettings::type.
typedef enum {
NfpLaStartParamTypeForAmiiboSettings_NicknameAndOwnerSettings = 0, ///< NicknameAndOwnerSettings
NfpLaStartParamTypeForAmiiboSettings_GameDataEraser = 1, ///< GameDataEraser
NfpLaStartParamTypeForAmiiboSettings_Restorer = 2, ///< Restorer
NfpLaStartParamTypeForAmiiboSettings_Formatter = 3, ///< Formatter
} NfpLaStartParamTypeForAmiiboSettings;
/// AmiiboSettingsStartParam
typedef struct {
u8 unk_x0[0x8]; ///< Unknown
u8 unk_x8[0x20]; ///< Unknown
u8 unk_x28; ///< Unknown
} NfpLaAmiiboSettingsStartParam;
/// StartParamForAmiiboSettings
typedef struct {
u8 unk_x0; ///< Unknown
u8 type; ///< \ref NfpLaStartParamTypeForAmiiboSettings
u8 flags; ///< Flags
u8 unk_x3; ///< NfpLaAmiiboSettingsStartParam::unk_x28
u8 unk_x4[0x8]; ///< NfpLaAmiiboSettingsStartParam::unk_x0
NfpTagInfo tag_info; ///< \ref NfpTagInfo, only enabled when flags bit1 is set.
NfpRegisterInfo register_info; ///< \ref NfpRegisterInfo, only enabled when flags bit2 is set.
u8 unk_x164[0x20]; ///< NfpLaAmiiboSettingsStartParam::unk_x8
u8 unk_x184[0x24]; ///< Unknown
} NfpLaStartParamForAmiiboSettings;
/// ReturnValueForAmiiboSettings
typedef struct {
u8 flags; ///< 0 = error, non-zero = success.
u8 pad[3]; ///< Padding
NfcDeviceHandle handle; ///< \ref NfcDeviceHandle
NfpTagInfo tag_info; ///< \ref NfpTagInfo
NfpRegisterInfo register_info; ///< \ref NfpRegisterInfo, only available when flags bit2 is set.
u8 unk_x164[0x24]; ///< Unknown
} NfpLaReturnValueForAmiiboSettings;
/**
* @brief Launches the applet for NicknameAndOwnerSettings.
* @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time.
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
* @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo.
* @param[in] in_reg_info \ref NfpRegisterInfo. Optional, can be NULL. If specified, this sets the \ref NfpRegisterInfo which will be used for writing, with an option for the user to change it.
* @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL.
* @param[out] handle \ref NfcDeviceHandle
* @param[out] reg_info_flag Flag indicating whether the data for out_reg_info is set. Optional, can be NULL.
* @param[out] out_reg_info \ref NfpRegisterInfo, see reg_info_flag. Optional, can be NULL.
*/
Result nfpLaStartNicknameAndOwnerSettings(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, const NfpRegisterInfo *in_reg_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle, bool *reg_info_flag, NfpRegisterInfo *out_reg_info);
/**
* @brief Launches the applet for GameDataEraser.
* @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time.
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
* @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo.
* @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL.
* @param[out] handle \ref NfcDeviceHandle
*/
Result nfpLaStartGameDataEraser(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle);
/**
* @brief Launches the applet for Restorer.
* @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time.
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
* @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo.
* @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL.
* @param[out] handle \ref NfcDeviceHandle
*/
Result nfpLaStartRestorer(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle);
/**
* @brief Launches the applet for Formatter.
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
* @param[out] out_tag_info \ref NfpTagInfo
* @param[out] handle \ref NfcDeviceHandle
*/
Result nfpLaStartFormatter(const NfpLaAmiiboSettingsStartParam *in_param, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle);

View File

@ -0,0 +1,16 @@
/**
* @file nifm_la.h
* @brief Wrapper for using the nifm LibraryApplet (the launched applet varies).
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../services/nifm.h"
/**
* @brief Uses \ref nifmGetResult, then on failure launches the applet.
* @param r \ref NifmRequest
*/
Result nifmLaHandleNetworkRequestResult(NifmRequest* r);

View File

@ -23,6 +23,7 @@ typedef enum {
PselUiMode_LicenseRequirementsForNetworkService = 10, ///< [6.0.0+] LicenseRequirementsForNetworkService
PselUiMode_LicenseRequirementsForNetworkServiceWithUserContextImpl = 11, ///< [7.0.0+] LicenseRequirementsForNetworkServiceWithUserContextImpl
PselUiMode_UserCreatorForImmediateNaLoginTest = 12, ///< [7.0.0+] UserCreatorForImmediateNaLoginTest
PselUiMode_UserQualificationPromoter = 13, ///< [13.0.0+] UserQualificationPromoter
} PselUiMode;
/// UI message text to display with ::PselUiMode_UserSelector. Invalid values are handled as ::PselUserSelectionPurpose_General.
@ -200,3 +201,10 @@ Result pselShowUserCreatorForStarter(void);
* @param[in] user Input user ID.
*/
Result pselShowNintendoAccountNnidLinker(AccountUid user);
/**
* @brief Shows the applet for UserQualificationPromoter.
* @note Only available on [13.0.0+].
* @param[in] user Input user ID.
*/
Result pselShowUserQualificationPromoter(AccountUid user);

View File

@ -18,9 +18,16 @@ typedef enum {
/// Type of keyboard.
typedef enum {
SwkbdType_Normal = 0, ///< Normal keyboard.
SwkbdType_NumPad = 1, ///< Number pad. The buttons at the bottom left/right are only available when they're set by \ref swkbdConfigSetLeftOptionalSymbolKey / \ref swkbdConfigSetRightOptionalSymbolKey.
SwkbdType_QWERTY = 2, ///< QWERTY (and variants) keyboard only.
SwkbdType_Normal = 0, ///< Normal keyboard.
SwkbdType_NumPad = 1, ///< Number pad. The buttons at the bottom left/right are only available when they're set by \ref swkbdConfigSetLeftOptionalSymbolKey / \ref swkbdConfigSetRightOptionalSymbolKey.
SwkbdType_QWERTY = 2, ///< QWERTY (and variants) keyboard only.
SwkbdType_Unknown3 = 3, ///< The same as SwkbdType_Normal keyboard.
SwkbdType_Latin = 4, ///< All Latin like languages keyboard only (without CJK keyboard).
SwkbdType_ZhHans = 5, ///< Chinese Simplified keyboard only.
SwkbdType_ZhHant = 6, ///< Chinese Traditional keyboard only.
SwkbdType_Korean = 7, ///< Korean keyboard only.
SwkbdType_All = 8, ///< All language keyboards.
SwkbdType_Unknown9 = 9, ///< Unknown
} SwkbdType;
/// Bitmask for SwkbdArgCommon::keySetDisableBitmask. This disables keys on the keyboard when the corresponding bit(s) are set.
@ -77,16 +84,17 @@ typedef enum {
/// SwkbdInline State
typedef enum {
SwkbdState_Inactive = 0x0, ///< Default state from \ref swkbdInlineCreate, before a state is set by \ref swkbdInlineUpdate when a reply is received. Also indicates that the applet is no longer running.
SwkbdState_Initialized = 0x1, ///< Applet is initialized.
SwkbdState_Unknown2 = 0x2,
SwkbdState_TextAvailable = 0x3, ///< Text is available since a ChangedString* reply was received.
SwkbdState_Submitted = 0x4, ///< The user pressed the ok-button, submitting the text and closing the applet.
SwkbdState_Initialized = 0x1, ///< Applet is initialized but hidden.
SwkbdState_Appearing = 0x2, ///< Applet is appearing.
SwkbdState_Shown = 0x3, ///< Applet is fully shown and ready to accept text input.
SwkbdState_Disappearing = 0x4, ///< The user pressed the ok or cancel button, causing the applet to disappear.
SwkbdState_Unknown5 = 0x5,
SwkbdState_Unknown6 = 0x6,
} SwkbdState;
/// Value for \ref SwkbdInitializeArg mode. Controls the LibAppletMode when launching the applet.
typedef enum {
SwkbdInlineMode_UserDisplay = 0, ///< LibAppletMode_Unknown3. This is the default. The user-process must handle displaying the swkbd gfx on the screen. Attempting to get the swkbd gfx data for this currently throws an error (unknown why), SwkbdInlineMode_AppletDisplay should be used instead.
SwkbdInlineMode_UserDisplay = 0, ///< LibAppletMode_BackgroundIndirect. This is the default. The user-process must handle displaying the swkbd gfx on the screen, by loading the image with \ref swkbdInlineGetImage.
SwkbdInlineMode_AppletDisplay = 1, ///< LibAppletMode_Background. The applet will handle displaying gfx on the screen.
} SwkbdInlineMode;
@ -108,7 +116,7 @@ typedef struct {
u32 buffer_size; ///< 0x1000-byte aligned buffer size.
u64 entries[0x18];
u16 total_entries;
} PACKED SwkbdCustomizedDictionarySet;
} NX_PACKED SwkbdCustomizedDictionarySet;
/// Base swkbd arg struct.
typedef struct {
@ -125,7 +133,7 @@ typedef struct {
u16 guideText[514/2];
u16 pad_x3aa;
u32 stringLenMax; ///< When non-zero, specifies the max string length. When the input is too long, swkbd will stop accepting more input until text is deleted via the B button (Backspace). See also \ref SwkbdTextDrawType.
u32 stringLenMaxExt; ///< When non-zero, specifies the max string length. When the input is too long, swkbd will display an icon and disable the ok-button.
u32 stringLenMin; ///< When non-zero, specifies the min string length. When the input is too short, swkbd will display an icon and disable the ok-button.
u32 passwordFlag; ///< Use password: 0 = disable, 1 = enable.
SwkbdTextDrawType textDrawType; ///< See \ref SwkbdTextDrawType.
u16 returnButtonFlag; ///< Controls whether the Return button is enabled, for newlines input. 0 = disabled, non-zero = enabled.
@ -178,6 +186,14 @@ typedef struct {
u32 version;
} SwkbdConfig;
/// Rect
typedef struct {
s16 x; ///< X
s16 y; ///< Y
s16 width; ///< Width
s16 height; ///< Height
} SwkbdRect;
/// InitializeArg for SwkbdInline.
typedef struct {
u32 unk_x0;
@ -194,10 +210,10 @@ typedef struct {
u8 dicFlag; ///< Enables dictionary usage when non-zero (including the system dictionary).
u8 unk_x1b;
u32 keySetDisableBitmask; ///< See SwkbdKeyDisableBitmask_*.
s32 unk_x20;
s32 unk_x24;
s32 stringLenMax; ///< When non-negative and non-zero, specifies the max string length. When the input is too long, swkbd will stop accepting more input until text is deleted via the B button (Backspace).
s32 stringLenMin; ///< When non-negative and non-zero, specifies the min string length. When the input is too short, swkbd will display an icon and disable the ok-button.
u8 returnButtonFlag; ///< Controls whether the Return button is enabled, for newlines input. 0 = disabled, non-zero = enabled.
u8 unk_x29;
u8 unk_x29; ///< [10.0.0+] When value 1-2, \ref swkbdInlineAppear / \ref swkbdInlineAppearEx will set keytopAsFloating=0 and footerScalable=1.
u8 unk_x2a;
u8 unk_x2b;
u32 flags; ///< Bitmask 0x4: unknown.
@ -225,7 +241,7 @@ typedef struct {
u8 alphaEnabledInInputMode; ///< Flags bitmask 0x100.
u8 inputModeFadeType; ///< Flags bitmask 0x100.
u8 disableTouch; ///< Flags bitmask 0x200.
u8 disableUSBKeyboard; ///< Flags bitmask 0x800.
u8 disableHardwareKeyboard; ///< Flags bitmask 0x800.
u8 unk_x468[5];
u8 unk_x46d;
u8 unk_x46e;
@ -365,7 +381,7 @@ void swkbdConfigMakePresetUserName(SwkbdConfig* c);
/**
* @brief Clears the args in the SwkbdConfig struct and initializes it with the DownloadCode Preset.
* @note Do not use this before \ref swkbdCreate.
* @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal (\ref SwkbdType_QWERTY on [5.0.0+]), swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_DownloadCode, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. [5.0.0+]: swkbdConfigSetStringLenMax() with value 16, swkbdConfigSetStringLenMaxExt() with value 1, and swkbdConfigSetTextDrawType() with SwkbdTextDrawType_DownloadCode. Uses swkbdConfigSetTextGrouping() for [0-2] with: 0x3, 0x7, and 0xb.
* @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal (\ref SwkbdType_QWERTY on [5.0.0+]), swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_DownloadCode, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. [5.0.0+]: swkbdConfigSetStringLenMax() with value 16, swkbdConfigSetStringLenMin() with value 1, and swkbdConfigSetTextDrawType() with SwkbdTextDrawType_DownloadCode. Uses swkbdConfigSetTextGrouping() for [0-2] with: 0x3, 0x7, and 0xb.
* @param c SwkbdConfig struct.
*/
void swkbdConfigMakePresetDownloadCode(SwkbdConfig* c);
@ -491,12 +507,12 @@ static inline void swkbdConfigSetStringLenMax(SwkbdConfig* c, u32 stringLenMax)
}
/**
* @brief Sets SwkbdArgCommon::stringLenMaxExt.
* @brief Sets SwkbdArgCommon::stringLenMin.
* @param c SwkbdConfig struct.
* @param stringLenMaxExt stringLenMaxExt
* @param stringLenMin stringLenMin
*/
static inline void swkbdConfigSetStringLenMaxExt(SwkbdConfig* c, u32 stringLenMaxExt) {
c->arg.arg.arg.stringLenMaxExt = stringLenMaxExt;
static inline void swkbdConfigSetStringLenMin(SwkbdConfig* c, u32 stringLenMin) {
c->arg.arg.arg.stringLenMin = stringLenMin;
}
/**
@ -599,6 +615,63 @@ Result swkbdInlineLaunch(SwkbdInline* s);
*/
Result swkbdInlineLaunchForLibraryApplet(SwkbdInline* s, u8 mode, u8 unk_x5);
/**
* @brief GetWindowSize
* @param[out] width Output width.
* @param[out] height Output height.
*/
NX_CONSTEXPR void swkbdInlineGetWindowSize(s32 *width, s32 *height) {
*width = 1280;
*height = 720;
}
/**
* @brief GetImageMemoryRequirement
* @note Wrapper for \ref viGetIndirectLayerImageRequiredMemoryInfo.
* @param[out] out_size Output size.
* @param[out] out_alignment Output alignment.
*/
Result swkbdInlineGetImageMemoryRequirement(u64 *out_size, u64 *out_alignment);
/**
* @brief GetImage
* @note Only available with ::SwkbdInlineMode_UserDisplay.
* @note For width/height, see \ref swkbdInlineGetWindowSize.
* @param s SwkbdInline object.
* @param[out] buffer Output RGBA8 image buffer, this must use the alignment from \ref swkbdInlineGetImageMemoryRequirement.
* @param[in] size Output buffer size, this must match the size from \ref swkbdInlineGetImageMemoryRequirement.
* @param[out] data_available Whether data is available.
*/
Result swkbdInlineGetImage(SwkbdInline* s, void* buffer, u64 size, bool *data_available);
/**
* @brief Gets the image max height, relative to the bottom of the screen.
* @param s SwkbdInline object.
*/
s32 swkbdInlineGetMaxHeight(SwkbdInline* s);
/**
* @brief Gets the MiniaturizedHeight, relative to the bottom of the screen.
* @param s SwkbdInline object.
*/
s32 swkbdInlineGetMiniaturizedHeight(SwkbdInline* s);
/**
* @brief GetTouchRectangles. Returns number of valid Rects: 1 for only keytop, 2 for keytop/footer.
* @param s SwkbdInline object.
* @param[out] keytop \ref SwkbdRect for keytop. Optional, can be NULL.
* @param[out] footer \ref SwkbdRect for footer. Optional, can be NULL.
*/
s32 swkbdInlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *footer);
/**
* @brief Gets whether the input x/y are within the output from \ref swkbdInlineGetTouchRectangles.
* @param s SwkbdInline object.
* @param[out] x X
* @param[out] y Y
*/
bool swkbdInlineIsUsedTouchPointByKeyboard(SwkbdInline* s, s32 x, s32 y);
/**
* @brief Handles updating SwkbdInline state, this should be called periodically.
* @note Handles applet exit if needed, and also sends the \ref SwkbdInlineCalcArg to the applet if needed. Hence, this should be called at some point after writing to \ref SwkbdInlineCalcArg.
@ -732,6 +805,24 @@ void swkbdInlineAppearArgSetLeftButtonText(SwkbdAppearArg* arg, const char* str)
*/
void swkbdInlineAppearArgSetRightButtonText(SwkbdAppearArg* arg, const char* str);
/**
* @brief Sets the stringLenMax for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg.
* @param arg \ref SwkbdAppearArg
* @param stringLenMax Max string length
*/
static inline void swkbdInlineAppearArgSetStringLenMax(SwkbdAppearArg* arg, s32 stringLenMax) {
arg->stringLenMax = stringLenMax;
}
/**
* @brief Sets the stringLenMin for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg.
* @param arg \ref SwkbdAppearArg
* @param stringLenMin Min string length
*/
static inline void swkbdInlineAppearArgSetStringLenMin(SwkbdAppearArg* arg, s32 stringLenMin) {
arg->stringLenMin = stringLenMin;
}
/**
* @brief Sets the audio volume.
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
@ -759,7 +850,7 @@ void swkbdInlineSetCursorPos(SwkbdInline* s, s32 pos);
/**
* @brief Sets the UserWordInfo.
* @note Not avilable when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this was already used previously.
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this was already used previously.
* @note The specified buffer must not be used after this, until \ref swkbdInlineClose is used.
* @note \ref swkbdInlineUpdate must be called at some point afterwards.
* @note If input==NULL or total_entries==0, this will just call \ref swkbdInlineUnsetUserWordInfo internally.
@ -772,7 +863,7 @@ Result swkbdInlineSetUserWordInfo(SwkbdInline* s, const SwkbdDictWord *input, s3
/**
* @brief Request UnsetUserWordInfo.
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
* @note Not avilable when \ref SwkbdState is above ::SwkbdState_Initialized.
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized.
* @param s SwkbdInline object.
*/
Result swkbdInlineUnsetUserWordInfo(SwkbdInline* s);
@ -788,7 +879,7 @@ void swkbdInlineSetUtf8Mode(SwkbdInline* s, bool flag);
/**
* @brief Sets the CustomizeDic.
* @note Not avilable when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizedDictionaries was already used previously.
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizedDictionaries was already used previously.
* @note The specified buffer must not be used after this, until \ref swkbdInlineClose is used. However, it will also become available once \ref swkbdInlineUpdate handles SwkbdReplyType_UnsetCustomizeDic internally.
* @param s SwkbdInline object.
* @param buffer 0x1000-byte aligned buffer.
@ -800,14 +891,14 @@ Result swkbdInlineSetCustomizeDic(SwkbdInline* s, void* buffer, size_t size, Swk
/**
* @brief Request UnsetCustomizeDic.
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
* @note Not avilable when \ref SwkbdState is above ::SwkbdState_Initialized.
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized.
* @param s SwkbdInline object.
*/
void swkbdInlineUnsetCustomizeDic(SwkbdInline* s);
/**
* @brief Sets the CustomizedDictionaries.
* @note Not avilable when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizeDic was already used previously.
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizeDic was already used previously.
* @note The specified buffer in dic must not be used after this, until \ref swkbdInlineClose is used. However, it will also become available once \ref swkbdInlineUpdate handles SwkbdReplyType_UnsetCustomizedDictionaries internally.
* @note Only available on [6.0.0+].
* @param s SwkbdInline object.
@ -817,7 +908,7 @@ Result swkbdInlineSetCustomizedDictionaries(SwkbdInline* s, const SwkbdCustomize
/**
* @brief Request UnsetCustomizedDictionaries.
* @note Not avilable when \ref SwkbdState is above ::SwkbdState_Initialized.
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized.
* @note Only available on [6.0.0+].
* @param s SwkbdInline object.
*/
@ -858,6 +949,7 @@ void swkbdInlineSetFooterBgAlpha(SwkbdInline* s, float alpha);
/**
* @brief Sets gfx scaling. Configures KeytopScale* and BalloonScale based on the input value.
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
* @note The BalloonScale is not updated when \ref SwkbdState is above ::SwkbdState_Initialized.
* @param s SwkbdInline object.
* @param scale Scale
*/
@ -875,6 +967,7 @@ void swkbdInlineSetKeytopTranslate(SwkbdInline* s, float x, float y);
/**
* @brief Sets KeytopAsFloating.
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized.
* @param s SwkbdInline object.
* @param flag Flag
*/
@ -897,12 +990,12 @@ void swkbdInlineSetFooterScalable(SwkbdInline* s, bool flag);
void swkbdInlineSetTouchFlag(SwkbdInline* s, bool flag);
/**
* @brief Sets whether USB-keyboard is enabled. The default is enabled.
* @brief Sets whether Hardware-keyboard is enabled. The default is enabled.
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
* @param s SwkbdInline object.
* @param flag Flag
*/
void swkbdInlineSetUSBKeyboardFlag(SwkbdInline* s, bool flag);
void swkbdInlineSetHardwareKeyboardFlag(SwkbdInline* s, bool flag);
/**
* @brief Sets whether DirectionalButtonAssign is enabled. The default is disabled.

View File

@ -9,6 +9,7 @@
#include "../services/applet.h"
#include "../services/caps.h"
#include "../services/acc.h"
#include "../kernel/mutex.h"
/// This indicates the type of web-applet.
typedef enum {
@ -28,6 +29,7 @@ typedef enum {
WebExitReason_Requested = 0x2, ///< The applet exited since \ref webConfigRequestExit was used.
WebExitReason_LastUrl = 0x3, ///< The applet exited due to LastUrl handling, see \ref webReplyGetLastUrl.
WebExitReason_ErrorDialog = 0x7, ///< The applet exited after displaying an error dialog.
WebExitReason_UnknownE = 0xE, ///< Unknown
} WebExitReason;
/// Button values for \ref webConfigSetBootFooterButtonVisible.
@ -42,6 +44,26 @@ typedef enum {
WebFooterButtonId_Max, ///< Values starting with this are invalid.
} WebFooterButtonId;
/// WebSessionBootMode
typedef enum {
WebSessionBootMode_AllForeground = 0, ///< AllForeground. This is the default.
WebSessionBootMode_AllForegroundInitiallyHidden = 1, ///< AllForegroundInitiallyHidden
} WebSessionBootMode;
/// WebSessionSendMessageKind
typedef enum {
WebSessionSendMessageKind_BrowserEngineContent = 0x0, ///< BrowserEngine Content
WebSessionSendMessageKind_SystemMessageAppear = 0x100, ///< SystemMessage Appear
WebSessionSendMessageKind_Ack = 0x1000, ///< Ack
} WebSessionSendMessageKind;
/// WebSessionReceiveMessageKind
typedef enum {
WebSessionReceiveMessageKind_BrowserEngineContent = 0x0, ///< BrowserEngine Content
WebSessionReceiveMessageKind_AckBrowserEngine = 0x1000, ///< Ack BrowserEngine
WebSessionReceiveMessageKind_AckSystemMessage = 0x1001, ///< Ack SystemMessage
} WebSessionReceiveMessageKind;
/// Struct for the WebWifi applet input storage.
typedef struct {
u32 unk_x0; ///< Official sw sets this to 0 with appletStorageWrite, separately from the rest of the config struct.
@ -73,21 +95,21 @@ typedef struct {
u32 pad; ///< Padding
char lastUrl[0x1000]; ///< LastUrl string
u64 lastUrlSize; ///< Size of LastUrl, including NUL-terminator.
} PACKED WebCommonReturnValue;
} NX_PACKED WebCommonReturnValue;
/// Header struct at offset 0 in the web Arg storage (non-webWifi).
typedef struct {
u16 total_entries; ///< Total \ref WebArgTLV entries following this struct.
u16 pad; ///< Padding
WebShimKind shimKind; ///< ShimKind
} PACKED WebArgHeader;
} NX_PACKED WebArgHeader;
/// Web TLV used in the web Arg storage.
typedef struct {
u16 type; ///< Type of this arg.
u16 size; ///< Size of the arg data following this struct.
u8 pad[4]; ///< Padding
} PACKED WebArgTLV;
} NX_PACKED WebArgTLV;
/// Config struct for web applets, non-WebWifi.
typedef struct {
@ -111,7 +133,34 @@ typedef struct {
u8 visible;
u16 unk_x5;
u8 unk_x7;
} PACKED WebBootFooterButtonEntry;
} NX_PACKED WebBootFooterButtonEntry;
/// StorageHandleQueue
typedef struct {
s32 read_pos;
s32 write_pos;
s32 max_storages;
bool is_full;
AppletStorage storages[0x10];
} WebSessionStorageHandleQueue;
/// WebSession
typedef struct {
Mutex mutex;
WebCommonConfig *config;
struct {
u32 count;
u32 cur_size;
} queue[2];
WebSessionStorageHandleQueue storage_queue;
} WebSession;
/// SessionMessageHeader
typedef struct {
u32 kind; ///< Message Kind (\ref WebSessionSendMessageKind / \ref WebSessionReceiveMessageKind)
u32 size; ///< Data size following the header.
u8 reserved[0x8]; ///< Unused
} WebSessionMessageHeader;
/// Types for \ref WebArgTLV, input storage.
typedef enum {
@ -175,9 +224,10 @@ typedef enum {
WebArgType_BootFooterButton = 0x3E, ///< [6.0.0+] Array of \ref WebBootFooterButtonEntry with 0x10 entries.
WebArgType_OverrideWebAudioVolume = 0x3F, ///< [6.0.0+] float
WebArgType_OverrideMediaAudioVolume = 0x40, ///< [6.0.0+] float
WebArgType_SessionBootMode = 0x41, ///< [7.0.0+] u32 enum WebSessionBootMode
WebArgType_SessionBootMode = 0x41, ///< [7.0.0+] u32 enum \ref WebSessionBootMode
WebArgType_SessionFlag = 0x42, ///< [7.0.0+] u8 bool, enables using WebSession when set.
WebArgType_MediaPlayerUi = 0x43, ///< [8.0.0+] u8 bool
WebArgType_TransferMemory = 0x44, ///< [11.0.0+] u8 bool
} WebArgType;
/// Types for \ref WebArgTLV, output storage.
@ -648,6 +698,14 @@ Result webConfigSetOverrideWebAudioVolume(WebCommonConfig* config, float value);
*/
Result webConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value);
/**
* @brief Sets \ref WebSessionBootMode.
* @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+].
* @param config WebCommonConfig object.
* @param mode \ref WebSessionBootMode
*/
Result webConfigSetBootMode(WebCommonConfig* config, WebSessionBootMode mode);
/**
* @brief Sets whether MediaPlayerUi is enabled.
* @note Only available with config created by \ref webOfflineCreate on [8.0.0+].
@ -656,6 +714,14 @@ Result webConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value
*/
Result webConfigSetMediaPlayerUi(WebCommonConfig* config, bool flag);
/**
* @brief Sets whether TransferMemory is enabled.
* @note Only available with config created by \ref webPageCreate on [11.0.0+].
* @param config WebCommonConfig object.
* @param flag Flag
*/
Result webConfigSetTransferMemory(WebCommonConfig* config, bool flag);
/**
* @brief Launches the {web applet} with the specified config and waits for it to exit.
* @param config WebCommonConfig object.
@ -725,3 +791,72 @@ Result webReplyGetPostId(WebCommonReply *reply, char *outstr, size_t outstr_maxs
*/
Result webReplyGetMediaPlayerAutoClosedByCompletion(WebCommonReply *reply, bool *flag);
/**
* @brief Creates a \ref WebSession object.
* @param s \ref WebSession
* @param config WebCommonConfig object.
*/
void webSessionCreate(WebSession *s, WebCommonConfig* config);
/**
* @brief Closes a \ref WebSession object.
* @param s \ref WebSession
*/
void webSessionClose(WebSession *s);
/**
* @brief Launches the applet for \ref WebSession.
* @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+].
* @note Do not use \ref webConfigShow when using WebSession.
* @param s \ref WebSession
* @param[out] out_event Output Event with autoclear=false, from \ref appletHolderGetExitEvent. Optional, can be NULL.
*/
Result webSessionStart(WebSession *s, Event **out_event);
/**
* @brief Waits for the applet to exit.
* @note This must be used before \ref webSessionClose, when \ref webSessionStart was used successfully.
* @param s \ref WebSession
* @param out Optional output applet reply data, can be NULL.
*/
Result webSessionWaitForExit(WebSession *s, WebCommonReply *out);
/**
* @brief Request the applet to exit.
* @note Use this instead of \ref webConfigRequestExit, when using WebSession.
* @param s \ref WebSession
*/
Result webSessionRequestExit(WebSession *s);
/**
* @brief Request the applet to Appear, this is only needed with ::WebSessionBootMode_AllForegroundInitiallyHidden.
* @note This should not be used before \ref webSessionStart.
* @param s \ref WebSession
* @param[out] flag Whether the message was sent successfully.
*/
Result webSessionAppear(WebSession *s, bool *flag);
/**
* @brief TrySendContentMessage
* @note This should not be used before \ref webSessionStart.
* @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension.
* @note The JS-side may ignore this if it's sent too soon after the applet launches.
* @param s \ref WebSession
* @param[in] content Input content NUL-terminated string.
* @param[in] size Size of content.
* @param[out] flag Whether the message was sent successfully.
*/
Result webSessionTrySendContentMessage(WebSession *s, const char *content, u32 size, bool *flag);
/**
* @brief TryReceiveContentMessage
* @note This should not be used before \ref webSessionStart.
* @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension.
* @param s \ref WebSession
* @param[out] content Output content string, always NUL-terminated.
* @param[in] size Max size of content.
* @param[out] out_size Original content size, prior to being clamped to the specified size param.
* @param[out] flag Whether the message was received successfully.
*/
Result webSessionTryReceiveContentMessage(WebSession *s, char *content, u64 size, u64 *out_size, bool *flag);

View File

@ -1,28 +0,0 @@
/**
* @file atomics.h
* @brief AArch64 atomic operations.
* @author plutoo
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
/// Atomically increments a 32-bit value.
static inline u32 atomicIncrement32(u32* p) {
return __atomic_fetch_add(p, 1, __ATOMIC_SEQ_CST);
}
/// Atomically decrements a 32-bit value.
static inline u32 atomicDecrement32(u32* p) {
return __atomic_sub_fetch(p, 1, __ATOMIC_SEQ_CST);
}
/// Atomically increments a 64-bit value.
static inline u64 atomicIncrement64(u64* p) {
return __atomic_fetch_add(p, 1, __ATOMIC_SEQ_CST);
}
/// Atomically decrements a 64-bit value.
static inline u64 atomicDecrement64(u64* p) {
return __atomic_sub_fetch(p, 1, __ATOMIC_SEQ_CST);
}

View File

@ -62,6 +62,7 @@ struct AudioDriverWaveBuf {
bool audrvVoiceInit(AudioDriver* d, int id, int num_channels, PcmFormat format, int sample_rate);
void audrvVoiceDrop(AudioDriver* d, int id);
void audrvVoiceStop(AudioDriver* d, int id);
bool audrvVoiceIsPaused(AudioDriver* d, int id);
bool audrvVoiceIsPlaying(AudioDriver* d, int id);
bool audrvVoiceAddWaveBuf(AudioDriver* d, int id, AudioDriverWaveBuf* wavebuf);
u32 audrvVoiceGetWaveBufSeq(AudioDriver* d, int id);

View File

@ -24,11 +24,12 @@ do { \
} \
} while (0)
/// Calculate a CRC32 over data.
static inline u32 crc32Calculate(const void *src, size_t size) {
/// Calculate a CRC32 over data using a seed.
/// Can be used to calculate a CRC32 in chunks using an initial seed of zero for the first chunk.
static inline u32 crc32CalculateWithSeed(u32 seed, const void *src, size_t size) {
const u8 *src_u8 = (const u8 *)src;
u32 crc = 0xFFFFFFFF;
u32 crc = ~seed;
s64 len = size;
_CRC_ALIGN(u8, b);
@ -44,14 +45,20 @@ static inline u32 crc32Calculate(const void *src, size_t size) {
_CRC_REMAINDER(u16, h);
_CRC_REMAINDER(u8, b);
return crc ^ 0xFFFFFFFF;
return ~crc;
}
/// Calculate a CRC32C over data.
static inline u32 crc32cCalculate(const void *src, size_t size) {
/// Calculate a CRC32 over data.
static inline u32 crc32Calculate(const void *src, size_t size) {
return crc32CalculateWithSeed(0, src, size);
}
/// Calculate a CRC32C over data using a seed.
/// Can be used to calculate a CRC32C in chunks using an initial seed of zero for the first chunk.
static inline u32 crc32cCalculateWithSeed(u32 seed, const void *src, size_t size) {
const u8 *src_u8 = (const u8 *)src;
u32 crc = 0xFFFFFFFF;
u32 crc = ~seed;
s64 len = size;
_CRC_ALIGN(u8, cb);
@ -67,7 +74,12 @@ static inline u32 crc32cCalculate(const void *src, size_t size) {
_CRC_REMAINDER(u16, ch);
_CRC_REMAINDER(u8, cb);
return crc ^ 0xFFFFFFFF;
return ~crc;
}
/// Calculate a CRC32C over data.
static inline u32 crc32cCalculate(const void *src, size_t size) {
return crc32cCalculateWithSeed(0, src, size);
}
#undef _CRC_REMAINDER

View File

@ -11,7 +11,7 @@ typedef struct {
} BqRect;
typedef struct {
struct { s64 timestamp; } PACKED;
struct { s64 timestamp; } NX_PACKED;
s32 isAutoTimestamp;
BqRect crop;
s32 scalingMode;

View File

@ -40,7 +40,7 @@ Result condvarWaitTimeout(CondVar* c, Mutex* m, u64 timeout);
*/
static inline Result condvarWait(CondVar* c, Mutex* m)
{
return condvarWaitTimeout(c, m, U64_MAX);
return condvarWaitTimeout(c, m, UINT64_MAX);
}
/**
@ -51,7 +51,8 @@ static inline Result condvarWait(CondVar* c, Mutex* m)
*/
static inline Result condvarWake(CondVar* c, int num)
{
return svcSignalProcessWideKey(c, num);
svcSignalProcessWideKey(c, num);
return 0;
}
/**

View File

@ -6,37 +6,19 @@
*/
#pragma once
#include "../types.h"
#include "../result.h"
#include "svc.h"
/// Returns the kernel version that can be detected by checking kernel capabilities. This only goes from 1 (representing 1.0.0) up to 6 (representing 6.0.0 and above). Generally, \ref hosversionGet should be used instead of this function.
int detectKernelVersion(void);
/// Returns true if the process has a debugger attached.
bool detectDebugger(void);
/// Returns true if the kernel is patched to allow self-process-jit.
bool detectJitKernelPatch(void);
/// After this has been called, libnx will ignore the self-process-jit kernel patch. For testing purposes only.
void detectIgnoreJitKernelPatch(void);
/// Returns true if the kernel version is equal to or above 2.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
static inline bool kernelAbove200(void) {
return detectKernelVersion() >= 2;
NX_INLINE bool detectDebugger(void) {
u64 tmp = 0;
Result rc = svcGetInfo(&tmp, InfoType_DebuggerAttached, INVALID_HANDLE, 0);
return R_SUCCEEDED(rc) && tmp != 0;
}
/// Returns true if the kernel version is equal to or above 3.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
static inline bool kernelAbove300(void) {
return detectKernelVersion() >= 3;
}
/// Returns true if the kernel version is equal to or above 4.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
static inline bool kernelAbove400(void) {
return detectKernelVersion() >= 4;
}
/// Returns true if the kernel version is equal to or above 5.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
static inline bool kernelAbove500(void) {
return detectKernelVersion() >= 5;
}
/// Returns true if the kernel version is equal to or above 6.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
static inline bool kernelAbove600(void) {
return detectKernelVersion() >= 6;
/// Returns true if the underlying kernel is Mesosphère.
NX_INLINE bool detectMesosphere(void) {
u64 dummy = 0;
Result rc = svcGetInfo(&dummy, 65000, INVALID_HANDLE, 0); // InfoType_MesosphereMeta
return R_SUCCEEDED(rc);
}

View File

@ -1,786 +0,0 @@
/**
* @file ipc.h
* @brief Inter-process communication handling
* @author plutoo
* @copyright libnx Authors
*/
#pragma once
#include "../result.h"
#include "../arm/tls.h"
#include "../kernel/svc.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
/// IPC input header magic
#define SFCI_MAGIC 0x49434653
/// IPC output header magic
#define SFCO_MAGIC 0x4f434653
/// IPC invalid object ID
#define IPC_INVALID_OBJECT_ID UINT32_MAX
///@name IPC request building
///@{
/// IPC command (request) structure.
#define IPC_MAX_BUFFERS 8
#define IPC_MAX_OBJECTS 8
typedef enum {
BufferType_Normal=0, ///< Regular buffer.
BufferType_Type1=1, ///< Allows ProcessMemory and shared TransferMemory.
BufferType_Invalid=2,
BufferType_Type3=3 ///< Same as Type1 except remote process is not allowed to use device-mapping.
} BufferType DEPRECATED;
typedef enum {
BufferDirection_Send=0,
BufferDirection_Recv=1,
BufferDirection_Exch=2,
} BufferDirection DEPRECATED;
typedef enum {
IpcCommandType_Invalid = 0,
IpcCommandType_LegacyRequest = 1,
IpcCommandType_Close = 2,
IpcCommandType_LegacyControl = 3,
IpcCommandType_Request = 4,
IpcCommandType_Control = 5,
IpcCommandType_RequestWithContext = 6,
IpcCommandType_ControlWithContext = 7,
} IpcCommandType DEPRECATED;
typedef enum {
DomainMessageType_Invalid = 0,
DomainMessageType_SendMessage = 1,
DomainMessageType_Close = 2,
} DomainMessageType DEPRECATED;
/// IPC domain message header.
typedef struct {
u8 Type;
u8 NumObjectIds;
u16 Length;
u32 ThisObjectId;
u32 Pad[2];
} DomainMessageHeader DEPRECATED;
/// IPC domain response header.
typedef struct {
u32 NumObjectIds;
u32 Pad[3];
} DomainResponseHeader DEPRECATED;
typedef struct {
size_t NumSend; // A
size_t NumRecv; // B
size_t NumExch; // W
const void* Buffers[IPC_MAX_BUFFERS];
size_t BufferSizes[IPC_MAX_BUFFERS];
BufferType BufferTypes[IPC_MAX_BUFFERS];
size_t NumStaticIn; // X
size_t NumStaticOut; // C
const void* Statics[IPC_MAX_BUFFERS];
size_t StaticSizes[IPC_MAX_BUFFERS];
u8 StaticIndices[IPC_MAX_BUFFERS];
bool SendPid;
size_t NumHandlesCopy;
size_t NumHandlesMove;
Handle Handles[IPC_MAX_OBJECTS];
size_t NumObjectIds;
u32 ObjectIds[IPC_MAX_OBJECTS];
} IpcCommand DEPRECATED;
/**
* @brief Initializes an IPC command structure.
* @param cmd IPC command structure.
*/
DEPRECATED
static inline void ipcInitialize(IpcCommand* cmd) {
*cmd = (IpcCommand){};
}
/// IPC buffer descriptor.
typedef struct {
u32 Size; ///< Size of the buffer.
u32 Addr; ///< Lower 32-bits of the address of the buffer
u32 Packed; ///< Packed data (including higher bits of the address)
} IpcBufferDescriptor DEPRECATED;
/// IPC static send-buffer descriptor.
typedef struct {
u32 Packed; ///< Packed data (including higher bits of the address)
u32 Addr; ///< Lower 32-bits of the address
} IpcStaticSendDescriptor DEPRECATED;
/// IPC static receive-buffer descriptor.
typedef struct {
u32 Addr; ///< Lower 32-bits of the address of the buffer
u32 Packed; ///< Packed data (including higher bits of the address)
} IpcStaticRecvDescriptor DEPRECATED;
/**
* @brief Adds a buffer to an IPC command structure.
* @param cmd IPC command structure.
* @param buffer Address of the buffer.
* @param size Size of the buffer.
* @param type Buffer type.
*/
DEPRECATED
static inline void ipcAddSendBuffer(IpcCommand* cmd, const void* buffer, size_t size, BufferType type) {
size_t off = cmd->NumSend;
cmd->Buffers[off] = buffer;
cmd->BufferSizes[off] = size;
cmd->BufferTypes[off] = type;
cmd->NumSend++;
}
/**
* @brief Adds a receive-buffer to an IPC command structure.
* @param cmd IPC command structure.
* @param buffer Address of the buffer.
* @param size Size of the buffer.
* @param type Buffer type.
*/
DEPRECATED
static inline void ipcAddRecvBuffer(IpcCommand* cmd, void* buffer, size_t size, BufferType type) {
size_t off = cmd->NumSend + cmd->NumRecv;
cmd->Buffers[off] = buffer;
cmd->BufferSizes[off] = size;
cmd->BufferTypes[off] = type;
cmd->NumRecv++;
}
/**
* @brief Adds an exchange-buffer to an IPC command structure.
* @param cmd IPC command structure.
* @param buffer Address of the buffer.
* @param size Size of the buffer.
* @param type Buffer type.
*/
DEPRECATED
static inline void ipcAddExchBuffer(IpcCommand* cmd, void* buffer, size_t size, BufferType type) {
size_t off = cmd->NumSend + cmd->NumRecv + cmd->NumExch;
cmd->Buffers[off] = buffer;
cmd->BufferSizes[off] = size;
cmd->BufferTypes[off] = type;
cmd->NumExch++;
}
/**
* @brief Adds a static-buffer to an IPC command structure.
* @param cmd IPC command structure.
* @param buffer Address of the buffer.
* @param size Size of the buffer.
* @param index Index of buffer.
*/
DEPRECATED
static inline void ipcAddSendStatic(IpcCommand* cmd, const void* buffer, size_t size, u8 index) {
size_t off = cmd->NumStaticIn;
cmd->Statics[off] = buffer;
cmd->StaticSizes[off] = size;
cmd->StaticIndices[off] = index;
cmd->NumStaticIn++;
}
/**
* @brief Adds a static-receive-buffer to an IPC command structure.
* @param cmd IPC command structure.
* @param buffer Address of the buffer.
* @param size Size of the buffer.
* @param index Index of buffer.
*/
DEPRECATED
static inline void ipcAddRecvStatic(IpcCommand* cmd, void* buffer, size_t size, u8 index) {
size_t off = cmd->NumStaticIn + cmd->NumStaticOut;
cmd->Statics[off] = buffer;
cmd->StaticSizes[off] = size;
cmd->StaticIndices[off] = index;
cmd->NumStaticOut++;
}
/**
* @brief Adds a smart-buffer (buffer + static-buffer pair) to an IPC command structure.
* @param cmd IPC command structure.
* @param pointer_buffer_size Pointer buffer size.
* @param buffer Address of the buffer.
* @param size Size of the buffer.
* @param index Index of buffer.
*/
DEPRECATED
static inline void ipcAddSendSmart(IpcCommand* cmd, size_t pointer_buffer_size, const void* buffer, size_t size, u8 index) {
if (pointer_buffer_size != 0 && size <= pointer_buffer_size) {
ipcAddSendBuffer(cmd, NULL, 0, BufferType_Normal);
ipcAddSendStatic(cmd, buffer, size, index);
} else {
ipcAddSendBuffer(cmd, buffer, size, BufferType_Normal);
ipcAddSendStatic(cmd, NULL, 0, index);
}
}
/**
* @brief Adds a smart-receive-buffer (buffer + static-receive-buffer pair) to an IPC command structure.
* @param cmd IPC command structure.
* @param pointer_buffer_size Pointer buffer size.
* @param buffer Address of the buffer.
* @param size Size of the buffer.
* @param index Index of buffer.
*/
DEPRECATED
static inline void ipcAddRecvSmart(IpcCommand* cmd, size_t pointer_buffer_size, void* buffer, size_t size, u8 index) {
if (pointer_buffer_size != 0 && size <= pointer_buffer_size) {
ipcAddRecvBuffer(cmd, NULL, 0, BufferType_Normal);
ipcAddRecvStatic(cmd, buffer, size, index);
} else {
ipcAddRecvBuffer(cmd, buffer, size, BufferType_Normal);
ipcAddRecvStatic(cmd, NULL, 0, index);
}
}
/**
* @brief Tags an IPC command structure to send the PID.
* @param cmd IPC command structure.
*/
DEPRECATED
static inline void ipcSendPid(IpcCommand* cmd) {
cmd->SendPid = true;
}
/**
* @brief Adds a copy-handle to be sent through an IPC command structure.
* @param cmd IPC command structure.
* @param h Handle to send.
* @remark The receiving process gets a copy of the handle.
*/
DEPRECATED
static inline void ipcSendHandleCopy(IpcCommand* cmd, Handle h) {
cmd->Handles[cmd->NumHandlesCopy++] = h;
}
/**
* @brief Adds a move-handle to be sent through an IPC command structure.
* @param cmd IPC command structure.
* @param h Handle to send.
* @remark The sending process loses ownership of the handle, which is transferred to the receiving process.
*/
DEPRECATED
static inline void ipcSendHandleMove(IpcCommand* cmd, Handle h) {
cmd->Handles[cmd->NumHandlesCopy + cmd->NumHandlesMove++] = h;
}
/**
* @brief Prepares the header of an IPC command structure.
* @param cmd IPC command structure.
* @param sizeof_raw Size in bytes of the raw data structure to embed inside the IPC request
* @return Pointer to the raw embedded data structure in the request, ready to be filled out.
*/
DEPRECATED
static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) {
u32* buf = (u32*)armGetTls();
size_t i;
*buf++ = IpcCommandType_Request | (cmd->NumStaticIn << 16) | (cmd->NumSend << 20) | (cmd->NumRecv << 24) | (cmd->NumExch << 28);
u32* fill_in_size_later = buf;
if (cmd->NumStaticOut > 0) {
*buf = (cmd->NumStaticOut + 2) << 10;
}
else {
*buf = 0;
}
if (cmd->SendPid || cmd->NumHandlesCopy > 0 || cmd->NumHandlesMove > 0) {
*buf++ |= 0x80000000;
*buf++ = (!!cmd->SendPid) | (cmd->NumHandlesCopy << 1) | (cmd->NumHandlesMove << 5);
if (cmd->SendPid)
buf += 2;
for (i=0; i<(cmd->NumHandlesCopy + cmd->NumHandlesMove); i++)
*buf++ = cmd->Handles[i];
}
else {
buf++;
}
for (i=0; i<cmd->NumStaticIn; i++, buf+=2) {
IpcStaticSendDescriptor* desc = (IpcStaticSendDescriptor*) buf;
uintptr_t ptr = (uintptr_t) cmd->Statics[i];
desc->Addr = ptr;
desc->Packed = cmd->StaticIndices[i] | (cmd->StaticSizes[i] << 16) |
(((ptr >> 32) & 15) << 12) | (((ptr >> 36) & 15) << 6);
}
for (i=0; i<(cmd->NumSend + cmd->NumRecv + cmd->NumExch); i++, buf+=3) {
IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf;
desc->Size = cmd->BufferSizes[i];
uintptr_t ptr = (uintptr_t) cmd->Buffers[i];
desc->Addr = ptr;
desc->Packed = cmd->BufferTypes[i] |
(((ptr >> 32) & 15) << 28) | ((ptr >> 36) << 2);
}
u32 padding = ((16 - (((uintptr_t) buf) & 15)) & 15) / 4;
u32* raw = (u32*) (buf + padding);
size_t raw_size = (sizeof_raw/4) + 4;
buf += raw_size;
u16* buf_u16 = (u16*) buf;
for (i=0; i<cmd->NumStaticOut; i++) {
size_t off = cmd->NumStaticIn + i;
size_t sz = (uintptr_t) cmd->StaticSizes[off];
buf_u16[i] = (sz > 0xFFFF) ? 0 : sz;
}
size_t u16s_size = ((2*cmd->NumStaticOut) + 3)/4;
buf += u16s_size;
raw_size += u16s_size;
*fill_in_size_later |= raw_size;
for (i=0; i<cmd->NumStaticOut; i++, buf+=2) {
IpcStaticRecvDescriptor* desc = (IpcStaticRecvDescriptor*) buf;
size_t off = cmd->NumStaticIn + i;
uintptr_t ptr = (uintptr_t) cmd->Statics[off];
desc->Addr = ptr;
desc->Packed = (ptr >> 32) | (cmd->StaticSizes[off] << 16);
}
return (void*) raw;
}
/**
* @brief Dispatches an IPC request.
* @param session IPC session handle.
* @return Result code.
*/
DEPRECATED
static inline Result ipcDispatch(Handle session) {
return svcSendSyncRequest(session);
}
///@}
///@name IPC response parsing
///@{
/// IPC parsed command (response) structure.
typedef struct {
IpcCommandType CommandType; ///< Type of the command
bool HasPid; ///< true if the 'Pid' field is filled out.
u64 Pid; ///< PID included in the response (only if HasPid is true)
size_t NumHandles; ///< Number of handles copied.
Handle Handles[IPC_MAX_OBJECTS]; ///< Handles.
bool WasHandleCopied[IPC_MAX_OBJECTS]; ///< true if the handle was moved, false if it was copied.
bool IsDomainRequest; ///< true if the the message is a Domain message.
DomainMessageType InMessageType; ///< Type of the domain message.
u32 InMessageLength; ///< Size of rawdata (for domain messages).
u32 InThisObjectId; ///< Object ID to call the command on (for domain messages).
size_t InNumObjectIds; ///< Number of object IDs (for domain messages).
u32 InObjectIds[IPC_MAX_OBJECTS]; ///< Object IDs (for domain messages).
bool IsDomainResponse; ///< true if the the message is a Domain response.
size_t OutNumObjectIds; ///< Number of object IDs (for domain responses).
u32 OutObjectIds[IPC_MAX_OBJECTS]; ///< Object IDs (for domain responses).
size_t NumBuffers; ///< Number of buffers in the response.
void* Buffers[IPC_MAX_BUFFERS]; ///< Pointers to the buffers.
size_t BufferSizes[IPC_MAX_BUFFERS]; ///< Sizes of the buffers.
BufferType BufferTypes[IPC_MAX_BUFFERS]; ///< Types of the buffers.
BufferDirection BufferDirections[IPC_MAX_BUFFERS]; ///< Direction of each buffer.
size_t NumStatics; ///< Number of statics in the response.
void* Statics[IPC_MAX_BUFFERS]; ///< Pointers to the statics.
size_t StaticSizes[IPC_MAX_BUFFERS]; ///< Sizes of the statics.
u8 StaticIndices[IPC_MAX_BUFFERS]; ///< Indices of the statics.
size_t NumStaticsOut; ///< Number of output statics available in the response.
void* Raw; ///< Pointer to the raw embedded data structure in the response.
void* RawWithoutPadding; ///< Pointer to the raw embedded data structure, without padding.
size_t RawSize; ///< Size of the raw embedded data.
} IpcParsedCommand DEPRECATED;
/**
* @brief Parse an IPC command response into an IPC parsed command structure.
* @param r IPC parsed command structure to fill in.
* @return Result code.
*/
DEPRECATED
static inline Result ipcParse(IpcParsedCommand* r) {
u32* buf = (u32*)armGetTls();
u32 ctrl0 = *buf++;
u32 ctrl1 = *buf++;
size_t i;
r->IsDomainRequest = false;
r->IsDomainResponse = false;
r->CommandType = (IpcCommandType) (ctrl0 & 0xffff);
r->HasPid = false;
r->RawSize = (ctrl1 & 0x1ff) * 4;
r->NumHandles = 0;
r->NumStaticsOut = (ctrl1 >> 10) & 15;
if (r->NumStaticsOut >> 1) r->NumStaticsOut--; // Value 2 -> Single descriptor
if (r->NumStaticsOut >> 1) r->NumStaticsOut--; // Value 3+ -> (Value - 2) descriptors
if (ctrl1 & 0x80000000) {
u32 ctrl2 = *buf++;
if (ctrl2 & 1) {
r->HasPid = true;
r->Pid = *buf++;
r->Pid |= ((u64)(*buf++)) << 32;
}
size_t num_handles_copy = ((ctrl2 >> 1) & 15);
size_t num_handles_move = ((ctrl2 >> 5) & 15);
size_t num_handles = num_handles_copy + num_handles_move;
u32* buf_after_handles = buf + num_handles;
if (num_handles > IPC_MAX_OBJECTS)
num_handles = IPC_MAX_OBJECTS;
for (i=0; i<num_handles; i++)
{
r->Handles[i] = *(buf+i);
r->WasHandleCopied[i] = (i < num_handles_copy);
}
r->NumHandles = num_handles;
buf = buf_after_handles;
}
size_t num_statics = (ctrl0 >> 16) & 15;
u32* buf_after_statics = buf + num_statics*2;
if (num_statics > IPC_MAX_BUFFERS)
num_statics = IPC_MAX_BUFFERS;
for (i=0; i<num_statics; i++, buf+=2) {
IpcStaticSendDescriptor* desc = (IpcStaticSendDescriptor*) buf;
u64 packed = (u64) desc->Packed;
r->Statics[i] = (void*) (desc->Addr | (((packed >> 12) & 15) << 32) | (((packed >> 6) & 15) << 36));
r->StaticSizes[i] = packed >> 16;
r->StaticIndices[i] = packed & 63;
}
r->NumStatics = num_statics;
buf = buf_after_statics;
size_t num_bufs_send = (ctrl0 >> 20) & 15;
size_t num_bufs_recv = (ctrl0 >> 24) & 15;
size_t num_bufs_exch = (ctrl0 >> 28) & 15;
size_t num_bufs = num_bufs_send + num_bufs_recv + num_bufs_exch;
r->Raw = (void*)(((uintptr_t)(buf + num_bufs*3) + 15) &~ 15);
r->RawWithoutPadding = (void*)((uintptr_t)(buf + num_bufs*3));
if (num_bufs > IPC_MAX_BUFFERS)
num_bufs = IPC_MAX_BUFFERS;
for (i=0; i<num_bufs; i++, buf+=3) {
IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf;
u64 packed = (u64) desc->Packed;
r->Buffers[i] = (void*) (desc->Addr | ((packed >> 28) << 32) | (((packed >> 2) & 15) << 36));
r->BufferSizes[i] = desc->Size;
r->BufferTypes[i] = (BufferType) (packed & 3);
if (i < num_bufs_send)
r->BufferDirections[i] = BufferDirection_Send;
else if (i < (num_bufs_send + num_bufs_recv))
r->BufferDirections[i] = BufferDirection_Recv;
else
r->BufferDirections[i] = BufferDirection_Exch;
}
r->NumBuffers = num_bufs;
return 0;
}
/**
* @brief Queries the size of an IPC pointer buffer.
* @param session IPC session handle.
* @param size Output variable in which to store the size.
* @return Result code.
*/
DEPRECATED
static inline Result ipcQueryPointerBufferSize(Handle session, size_t *size) {
u32* buf = (u32*)armGetTls();
buf[0] = IpcCommandType_Control;
buf[1] = 8;
buf[2] = 0;
buf[3] = 0;
buf[4] = SFCI_MAGIC;
buf[5] = 0;
buf[6] = 3;
buf[7] = 0;
Result rc = ipcDispatch(session);
if (R_SUCCEEDED(rc)) {
IpcParsedCommand r;
ipcParse(&r);
struct ipcQueryPointerBufferSizeResponse {
u64 magic;
u64 result;
u32 size;
} *raw = (struct ipcQueryPointerBufferSizeResponse*)r.Raw;
rc = raw->result;
if (R_SUCCEEDED(rc)) {
*size = raw->size & 0xffff;
}
}
return rc;
}
/**
* @brief Closes the IPC session with proper clean up.
* @param session IPC session handle.
* @return Result code.
*/
DEPRECATED
static inline Result ipcCloseSession(Handle session) {
u32* buf = (u32*)armGetTls();
buf[0] = IpcCommandType_Close;
buf[1] = 0;
return ipcDispatch(session);
}
/**
* @brief Clones an IPC session.
* @param session IPC session handle.
* @param unk Unknown.
* @param new_session_out Output cloned IPC session handle.
* @return Result code.
*/
DEPRECATED
static inline Result ipcCloneSession(Handle session, u32 unk, Handle* new_session_out) {
u32* buf = (u32*)armGetTls();
buf[0] = IpcCommandType_Control;
buf[1] = 9;
buf[2] = 0;
buf[3] = 0;
buf[4] = SFCI_MAGIC;
buf[5] = 0;
buf[6] = 4;
buf[7] = 0;
buf[8] = unk;
Result rc = ipcDispatch(session);
if (R_SUCCEEDED(rc)) {
IpcParsedCommand r;
ipcParse(&r);
struct ipcCloneSessionResponse {
u64 magic;
u64 result;
} *raw = (struct ipcCloneSessionResponse*)r.Raw;
rc = raw->result;
if (R_SUCCEEDED(rc) && new_session_out) {
*new_session_out = r.Handles[0];
}
}
return rc;
}
///@}
///@name IPC domain handling
///@{
/**
* @brief Converts an IPC session handle into a domain.
* @param session IPC session handle.
* @param object_id_out Output variable in which to store the object ID.
* @return Result code.
*/
DEPRECATED
static inline Result ipcConvertSessionToDomain(Handle session, u32* object_id_out) {
u32* buf = (u32*)armGetTls();
buf[0] = IpcCommandType_Control;
buf[1] = 8;
buf[4] = SFCI_MAGIC;
buf[5] = 0;
buf[6] = 0;
buf[7] = 0;
Result rc = ipcDispatch(session);
if (R_SUCCEEDED(rc)) {
IpcParsedCommand r;
ipcParse(&r);
struct ipcConvertSessionToDomainResponse {
u64 magic;
u64 result;
u32 object_id;
} *raw = (struct ipcConvertSessionToDomainResponse*)r.Raw;
rc = raw->result;
if (R_SUCCEEDED(rc)) {
*object_id_out = raw->object_id;
}
}
return rc;
}
/**
* @brief Adds an object ID to be sent through an IPC domain command structure.
* @param cmd IPC domain command structure.
* @param object_id Object ID to send.
*/
DEPRECATED
static inline void ipcSendObjectId(IpcCommand* cmd, u32 object_id) {
cmd->ObjectIds[cmd->NumObjectIds++] = object_id;
}
/**
* @brief Prepares the header of an IPC command structure (domain version).
* @param cmd IPC command structure.
* @param sizeof_raw Size in bytes of the raw data structure to embed inside the IPC request
* @param object_id Domain object ID.
* @return Pointer to the raw embedded data structure in the request, ready to be filled out.
*/
DEPRECATED
static inline void* ipcPrepareHeaderForDomain(IpcCommand* cmd, size_t sizeof_raw, u32 object_id) {
void* raw = ipcPrepareHeader(cmd, sizeof_raw + sizeof(DomainMessageHeader) + cmd->NumObjectIds*sizeof(u32));
DomainMessageHeader* hdr = (DomainMessageHeader*) raw;
u32 *object_ids = (u32*)(((uintptr_t) raw) + sizeof(DomainMessageHeader) + sizeof_raw);
hdr->Type = DomainMessageType_SendMessage;
hdr->NumObjectIds = (u8)cmd->NumObjectIds;
hdr->Length = sizeof_raw;
hdr->ThisObjectId = object_id;
hdr->Pad[0] = hdr->Pad[1] = 0;
for(size_t i = 0; i < cmd->NumObjectIds; i++)
object_ids[i] = cmd->ObjectIds[i];
return (void*)(((uintptr_t) raw) + sizeof(DomainMessageHeader));
}
/**
* @brief Parse an IPC command request into an IPC parsed command structure (domain version).
* @param r IPC parsed command structure to fill in.
* @return Result code.
*/
DEPRECATED
static inline Result ipcParseDomainRequest(IpcParsedCommand* r) {
Result rc = ipcParse(r);
DomainMessageHeader *hdr;
u32 *object_ids;
if(R_FAILED(rc))
return rc;
hdr = (DomainMessageHeader*) r->Raw;
object_ids = (u32*)(((uintptr_t) hdr) + sizeof(DomainMessageHeader) + hdr->Length);
r->Raw = (void*)(((uintptr_t) r->Raw) + sizeof(DomainMessageHeader));
r->IsDomainRequest = true;
r->InMessageType = (DomainMessageType)(hdr->Type);
switch (r->InMessageType) {
case DomainMessageType_SendMessage:
case DomainMessageType_Close:
break;
default:
return MAKERESULT(Module_Libnx, LibnxError_DomainMessageUnknownType);
}
r->InThisObjectId = hdr->ThisObjectId;
r->InNumObjectIds = hdr->NumObjectIds > 8 ? 8 : hdr->NumObjectIds;
if ((uintptr_t)object_ids + sizeof(u32) * r->InNumObjectIds - (uintptr_t)armGetTls() >= 0x100) {
return MAKERESULT(Module_Libnx, LibnxError_DomainMessageTooManyObjectIds);
}
for(size_t i = 0; i < r->InNumObjectIds; i++)
r->InObjectIds[i] = object_ids[i];
return rc;
}
/**
* @brief Parse an IPC command response into an IPC parsed command structure (domain version).
* @param r IPC parsed command structure to fill in.
* @param sizeof_raw Size in bytes of the raw data structure.
* @return Result code.
*/
DEPRECATED
static inline Result ipcParseDomainResponse(IpcParsedCommand* r, size_t sizeof_raw) {
Result rc = ipcParse(r);
DomainResponseHeader *hdr;
u32 *object_ids;
if(R_FAILED(rc))
return rc;
hdr = (DomainResponseHeader*) r->Raw;
r->Raw = (void*)(((uintptr_t) r->Raw) + sizeof(DomainResponseHeader));
object_ids = (u32*)(((uintptr_t) r->Raw) + sizeof_raw);//Official sw doesn't align this.
r->IsDomainResponse = true;
r->OutNumObjectIds = hdr->NumObjectIds > 8 ? 8 : hdr->NumObjectIds;
if ((uintptr_t)object_ids + sizeof(u32) * r->OutNumObjectIds - (uintptr_t)armGetTls() >= 0x100) {
return MAKERESULT(Module_Libnx, LibnxError_DomainMessageTooManyObjectIds);
}
for(size_t i = 0; i < r->OutNumObjectIds; i++)
r->OutObjectIds[i] = object_ids[i];
return rc;
}
/**
* @brief Closes a domain object by ID.
* @param session IPC session handle.
* @param object_id ID of the object to close.
* @return Result code.
*/
DEPRECATED
static inline Result ipcCloseObjectById(Handle session, u32 object_id) {
IpcCommand c;
DomainMessageHeader* hdr;
ipcInitialize(&c);
hdr = (DomainMessageHeader*)ipcPrepareHeader(&c, sizeof(DomainMessageHeader));
hdr->Type = DomainMessageType_Close;
hdr->NumObjectIds = 0;
hdr->Length = 0;
hdr->ThisObjectId = object_id;
hdr->Pad[0] = hdr->Pad[1] = 0;
return ipcDispatch(session); // this command has no associated response
}
///@}
#pragma GCC diagnostic pop

View File

@ -6,11 +6,12 @@
*/
#pragma once
#include "../types.h"
#include "virtmem.h"
/// JIT implementation type.
typedef enum {
JitType_CodeMemory, ///< JIT supported using svcSetProcessMemoryPermission
JitType_JitMemory, ///< JIT supported using [4.0.0+] code-memory syscalls (this isn't usable on [5.0.0+] so JitType_CodeMemory is used instead).
JitType_SetProcessMemoryPermission, ///< JIT supported using svcSetProcessMemoryPermission
JitType_CodeMemory, ///< JIT supported using [4.0.0+] CodeMemory syscalls
} JitType;
/// JIT buffer object.
@ -21,7 +22,10 @@ typedef struct {
void* rx_addr;
void* rw_addr;
bool is_executable;
Handle handle;
union {
Handle handle;
VirtmemReservation* rv;
};
} Jit;
/**
@ -58,11 +62,15 @@ Result jitClose(Jit* j);
* @param j JIT buffer.
* @return Pointer to alias of the JIT buffer that can be written to.
*/
void* jitGetRwAddr(Jit* j);
NX_CONSTEXPR void* jitGetRwAddr(Jit* j) {
return j->rw_addr;
}
/**
* @brief Gets the address of the executable memory alias of a JIT buffer.
* @param j JIT buffer.
* @return Pointer to alias of the JIT buffer that can be executed.
*/
void* jitGetRxAddr(Jit* j);
NX_CONSTEXPR void* jitGetRxAddr(Jit* j) {
return j->rx_addr;
}

View File

@ -0,0 +1,54 @@
/**
* @file levent.h
* @brief Light event synchronization primitive [4.0.0+]
* @author fincs
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../result.h"
#include "svc.h"
/// User-mode light event structure.
typedef struct LEvent {
u32 counter;
bool autoclear;
} LEvent;
/**
* @brief Initializes a user-mode light event.
* @param[out] le Pointer to \ref LEvent structure.
* @param[in] signaled Whether the event starts off in signaled state.
* @param[in] autoclear Autoclear flag.
*/
NX_CONSTEXPR void leventInit(LEvent* le, bool signaled, bool autoclear) {
le->counter = signaled ? 2 : 0;
le->autoclear = autoclear;
}
/**
* @brief Waits on a user-mode light event.
* @param[in] le Pointer to \ref LEvent structure.
* @param[in] timeout_ns Timeout in nanoseconds (pass UINT64_MAX to wait indefinitely).
* @return true if wait succeeded, false if wait timed out.
*/
bool leventWait(LEvent* le, u64 timeout_ns);
/**
* @brief Polls a user-mode light event.
* @param[in] le Pointer to \ref LEvent structure.
* @return true if event is signaled, false otherwise.
*/
bool leventTryWait(LEvent* le);
/**
* @brief Signals a user-mode light event.
* @param[in] le Pointer to \ref LEvent structure.
*/
void leventSignal(LEvent* le);
/**
* @brief Clears a user-mode light event.
* @param[in] le Pointer to \ref LEvent structure.
*/
void leventClear(LEvent* le);

View File

@ -20,7 +20,7 @@ typedef _LOCK_RECURSIVE_T RMutex;
*/
static inline void mutexInit(Mutex* m)
{
*m = 0;
*m = INVALID_HANDLE;
}
/**
@ -42,6 +42,13 @@ bool mutexTryLock(Mutex* m);
*/
void mutexUnlock(Mutex* m);
/**
* @brief Gets whether the current thread owns the mutex.
* @param m Mutex object.
* @return 1 if the mutex is locked by the current thread, and 0 otherwise.
*/
bool mutexIsLockedByCurrentThread(const Mutex* m);
/**
* @brief Initializes a recursive mutex.
* @param m Recursive mutex object.

View File

@ -40,6 +40,8 @@ typedef enum {
MemType_KernelStack=0x13, ///< Mapped in kernel during \ref svcCreateThread.
MemType_CodeReadOnly=0x14, ///< Mapped in kernel during \ref svcControlCodeMemory.
MemType_CodeWritable=0x15, ///< Mapped in kernel during \ref svcControlCodeMemory.
MemType_Coverage=0x16, ///< Not available.
MemType_Insecure=0x17, ///< Mapped in kernel during \ref svcMapInsecurePhysicalMemory.
} MemoryType;
/// Memory state bitmasks.
@ -67,10 +69,11 @@ typedef enum {
/// Memory attribute bitmasks.
typedef enum {
MemAttr_IsBorrowed=BIT(0), ///< Is borrowed memory.
MemAttr_IsIpcMapped=BIT(1), ///< Is IPC mapped (when IpcRefCount > 0).
MemAttr_IsDeviceMapped=BIT(2), ///< Is device mapped (when DeviceRefCount > 0).
MemAttr_IsUncached=BIT(3), ///< Is uncached.
MemAttr_IsBorrowed=BIT(0), ///< Is borrowed memory.
MemAttr_IsIpcMapped=BIT(1), ///< Is IPC mapped (when IpcRefCount > 0).
MemAttr_IsDeviceMapped=BIT(2), ///< Is device mapped (when DeviceRefCount > 0).
MemAttr_IsUncached=BIT(3), ///< Is uncached.
MemAttr_IsPermissionLocked=BIT(4), ///< Is permission locked.
} MemoryAttribute;
/// Memory permission bitmasks.
@ -91,15 +94,36 @@ typedef struct {
u32 type; ///< Memory type (see lower 8 bits of \ref MemoryState).
u32 attr; ///< Memory attributes (see \ref MemoryAttribute).
u32 perm; ///< Memory permissions (see \ref Permission).
u32 device_refcount; ///< Device reference count.
u32 ipc_refcount; ///< IPC reference count.
u32 device_refcount; ///< Device reference count.
u32 padding; ///< Padding.
} MemoryInfo;
/// Physical memory information structure.
typedef struct {
u64 physical_address; ///< Physical address.
u64 virtual_address; ///< Virtual address.
u64 size; ///< Size.
} PhysicalMemoryInfo;
/// Secure monitor arguments.
typedef struct {
u64 X[8]; ///< Values of X0 through X7.
} PACKED SecmonArgs;
} NX_PACKED SecmonArgs;
/// Break reasons
typedef enum {
BreakReason_Panic = 0,
BreakReason_Assert = 1,
BreakReason_User = 2,
BreakReason_PreLoadDll = 3,
BreakReason_PostLoadDll = 4,
BreakReason_PreUnloadDll = 5,
BreakReason_PostUnloadDll = 6,
BreakReason_CppException = 7,
BreakReason_NotificationOnlyFlag = 0x80000000,
} BreakReason;
/// Code memory mapping operations
typedef enum {
@ -118,6 +142,12 @@ typedef enum {
LimitableResource_Sessions=4, ///<How many sessions can a process own.
} LimitableResource;
/// Thread Activity.
typedef enum {
ThreadActivity_Runnable = 0, ///< Thread can run.
ThreadActivity_Paused = 1, ///< Thread is paused.
} ThreadActivity;
/// Process Information.
typedef enum {
ProcessInfoType_ProcessState=0, ///<What state is a process in.
@ -135,6 +165,12 @@ typedef enum {
ProcessState_DebugSuspended=7, ///<Process execution suspended by debugger.
} ProcessState;
/// Process Activity.
typedef enum {
ProcessActivity_Runnable = 0, ///< Process can run.
ProcessActivity_Paused = 1, ///< Process is paused.
} ProcessActivity;
/// Debug Thread Parameters.
typedef enum {
DebugThreadParam_ActualPriority=0,
@ -170,8 +206,15 @@ typedef enum {
InfoType_TotalNonSystemMemorySize = 21, ///< [6.0.0+] Total amount of memory available for process, excluding that for process memory management.
InfoType_UsedNonSystemMemorySize = 22, ///< [6.0.0+] Amount of memory used by process, excluding that for process memory management.
InfoType_IsApplication = 23, ///< [9.0.0+] Whether the specified process is an Application.
InfoType_FreeThreadCount = 24, ///< [11.0.0+] The number of free threads available to the process's resource limit.
InfoType_ThreadTickCount = 25, ///< [13.0.0+] Number of ticks spent on thread.
InfoType_IsSvcPermitted = 26, ///< [14.0.0+] Does process have access to SVC (only usable with \ref svcSynchronizePreemptionState at present).
InfoType_IoRegionHint = 27, ///< [16.0.0+] Low bits of the physical address for a KIoRegion.
InfoType_AliasRegionExtraSize = 28, ///< [18.0.0+] Extra size added to the reserved region.
InfoType_ThreadTickCount = 0xF0000002, ///< Number of ticks spent on thread.
InfoType_TransferMemoryHint = 34, ///< [19.0.0+] Low bits of the process address for a KTransferMemory.
InfoType_ThreadTickCountDeprecated = 0xF0000002, ///< [1.0.0-12.1.0] Number of ticks spent on thread.
} InfoType;
/// GetSystemInfo IDs.
@ -188,7 +231,7 @@ typedef enum {
TickCountInfo_Core2 = 2, ///< Tick count on core 2.
TickCountInfo_Core3 = 3, ///< Tick count on core 3.
TickCountInfo_Total = U64_MAX, ///< Tick count on all cores.
TickCountInfo_Total = UINT64_MAX, ///< Tick count on all cores.
} TickCountInfo;
/// GetInfo InitialProcessIdRange Sub IDs.
@ -199,11 +242,53 @@ typedef enum {
/// GetSystemInfo PhysicalMemory Sub IDs.
typedef enum {
PhysicalMemoryInfo_Application = 0, ///< Memory allocated for application usage.
PhysicalMemoryInfo_Applet = 1, ///< Memory allocated for applet usage.
PhysicalMemoryInfo_System = 2, ///< Memory allocated for system usage.
PhysicalMemoryInfo_SystemUnsafe = 3, ///< Memory allocated for unsafe system usage (accessible to devices).
} PhysicalMemoryInfo;
PhysicalMemorySystemInfo_Application = 0, ///< Memory allocated for application usage.
PhysicalMemorySystemInfo_Applet = 1, ///< Memory allocated for applet usage.
PhysicalMemorySystemInfo_System = 2, ///< Memory allocated for system usage.
PhysicalMemorySystemInfo_SystemUnsafe = 3, ///< Memory allocated for unsafe system usage (accessible to devices).
} PhysicalMemorySystemInfo;
/// SleepThread yield types.
typedef enum {
YieldType_WithoutCoreMigration = 0l, ///< Yields to another thread on the same core.
YieldType_WithCoreMigration = -1l, ///< Yields to another thread (possibly on a different core).
YieldType_ToAnyThread = -2l, ///< Yields and performs forced load-balancing.
} YieldType;
/// SignalToAddress behaviors.
typedef enum {
SignalType_Signal = 0, ///< Signals the address.
SignalType_SignalAndIncrementIfEqual = 1, ///< Signals the address and increments its value if equal to argument.
SignalType_SignalAndModifyBasedOnWaitingThreadCountIfEqual = 2, ///< Signals the address and updates its value if equal to argument.
} SignalType;
/// WaitForAddress behaviors.
typedef enum {
ArbitrationType_WaitIfLessThan = 0, ///< Wait if the 32-bit value is less than argument.
ArbitrationType_DecrementAndWaitIfLessThan = 1, ///< Decrement the 32-bit value and wait if it is less than argument.
ArbitrationType_WaitIfEqual = 2, ///< Wait if the 32-bit value is equal to argument.
ArbitrationType_WaitIfEqual64 = 3, ///< [19.0.0+] Wait if the 64-bit value is equal to argument.
} ArbitrationType;
/// Context of a scheduled thread.
typedef struct {
u64 fp; ///< Frame Pointer for the thread.
u64 sp; ///< Stack Pointer for the thread.
u64 lr; ///< Link Register for the thread.
u64 pc; ///< Program Counter for the thread.
} LastThreadContext;
/// Memory mapping type.
typedef enum {
MemoryMapping_IoRegister = 0, ///< Mapping IO registers.
MemoryMapping_Uncached = 1, ///< Mapping normal memory without cache.
MemoryMapping_Memory = 2, ///< Mapping normal memory.
} MemoryMapping;
/// Io Pools.
typedef enum {
IoPoolType_PcieA2 = 0, ///< Physical address range 0x12000000-0x1FFFFFFF
} IoPoolType;
///@name Memory management
///@{
@ -211,9 +296,9 @@ typedef enum {
/**
* @brief Set the process heap to a given size. It can both extend and shrink the heap.
* @param[out] out_addr Variable to which write the address of the heap (which is randomized and fixed by the kernel)
* @param[in] size Size of the heap, must be a multiple of 0x2000000 and [2.0.0+] less than 0x18000000.
* @param[in] size Size of the heap, must be a multiple of 0x200000 and [2.0.0+] less than 0x18000000.
* @return Result code.
* @note Syscall number 0x00.
* @note Syscall number 0x01.
*/
Result svcSetHeapSize(void** out_addr, u64 size);
@ -225,7 +310,7 @@ Result svcSetHeapSize(void** out_addr, u64 size);
* @return Result code.
* @remark Perm_X is not allowed. Setting write-only is not allowed either (Perm_W).
* This can be used to move back and forth between Perm_None, Perm_R and Perm_Rw.
* @note Syscall number 0x01.
* @note Syscall number 0x02.
*/
Result svcSetMemoryPermission(void* addr, u64 size, u32 perm);
@ -237,7 +322,7 @@ Result svcSetMemoryPermission(void* addr, u64 size, u32 perm);
* @param[in] val1 State1
* @return Result code.
* @remark See <a href="https://switchbrew.org/wiki/SVC#svcSetMemoryAttribute">switchbrew.org Wiki</a> for more details.
* @note Syscall number 0x02.
* @note Syscall number 0x03.
*/
Result svcSetMemoryAttribute(void* addr, u64 size, u32 val0, u32 val1);
@ -282,7 +367,7 @@ Result svcQueryMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, u64 addr);
* @note Syscall number 0x07.
*/
void NORETURN svcExitProcess(void);
void NX_NORETURN svcExitProcess(void);
/**
* @brief Creates a thread.
@ -302,11 +387,11 @@ Result svcStartThread(Handle handle);
* @brief Exits the current thread.
* @note Syscall number 0x0A.
*/
void NORETURN svcExitThread(void);
void NX_NORETURN svcExitThread(void);
/**
* @brief Sleeps the current thread for the specified amount of time.
* @param[in] nano Number of nanoseconds to sleep, or 0, -1, -2 for yield.
* @param[in] nano Number of nanoseconds to sleep, or \ref YieldType for yield.
* @note Syscall number 0x0B.
*/
void svcSleepThread(s64 nano);
@ -316,7 +401,7 @@ void svcSleepThread(s64 nano);
* @return Result code.
* @note Syscall number 0x0C.
*/
Result svcGetThreadPriority(u32* priority, Handle handle);
Result svcGetThreadPriority(s32* priority, Handle handle);
/**
* @brief Sets a thread's priority.
@ -330,7 +415,7 @@ Result svcSetThreadPriority(Handle handle, u32 priority);
* @return Result code.
* @note Syscall number 0x0E.
*/
Result svcGetThreadCoreMask(s32* preferred_core, u32* affinity_mask, Handle handle);
Result svcGetThreadCoreMask(s32* preferred_core, u64* affinity_mask, Handle handle);
/**
* @brief Sets a thread's core mask.
@ -472,10 +557,9 @@ Result svcWaitProcessWideKeyAtomic(u32* key, u32* tag_location, u32 self_tag, u6
/**
* @brief Performs a condition variable wake-up operation in userspace.
* @return Result code.
* @note Syscall number 0x1D.
*/
Result svcSignalProcessWideKey(u32* key, s32 num);
void svcSignalProcessWideKey(u32* key, s32 num);
///@}
@ -501,6 +585,13 @@ u64 svcGetSystemTick(void);
*/
Result svcConnectToNamedPort(Handle* session, const char* name);
/**
* @brief Sends a light IPC synchronization request to a session.
* @return Result code.
* @note Syscall number 0x20.
*/
Result svcSendSyncRequestLight(Handle session);
/**
* @brief Sends an IPC synchronization request to a session.
* @return Result code.
@ -549,14 +640,14 @@ Result svcGetThreadId(u64 *threadID, Handle handle);
///@{
/**
* @brief Breaks execution. Panic.
* @param[in] breakReason Break reason.
* @param[in] inval1 First break parameter.
* @param[in] inval2 Second break parameter.
* @brief Breaks execution.
* @param[in] breakReason Break reason (see \ref BreakReason).
* @param[in] address Address of the buffer to pass to the debugger.
* @param[in] size Size of the buffer to pass to the debugger.
* @return Result code.
* @note Syscall number 0x26.
*/
Result svcBreak(u32 breakReason, u64 inval1, u64 inval2);
Result svcBreak(u32 breakReason, uintptr_t address, uintptr_t size);
///@}
@ -582,7 +673,7 @@ Result svcOutputDebugString(const char *str, u64 size);
* @param[in] res Result code.
* @note Syscall number 0x28.
*/
void NORETURN svcReturnFromException(Result res);
void NX_NORETURN svcReturnFromException(Result res);
/**
* @brief Retrieves information about the system, or a certain kernel object.
@ -598,6 +689,28 @@ Result svcGetInfo(u64* out, u32 id0, Handle handle, u64 id1);
///@}
///@name Cache Management
///@{
/**
* @brief Flushes the entire data cache (by set/way).
* @note Syscall number 0x2A.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
* @warning This syscall is dangerous, and should not be used.
*/
void svcFlushEntireDataCache(void);
/**
* @brief Flushes data cache for a virtual address range.
* @param[in] address Address of region to flush.
* @param[in] size Size of region to flush.
* @remark armDCacheFlush should be used instead of this syscall whenever possible.
* @note Syscall number 0x2B.
*/
Result svcFlushDataCache(void *address, size_t size);
///@}
///@name Memory management
///@{
@ -605,7 +718,6 @@ Result svcGetInfo(u64* out, u32 id0, Handle handle, u64 id1);
* @brief Maps new heap memory at the desired address. [3.0.0+]
* @return Result code.
* @note Syscall number 0x2C.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcMapPhysicalMemory(void *address, u64 size);
@ -613,12 +725,38 @@ Result svcMapPhysicalMemory(void *address, u64 size);
* @brief Undoes the effects of \ref svcMapPhysicalMemory. [3.0.0+]
* @return Result code.
* @note Syscall number 0x2D.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcUnmapPhysicalMemory(void *address, u64 size);
///@}
///@name Process and thread management
///@{
/**
* @brief Gets information about a thread that will be scheduled in the future. [5.0.0+]
* @param[out] out_context Output \ref LastThreadContext for the thread that will be scheduled.
* @param[out] out_thread_id Output thread id for the thread that will be scheduled.
* @param[in] debug Debug handle.
* @param[in] ns Nanoseconds in the future to get scheduled thread at.
* @return Result code.
* @note Syscall number 0x2E.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetDebugFutureThreadInfo(LastThreadContext *out_context, u64 *out_thread_id, Handle debug, s64 ns);
/**
* @brief Gets information about the previously-scheduled thread.
* @param[out] out_context Output \ref LastThreadContext for the previously scheduled thread.
* @param[out] out_tls_address Output tls address for the previously scheduled thread.
* @param[out] out_flags Output flags for the previously scheduled thread.
* @return Result code.
* @note Syscall number 0x2F.
*/
Result svcGetLastThreadInfo(LastThreadContext *out_context, u64 *out_tls_address, u32 *out_flags);
///@}
///@name Resource Limit Management
///@{
@ -628,7 +766,7 @@ Result svcUnmapPhysicalMemory(void *address, u64 size);
* @note Syscall number 0x30.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetResourceLimitLimitValue(u64 *out, Handle reslimit_h, LimitableResource which);
Result svcGetResourceLimitLimitValue(s64 *out, Handle reslimit_h, LimitableResource which);
/**
* @brief Gets the maximum value a LimitableResource can have, for a Resource Limit handle.
@ -636,7 +774,7 @@ Result svcGetResourceLimitLimitValue(u64 *out, Handle reslimit_h, LimitableResou
* @note Syscall number 0x31.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetResourceLimitCurrentValue(u64 *out, Handle reslimit_h, LimitableResource which);
Result svcGetResourceLimitCurrentValue(s64 *out, Handle reslimit_h, LimitableResource which);
///@}
@ -648,7 +786,7 @@ Result svcGetResourceLimitCurrentValue(u64 *out, Handle reslimit_h, LimitableRes
* @return Result code.
* @note Syscall number 0x32.
*/
Result svcSetThreadActivity(Handle thread, bool paused);
Result svcSetThreadActivity(Handle thread, ThreadActivity paused);
/**
* @brief Dumps the registers of a thread paused by @ref svcSetThreadActivity (register groups: all).
@ -662,6 +800,110 @@ Result svcGetThreadContext3(ThreadContext* ctx, Handle thread);
///@}
///@name Synchronization
///@{
/**
* @brief Arbitrates an address depending on type and value. [4.0.0+]
* @param[in] address Address to arbitrate.
* @param[in] arb_type \ref ArbitrationType to use.
* @param[in] value Value to arbitrate on.
* @param[in] timeout Maximum time in nanoseconds to wait.
* @return Result code.
* @note Syscall number 0x34.
*/
Result svcWaitForAddress(void *address, u32 arb_type, s64 value, s64 timeout);
/**
* @brief Signals (and updates) an address depending on type and value. [4.0.0+]
* @param[in] address Address to arbitrate.
* @param[in] signal_type \ref SignalType to use.
* @param[in] value Value to arbitrate on.
* @param[in] count Number of waiting threads to signal.
* @return Result code.
* @note Syscall number 0x35.
*/
Result svcSignalToAddress(void *address, u32 signal_type, s32 value, s32 count);
///@}
///@name Miscellaneous
///@{
/**
* @brief Sets thread preemption state (used during abort/panic). [8.0.0+]
* @note Syscall number 0x36.
*/
void svcSynchronizePreemptionState(void);
///@}
///@name Resource Limit Management
///@{
/**
* @brief Gets the peak value a LimitableResource has had, for a Resource Limit handle. [11.0.0+]
* @return Result code.
* @note Syscall number 0x37.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetResourceLimitPeakValue(s64 *out, Handle reslimit_h, LimitableResource which);
///@}
///@name Memory Management
///@{
/**
* @brief Creates an IO Pool. [13.0.0+]
* @return Result code.
* @note Syscall number 0x39.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcCreateIoPool(Handle *out_handle, u32 pool_type);
/**
* @brief Creates an IO Region. [13.0.0+]
* @return Result code.
* @note Syscall number 0x3A.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcCreateIoRegion(Handle *out_handle, Handle io_pool_h, u64 physical_address, u64 size, u32 memory_mapping, u32 perm);
///@}
///@name Debugging
///@{
/**
* @brief Causes the kernel to dump debug information. [1.0.0-3.0.2]
* @param[in] dump_info_type Type of information to dump.
* @param[in] arg0 Argument to the debugging operation.
* @note Syscall number 0x3C.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
void svcDumpInfo(u32 dump_info_type, u64 arg0);
/**
* @brief Performs a debugging operation on the kernel. [4.0.0+]
* @param[in] kern_debug_type Type of debugging operation to perform.
* @param[in] arg0 First argument to the debugging operation.
* @param[in] arg1 Second argument to the debugging operation.
* @param[in] arg2 Third argument to the debugging operation.
* @note Syscall number 0x3C.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
void svcKernelDebug(u32 kern_debug_type, u64 arg0, u64 arg1, u64 arg2);
/**
* @brief Performs a debugging operation on the kernel. [4.0.0+]
* @param[in] kern_trace_state Type of tracing the kernel should perform.
* @note Syscall number 0x3D.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
void svcChangeKernelTraceState(u32 kern_trace_state);
///@}
\
///@name Inter-process communication (IPC)
///@{
@ -681,6 +923,15 @@ Result svcCreateSession(Handle *server_handle, Handle *client_handle, u32 unk0,
*/
Result svcAcceptSession(Handle *session_handle, Handle port_handle);
/**
* @brief Performs light IPC input/output.
* @return Result code.
* @param[in] handle Server or port handle to act on.
* @note Syscall number 0x42.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcReplyAndReceiveLight(Handle handle);
/**
* @brief Performs IPC input/output.
* @return Result code.
@ -715,6 +966,22 @@ Result svcCreateEvent(Handle* server_handle, Handle* client_handle);
///@name Memory management
///@{
/**
* @brief Maps an IO Region. [13.0.0+]
* @return Result code.
* @note Syscall number 0x46.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcMapIoRegion(Handle io_region_h, void *address, u64 size, u32 perm);
/**
* @brief Undoes the effects of \ref svcMapIoRegion. [13.0.0+]
* @return Result code.
* @note Syscall number 0x47.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcUnmapIoRegion(Handle io_region_h, void *address, u64 size);
/**
* @brief Maps unsafe memory (usable for GPU DMA) for a system module at the desired address. [5.0.0+]
* @return Result code.
@ -763,6 +1030,18 @@ Result svcControlCodeMemory(Handle code_handle, CodeMapOperation op, void* dst_a
///@}
///@name Power Management
///@{
/**
* @brief Causes the system to enter deep sleep.
* @note Syscall number 0x4D.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
void svcSleepSystem(void);
///@}
///@name Device memory-mapped I/O (MMIO)
///@{
@ -776,6 +1055,19 @@ Result svcReadWriteRegister(u32* outVal, u64 regAddr, u32 rwMask, u32 inVal);
///@}
///@name Process and thread management
///@{
/**
* @brief Configures the pause/unpause status of a process.
* @return Result code.
* @note Syscall number 0x4F.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcSetProcessActivity(Handle process, ProcessActivity paused);
///@}
///@name Inter-process memory sharing
///@{
@ -822,15 +1114,25 @@ Result svcCreateInterruptEvent(Handle* handle, u64 irqNum, u32 flag);
* @note Syscall number 0x54.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcQueryPhysicalAddress(u64 out[3], u64 virtaddr);
Result svcQueryPhysicalAddress(PhysicalMemoryInfo *out, u64 virtaddr);
/**
* @brief Returns a virtual address mapped to a given IO range.
* @return Result code.
* @note Syscall number 0x55.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
* @warning Only exists on [10.0.0+]. For older versions use \ref svcLegacyQueryIoMapping.
*/
Result svcQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size);
Result svcQueryMemoryMapping(u64* virtaddr, u64* out_size, u64 physaddr, u64 size);
/**
* @brief Returns a virtual address mapped to a given IO range.
* @return Result code.
* @note Syscall number 0x55.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
* @warning Only exists on [1.0.0-9.2.0]. For newer versions use \ref svcQueryMemoryMapping.
*/
Result svcLegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size);
///@}
@ -868,7 +1170,7 @@ Result svcDetachDeviceAddressSpace(u64 device, Handle handle);
* @note Syscall number 0x59.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcMapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm);
Result svcMapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option);
/**
* @brief Maps an attached device address space to an userspace address.
@ -877,7 +1179,16 @@ Result svcMapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 ma
* @note Syscall number 0x5A.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcMapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm);
Result svcMapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option);
/**
* @brief Maps an attached device address space to an userspace address. [1.0.0-12.1.0]
* @return Result code.
* @remark The userspace destination address must have the \ref MemState_MapDeviceAlignedAllowed bit set.
* @note Syscall number 0x5B.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcMapDeviceAddressSpace(u64 *out_mapped_size, Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm);
/**
* @brief Unmaps an attached device address space from an userspace address.
@ -889,6 +1200,38 @@ Result svcUnmapDeviceAddressSpace(Handle handle, Handle proc_handle, u64 map_add
///@}
///@name Cache Management
///@{
/**
* @brief Invalidates data cache for a virtual address range within a process.
* @param[in] address Address of region to invalidate.
* @param[in] size Size of region to invalidate.
* @note Syscall number 0x5D.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcInvalidateProcessDataCache(Handle process, uintptr_t address, size_t size);
/**
* @brief Stores data cache for a virtual address range within a process.
* @param[in] address Address of region to store.
* @param[in] size Size of region to store.
* @note Syscall number 0x5E.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcStoreProcessDataCache(Handle process, uintptr_t address, size_t size);
/**
* @brief Flushes data cache for a virtual address range within a process.
* @param[in] address Address of region to flush.
* @param[in] size Size of region to flush.
* @note Syscall number 0x5F.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcFlushProcessDataCache(Handle process, uintptr_t address, size_t size);
///@}
///@name Debugging
///@{
@ -922,7 +1265,7 @@ Result svcTerminateDebugProcess(Handle debug);
* @note Syscall number 0x63.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetDebugEvent(u8* event_out, Handle debug);
Result svcGetDebugEvent(void* event_out, Handle debug);
/**
* @brief Continues a debugging session.
@ -979,7 +1322,7 @@ Result svcSetDebugThreadContext(Handle debug, u64 threadID, const ThreadContext*
* @note Syscall number 0x65.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetProcessList(u32 *num_out, u64 *pids_out, u32 max_pids);
Result svcGetProcessList(s32 *num_out, u64 *pids_out, u32 max_pids);
/**
* @brief Retrieves a list of all threads for a debug handle (or zero).
@ -987,7 +1330,7 @@ Result svcGetProcessList(u32 *num_out, u64 *pids_out, u32 max_pids);
* @note Syscall number 0x66.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetThreadList(u32 *num_out, u64 *tids_out, u32 max_tids, Handle debug);
Result svcGetThreadList(s32 *num_out, u64 *tids_out, u32 max_tids, Handle debug);
///@}
@ -1018,6 +1361,14 @@ Result svcReadDebugProcessMemory(void* buffer, Handle debug, u64 addr, u64 size)
*/
Result svcWriteDebugProcessMemory(Handle debug, const void* buffer, u64 addr, u64 size);
/**
* @brief Sets one of the hardware breakpoints.
* @return Result code.
* @note Syscall number 0x6C.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcSetHardwareBreakPoint(u32 which, u64 flags, u64 value);
/**
* @brief Gets parameters from a thread in a debugging session.
* @return Result code.
@ -1188,7 +1539,7 @@ Result svcTerminateProcess(Handle proc);
* @note Syscall number 0x7C.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
Result svcGetProcessInfo(u64 *out, Handle proc, ProcessInfoType which);
Result svcGetProcessInfo(s64 *out, Handle proc, ProcessInfoType which);
///@}
@ -1219,10 +1570,28 @@ Result svcSetResourceLimitLimitValue(Handle reslimit, LimitableResource which, u
/**
* @brief Calls a secure monitor function (TrustZone, EL3).
* @param regs Arguments to pass to the secure monitor.
* @return Return value from the secure monitor.
* @note Syscall number 0x7F.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
*/
u64 svcCallSecureMonitor(SecmonArgs* regs);
void svcCallSecureMonitor(SecmonArgs* regs);
///@}
///@name Memory management
///@{
/**
* @brief Maps new insecure memory at the desired address. [15.0.0+]
* @return Result code.
* @note Syscall number 0x90.
*/
Result svcMapInsecurePhysicalMemory(void *address, u64 size);
/**
* @brief Undoes the effects of \ref svcMapInsecureMemory. [15.0.0+]
* @return Result code.
* @note Syscall number 0x91.
*/
Result svcUnmapInsecurePhysicalMemory(void *address, u64 size);
///@}

View File

@ -52,7 +52,7 @@ Result threadStart(Thread* t);
/**
* @brief Exits the current thread immediately.
*/
void NORETURN threadExit(void);
void NX_NORETURN threadExit(void);
/**
* @brief Waits for a thread to finish executing.
@ -91,6 +91,12 @@ Result threadResume(Thread* t);
*/
Result threadDumpContext(ThreadContext* ctx, Thread* t);
/**
* @brief Gets a pointer to the current thread structure.
* @return Thread information structure.
*/
Thread *threadGetSelf(void);
/**
* @brief Gets the raw handle to the current thread.
* @return The current thread's handle.

View File

@ -72,6 +72,21 @@ static inline void* tmemGetAddr(TransferMemory* t){
return t->map_addr;
}
/**
* @brief Closes handle of a transfer memory object.
* @param t Transfer memory information structure.
* @return Result code.
*/
Result tmemCloseHandle(TransferMemory* t);
/**
* @brief Waits until source backing memory permissions match perm.
* @param t Transfer memory information structure.
* @param perm Permissions which the source backing memory is expected to have before return.
* @return Result code.
*/
Result tmemWaitForPermission(TransferMemory* t, Permission perm);
/**
* @brief Frees up resources used by a transfer memory object, unmapping and closing handles, etc.
* @param t Transfer memory information structure.

View File

@ -7,30 +7,55 @@
#pragma once
#include "../types.h"
/// Address space reservation type (see \ref virtmemAddReservation)
typedef struct VirtmemReservation VirtmemReservation;
/// Locks the virtual memory manager mutex.
void virtmemLock(void);
/// Unlocks the virtual memory manager mutex.
void virtmemUnlock(void);
/**
* @brief Reserves a slice of general purpose address space.
* @param size The size of the slice of address space that will be reserved (rounded up to page alignment).
* @brief Finds a random slice of free general purpose address space.
* @param size Desired size of the slice (rounded up to page alignment).
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
* @return Pointer to the slice of address space, or NULL on failure.
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
*/
void* virtmemReserve(size_t size);
void* virtmemFindAslr(size_t size, size_t guard_size);
/**
* @brief Relinquishes a slice of address space reserved with virtmemReserve (currently no-op).
* @param addr Pointer to the slice.
* @param size Size of the slice.
*/
void virtmemFree(void* addr, size_t size);
/**
* @brief Reserves a slice of address space inside the stack memory mapping region (for use with svcMapMemory).
* @param size The size of the slice of address space that will be reserved (rounded up to page alignment).
* @brief Finds a random slice of free stack address space.
* @param size Desired size of the slice (rounded up to page alignment).
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
* @return Pointer to the slice of address space, or NULL on failure.
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
*/
void* virtmemReserveStack(size_t size);
void* virtmemFindStack(size_t size, size_t guard_size);
/**
* @brief Relinquishes a slice of address space reserved with virtmemReserveStack (currently no-op).
* @param addr Pointer to the slice.
* @param size Size of the slice.
* @brief Finds a random slice of free code memory address space.
* @param size Desired size of the slice (rounded up to page alignment).
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
* @return Pointer to the slice of address space, or NULL on failure.
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
*/
void virtmemFreeStack(void* addr, size_t size);
void* virtmemFindCodeMemory(size_t size, size_t guard_size);
/**
* @brief Reserves a range of memory address space.
* @param mem Pointer to the address space slice.
* @param size Size of the slice.
* @return Pointer to a reservation object, or NULL on failure.
* @remark This function is intended to be used in lieu of a memory map operation when the memory won't be mapped straight away.
* @note The virtual memory manager mutex must be held during the find-and-reserve process (see \ref virtmemLock and \ref virtmemUnlock).
*/
VirtmemReservation* virtmemAddReservation(void* mem, size_t size);
/**
* @brief Releases a memory address space reservation.
* @param rv Reservation to release.
* @note The virtual memory manager mutex must be held before calling this function (see \ref virtmemLock and \ref virtmemUnlock).
*/
void virtmemRemoveReservation(VirtmemReservation* rv);

View File

@ -12,70 +12,83 @@ typedef struct {
char author[0x100];
} NacpLanguageEntry;
/// Entry forSendDataConfiguration / ReceivableDataConfiguration.
/// ApplicationNeighborDetectionGroupConfiguration
typedef struct {
u64 id;
u64 group_id; ///< GroupId
u8 key[0x10];
} NacpSendReceiveConfiguration;
} NacpApplicationNeighborDetectionGroupConfiguration;
/// NeighborDetectionClientConfiguration
typedef struct {
NacpApplicationNeighborDetectionGroupConfiguration send_group_configuration; ///< SendGroupConfiguration
NacpApplicationNeighborDetectionGroupConfiguration receivable_group_configurations[0x10]; ///< ReceivableGroupConfigurations
} NacpNeighborDetectionClientConfiguration;
/// ApplicationJitConfiguration
typedef struct {
u64 flags; ///< Flags
u64 memory_size; ///< MemorySize
} NacpApplicationJitConfiguration;
/// ns ApplicationControlProperty
typedef struct {
NacpLanguageEntry lang[16]; ///< \ref NacpLanguageEntry
u8 isbn[0x25]; ///< Isbn
u8 startup_user_account; ///< StartupUserAccount
u8 user_account_switch_lock; ///< UserAccountSwitchLock
u8 add_on_content_registration_type; ///< AddOnContentRegistrationType
u32 application_attribute; ///< ApplicationAttribute
u32 supported_languages; ///< SupportedLanguages
u32 parental_control; ///< ParentalControl
u8 screenshot; ///< Screenshot
u8 video_capture_mode; ///< VideoCaptureMode
u8 data_loss_confirmation; ///< DataLossConfirmation
u8 play_log_policy; ///< PlayLogPolicy
u64 presence_group_id; ///< PresenceGroupId
s8 rating_age[0x20]; ///< RatingAge
char display_version[0x10]; ///< DisplayVersion
u64 add_on_content_base_id; ///< AddOnContentBaseId
u64 save_data_owner_id; ///< SaveDataOwnerId
u64 user_account_save_data_size; ///< UserAccountSaveDataSize
u64 user_account_save_data_journal_size; ///< UserAccountSaveDataJournalSize
u64 device_save_data_size; ///< DeviceSaveDataSize
u64 device_save_data_journal_size; ///< DeviceSaveDataJournalSize
u64 bcat_delivery_cache_storage_size; ///< BcatDeliveryCacheStorageSize
u64 application_error_code_category; ///< ApplicationErrorCodeCategory
u64 local_communication_ids[0x8]; ///< LocalCommunicationIds
u8 logo_type; ///< LogoType
u8 logo_handling; ///< LogoHandling
u8 runtime_add_on_content_install; ///< RuntimeAddOnContentInstall
u8 reserved_x30f3[0x3]; ///< Reserved
u8 crash_report; ///< CrashReport
u8 hdcp; ///< Hdcp
u64 pseudo_device_id_seed; ///< SeedForPseudoDeviceId
char bcat_passphrase[0x41]; ///< BcatPassphrase
u8 startup_user_account_option; ///< StartupUserAccountOption
u8 reserved_for_user_account_save_data_operation[0x6]; ///< ReservedForUserAccountSaveDataOperation
u64 user_account_save_data_max_size; ///< UserAccountSaveDataMaxSize
u64 user_account_save_data_max_journal_size; ///< UserAccountSaveDataMaxJournalSize
u64 device_save_data_max_size; ///< DeviceSaveDataMaxSize
u64 device_save_data_max_journal_size; ///< DeviceSaveDataMaxJournalSize
u64 temporary_storage_size; ///< TemporaryStorageSize
u64 cache_storage_size; ///< CacheStorageSize
u64 cache_storage_journal_size; ///< CacheStorageJournalSize
u64 cache_storage_and_journal_max_size; ///< CacheStorageMaxSizeAndMaxJournalSize
u64 cache_storage_max_index; ///< CacheStorageMaxIndex
u64 play_log_queryable_application_id[0x10]; ///< PlayLogQueryableApplicationId
u8 play_log_query_capability; ///< PlayLogQueryCapability
u8 repair_flag; ///< RepairFlag
u8 program_index; ///< ProgramIndex
u8 required_network_service_license_on_launch; ///< RequiredNetworkServiceLicenseOnLaunchFlag
u32 reserved_x3214; ///< Reserved
NacpSendReceiveConfiguration send_data_configuration; ///< SendDataConfiguration
NacpSendReceiveConfiguration receivable_data_configurations[0x10]; ///< ReceivableDataConfigurations
u64 jit_configuration_flag; ///< JitConfigurationFlag
u64 memory_size; ///< MemorySize
u8 reserved_x33c0[0xc40]; ///< Reserved
NacpLanguageEntry lang[16]; ///< \ref NacpLanguageEntry
u8 isbn[0x25]; ///< Isbn
u8 startup_user_account; ///< StartupUserAccount
u8 user_account_switch_lock; ///< UserAccountSwitchLock
u8 add_on_content_registration_type; ///< AddOnContentRegistrationType
u32 attribute_flag; ///< AttributeFlag
u32 supported_language_flag; ///< SupportedLanguageFlag
u32 parental_control_flag; ///< ParentalControlFlag
u8 screenshot; ///< Screenshot
u8 video_capture; ///< VideoCapture
u8 data_loss_confirmation; ///< DataLossConfirmation
u8 play_log_policy; ///< PlayLogPolicy
u64 presence_group_id; ///< PresenceGroupId
s8 rating_age[0x20]; ///< RatingAge
char display_version[0x10]; ///< DisplayVersion
u64 add_on_content_base_id; ///< AddOnContentBaseId
u64 save_data_owner_id; ///< SaveDataOwnerId
u64 user_account_save_data_size; ///< UserAccountSaveDataSize
u64 user_account_save_data_journal_size; ///< UserAccountSaveDataJournalSize
u64 device_save_data_size; ///< DeviceSaveDataSize
u64 device_save_data_journal_size; ///< DeviceSaveDataJournalSize
u64 bcat_delivery_cache_storage_size; ///< BcatDeliveryCacheStorageSize
u64 application_error_code_category; ///< ApplicationErrorCodeCategory
u64 local_communication_id[0x8]; ///< LocalCommunicationId
u8 logo_type; ///< LogoType
u8 logo_handling; ///< LogoHandling
u8 runtime_add_on_content_install; ///< RuntimeAddOnContentInstall
u8 runtime_parameter_delivery; ///< RuntimeParameterDelivery
u8 reserved_x30f4[0x2]; ///< Reserved
u8 crash_report; ///< CrashReport
u8 hdcp; ///< Hdcp
u64 pseudo_device_id_seed; ///< SeedForPseudoDeviceId
char bcat_passphrase[0x41]; ///< BcatPassphrase
u8 startup_user_account_option; ///< StartupUserAccountOption
u8 reserved_for_user_account_save_data_operation[0x6]; ///< ReservedForUserAccountSaveDataOperation
u64 user_account_save_data_size_max; ///< UserAccountSaveDataSizeMax
u64 user_account_save_data_journal_size_max; ///< UserAccountSaveDataJournalSizeMax
u64 device_save_data_size_max; ///< DeviceSaveDataSizeMax
u64 device_save_data_journal_size_max; ///< DeviceSaveDataJournalSizeMax
u64 temporary_storage_size; ///< TemporaryStorageSize
u64 cache_storage_size; ///< CacheStorageSize
u64 cache_storage_journal_size; ///< CacheStorageJournalSize
u64 cache_storage_data_and_journal_size_max; ///< CacheStorageDataAndJournalSizeMax
u16 cache_storage_index_max; ///< CacheStorageIndexMax
u8 reserved_x318a[0x6]; ///< Reserved
u64 play_log_queryable_application_id[0x10]; ///< PlayLogQueryableApplicationId
u8 play_log_query_capability; ///< PlayLogQueryCapability
u8 repair_flag; ///< RepairFlag
u8 program_index; ///< ProgramIndex
u8 required_network_service_license_on_launch; ///< RequiredNetworkServiceLicenseOnLaunchFlag
u32 reserved_x3214; ///< Reserved
NacpNeighborDetectionClientConfiguration neighbor_detection_client_configuration; ///< NeighborDetectionClientConfiguration
NacpApplicationJitConfiguration jit_configuration; ///< JitConfiguration
u8 reserved_x33c0[0xc40]; ///< Reserved
} NacpStruct;
/// Get the NacpLanguageEntry from the input nacp corresponding to the current system language (this may fallback to other languages when needed). Output langentry is NULL if none found / content of entry is empty.
/// If you're using ns you may want to use \ref nsGetApplicationDesiredLanguage instead.
Result nacpGetLanguageEntry(NacpStruct* nacp, NacpLanguageEntry** langentry);

View File

@ -10,6 +10,7 @@ typedef struct {
Result nvFenceInit(void);
void nvFenceExit(void);
u32 nvFenceGetFd(void);
Result nvFenceWait(NvFence* f, s32 timeout_us);

View File

@ -13,3 +13,4 @@ const u32* nvGpuGetTpcMasks(u32 *num_masks_out);
Result nvGpuZbcGetActiveSlotMask(u32 *out_slot, u32 *out_mask);
Result nvGpuZbcAddColor(const u32 color_l2[4], const u32 color_ds[4], u32 format);
Result nvGpuZbcAddDepth(float depth);
Result nvGpuGetTimestamp(u64 *ts);

View File

@ -18,13 +18,14 @@ typedef struct NvGpuChannel
u32 num_entries;
} NvGpuChannel;
Result nvGpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as);
Result nvGpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as, NvChannelPriority prio);
void nvGpuChannelClose(NvGpuChannel* c);
Result nvGpuChannelZcullBind(NvGpuChannel* c, iova_t iova);
Result nvGpuChannelAppendEntry(NvGpuChannel* c, iova_t start, size_t num_cmds, u32 flags, u32 flush_threshold);
Result nvGpuChannelKickoff(NvGpuChannel* c);
Result nvGpuChannelGetErrorNotification(NvGpuChannel* c, NvError* error);
Result nvGpuChannelGetErrorNotification(NvGpuChannel* c, NvNotification* notif);
Result nvGpuChannelGetErrorInfo(NvGpuChannel* c, NvError* error);
static inline u32 nvGpuChannelGetSyncpointId(NvGpuChannel* c)
{

View File

@ -117,6 +117,11 @@ typedef struct {
u32 mask;
} nvioctl_zbc_slot_mask;
typedef struct {
u64 timestamp;
u64 reserved;
} nvioctl_gpu_time;
typedef struct {
u32 id;
u32 value;
@ -129,6 +134,41 @@ typedef struct {
};
} nvioctl_gpfifo_entry;
typedef struct {
u32 mem;
u32 offset;
u32 words;
} nvioctl_cmdbuf;
typedef struct {
u32 cmdbuf_mem;
u32 cmdbuf_offset;
u32 target;
u32 target_offset;
} nvioctl_reloc;
typedef struct {
u32 shift;
} nvioctl_reloc_shift;
typedef struct {
u32 syncpt_id;
u32 syncpt_incrs;
u32 waitbase_id; // Always -1
u32 next; //< Next valid incr index, or -1
u32 prev; //< Previous valid incr index, or -1
} nvioctl_syncpt_incr;
typedef struct {
u32 handle;
u32 iova;
} nvioctl_command_buffer_map;
typedef struct {
u32 rate;
u32 moduleid;
} nvioctl_clk_rate;
#define NVGPU_ZBC_TYPE_INVALID 0
#define NVGPU_ZBC_TYPE_COLOR 1
#define NVGPU_ZBC_TYPE_DEPTH 2
@ -181,21 +221,26 @@ typedef enum {
} NvMapBufferFlags;
typedef enum {
NvErrorType_FifoErrorIdleTimeout=8,
NvErrorType_GrErrorSwNotify=13,
NvErrorType_GrSemaphoreTimeout=24,
NvErrorType_GrIllegalNotify=25,
NvErrorType_FifoErrorMmuErrFlt=31,
NvErrorType_PbdmaError=32,
NvErrorType_ResetChannelVerifError=43,
NvErrorType_PbdmaPushbufferCrcMismatch=80
} NvErrorType;
NvNotificationType_FifoErrorIdleTimeout=8,
NvNotificationType_GrErrorSwNotify=13,
NvNotificationType_GrSemaphoreTimeout=24,
NvNotificationType_GrIllegalNotify=25,
NvNotificationType_FifoErrorMmuErrFlt=31,
NvNotificationType_PbdmaError=32,
NvNotificationType_ResetChannelVerifError=43,
NvNotificationType_PbdmaPushbufferCrcMismatch=80
} NvNotificationType;
typedef struct {
u64 tickstamp;
u32 error_type;
u16 unk16;
u64 timestamp;
u32 info32; // see NvNotificationType
u16 info16;
u16 status; // always -1
} NvNotification;
typedef struct {
u32 type;
u32 info[31];
} NvError;
Result nvioctlNvhostCtrl_SyncptRead(u32 fd, u32 id, u32* out);
@ -214,6 +259,7 @@ Result nvioctlNvhostCtrlGpu_ZbcQueryTable(u32 fd, u32 index, nvioctl_zbc_entry *
Result nvioctlNvhostCtrlGpu_GetCharacteristics(u32 fd, nvioctl_gpu_characteristics *out);
Result nvioctlNvhostCtrlGpu_GetTpcMasks(u32 fd, void *buffer, size_t size);
Result nvioctlNvhostCtrlGpu_ZbcGetActiveSlotMask(u32 fd, nvioctl_zbc_slot_mask *out);
Result nvioctlNvhostCtrlGpu_GetGpuTime(u32 fd, nvioctl_gpu_time *out);
Result nvioctlNvhostAsGpu_BindChannel(u32 fd, u32 channel_fd);
Result nvioctlNvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align_or_offset, u64 *offset);
@ -236,8 +282,17 @@ Result nvioctlChannel_KickoffPb(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_e
Result nvioctlChannel_AllocObjCtx(u32 fd, u32 class_num, u32 flags, u64* id_out);
Result nvioctlChannel_ZCullBind(u32 fd, u64 gpu_va, u32 mode);
Result nvioctlChannel_SetErrorNotifier(u32 fd, u32 enable);
Result nvioctlChannel_GetErrorNotification(u32 fd, NvError* out);
Result nvioctlChannel_GetErrorInfo(u32 fd, NvError* out);
Result nvioctlChannel_GetErrorNotification(u32 fd, NvNotification* out);
Result nvioctlChannel_SetPriority(u32 fd, u32 priority);
Result nvioctlChannel_SetTimeout(u32 fd, u32 timeout);
Result nvioctlChannel_AllocGpfifoEx2(u32 fd, u32 num_entries, u32 flags, u32 unk0, u32 unk1, u32 unk2, u32 unk3, nvioctl_fence *fence_out);
Result nvioctlChannel_SetUserData(u32 fd, void* addr);
Result nvioctlChannel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdbufs, const nvioctl_reloc *relocs, const nvioctl_reloc_shift *reloc_shifts, u32 num_relocs,
const nvioctl_syncpt_incr *syncpt_incrs, u32 num_syncpt_incrs, nvioctl_fence *fences, u32 num_fences);
Result nvioctlChannel_GetSyncpt(u32 fd, u32 module_id, u32 *syncpt);
Result nvioctlChannel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq);
Result nvioctlChannel_SetModuleClockRate(u32 fd, u32 module_id, u32 freq);
Result nvioctlChannel_MapCommandBuffer(u32 fd, nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed);
Result nvioctlChannel_UnmapCommandBuffer(u32 fd, const nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed);
Result nvioctlChannel_SetSubmitTimeout(u32 fd, u32 timeout);

View File

@ -125,6 +125,7 @@ enum {
LibnxError_LibAppletBadExit,
LibnxError_InvalidCmifOutHeader,
LibnxError_ShouldNotHappen,
LibnxError_Timeout,
};
/// libnx binder error codes

View File

@ -0,0 +1,445 @@
/**
* @file btdev.h
* @brief Wrapper around the bt/btmu services for using bluetooth BLE.
* @note Only available on [5.0.0+].
* @note See also: https://switchbrew.org/wiki/BTM_services
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/btdrv_types.h"
/// GattAttribute
typedef struct {
u8 type; ///< Type
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
u16 handle; ///< Handle
u32 connection_handle; ///< ConnectionHandle
} BtdevGattAttribute;
/// GattService
typedef struct {
BtdevGattAttribute attr; ///< \ref BtdevGattAttribute
u16 instance_id; ///< InstanceId
u16 end_group_handle; ///< EndGroupHandle
bool primary_service; ///< PrimaryService
} BtdevGattService;
/// GattCharacteristic
typedef struct {
BtdevGattAttribute attr; ///< \ref BtdevGattAttribute
u16 instance_id; ///< InstanceId
u8 properties; ///< Properties
u64 value_size; ///< Size of value.
u8 value[0x200]; ///< Value
} BtdevGattCharacteristic;
/// GattDescriptor
typedef struct {
BtdevGattAttribute attr; ///< \ref BtdevGattAttribute
u64 value_size; ///< Size of value.
u8 value[0x200]; ///< Value
} BtdevGattDescriptor;
/// Initialize bt/btmu.
Result btdevInitialize(void);
/// Exit bt/btmu.
void btdevExit(void);
/// Compares two \ref BtdrvGattAttributeUuid, returning whether these match.
bool btdevGattAttributeUuidIsSame(const BtdrvGattAttributeUuid *a, const BtdrvGattAttributeUuid *b);
/// Wrapper for \ref btmuAcquireBleScanEvent.
Result btdevAcquireBleScanEvent(Event* out_event);
/// Wrapper for \ref btmuGetBleScanFilterParameter.
Result btdevGetBleScanParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out);
/// Wrapper for \ref btmuGetBleScanFilterParameter2.
Result btdevGetBleScanParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out);
/// Wrapper for \ref btdevStartBleScanGeneral.
Result btdevStartBleScanGeneral(BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuStopBleScanForGeneral.
Result btdevStopBleScanGeneral(void);
/**
* @brief Wrapper for \ref btmuGetBleScanResultsForGeneral and \ref btmuGetBleScanResultsForSmartDevice.
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries.
* @param[out] total_out Total output entries.
*/
Result btdevGetBleScanResult(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/// Wrapper for \ref btmuStartBleScanForPaired.
Result btdevEnableBleAutoConnection(BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuStopBleScanForPaired.
Result btdevDisableBleAutoConnection(void);
/// Wrapper for \ref btmuStartBleScanForSmartDevice.
Result btdevStartBleScanSmartDevice(const BtdrvGattAttributeUuid *uuid);
/// Wrapper for \ref btmuStopBleScanForSmartDevice.
Result btdevStopBleScanSmartDevice(void);
/// Wrapper for \ref btmuAcquireBleConnectionEvent.
Result btdevAcquireBleConnectionStateChangedEvent(Event* out_event);
/// Wrapper for \ref btmuBleConnect.
Result btdevConnectToGattServer(BtdrvAddress addr);
/// Wrapper for \ref btmuBleDisconnect.
Result btdevDisconnectFromGattServer(u32 connection_handle);
/// Wrapper for \ref btmuBleGetConnectionState.
Result btdevGetBleConnectionInfoList(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out);
/// Wrapper for \ref btmuAcquireBleServiceDiscoveryEvent.
Result btdevAcquireBleServiceDiscoveryEvent(Event* out_event);
/**
* @brief Wrapper for \ref btmuGetGattServices.
* @param[in] connection_handle ConnectionHandle
* @param[out] services Output array of \ref BtdevGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGetGattServices(u32 connection_handle, BtdevGattService *services, u8 count, u8 *total_out);
/**
* @brief Wrapper for \ref btmuGetGattService.
* @param[in] connection_handle ConnectionHandle
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] service \ref BtdevGattService
* @param[out] flag Whether a \ref BtdevGattService was returned.
*/
Result btdevGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtdevGattService *service, bool *flag);
/// Wrapper for \ref btmuAcquireBlePairingEvent.
Result btdevAcquireBlePairingEvent(Event* out_event);
/// Wrapper for \ref btmuBlePairDevice.
Result btdevPairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuBleUnPairDevice.
Result btdevUnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuBleUnPairDevice2.
Result btdevUnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuBleGetPairedDevices.
Result btdevGetPairedGattServerAddress(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out);
/// Wrapper for \ref btmuAcquireBleMtuConfigEvent.
Result btdevAcquireBleMtuConfigEvent(Event* out_event);
/**
* @brief Wrapper for \ref btmuConfigureBleMtu.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] mtu MTU, must be 0x18-0x200.
*/
Result btdevConfigureBleMtu(u32 connection_handle, u16 mtu);
/// Wrapper for \ref btmuGetBleMtu.
Result btdevGetBleMtu(u32 connection_handle, u16 *out);
/// Wrapper for \ref btRegisterBleEvent.
Result btdevAcquireBleGattOperationEvent(Event* out_event);
/**
* @brief Wrapper for \ref btmuRegisterBleGattDataPath.
* @param[in] uuid \ref BtdrvGattAttributeUuid
*/
Result btdevRegisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid);
/**
* @brief Wrapper for \ref btmuUnregisterBleGattDataPath.
* @param[in] uuid \ref BtdrvGattAttributeUuid
*/
Result btdevUnregisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid);
/**
* @brief Wrapper for \ref btGetLeEventInfo.
* @param[out] out \ref BtdrvBleClientGattOperationInfo
*/
Result btdevGetGattOperationResult(BtdrvBleClientGattOperationInfo *out);
/**
* @brief Wrapper for \ref btLeClientReadCharacteristic.
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
* @param c \ref BtdevGattCharacteristic
*/
Result btdevReadGattCharacteristic(BtdevGattCharacteristic *c);
/**
* @brief Wrapper for \ref btLeClientWriteCharacteristic.
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
* @note This uses the Value from \ref btdevGattCharacteristicSetValue.
* @param c \ref BtdevGattCharacteristic
*/
Result btdevWriteGattCharacteristic(BtdevGattCharacteristic *c);
/**
* @brief Wrapper for \ref btLeClientRegisterNotification / \ref btLeClientDeregisterNotification.
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
* @param c \ref BtdevGattCharacteristic
* @param[in] flag Whether to enable/disable, controls which func to call.
*/
Result btdevEnableGattCharacteristicNotification(BtdevGattCharacteristic *c, bool flag);
/**
* @brief Wrapper for \ref btLeClientReadDescriptor.
* @param d \ref BtdevGattDescriptor
*/
Result btdevReadGattDescriptor(BtdevGattDescriptor *d);
/**
* @brief Wrapper for \ref btLeClientWriteDescriptor.
* @note This uses the Value from \ref btdevGattDescriptorSetValue.
* @param d \ref BtdevGattDescriptor
*/
Result btdevWriteGattDescriptor(BtdevGattDescriptor *d);
///@name GattAttribute
///@{
/**
* @brief Creates a \ref BtdevGattAttribute object. This is intended for internal use.
* @param a \ref BtdevGattAttribute
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
*/
void btdevGattAttributeCreate(BtdevGattAttribute *a, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle);
/**
* @brief Gets the Type.
* @param a \ref BtdevGattAttribute
*/
NX_CONSTEXPR u8 btdevGattAttributeGetType(BtdevGattAttribute *a) {
return a->type;
}
/**
* @brief Gets the Uuid.
* @param a \ref BtdevGattAttribute
* @param[out] out \ref BtdrvGattAttributeUuid
*/
NX_CONSTEXPR void btdevGattAttributeGetUuid(BtdevGattAttribute *a, BtdrvGattAttributeUuid *out) {
*out = a->uuid;
}
/**
* @brief Gets the Handle.
* @param a \ref BtdevGattAttribute
*/
NX_CONSTEXPR u16 btdevGattAttributeGetHandle(BtdevGattAttribute *a) {
return a->handle;
}
/**
* @brief Gets the ConnectionHandle.
* @param a \ref BtdevGattAttribute
*/
NX_CONSTEXPR u32 btdevGattAttributeGetConnectionHandle(BtdevGattAttribute *a) {
return a->connection_handle;
}
///@}
///@name GattService
///@{
/**
* @brief Creates a \ref BtdevGattService object. This is intended for internal use.
* @param s \ref BtdevGattService
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
* @param[in] instance_id InstanceId
* @param[in] end_group_handle EndGroupHandle
* @param[in] primary_service PrimaryService
*/
void btdevGattServiceCreate(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u16 end_group_handle, bool primary_service);
/**
* @brief Gets the InstanceId.
* @param s \ref BtdevGattService
*/
NX_CONSTEXPR u16 btdevGattServiceGetInstanceId(BtdevGattService *s) {
return s->instance_id;
}
/**
* @brief Gets the EndGroupHandle.
* @param s \ref BtdevGattService
*/
NX_CONSTEXPR u16 btdevGattServiceGetEndGroupHandle(BtdevGattService *s) {
return s->end_group_handle;
}
/**
* @brief Gets whether this is the PrimaryService.
* @param s \ref BtdevGattService
*/
NX_CONSTEXPR u16 btdevGattServiceIsPrimaryService(BtdevGattService *s) {
return s->primary_service;
}
/**
* @brief Wrapper for \ref btmuGetGattIncludedServices.
* @param s \ref BtdevGattService
* @param[out] services Output array of \ref BtdevGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService *services, u8 count, u8 *total_out);
/**
* @brief Wrapper for \ref btmuGetGattCharacteristics.
* @param s \ref BtdevGattService
* @param[out] characteristics Output array of \ref BtdevGattCharacteristic.
* @param[in] count Size of the characteristics array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out);
/**
* @brief Same as \ref btdevGattServiceGetCharacteristics except this only returns the \ref BtdevGattCharacteristic which contains a matching \ref BtdrvGattAttributeUuid.
* @param s \ref BtdevGattService
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] characteristic \ref BtdevGattCharacteristic
* @param[out] flag Whether a \ref BtdevGattService was returned.
*/
Result btdevGattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, BtdevGattCharacteristic *characteristic, bool *flag);
///@}
///@name GattCharacteristic
///@{
/**
* @brief Creates a \ref BtdevGattCharacteristic object. This is intended for internal use.
* @param c \ref BtdevGattCharacteristic
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
* @param[in] instance_id InstanceId
* @param[in] properties Properties
*/
void btdevGattCharacteristicCreate(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u8 properties);
/**
* @brief Gets the InstanceId.
* @param c \ref BtdevGattCharacteristic
*/
NX_CONSTEXPR u16 btdevGattCharacteristicGetInstanceId(BtdevGattCharacteristic *c) {
return c->instance_id;
}
/**
* @brief Gets the Properties.
* @param c \ref BtdevGattCharacteristic
*/
NX_CONSTEXPR u8 btdevGattCharacteristicGetProperties(BtdevGattCharacteristic *c) {
return c->properties;
}
/**
* @brief Wrapper for \ref btmuGetBelongingGattService.
* @note Gets the \ref BtdevGattService which belongs to this object.
* @param c \ref BtdevGattCharacteristic.
* @param[out] service \ref BtdevGattService
*/
Result btdevGattCharacteristicGetService(BtdevGattCharacteristic *c, BtdevGattService *service);
/**
* @brief Wrapper for \ref btmuGetGattDescriptors.
* @note Gets the descriptors which belongs to this object.
* @param c \ref BtdevGattCharacteristic
* @param[out] descriptors Output array of \ref BtdevGattDescriptor.
* @param[in] count Size of the descriptors array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGattCharacteristicGetDescriptors(BtdevGattCharacteristic *c, BtdevGattDescriptor *descriptors, u8 count, u8 *total_out);
/**
* @brief Same as \ref btdevGattCharacteristicGetDescriptors except this only returns a \ref BtdevGattDescriptor which contains a matching \ref BtdrvGattAttributeUuid.
* @param c \ref BtdevGattCharacteristic
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] descriptor \ref BtdevGattDescriptor
* @param[out] flag Whether a \ref BtdevGattDescriptor was returned.
*/
Result btdevGattCharacteristicGetDescriptor(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, BtdevGattDescriptor *descriptor, bool *flag);
/**
* @brief Sets the Value in the object.
* @note See also \ref btdevWriteGattCharacteristic.
* @param c \ref BtdevGattCharacteristic
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, max is 0x200.
*/
void btdevGattCharacteristicSetValue(BtdevGattCharacteristic *c, const void* buffer, size_t size);
/**
* @brief Gets the Value in the object, returns the copied value size.
* @param c \ref BtdevGattCharacteristic
* @param[out] buffer Output buffer.
* @param[in] size Output buffer size, max is 0x200.
*/
u64 btdevGattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, size_t size);
///@}
///@name GattDescriptor
///@{
/**
* @brief Creates a \ref BtdevGattDescriptor object. This is intended for internal use.
* @param d \ref BtdevGattDescriptor
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
*/
void btdevGattDescriptorCreate(BtdevGattDescriptor *d, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle);
/**
* @brief Wrapper for \ref btmuGetBelongingGattService.
* @note Gets the \ref BtdevGattService which belongs to this object.
* @param d \ref BtdevGattDescriptor
* @param[out] service \ref BtdevGattService
*/
Result btdevGattDescriptorGetService(BtdevGattDescriptor *d, BtdevGattService *service);
/**
* @brief Wrapper for \ref btmuGetGattCharacteristics.
* @note Gets the \ref BtdevGattCharacteristic which belongs to this object.
* @param d \ref BtdevGattDescriptor
* @param[out] characteristic \ref BtdevGattCharacteristic
*/
Result btdevGattDescriptorGetCharacteristic(BtdevGattDescriptor *d, BtdevGattCharacteristic *characteristic);
/**
* @brief Sets the Value in the object.
* @note See also \ref btdevWriteGattDescriptor.
* @param d \ref BtdevGattDescriptor
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, max is 0x200.
*/
void btdevGattDescriptorSetValue(BtdevGattDescriptor *d, const void* buffer, size_t size);
/**
* @brief Gets the Value in the object, returns the copied value size.
* @param d \ref BtdevGattDescriptor
* @param[out] buffer Output buffer.
* @param[in] size Output buffer size, max is 0x200.
*/
u64 btdevGattDescriptorGetValue(BtdevGattDescriptor *d, void* buffer, size_t size);
///@}

View File

@ -103,8 +103,8 @@ struct PrintConsole
int windowHeight; ///< Window height in characters
int tabSize; ///< Size of a tab
int fg; ///< Foreground color
int bg; ///< Background color
u16 fg; ///< Foreground color
u16 bg; ///< Background color
int flags; ///< Reverse/bright flags
bool consoleInitialised; ///< True if the console is initialized
@ -119,13 +119,14 @@ struct PrintConsole
#define CONSOLE_COLOR_REVERSE (1<<6) ///< Reversed color text
#define CONSOLE_CONCEAL (1<<7) ///< Concealed text
#define CONSOLE_CROSSED_OUT (1<<8) ///< Crossed out text
#define CONSOLE_FG_CUSTOM (1<<9) ///< Foreground custom color
#define CONSOLE_BG_CUSTOM (1<<10) ///< Background custom color
/// Console debug devices supported by libnx.
typedef enum {
debugDevice_NULL, ///< Swallows prints to stderr
debugDevice_SVC, ///< Outputs stderr debug statements using svcOutputDebugString, which can then be captured by interactive debuggers
debugDevice_CONSOLE, ///< Directs stderr debug statements to Switch console window
debugDevice_3DMOO = debugDevice_SVC,
} debugDevice;
/**

View File

@ -30,14 +30,37 @@ NX_CONSTEXPR FsDirectoryEntry* fsdevDirGetEntries(fsdev_dir_t *dir)
/// Initializes and mounts the sdmc device if accessible.
Result fsdevMountSdmc(void);
/// Mounts the specified save data.
/// Mounts the specified SaveData.
Result fsdevMountSaveData(const char *name, u64 application_id, AccountUid uid);
/// Mounts the specified system save data.
/// Mounts the specified SaveData as ReadOnly.
/// Only available on [2.0.0+].
Result fsdevMountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid);
/// Mounts the specified BcatSaveData.
Result fsdevMountBcatSaveData(const char *name, u64 application_id);
/// Mounts the specified DeviceSaveData.
Result fsdevMountDeviceSaveData(const char *name, u64 application_id);
/// Mounts the TemporaryStorage for the current process.
/// Only available on [3.0.0+].
Result fsdevMountTemporaryStorage(const char *name);
/// Mounts the specified CacheStorage.
/// Only available on [3.0.0+].
Result fsdevMountCacheStorage(const char *name, u64 application_id, u16 save_data_index);
/// Mounts the specified SystemSaveData.
Result fsdevMountSystemSaveData(const char *name, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid);
/// Mounts the specified SystemBcatSaveData.
/// Only available on [4.0.0+].
Result fsdevMountSystemBcatSaveData(const char *name, u64 system_save_data_id);
/// Mounts the input fs with the specified device name. fsdev will handle closing the fs when required, including when fsdevMountDevice() fails.
/// Returns -1 when any errors occur.
/// Input device name string shouldn't exceed 31 characters, and shouldn't have a trailing colon.
int fsdevMountDevice(const char *name, FsFileSystem fs);
/// Unmounts the specified device.

View File

@ -82,6 +82,14 @@ Result romfsMountFromStorage(FsStorage storage, u64 offset, const char *name);
*/
Result romfsMountFromCurrentProcess(const char *name);
/**
* @brief Mounts RomFS of a running program.
* @note Permission needs to be set in the NPDM.
* @param program_id ProgramId to mount.
* @param name Device mount name.
*/
Result romfsMountDataStorageFromProgram(u64 program_id, const char *name);
/**
* @brief Mounts RomFS from a file path in a mounted fsdev device.
* @param path File path.

View File

@ -10,10 +10,8 @@ typedef enum {
/// Configuration structure for socketInitalize
typedef struct {
u32 bsdsockets_version; ///< Observed 1 on 2.0 LibAppletWeb, 2 on 3.0.
u32 tcp_tx_buf_size; ///< Size of the TCP transfer (send) buffer (initial or fixed).
u32 tcp_rx_buf_size; ///< Size of the TCP recieve buffer (initial or fixed).
u32 tcp_rx_buf_size; ///< Size of the TCP receive buffer (initial or fixed).
u32 tcp_tx_buf_max_size; ///< Maximum size of the TCP transfer (send) buffer. If it is 0, the size of the buffer is fixed to its initial value.
u32 tcp_rx_buf_max_size; ///< Maximum size of the TCP receive buffer. If it is 0, the size of the buffer is fixed to its initial value.
@ -39,3 +37,22 @@ void socketExit(void);
NX_INLINE Result socketInitializeDefault(void) {
return socketInitialize(NULL);
}
/// Wrapper for \ref sslConnectionSetSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored.
int socketSslConnectionSetSocketDescriptor(SslConnection *c, int sockfd);
/// Wrapper for \ref sslConnectionGetSocketDescriptor. Returns the output sockfd on success and -1 on error.
int socketSslConnectionGetSocketDescriptor(SslConnection *c);
#ifdef _SOCKLEN_T_DECLARED
struct sockaddr;
/// Wrapper for \ref sslConnectionSetDtlsSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored.
int socketSslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const struct sockaddr *addr, socklen_t addrlen);
#endif
/// Wrapper for \ref nifmRequestRegisterSocketDescriptor. Returns 0 on success and -1 on error.
int socketNifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd);
/// Wrapper for \ref nifmRequestUnregisterSocketDescriptor. Returns 0 on success and -1 on error.
int socketNifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd);

View File

@ -18,7 +18,7 @@ typedef struct {
Result usbCommsInitialize(void);
/// Initializes usbComms with a specific number of interfaces.
Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos);
Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos, u16 idVendor, u16 idProduct);
/// Exits usbComms.
void usbCommsExit(void);
@ -26,6 +26,9 @@ void usbCommsExit(void);
/// Sets whether to throw a fatal error in usbComms{Read/Write}* on failure, or just return the transferred size. By default (false) the latter is used.
void usbCommsSetErrorHandling(bool flag);
///@name Synchronous API
///@{
/// Read data with the default interface.
size_t usbCommsRead(void* buffer, size_t size);
@ -37,3 +40,31 @@ size_t usbCommsReadEx(void* buffer, size_t size, u32 interface);
/// Same as usbCommsWrite except with the specified interface.
size_t usbCommsWriteEx(const void* buffer, size_t size, u32 interface);
///@}
///@name Asynchronous API
///@{
/// Retrieve event used for read completion with the given interface.
Event *usbCommsGetReadCompletionEvent(u32 interface);
/// Start an asynchronous read. The completion event will be signaled when the read completes.
/// The buffer must be page-aligned and no larger than one page.
Result usbCommsReadAsync(void *buffer, size_t size, u32 *urbId, u32 interface);
/// Complete an asynchronous read, clearing the completion event, and return the amount of data which was read.
Result usbCommsGetReadResult(u32 urbId, u32 *transferredSize, u32 interface);
/// Retrieve event used for write completion with the given interface.
Event *usbCommsGetWriteCompletionEvent(u32 interface);
/// Start an asynchronous write. The completion event will be signaled when the write completes.
/// The buffer must be page-aligned and no larger than one page.
Result usbCommsWriteAsync(void *buffer, size_t size, u32 *urbId, u32 interface);
/// Complete an asynchronous write, clearing the completion event, and return the amount of data which was written.
Result usbCommsGetWriteResult(u32 urbId, u32 *transferredSize, u32 interface);
///@}

View File

@ -0,0 +1,15 @@
/**
* @file diag.h
* @brief Debugging and diagnostics utilities
* @author fincs
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../result.h"
/**
* @brief Aborts program execution with a result code.
* @param[in] res Result code.
*/
void NX_NORETURN diagAbortWithResult(Result res);

View File

@ -28,7 +28,7 @@ enum {
EntryType_OverrideHeap=3, ///< Provides heap override information.
EntryType_OverrideService=4, ///< Provides service override information.
EntryType_Argv=5, ///< Provides argv.
EntryType_SyscallAvailableHint=6, ///< Provides syscall availability hints.
EntryType_SyscallAvailableHint=6, ///< Provides syscall availability hints (SVCs 0x00..0x7F).
EntryType_AppletType=7, ///< Provides APT applet type.
EntryType_AppletWorkaround=8, ///< Indicates that APT is broken and should not be used.
EntryType_Reserved9=9, ///< Unused/reserved entry type, formerly used by StdioSockets.
@ -37,6 +37,7 @@ enum {
EntryType_RandomSeed=14, ///< Provides random data used to seed the pseudo-random number generator.
EntryType_UserIdStorage=15, ///< Provides persistent storage for the preselected user id.
EntryType_HosVersion=16, ///< Provides the currently running Horizon OS version.
EntryType_SyscallAvailableHint2=17, ///< Provides syscall availability hints (SVCs 0x80..0xBF).
};
enum {
@ -44,7 +45,7 @@ enum {
};
/// Loader return function.
typedef void NORETURN (*LoaderReturnFn)(int result_code);
typedef void NX_NORETURN (*LoaderReturnFn)(int result_code);
/**
* @brief Parses the homebrew loader environment block (internally called).
@ -81,7 +82,7 @@ void* envGetArgv(void);
* @param svc Syscall number to test.
* @returns true if the syscall is available.
*/
bool envIsSyscallHinted(u8 svc);
bool envIsSyscallHinted(unsigned svc);
/// Returns the handle to the running homebrew process.
Handle envGetOwnProcessHandle(void);

View File

@ -25,6 +25,9 @@ u32 hosversionGet(void);
/// Sets or overrides the current HOS version. This function is normally called automatically by libnx on startup with the version info obtained with \ref setsysGetFirmwareVersion.
void hosversionSet(u32 version);
/// Returns whether the current HOS version is augmented by running the Atmosphère custom firmware.
bool hosversionIsAtmosphere(void);
/// Returns true if the current HOS version is equal to or above the specified major/minor/micro version.
static inline bool hosversionAtLeast(u8 major, u8 minor, u8 micro) {
return hosversionGet() >= MAKEHOSVERSION(major,minor,micro);

View File

@ -5,6 +5,7 @@
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
struct in_addr;
@ -15,8 +16,20 @@ extern struct in_addr __nxlink_host;
#define NXLINK_CLIENT_PORT 28771 ///< nxlink TCP client port
/**
* @brief Sets up stdout/stderr redirection to the nxlink host.
* @brief Connects to the nxlink host, setting up an output stream.
* @param[in] redirStdout Whether to redirect stdout to nxlink output.
* @param[in] redirStderr Whether to redirect stderr to nxlink output.
* @return Socket fd on success, negative number on failure.
* @note The socket should be closed with close() during application cleanup.
*/
int nxlinkStdio(void);
int nxlinkConnectToHost(bool redirStdout, bool redirStderr);
/// Same as \ref nxlinkConnectToHost but redirecting both stdout/stderr.
NX_INLINE int nxlinkStdio(void) {
return nxlinkConnectToHost(true, true);
}
/// Same as \ref nxlinkConnectToHost but redirecting only stderr.
NX_INLINE int nxlinkStdioForDebug(void) {
return nxlinkConnectToHost(false, true);
}

View File

@ -0,0 +1,224 @@
/**
* @file pad.h
* @brief Simple wrapper for the HID Npad API.
* @author fincs
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../services/hid.h"
/// Mask including all existing controller IDs.
#define PAD_ANY_ID_MASK 0x1000100FFUL
/// Pad state object.
typedef struct {
u8 id_mask;
u8 active_id_mask;
bool read_handheld;
bool active_handheld;
u32 style_set;
u32 attributes;
u64 buttons_cur;
u64 buttons_old;
HidAnalogStickState sticks[2];
u32 gc_triggers[2];
} PadState;
/// Pad button repeater state object.
typedef struct {
u64 button_mask;
s32 counter;
u16 delay;
u16 repeat;
} PadRepeater;
/**
* @brief Configures the input layout supported by the application.
* @param[in] max_players The maximum supported number of players (1 to 8).
* @param[in] style_set Bitfield of supported controller styles (see \ref HidNpadStyleTag).
*/
void padConfigureInput(u32 max_players, u32 style_set);
/**
* @brief Initializes a \ref PadState object to read input from one or more controller input sources.
* @param[in] _pad Pointer to \ref PadState.
* @remarks This is a variadic macro, pass the \ref HidNpadIdType value of each controller to add to the set.
*/
#define padInitialize(_pad, ...) ({ \
const HidNpadIdType _pad_ids[] = { __VA_ARGS__ }; \
u64 _pad_mask = 0; \
for (unsigned _pad_i = 0; _pad_i < (sizeof(_pad_ids)/sizeof(_pad_ids[0])); ++_pad_i) \
_pad_mask |= 1UL << (_pad_ids[_pad_i]); \
padInitializeWithMask((_pad), _pad_mask); \
})
/**
* @brief Same as \ref padInitialize, but taking a bitfield of controller IDs directly.
* @param[in] pad Pointer to \ref PadState.
* @param[in] mask Bitfield of controller IDs (each bit's position indicates a different \ref HidNpadIdType value).
*/
void padInitializeWithMask(PadState* pad, u64 mask);
/**
* @brief Same as \ref padInitialize, but including every single controller input source.
* @param[in] pad Pointer to \ref PadState.
* @remark Use this function if you want to accept input from any controller.
*/
NX_INLINE void padInitializeAny(PadState* pad) {
padInitializeWithMask(pad, PAD_ANY_ID_MASK);
}
/**
* @brief Same as \ref padInitialize, but including \ref HidNpadIdType_No1 and \ref HidNpadIdType_Handheld.
* @param[in] pad Pointer to \ref PadState.
* @remark Use this function if you just want to accept input for a single-player application.
*/
NX_INLINE void padInitializeDefault(PadState* pad) {
padInitialize(pad, HidNpadIdType_No1, HidNpadIdType_Handheld);
}
/**
* @brief Updates pad state by reading from the controller input sources specified during initialization.
* @param[in] pad Pointer to \ref PadState.
*/
void padUpdate(PadState* pad);
/**
* @brief Retrieves whether \ref HidNpadIdType_Handheld is an active input source (i.e. it was possible to read from it).
* @param[in] pad Pointer to \ref PadState.
* @return Boolean value.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR bool padIsHandheld(const PadState* pad) {
return pad->active_handheld;
}
/**
* @brief Retrieves whether the specified controller is an active input source (i.e. it was possible to read from it).
* @param[in] pad Pointer to \ref PadState.
* @param[in] id ID of the controller input source (see \ref HidNpadIdType)
* @return Boolean value.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR bool padIsNpadActive(const PadState* pad, HidNpadIdType id) {
if (id <= HidNpadIdType_No8)
return pad->active_id_mask & BIT(id);
else if (id == HidNpadIdType_Handheld)
return pad->active_handheld;
else
return false;
}
/**
* @brief Retrieves the set of input styles supported by the selected controller input sources.
* @param[in] pad Pointer to \ref PadState.
* @return Bitfield of \ref HidNpadStyleTag.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR u32 padGetStyleSet(const PadState* pad) {
return pad->style_set;
}
/**
* @brief Retrieves the set of attributes reported by the system for the selected controller input sources.
* @param[in] pad Pointer to \ref PadState.
* @return Bitfield of \ref HidNpadAttribute.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR u32 padGetAttributes(const PadState* pad) {
return pad->attributes;
}
/**
* @brief Retrieves whether any of the selected controller input sources is connected.
* @param[in] pad Pointer to \ref PadState.
* @return Boolean value.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR bool padIsConnected(const PadState* pad) {
return pad->attributes & HidNpadAttribute_IsConnected;
}
/**
* @brief Retrieves the current set of pressed buttons across all selected controller input sources.
* @param[in] pad Pointer to \ref PadState.
* @return Bitfield of \ref HidNpadButton.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR u64 padGetButtons(const PadState* pad) {
return pad->buttons_cur;
}
/**
* @brief Retrieves the set of buttons that are newly pressed.
* @param[in] pad Pointer to \ref PadState.
* @return Bitfield of \ref HidNpadButton.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR u64 padGetButtonsDown(const PadState* pad) {
return ~pad->buttons_old & pad->buttons_cur;
}
/**
* @brief Retrieves the set of buttons that are newly released.
* @param[in] pad Pointer to \ref PadState.
* @return Bitfield of \ref HidNpadButton.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR u64 padGetButtonsUp(const PadState* pad) {
return pad->buttons_old & ~pad->buttons_cur;
}
/**
* @brief Retrieves the position of an analog stick in a controller.
* @param[in] pad Pointer to \ref PadState.
* @param[in] i ID of the analog stick to read (0=left, 1=right).
* @return \ref HidAnalogStickState.
* @remark \ref padUpdate must have been previously called.
*/
NX_CONSTEXPR HidAnalogStickState padGetStickPos(const PadState* pad, unsigned i) {
return pad->sticks[i];
}
/**
* @brief Retrieves the position of an analog trigger in a GameCube controller.
* @param[in] pad Pointer to \ref PadState.
* @param[in] i ID of the analog trigger to read (0=left, 1=right).
* @return Analog trigger position (range is 0 to 0x7fff).
* @remark \ref padUpdate must have been previously called.
* @remark \ref HidNpadStyleTag_NpadGc must have been previously configured as a supported style in \ref padConfigureInput for GC trigger data to be readable.
*/
NX_CONSTEXPR u32 padGetGcTriggerPos(const PadState* pad, unsigned i) {
return pad->gc_triggers[i];
}
/**
* @brief Initializes a \ref PadRepeater object with the specified settings.
* @param[in] r Pointer to \ref PadRepeater.
* @param[in] delay Number of input updates between button presses being first detected and them being considered for repeat.
* @param[in] repeat Number of input updates between autogenerated repeat button presses.
*/
NX_CONSTEXPR void padRepeaterInitialize(PadRepeater* r, u16 delay, u16 repeat) {
r->button_mask = 0;
r->counter = 0;
r->delay = delay;
r->repeat = repeat;
}
/**
* @brief Updates pad repeat state.
* @param[in] r Pointer to \ref PadRepeater.
* @param[in] button_mask Bitfield of currently pressed \ref HidNpadButton that will be considered for repeat.
*/
void padRepeaterUpdate(PadRepeater* r, u64 button_mask);
/**
* @brief Retrieves the set of buttons that are being repeated according to the parameters specified in \ref padRepeaterInitialize.
* @param[in] r Pointer to \ref PadRepeater.
* @return Bitfield of \ref HidNpadButton.
* @remark It is suggested to bitwise-OR the return value of this function with that of \ref padGetButtonsDown.
*/
NX_CONSTEXPR u64 padRepeaterGetButtons(const PadRepeater* r) {
return r->counter == 0 ? r->button_mask : 0;
}

View File

@ -0,0 +1,257 @@
/**
* @file ringcon.h
* @brief Wrapper for using the Ring-Con attached to a Joy-Con, with hidbus. See also: https://switchbrew.org/wiki/Ring-Con
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../services/hidbus.h"
#define RINGCON_CAL_MAGIC -0x3502 // 0xCAFE
/// Whether the output data is valid.
typedef enum {
RingConDataValid_Ok = 0, ///< Valid.
RingConDataValid_CRC = 1, ///< Bad CRC.
RingConDataValid_Cal = 2, ///< Only used with \ref ringconReadUserCal. Calibration is needed via \ref ringconUpdateUserCal.
} RingConDataValid;
typedef enum {
RingConErrorFlag_BadUserCalUpdate = 0, ///< The output from \ref ringconReadUserCal doesn't match the input used with \ref ringconWriteUserCal, or the \ref RingConDataValid is not ::RingConDataValid_Ok.
RingConErrorFlag_BadFlag = 4, ///< The output flag from \ref ringconCmdx00020105 when successful is invalid.
RingConErrorFlag_BadUserCal = 5, ///< BadUserCal
RingConErrorFlag_BadManuCal = 6, ///< BadManuCal
} RingConErrorFlag;
/// Ring-Con firmware version.
typedef struct {
u8 fw_main_ver; ///< Main firmware version.
u8 fw_sub_ver; ///< Sub firmware version.
} RingConFwVersion;
/// Ring-Con manufacturer calibration.
typedef struct {
s16 os_max; ///< (manu_)os_max
s16 hk_max; ///< (manu_)hk_max
s16 zero_min; ///< (manu_)zero_min
s16 zero_max; ///< (manu_)zero_max
} RingConManuCal;
/// Ring-Con user calibration.
typedef struct {
s16 os_max; ///< (user_)os_max
s16 hk_max; ///< (user_)hk_max
s16 zero; ///< (user_)zero
RingConDataValid data_valid; ///< \ref RingConDataValid
} RingConUserCal;
/// Polling data extracted from \ref HidbusJoyPollingReceivedData.
typedef struct {
s16 data; ///< Sensor state data.
u64 sampling_number; ///< SamplingNumber
} RingConPollingData;
/// Ring-Con state object.
typedef struct {
bool bus_initialized;
HidbusBusHandle handle;
void* workbuf;
size_t workbuf_size;
u64 polling_last_sampling_number;
u32 error_flags;
u64 id_l, id_h;
RingConFwVersion fw_ver;
u32 flag;
s16 unk_cal;
s32 total_push_count;
RingConManuCal manu_cal;
RingConUserCal user_cal;
} RingCon;
/**
* @brief Creates a \ref RingCon object, and handles the various initialization for it.
* @param c \ref RingCon
* @param[in] id \ref HidNpadIdType. A Ring-Con must be attached to this controller.
*/
Result ringconCreate(RingCon *c, HidNpadIdType id);
/**
* @brief Close a \ref RingCon.
* @param c \ref RingCon
*/
void ringconClose(RingCon *c);
/**
* @brief Gets the error flags field.
* @param c \ref RingCon
*/
NX_CONSTEXPR u32 ringconGetErrorFlags(RingCon *c) {
return c->error_flags;
}
/**
* @brief Gets the value of an error flag, set by \ref ringconSetErrorFlag.
* @param c \ref RingCon
* @param[in] flag \ref RingConErrorFlag
*/
NX_CONSTEXPR bool ringconGetErrorFlag(RingCon *c, RingConErrorFlag flag) {
return (c->error_flags & BIT(flag)) != 0;
}
/**
* @brief Gets the \ref RingConFwVersion previously loaded by \ref ringconCreate.
* @param c \ref RingCon
* @param[out] out \ref RingConFwVersion
*/
NX_CONSTEXPR RingConFwVersion ringconGetFwVersion(RingCon *c) {
return c->fw_ver;
}
/**
* @brief Gets the Id previously loaded by \ref ringconCreate.
* @param c \ref RingCon
* @param[out] id_l Id low.
* @param[out] id_h Id high.
*/
NX_CONSTEXPR void ringconGetId(RingCon *c, u64 *id_l, u64 *id_h) {
*id_l = c->id_l;
*id_h = c->id_h;
}
/**
* @brief Gets the unk_cal previously loaded by \ref ringconCreate with \ref ringconReadUnkCal. Only valid when the output flag from \ref ringconCmdx00020105 is valid.
* @param c \ref RingCon
*/
NX_CONSTEXPR s16 ringconGetUnkCal(RingCon *c) {
return c->unk_cal;
}
/**
* @brief Gets the total-push-count previously loaded by \ref ringconCreate.
* @param c \ref RingCon
* @param[out] out total_push_count
*/
NX_CONSTEXPR s32 ringconGetTotalPushCount(RingCon *c) {
return c->total_push_count;
}
/**
* @brief Gets the \ref RingConManuCal previously loaded by \ref ringconCreate.
* @param c \ref RingCon
* @param[out] out \ref RingConManuCal
*/
NX_CONSTEXPR void ringconGetManuCal(RingCon *c, RingConManuCal *out) {
*out = c->manu_cal;
}
/**
* @brief Gets the \ref RingConUserCal previously loaded by \ref ringconCreate.
* @note The Ring-Con UserCal doesn't seem to be calibrated normally?
* @param c \ref RingCon
* @param[out] out \ref RingConUserCal
*/
NX_CONSTEXPR void ringconGetUserCal(RingCon *c, RingConUserCal *out) {
*out = c->user_cal;
}
/**
* @brief Updates the \ref RingConUserCal.
* @note The input \ref RingConUserCal is used with \ref ringconWriteUserCal, and the output from \ref ringconReadUserCal is verified with the input \ref RingConUserCal. This does not update the \ref RingConUserCal returned by \ref ringconGetUserCal.
* @note The Ring-Con UserCal doesn't seem to be calibrated normally?
* @param c \ref RingCon
* @param[in] cal \ref RingConUserCal
*/
Result ringconUpdateUserCal(RingCon *c, RingConUserCal cal);
/**
* @brief Reads the \ref RingConFwVersion.
* @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetFwVersion instead.
* @param c \ref RingCon
* @param[out] out \ref RingConFwVersion
*/
Result ringconReadFwVersion(RingCon *c, RingConFwVersion *out);
/**
* @brief Reads the Id.
* @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetId instead.
* @param c \ref RingCon
* @param[out] id_l Id low.
* @param[out] id_h Id high.
*/
Result ringconReadId(RingCon *c, u64 *id_l, u64 *id_h);
/**
* @brief Gets the \ref RingConPollingData. Only returns entries which are new since the last time this was called (or if not previously called, all available entries up to count).
* @param c \ref RingCon
* @param[out] out Output array of \ref RingConPollingData. Entry order is newest -> oldest.
* @param[in] count Total size of the out array in entries, max value is 0x9.
* @param[out] total_out Total output entries.
*/
Result ringconGetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32 *total_out);
/**
* @brief Uses cmd 0x00020105.
* @note Used internally by \ref ringconCreate.
* @param c \ref RingCon
* @param[out] out Output value.
*/
Result ringconCmdx00020105(RingCon *c, u32 *out);
/**
* @brief Reads the \ref RingConManuCal.
* @note Used internally by \ref ringconCreate and \ref ringconReadUnkCal.
* @param c \ref RingCon
* @param[out] out \ref RingConManuCal
*/
Result ringconReadManuCal(RingCon *c, RingConManuCal *out);
/**
* @brief Gets the unknown value derived from the output of cmd 0x00020504 and \ref ringconReadManuCal.
* @note Used internally by \ref ringconCreate.
* @param c \ref RingCon
* @param[out] out Output value.
*/
Result ringconReadUnkCal(RingCon *c, s16 *out);
/**
* @brief Reads the \ref RingConUserCal.
* @note Used internally by \ref ringconCreate and \ref ringconUpdateUserCal.
* @param c \ref RingCon
* @param[out] out \ref RingConUserCal
*/
Result ringconReadUserCal(RingCon *c, RingConUserCal *out);
/**
* @brief Reads the rep-count for Multitask Mode.
* @param c \ref RingCon
* @param[out] out Output value. Official sw using this clamps the output to range 0-500.
* @param[out] data_valid \ref RingConDataValid
*/
Result ringconReadRepCount(RingCon *c, s32 *out, RingConDataValid *data_valid);
/**
* @brief Reads the total-push-count, for Multitask Mode.
* @note Used internally by \ref ringconCreate. Normally \ref ringconGetTotalPushCount should be used instead.
* @param c \ref RingCon
* @param[out] out Output value.
* @param[out] data_valid \ref RingConDataValid
*/
Result ringconReadTotalPushCount(RingCon *c, s32 *out, RingConDataValid *data_valid);
/**
* @brief This resets the value returned by \ref ringconReadRepCount to 0.
* @param c \ref RingCon
*/
Result ringconResetRepCount(RingCon *c);
/**
* @brief Writes the \ref RingConUserCal.
* @note Used internally by \ref ringconUpdateUserCal.
* @param c \ref RingCon
* @param[in] cal \ref RingConUserCal
*/
Result ringconWriteUserCal(RingCon *c, RingConUserCal cal);

View File

@ -10,21 +10,22 @@
/// PerformanceMode
typedef enum {
ApmPerformanceMode_Handheld = 0, ///< Handheld
ApmPerformanceMode_Docked = 1, ///< Docked
ApmPerformanceMode_Invalid = -1, ///< Invalid
ApmPerformanceMode_Normal = 0, ///< Normal
ApmPerformanceMode_Boost = 1, ///< Boost
} ApmPerformanceMode;
/// CpuBoostMode. With \ref appletSetCpuBoostMode, only values 0/1 are available. This allows using higher clock rates.
typedef enum {
ApmCpuBoostMode_Disabled = 0, ///< Default, use normal PerformanceConfiguration.
ApmCpuBoostMode_Type1 = 1, ///< Use performance configurations 0x92220009 (Docked) and 0x9222000A (Handheld), or 0x9222000B and 0x9222000C. All of these use the normal GPU clock rate for Docked-mode. The latter pair uses the normal CPU clock rate, while the former pair uses the maximum TX1 CPU clock rate. Memory clock rate is the same as normal.
ApmCpuBoostMode_Type2 = 2, ///< Use performance configurations 0x9222000B and 0x9222000C.
ApmCpuBoostMode_Normal = 0, ///< Default, boost-mode disabled.
ApmCpuBoostMode_FastLoad = 1, ///< Boost CPU. Additionally, throttle GPU to minimum. Use performance configurations 0x92220009 (Docked) and 0x9222000A (Handheld), or 0x9222000B and 0x9222000C.
ApmCpuBoostMode_Type2 = 2, ///< Conserve power. Only throttle GPU to minimum. Use performance configurations 0x9222000B and 0x9222000C.
} ApmCpuBoostMode;
/// Initialize apm. Used automatically by \ref appletInitialize.
/// Initialize apm. Used automatically by \ref appletInitialize with AppletType_Application.
Result apmInitialize(void);
/// Exit apm. Used automatically by \ref appletExit.
/// Exit apm. Used automatically by \ref appletExit with AppletType_Application.
void apmExit(void);
/// Gets the Service object for the actual apm service session.
@ -33,6 +34,12 @@ Service* apmGetServiceSession(void);
/// Gets the Service object for ISession.
Service* apmGetServiceSession_Session(void);
/**
* @brief Gets the current ApmPerformanceMode.
* @param[out] out_performanceMode ApmPerformanceMode
*/
Result apmGetPerformanceMode(ApmPerformanceMode* out_performanceMode);
/**
* @brief Sets the PerformanceConfiguration for the specified PerformanceMode.
* @param[in] PerformanceMode \ref ApmPerformanceMode

View File

@ -32,8 +32,8 @@ typedef enum {
/// OperationMode
typedef enum {
AppletOperationMode_Handheld = 0,
AppletOperationMode_Docked = 1,
AppletOperationMode_Handheld = 0, ///< Handheld
AppletOperationMode_Console = 1, ///< Console (Docked / TV-mode)
} AppletOperationMode;
/// applet hook types.
@ -42,9 +42,9 @@ typedef enum {
AppletHookType_OnOperationMode, ///< ::AppletMessage_OperationModeChanged
AppletHookType_OnPerformanceMode, ///< ::AppletMessage_PerformanceModeChanged
AppletHookType_OnExitRequest, ///< ::AppletMessage_ExitRequested
AppletHookType_OnRestart, ///< ::AppletMessage_Restart
AppletHookType_OnResume, ///< ::AppletMessage_Resume
AppletHookType_OnCaptureButtonShortPressed, ///< ::AppletMessage_CaptureButtonShortPressed
AppletHookType_OnAlbumImageTaken, ///< ::AppletMessage_AlbumImageTaken
AppletHookType_OnAlbumScreenShotTaken, ///< ::AppletMessage_AlbumScreenShotTaken
AppletHookType_RequestToDisplay, ///< ::AppletMessage_RequestToDisplay
AppletHookType_Max, ///< Number of applet hook types.
@ -52,31 +52,32 @@ typedef enum {
/// AppletMessage, for \ref appletGetMessage. See also \ref AppletHookType.
typedef enum {
AppletMessage_ExitRequested = 0x4, ///< Exit requested.
AppletMessage_FocusStateChanged = 0xF, ///< FocusState changed.
AppletMessage_Restart = 0x10, ///< Current applet execution was resumed.
AppletMessage_OperationModeChanged = 0x1E, ///< OperationMode changed.
AppletMessage_PerformanceModeChanged = 0x1F, ///< PerformanceMode changed.
AppletMessage_RequestToDisplay = 0x33, ///< Display requested, see \ref appletApproveToDisplay.
AppletMessage_CaptureButtonShortPressed = 0x5A, ///< Capture button was short-pressed.
AppletMessage_AlbumImageTaken = 0x5C, ///< Screenshot was taken.
AppletMessage_ExitRequest = 4, ///< Exit request.
AppletMessage_FocusStateChanged = 15, ///< FocusState changed.
AppletMessage_Resume = 16, ///< Current applet execution was resumed.
AppletMessage_OperationModeChanged = 30, ///< OperationMode changed.
AppletMessage_PerformanceModeChanged = 31, ///< PerformanceMode changed.
AppletMessage_RequestToDisplay = 51, ///< Display requested, see \ref appletApproveToDisplay.
AppletMessage_CaptureButtonShortPressed = 90, ///< Capture button was short-pressed.
AppletMessage_AlbumScreenShotTaken = 92, ///< Screenshot was taken.
AppletMessage_AlbumRecordingSaved = 93, ///< AlbumRecordingSaved
} AppletMessage;
/// FocusState
typedef enum {
AppletFocusState_Focused = 1, ///< Applet is focused.
AppletFocusState_NotFocusedLibraryApplet = 2, ///< Out of focus - LibraryApplet open.
AppletFocusState_NotFocusedHomeSleep = 3 ///< Out of focus - HOME menu open / console is sleeping.
AppletFocusState_InFocus = 1, ///< Applet is focused.
AppletFocusState_OutOfFocus = 2, ///< Out of focus - LibraryApplet open.
AppletFocusState_Background = 3 ///< Out of focus - HOME menu open / console is sleeping.
} AppletFocusState;
/// FocusHandlingMode
typedef enum {
AppletFocusHandlingMode_SuspendHomeSleep = 0, ///< Suspend only when HOME menu is open / console is sleeping (default).
AppletFocusHandlingMode_NoSuspend, ///< Don't suspend when out of focus.
AppletFocusHandlingMode_SuspendHomeSleepNotify, ///< Suspend only when HOME menu is open / console is sleeping but still receive OnFocusState hook.
AppletFocusHandlingMode_AlwaysSuspend, ///< Always suspend when out of focus, regardless of the reason.
AppletFocusHandlingMode_SuspendHomeSleep = 0, ///< Suspend only when HOME menu is open / console is sleeping (default).
AppletFocusHandlingMode_NoSuspend, ///< Don't suspend when out of focus.
AppletFocusHandlingMode_SuspendHomeSleepNotify, ///< Suspend only when HOME menu is open / console is sleeping but still receive OnFocusState hook.
AppletFocusHandlingMode_AlwaysSuspend, ///< Always suspend when out of focus, regardless of the reason.
AppletFocusHandlingMode_Max, ///< Number of focus handling modes.
AppletFocusHandlingMode_Max, ///< Number of focus handling modes.
} AppletFocusHandlingMode;
/// LaunchParameterKind
@ -88,27 +89,28 @@ typedef enum {
/// AppletId
typedef enum {
AppletId_application = 0x01, ///< Application. Not valid for use with LibraryApplets.
AppletId_overlayDisp = 0x02, ///< 010000000000100C "overlayDisp"
AppletId_qlaunch = 0x03, ///< 0100000000001000 "qlaunch" (SystemAppletMenu)
AppletId_starter = 0x04, ///< 0100000000001012 "starter" SystemApplication.
AppletId_auth = 0x0A, ///< 0100000000001001 "auth"
AppletId_cabinet = 0x0B, ///< 0100000000001002 "cabinet"
AppletId_controller = 0x0C, ///< 0100000000001003 "controller"
AppletId_dataErase = 0x0D, ///< 0100000000001004 "dataErase"
AppletId_error = 0x0E, ///< 0100000000001005 "error"
AppletId_netConnect = 0x0F, ///< 0100000000001006 "netConnect"
AppletId_playerSelect = 0x10, ///< 0100000000001007 "playerSelect"
AppletId_swkbd = 0x11, ///< 0100000000001008 "swkbd"
AppletId_miiEdit = 0x12, ///< 0100000000001009 "miiEdit"
AppletId_web = 0x13, ///< 010000000000100A "LibAppletWeb" WebApplet applet
AppletId_shop = 0x14, ///< 010000000000100B "LibAppletShop" ShopN applet
AppletId_photoViewer = 0x15, ///< 010000000000100D "photoViewer"
AppletId_set = 0x16, ///< 010000000000100E "set" (This applet is currently not present on retail devices.)
AppletId_offlineWeb = 0x17, ///< 010000000000100F "LibAppletOff" Offline web-applet
AppletId_loginShare = 0x18, ///< 0100000000001010 "LibAppletLns" Whitelisted web-applet
AppletId_wifiWebAuth = 0x19, ///< 0100000000001011 "LibAppletAuth" WifiWebAuth applet
AppletId_myPage = 0x1A, ///< 0100000000001013 "myPage"
AppletId_None = 0x00, ///< None
AppletId_application = 0x01, ///< Application. Not valid for use with LibraryApplets.
AppletId_OverlayApplet = 0x02, ///< 010000000000100C "overlayDisp"
AppletId_SystemAppletMenu = 0x03, ///< 0100000000001000 "qlaunch" (SystemAppletMenu)
AppletId_SystemApplication = 0x04, ///< 0100000000001012 "starter" SystemApplication.
AppletId_LibraryAppletAuth = 0x0A, ///< 0100000000001001 "auth"
AppletId_LibraryAppletCabinet = 0x0B, ///< 0100000000001002 "cabinet"
AppletId_LibraryAppletController = 0x0C, ///< 0100000000001003 "controller"
AppletId_LibraryAppletDataErase = 0x0D, ///< 0100000000001004 "dataErase"
AppletId_LibraryAppletError = 0x0E, ///< 0100000000001005 "error"
AppletId_LibraryAppletNetConnect = 0x0F, ///< 0100000000001006 "netConnect"
AppletId_LibraryAppletPlayerSelect = 0x10, ///< 0100000000001007 "playerSelect"
AppletId_LibraryAppletSwkbd = 0x11, ///< 0100000000001008 "swkbd"
AppletId_LibraryAppletMiiEdit = 0x12, ///< 0100000000001009 "miiEdit"
AppletId_LibraryAppletWeb = 0x13, ///< 010000000000100A "LibAppletWeb" WebApplet applet
AppletId_LibraryAppletShop = 0x14, ///< 010000000000100B "LibAppletShop" ShopN applet
AppletId_LibraryAppletPhotoViewer = 0x15, ///< 010000000000100D "photoViewer"
AppletId_LibraryAppletSet = 0x16, ///< 010000000000100E "set" (This applet is currently not present on retail devices.)
AppletId_LibraryAppletOfflineWeb = 0x17, ///< 010000000000100F "LibAppletOff" offlineWeb applet
AppletId_LibraryAppletLoginShare = 0x18, ///< 0100000000001010 "LibAppletLns" loginShare web-applet
AppletId_LibraryAppletWifiWebAuth = 0x19, ///< 0100000000001011 "LibAppletAuth" wifiWebAuth applet
AppletId_LibraryAppletMyPage = 0x1A, ///< 0100000000001013 "myPage"
} AppletId;
/// LibraryAppletMode
@ -186,8 +188,8 @@ typedef enum {
/// Input mode values for \ref appletSetWirelessPriorityMode.
typedef enum {
AppletWirelessPriorityMode_Unknown1 = 1, ///< Unknown.
AppletWirelessPriorityMode_Unknown2 = 2, ///< Unknown.
AppletWirelessPriorityMode_Default = 1, ///< Default
AppletWirelessPriorityMode_OptimizedForWlan = 2, ///< OptimizedForWlan
} AppletWirelessPriorityMode;
/// CaptureSharedBuffer for the IDisplayController commands.
@ -197,6 +199,12 @@ typedef enum {
AppletCaptureSharedBuffer_CallerApplet = 2, ///< CallerApplet
} AppletCaptureSharedBuffer;
/// WindowOriginMode
typedef enum {
AppletWindowOriginMode_LowerLeft = 0, ///< LowerLeft
AppletWindowOriginMode_UpperLeft = 1, ///< UpperLeft
} AppletWindowOriginMode;
/// ProgramSpecifyKind for the ExecuteProgram cmd. Controls the type of the u64 passed to the ExecuteProgram cmd.
typedef enum {
AppletProgramSpecifyKind_ExecuteProgram = 0, ///< u8 ProgramIndex.
@ -247,6 +255,11 @@ typedef struct {
AppletApplicationExitReason exitreason; ///< Set by \ref appletApplicationJoin using the output from cmd GetResult, see \ref AppletApplicationExitReason.
} AppletApplication;
/// GpuErrorHandler
typedef struct {
Service s; ///< IGpuErrorHandler
} AppletGpuErrorHandler;
/// Used by \ref appletInitialize with __nx_applet_AppletAttribute for cmd OpenLibraryAppletProxy (AppletType_LibraryApplet), on [3.0.0+]. The default for this struct is all-zero.
typedef struct {
u8 flag; ///< Flag. When non-zero, two state fields are set to 1.
@ -331,10 +344,10 @@ Service* appletGetServiceSession_Proxy(void);
/// Gets the Service object for IAppletCommonFunctions. Only initialized with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [7.0.0+].
Service* appletGetServiceSession_AppletCommonFunctions(void);
/// Gets the Service object for I*Functions, specific to each AppletType (IApplicationFunctions for AppletType_*Application). Not initialized with AppletType_LibraryApplet.
/// Gets the Service object for I*Functions, specific to each AppletType (IApplicationFunctions for AppletType_*Application). Not initialized with AppletType_LibraryApplet pre-15.0.0. On [15.0.0+] with AppletType_LibraryApplet this returns the object for IHomeMenuFunctions.
Service* appletGetServiceSession_Functions(void);
/// Gets the Service object for IGlobalStateController. Only initialized with AppletType_SystemApplet.
/// Gets the Service object for IGlobalStateController. Only initialized with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
Service* appletGetServiceSession_GlobalStateController(void);
/// Gets the Service object for IApplicationCreator. Only initialized with AppletType_SystemApplet.
@ -368,7 +381,7 @@ Service* appletGetServiceSession_DisplayController(void);
Service* appletGetServiceSession_DebugFunctions(void);
/// Get the cached AppletResourceUserId.
Result appletGetAppletResourceUserId(u64 *out);
u64 appletGetAppletResourceUserId(void);
/// Get the \ref AppletType.
AppletType appletGetAppletType(void);
@ -411,6 +424,13 @@ Result appletReleaseSleepLock(void);
*/
Result appletReleaseSleepLockTransiently(void);
/**
* @brief GetWakeupCount
* @note Only available with [11.0.0+].
* @param[out] out Output value.
*/
Result appletGetWakeupCount(u64 *out);
/**
* @brief Pushes a storage to the general channel. Used for sending requests to SystemApplet.
* @note This is not usable under an Application, however it is usable under a LibraryApplet.
@ -482,6 +502,17 @@ Result appletSetLcdBacklightOffEnabled(bool flag);
*/
Result appletIsInControllerFirmwareUpdateSection(bool *out);
/**
* @brief SetVrPositionForDebug
* @note The cached value loaded from \ref setsysGetDebugModeFlag must be 1, otherwise an error is returned.
* @note Only available with [11.0.0+].
* @param[in] x X, must not be negative. x+width must be <=1280.
* @param[in] y Y, must not be negative. y+height must be <=720.
* @param[in] width Width, must be 1-1280.
* @param[in] height Height, must be 1-720.
*/
Result appletSetVrPositionForDebug(s32 x, s32 y, s32 width, s32 height);
/**
* @brief Gets the DefaultDisplayResolution.
* @note Only available with [3.0.0+].
@ -535,6 +566,19 @@ Result appletGetApplicationIdByContentActionName(u64 *application_id, const char
*/
Result appletSetCpuBoostMode(ApmCpuBoostMode mode);
/**
* @brief CancelCpuBoostMode
* @note Only available with [10.0.0+].
*/
Result appletCancelCpuBoostMode(void);
/**
* @brief GetBuiltInDisplayType
* @note Only available with [11.0.0+].
* @param[out] out Output value.
*/
Result appletGetBuiltInDisplayType(s32 *out);
/**
* @brief Perform SystemButtonPressing with the specified \ref AppletSystemButtonType. Internally this cmd checks a state field, verifies that the type is allowed, then runs the same func as \ref appletPerformSystemButtonPressing internally.
* @note Only available with [6.0.0+].
@ -556,6 +600,14 @@ Result appletSetPerformanceConfigurationChangedNotification(bool flag);
*/
Result appletGetCurrentPerformanceConfiguration(u32 *PerformanceConfiguration);
/**
* @brief Opens an \ref AppletGpuErrorHandler.
* @note The cached value loaded from \ref setsysGetDebugModeFlag must be 1, otherwise an error is returned.
* @note Only available with [11.0.0+].
* @param[out] g \ref AppletGpuErrorHandler
*/
Result appletOpenMyGpuErrorHandler(AppletGpuErrorHandler *g);
/**
* @brief Gets the OperationModeSystemInfo.
* @note Only available with [7.0.0+].
@ -570,6 +622,78 @@ Result appletGetOperationModeSystemInfo(u32 *info);
*/
Result appletGetSettingsPlatformRegion(SetSysPlatformRegion *out);
/**
* @brief ActivateMigrationService
* @note Only available with [10.0.0+].
*/
Result appletActivateMigrationService(void);
/**
* @brief DeactivateMigrationService
* @note Only available with [10.0.0+].
*/
Result appletDeactivateMigrationService(void);
/**
* @brief DisableSleepTillShutdown
* @note Only available with [11.0.0+].
*/
Result appletDisableSleepTillShutdown(void);
/**
* @brief SuppressDisablingSleepTemporarily
* @param[in] val Nanoseconds value.
* @note Only available with [11.0.0+].
*/
Result appletSuppressDisablingSleepTemporarily(u64 val);
/**
* @brief SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled
* @note Only available with [11.0.0+].
*/
Result appletSetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(void);
///@}
///@name IGpuErrorHandler
///@{
/**
* @brief Close an \ref AppletGpuErrorHandler.
* @param g \ref AppletGpuErrorHandler
*/
void appletGpuErrorHandlerClose(AppletGpuErrorHandler *g);
/**
* @brief Gets the size of the info available with \ref appletGpuErrorHandlerGetManualGpuErrorInfo.
* @param g \ref AppletGpuErrorHandler
* @param[out] out Output size.
*/
Result appletGpuErrorHandlerGetManualGpuErrorInfoSize(AppletGpuErrorHandler *g, u64 *out);
/**
* @brief GetManualGpuErrorInfo
* @param g \ref AppletGpuErrorHandler
* @param[out] buffer Output buffer.
* @param[in] size Output buffer size, must be >= the output size from \ref appletGpuErrorHandlerGetManualGpuErrorInfoSize.
* @param[out] out Output value.
*/
Result appletGpuErrorHandlerGetManualGpuErrorInfo(AppletGpuErrorHandler *g, void* buffer, size_t size, u64 *out);
/**
* @brief GetManualGpuErrorDetectionSystemEvent
* @param g \ref AppletGpuErrorHandler
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
*/
Result appletGpuErrorHandlerGetManualGpuErrorDetectionSystemEvent(AppletGpuErrorHandler *g, Event *out_event);
/**
* @brief FinishManualGpuErrorHandling
* @param g \ref AppletGpuErrorHandler
*/
Result appletGpuErrorHandlerFinishManualGpuErrorHandling(AppletGpuErrorHandler *g);
///@}
///@name ISelfController
@ -603,7 +727,7 @@ Result appletLeaveFatalSection(void);
Result appletSetScreenShotPermission(AppletScreenShotPermission permission);
/**
* @brief Sets whether ::AppletMessage_Restart is enabled.
* @brief Sets whether ::AppletMessage_Resume is enabled.
* @param[in] flag Whether to enable the notification.
*/
Result appletSetRestartMessageEnabled(bool flag);
@ -667,6 +791,21 @@ Result appletGetSystemSharedLayerHandle(u64 *SharedBufferHandle, u64 *SharedLaye
*/
Result appletGetSystemSharedBufferHandle(u64 *SharedBufferHandle);
/**
* @brief CreateManagedDisplaySeparableLayer
* @note Only available with [10.0.0+].
* @param[out] display_layer Output display_layer.
* @param[out] recording_layer Output recording_layer.
*/
Result appletCreateManagedDisplaySeparableLayer(u64 *display_layer, u64 *recording_layer);
/**
* @brief SetManagedDisplayLayerSeparationMode
* @note Only available with [10.0.0+].
* @param[in] mode Mode. Must be 0-1.
*/
Result appletSetManagedDisplayLayerSeparationMode(u32 mode);
/**
* @brief Sets whether ::AppletMessage_RequestToDisplay is enabled.
* @note Sets an internal state flag. When the input flag is 0, this will in additional run the same code as \ref appletApproveToDisplay.
@ -770,7 +909,7 @@ Result appletSetWirelessPriorityMode(AppletWirelessPriorityMode mode);
Result appletGetProgramTotalActiveTime(u64 *activeTime);
/**
* @brief Sets whether ::AppletMessage_AlbumImageTaken is enabled.
* @brief Sets whether ::AppletMessage_AlbumScreenShotTaken is enabled.
* @note Only available with [7.0.0+].
* @param[in] flag Whether to enable the notification.
*/
@ -784,6 +923,13 @@ Result appletSetAlbumImageTakenNotificationEnabled(bool flag);
*/
Result appletSetApplicationAlbumUserData(const void* buffer, size_t size);
/**
* @brief SaveCurrentScreenshot
* @note Only available with [11.0.0+].
* @param[in] option \ref AlbumReportOption
*/
Result appletSaveCurrentScreenshot(AlbumReportOption option);
///@}
///@name IWindowController
@ -1003,7 +1149,7 @@ Result appletLockAccessorTryLock(AppletLockAccessor *a, bool *flag);
/**
* @brief Lock a LockAccessor.
* @note Similar to \ref appletLockAccessorTryLock, except this uses timeout U64_MAX with the eventWait call, and this uses TryLock repeatedly until the output flag value is true.
* @note Similar to \ref appletLockAccessorTryLock, except this uses timeout UINT64_MAX with the eventWait call, and this uses TryLock repeatedly until the output flag value is true.
* @param a LockAccessor object.
*/
Result appletLockAccessorLock(AppletLockAccessor *a);
@ -1095,7 +1241,7 @@ Result appletHolderTerminate(AppletHolder *h);
/**
* @brief Uses cmds GetAppletStateChangedEvent and RequestExit, then waits for the LibraryApplet to exit with the specified timeout. If a timeout occurs, the Terminate cmd is used.
* @param h AppletHolder object.
* @param[in] timeout Timeout in nanoseconds. U64_MAX for no timeout.
* @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout.
*/
Result appletHolderRequestExitOrTerminate(AppletHolder *h, u64 timeout);
@ -1105,6 +1251,14 @@ Result appletHolderRequestExitOrTerminate(AppletHolder *h, u64 timeout);
*/
void appletHolderJoin(AppletHolder *h);
/**
* @brief Gets the LibraryApplet StateChangedEvent.
* @param h AppletHolder object.
*/
NX_CONSTEXPR Event *appletHolderGetExitEvent(AppletHolder *h) {
return &h->StateChangedEvent;
}
/**
* @brief Waits on the LibraryApplet StateChangedEvent with timeout=0, and returns whether it was successful.
* @param h AppletHolder object.
@ -1125,6 +1279,20 @@ LibAppletExitReason appletHolderGetExitReason(AppletHolder *h);
*/
Result appletHolderSetOutOfFocusApplicationSuspendingEnabled(AppletHolder *h, bool flag);
/**
* @brief PresetLibraryAppletGpuTimeSliceZero
* @note Only available with [10.0.0+].
* @param h AppletHolder object.
*/
Result appletHolderPresetLibraryAppletGpuTimeSliceZero(AppletHolder *h);
/**
* @brief Gets the PopInteractiveOutDataEvent.
* @param h AppletHolder object.
* @param[out] out_event Output Event.
*/
Result appletHolderGetPopInteractiveOutDataEvent(AppletHolder *h, Event **out_event);
/**
* @brief Waits for the PopInteractiveOutDataEvent and StateChangedEvent.
* @return false for error / when StateChangedEvent was signaled, and true when PopInteractiveOutDataEvent was signaled. The latter is signaled when a new storage is available with \ref appletHolderPopInteractiveOutData where previously no storage was available (this willl not clear the event), this event is automatically cleared by the system once the last storage is popped.
@ -1386,6 +1554,12 @@ Result appletRequestToShutdown(void);
*/
Result appletRequestToReboot(void);
/**
* @brief RequestToSleep
* @note Only available with AppletType_*Application on [10.0.0+].
*/
Result appletRequestToSleep(void);
/**
* @brief Exit the application and return to the kiosk demo menu. This terminates the current process. This will enter an infinite-sleep-loop on success.
* @note Only available with AppletType_*Application on [4.0.0+], on kiosk systems (QuestFlag set).
@ -1409,9 +1583,9 @@ Result appletInitializeApplicationCopyrightFrameBuffer(void);
* @param[in] y Y coordinate. Must not be negative.
* @param[in] width Image width. Must be >=1.
* @param[in] height Image height. Must be >=1.
* @param[in] mode WindowOriginMode. Should be at least 1.
* @param[in] mode \ref AppletWindowOriginMode
*/
Result appletSetApplicationCopyrightImage(const void* buffer, size_t size, s32 x, s32 y, s32 width, s32 height, s32 mode);
Result appletSetApplicationCopyrightImage(const void* buffer, size_t size, s32 x, s32 y, s32 width, s32 height, AppletWindowOriginMode mode);
/**
* @brief Sets the visibility for the image set by \ref appletSetApplicationCopyrightImage, in screenshots.
@ -1478,6 +1652,13 @@ Result appletRestartProgram(const void* buffer, size_t size);
*/
Result appletGetPreviousProgramIndex(s32 *programIndex);
/**
* @brief SetDelayTimeToAbortOnGpuError
* @note Only available with AppletType_*Application on [11.0.0+].
* @param[in] val Input nanoseconds value.
*/
Result appletSetDelayTimeToAbortOnGpuError(u64 val);
/**
* @brief Gets an Event which is signaled when a new storage is available with \ref appletTryPopFromFriendInvitationStorageChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped.
* @note This is used by \ref friendsGetFriendInvitationNotificationEvent.
@ -1527,6 +1708,13 @@ Result appletGetHealthWarningDisappearedSystemEvent(Event *out_event);
*/
Result appletSetHdcpAuthenticationActivated(bool flag);
/**
* @brief GetLastApplicationExitReason
* @note Only available with AppletType_*Application on [11.0.0+].
* @param[out] out Output value.
*/
Result appletGetLastApplicationExitReason(s32 *out);
/**
* @brief CreateMovieMaker. Do not use this directly, use \ref grcCreateMovieMaker instead.
* @note Only available with AppletType_*Application on [5.0.0+].
@ -1544,37 +1732,37 @@ Result appletPrepareForJit(void);
///@}
///@name IHomeMenuFunctions: IFunctions for AppletType_SystemApplet.
///@name IHomeMenuFunctions: IFunctions for AppletType_SystemApplet and on [15.0.0+] for AppletType_LibraryApplet.
///@{
/**
* @brief RequestToGetForeground
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet.
*/
Result appletRequestToGetForeground(void);
/**
* @brief LockForeground
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet.
*/
Result appletLockForeground(void);
/**
* @brief UnlockForeground
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet.
*/
Result appletUnlockForeground(void);
/**
* @brief Pops a storage from the general channel.
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet.
* @param[out] s Storage object.
*/
Result appletPopFromGeneralChannel(AppletStorage *s);
/**
* @brief Gets an Event which is signaled when a new storage is available with \ref appletPopFromGeneralChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped.
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
*/
@ -1582,15 +1770,22 @@ Result appletGetPopFromGeneralChannelEvent(Event *out_event);
/**
* @brief Gets a \ref AppletLockAccessor for HomeButtonWriter.
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet.
* @note Similar to using \ref appletGetWriterLockAccessorEx with inval=0.
* @param a LockAccessor object.
*/
Result appletGetHomeButtonWriterLockAccessor(AppletLockAccessor *a);
/**
* @brief IsSleepEnabled
* @note Only available with AppletType_SystemApplet on [11.0.0+], or on [15.0.0+] with AppletType_LibraryApplet.
* @param[out] out Output flag.
*/
Result appletIsSleepEnabled(bool *out);
/**
* @brief PopRequestLaunchApplicationForDebug
* @note Only available with AppletType_SystemApplet on [6.0.0+].
* @note Only available with AppletType_SystemApplet on [6.0.0+], or on [15.0.0+] with AppletType_LibraryApplet.
* @param[out] uids Output array of \ref AccountUid.
* @param[in] count Size of the uids array in entries, must be at least the size stored in state.
* @param[out] application_id Output ApplicationId.
@ -1600,18 +1795,25 @@ Result appletPopRequestLaunchApplicationForDebug(AccountUid *uids, s32 count, u6
/**
* @brief IsForceTerminateApplicationDisabledForDebug
* @note Only available with AppletType_SystemApplet on [9.0.0+].
* @note Only available with AppletType_SystemApplet on [9.0.0+], or on [15.0.0+] with AppletType_LibraryApplet.
* @param[out] out Output flag. 0 when DebugMode is not enabled, otherwise this is loaded from a system-setting.
*/
Result appletIsForceTerminateApplicationDisabledForDebug(bool *out);
/**
* @brief Launches DevMenu and the dev Overlay-applet. This will enter an infinite-sleep-loop on success.
* @note Only available with AppletType_SystemApplet on [8.0.0+].
* @note Only available with AppletType_SystemApplet on [8.0.0+], or on [15.0.0+] with AppletType_LibraryApplet.
* @note This verifies that DebugMode is enabled, then uses a ns cmd. That cmd then loads the system-settings for these two ProgramIds (which normally only exist on devunits), and verifies that these programs are installed + launches them.
*/
Result appletLaunchDevMenu(void);
/**
* @brief SetLastApplicationExitReason
* @note Only available with AppletType_SystemApplet on [11.0.0+], or on [15.0.0+] with AppletType_LibraryApplet.
* @param[in] reason Reason
*/
Result appletSetLastApplicationExitReason(s32 reason);
///@}
///@name IGlobalStateController
@ -1619,65 +1821,65 @@ Result appletLaunchDevMenu(void);
/**
* @brief Start the sequence for entering sleep-mode.
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
* @param[in] flag Flag, official sw uses hard-coded value = true.
*/
Result appletStartSleepSequence(bool flag);
/**
* @brief Start the system-shutdown sequence.
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
*/
Result appletStartShutdownSequence(void);
/**
* @brief Start the system-reboot sequence.
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
*/
Result appletStartRebootSequence(void);
/**
* @brief IsAutoPowerDownRequested. Uses an idle:sys cmd internally.
* @note Only available with AppletType_SystemApplet on [7.0.0+].
* @note Only available with AppletType_SystemApplet on [7.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
* @param[out] out Output flag.
*/
Result appletIsAutoPowerDownRequested(bool *out);
/**
* @brief LoadAndApplyIdlePolicySettings. Uses an idle:sys cmd internally.
* @note Only available with AppletType_SystemApplet.
* @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
*/
Result appletLoadAndApplyIdlePolicySettings(void);
/**
* @brief NotifyCecSettingsChanged. Uses an omm cmd internally.
* @note Only available with AppletType_SystemApplet on [2.0.0+].
* @note Only available with AppletType_SystemApplet on [2.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
*/
Result appletNotifyCecSettingsChanged(void);
/**
* @brief Sets the DefaultHomeButtonLongPressTime.
* @note Only available with AppletType_SystemApplet on [3.0.0+].
* @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
* @param[in] val Input value.
*/
Result appletSetDefaultHomeButtonLongPressTime(s64 val);
/**
* @brief UpdateDefaultDisplayResolution. Uses an omm cmd internally.
* @note Only available with AppletType_SystemApplet on [3.0.0+].
* @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
*/
Result appletUpdateDefaultDisplayResolution(void);
/**
* @brief ShouldSleepOnBoot. Uses an omm cmd internally.
* @note Only available with AppletType_SystemApplet on [3.0.0+].
* @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
* @param[out] out Output flag.
*/
Result appletShouldSleepOnBoot(bool *out);
/**
* @brief Gets an Event which is signaled for HdcpAuthenticationFailed.
* @note Only available with AppletType_SystemApplet on [4.0.0+].
* @note Only available with AppletType_SystemApplet on [4.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
*/
@ -1792,7 +1994,7 @@ Result appletApplicationAreAnyLibraryAppletsLeft(AppletApplication *a, bool *out
/**
* @brief Calls the same func as \ref appletHolderRequestExitOrTerminate with the output IAppletAccessor from the GetCurrentLibraryApplet cmd.
* @param a \ref AppletApplication
* @param[in] timeout Timeout in nanoseconds. U64_MAX for no timeout.
* @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout.
*/
Result appletApplicationRequestExitLibraryAppletOrTerminate(AppletApplication *a, u64 timeout);
@ -1918,6 +2120,20 @@ Result appletApplicationPushToFriendInvitationStorageChannel(AppletApplication *
*/
Result appletApplicationPushToNotificationStorageChannel(AppletApplication *a, const void* buffer, u64 size);
/**
* @brief RequestApplicationSoftReset
* @note Only available on [10.0.0+].
* @param a \ref AppletApplication
*/
Result appletApplicationRequestApplicationSoftReset(AppletApplication *a);
/**
* @brief RestartApplicationTimer
* @note Only available on [10.0.0+].
* @param a \ref AppletApplication
*/
Result appletApplicationRestartApplicationTimer(AppletApplication *a);
///@}
///@name ILibraryAppletSelfAccessor
@ -2123,6 +2339,21 @@ Result appletUnreserveResourceForMovieOperation(void);
*/
Result appletGetMainAppletAvailableUsers(AccountUid *uids, s32 count, bool *flag, s32 *total_out);
/**
* @brief SetApplicationMemoryReservation
* @note Only available with AppletType_LibraryApplet on [10.0.0+].
* @note An Application must be currently running.
* @param[in] val Input value.
*/
Result appletSetApplicationMemoryReservation(u64 val);
/**
* @brief ShouldSetGpuTimeSliceManually
* @note Only available with AppletType_LibraryApplet on [10.0.0+].
* @param[out] out Output flag.
*/
Result appletShouldSetGpuTimeSliceManually(bool *out);
///@}
///@name IOverlayFunctions: IFunctions for AppletType_OverlayApplet.
@ -2196,6 +2427,13 @@ Result appletStartRebootSequenceForOverlay(void);
*/
Result appletSetHealthWarningShowingState(bool flag);
/**
* @brief IsHealthWarningRequired
* @note Only available with AppletType_OverlayApplet on [10.0.0+].
* @param[out] out Output flag.
*/
Result appletIsHealthWarningRequired(bool *out);
/**
* @brief Enables HID input for the OverlayApplet, without disabling input for the foreground applet. Generally \ref appletBeginToWatchShortHomeButtonMessage / appletEndToWatchShortHomeButtonMessage should be used instead.
* @note Only available with AppletType_OverlayApplet on [5.0.0+].
@ -2276,6 +2514,27 @@ Result appletSetHomeButtonDoubleClickEnabled(bool flag);
*/
Result appletGetHomeButtonDoubleClickEnabled(bool *out);
/**
* @brief IsHomeButtonShortPressedBlocked
* @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [10.0.0+].
* @param[out] out Output flag.
*/
Result appletIsHomeButtonShortPressedBlocked(bool *out);
/**
* @brief IsVrModeCurtainRequired
* @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [11.0.0+].
* @param[out] out Output flag.
*/
Result appletIsVrModeCurtainRequired(bool *out);
/**
* @brief SetCpuBoostRequestPriority
* @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [11.0.0+].
* @param[in] priority Priority
*/
Result appletSetCpuBoostRequestPriority(s32 priority);
///@}
///@name IDebugFunctions
@ -2284,6 +2543,7 @@ Result appletGetHomeButtonDoubleClickEnabled(bool *out);
/**
* @brief Open an \ref AppletApplication for the currently running Application.
* @note Should not be used when no Application is running.
* @note Only available on [1.0.0-9.2.0].
* @param[out] a \ref AppletApplication
*/
Result appletOpenMainApplication(AppletApplication *a);
@ -2429,6 +2689,11 @@ Result appletSetHandlingHomeButtonShortPressedEnabled(bool flag);
*/
AppletInfo *appletGetAppletInfo(void);
/**
* @brief Gets the event associated with notification messages.
*/
Event *appletGetMessageEvent(void);
/**
* @brief Gets a notification message, see \ref AppletMessage.
*/
@ -2468,6 +2733,10 @@ AppletOperationMode appletGetOperationMode(void);
ApmPerformanceMode appletGetPerformanceMode(void);
AppletFocusState appletGetFocusState(void);
/**
* @brief Sets the current \ref AppletFocusHandlingMode.
* @note Should only be called with AppletType_Application.
*/
Result appletSetFocusHandlingMode(AppletFocusHandlingMode mode);
///@}

View File

@ -27,7 +27,7 @@ typedef struct {
/**
* @brief Close a \ref AsyncValue.
* @note When the object is initialized, this uses \ref asyncValueCancel then \ref asyncValueWait with timeout=U64_MAX.
* @note When the object is initialized, this uses \ref asyncValueCancel then \ref asyncValueWait with timeout=UINT64_MAX.
* @param a \ref AsyncValue
*/
void asyncValueClose(AsyncValue *a);
@ -35,7 +35,7 @@ void asyncValueClose(AsyncValue *a);
/**
* @brief Waits for the async operation to finish using the specified timeout.
* @param a \ref AsyncValue
* @param[in] timeout Timeout in nanoseconds. U64_MAX for no timeout.
* @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout.
*/
Result asyncValueWait(AsyncValue *a, u64 timeout);
@ -48,7 +48,7 @@ Result asyncValueGetSize(AsyncValue *a, u64 *size);
/**
* @brief Gets the value.
* @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=U64_MAX.
* @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX.
* @param a \ref AsyncValue
* @param[out] buffer Output buffer.
* @param[in] size Output buffer size.
@ -64,6 +64,7 @@ Result asyncValueCancel(AsyncValue *a);
/**
* @brief Gets the \ref ErrorContext.
* @note Only available on [4.0.0+].
* @param a \ref AsyncValue
* @param[out] context \ref ErrorContext
*/
@ -76,7 +77,7 @@ Result asyncValueGetErrorContext(AsyncValue *a, ErrorContext *context);
/**
* @brief Close a \ref AsyncResult.
* @note When the object is initialized, this uses \ref asyncResultCancel then \ref asyncResultWait with timeout=U64_MAX.
* @note When the object is initialized, this uses \ref asyncResultCancel then \ref asyncResultWait with timeout=UINT64_MAX.
* @param a \ref AsyncResult
*/
void asyncResultClose(AsyncResult *a);
@ -84,13 +85,13 @@ void asyncResultClose(AsyncResult *a);
/**
* @brief Waits for the async operation to finish using the specified timeout.
* @param a \ref AsyncResult
* @param[in] timeout Timeout in nanoseconds. U64_MAX for no timeout.
* @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout.
*/
Result asyncResultWait(AsyncResult *a, u64 timeout);
/**
* @brief Gets the Result.
* @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=U64_MAX.
* @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX.
* @param a \ref AsyncResult
*/
Result asyncResultGet(AsyncResult *a);
@ -104,6 +105,7 @@ Result asyncResultCancel(AsyncResult *a);
/**
* @brief Gets the \ref ErrorContext.
* @note Only available on [4.0.0+].
* @param a \ref AsyncResult
* @param[out] context \ref ErrorContext
*/

View File

@ -0,0 +1,70 @@
/**
* @file audctl.h
* @brief Audio Control IPC wrapper.
* @author plutoo
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../audio/audio.h"
#include "../sf/service.h"
#include "../kernel/event.h"
typedef enum {
AudioTarget_Invalid = 0,
AudioTarget_Speaker = 1,
AudioTarget_Headphone = 2,
AudioTarget_Tv = 3,
AudioTarget_UsbOutputDevice = 4,
AudioTarget_Bluetooth = 5,
} AudioTarget;
typedef enum {
AudioOutputMode_Invalid = 0,
AudioOutputMode_Pcm1ch = 1,
AudioOutputMode_Pcm2ch = 2,
AudioOutputMode_Pcm6ch = 3,
AudioOutputMode_PcmAuto = 4,
} AudioOutputMode;
typedef enum {
AudioForceMutePolicy_Disable = 0,
AudioForceMutePolicy_SpeakerMuteOnHeadphoneUnplugged = 1,
} AudioForceMutePolicy;
typedef enum {
AudioHeadphoneOutputLevelMode_Normal = 0,
AudioHeadphoneOutputLevelMode_HighPower = 1,
} AudioHeadphoneOutputLevelMode;
Result audctlInitialize(void);
void audctlExit(void);
Service* audctlGetServiceSession(void);
Result audctlGetTargetVolume(s32* volume_out, AudioTarget target);
Result audctlSetTargetVolume(AudioTarget target, s32 volume);
Result audctlGetTargetVolumeMin(s32* volume_out);
Result audctlGetTargetVolumeMax(s32* volume_out);
Result audctlIsTargetMute(bool* mute_out, AudioTarget target);
Result audctlSetTargetMute(AudioTarget target, bool mute);
Result audctlIsTargetConnected(bool* connected_out, AudioTarget target); ///< [1.0.0-17.0.1]
Result audctlSetDefaultTarget(AudioTarget target, u64 fade_in_ns, u64 fade_out_ns);
Result audctlGetDefaultTarget(AudioTarget* target_out);
Result audctlGetAudioOutputMode(AudioOutputMode* mode_out, AudioTarget target);
Result audctlSetAudioOutputMode(AudioTarget target, AudioOutputMode mode);
Result audctlSetForceMutePolicy(AudioForceMutePolicy policy); ///< [1.0.0-13.2.1]
Result audctlGetForceMutePolicy(AudioForceMutePolicy* policy_out); ///< [1.0.0-13.2.1]
Result audctlGetOutputModeSetting(AudioOutputMode* mode_out, AudioTarget target);
Result audctlSetOutputModeSetting(AudioTarget target, AudioOutputMode mode);
Result audctlSetOutputTarget(AudioTarget target);
Result audctlSetInputTargetForceEnabled(bool enable);
Result audctlSetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode mode); ///< [3.0.0+]
Result audctlGetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode* mode_out); ///< [3.0.0+]
Result audctlAcquireAudioVolumeUpdateEventForPlayReport(Event* event_out); ///< [3.0.0-13.2.1]
Result audctlAcquireAudioOutputDeviceUpdateEventForPlayReport(Event* event_out); ///< [3.0.0-13.2.1]
Result audctlGetAudioOutputTargetForPlayReport(AudioTarget* target_out); ///< [3.0.0+]
Result audctlNotifyHeadphoneVolumeWarningDisplayedEvent(void); ///< [3.0.0+]
Result audctlSetSystemOutputMasterVolume(float volume); ///< [4.0.0+]
Result audctlGetSystemOutputMasterVolume(float* volume_out); ///< [4.0.0+]
Result audctlGetActiveOutputTarget(AudioTarget* target);

View File

@ -22,4 +22,4 @@ Service* auddevGetServiceSession(void);
Result auddevListAudioDeviceName(AudioDeviceName *DeviceNames, s32 max_names, s32 *total_names);
Result auddevSetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float volume);
Result auddevGetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float *volume);
Result auddevGetActiveAudioDeviceName(AudioDeviceName *DeviceName);

View File

@ -63,7 +63,7 @@ Result audinCaptureBuffer(AudioInBuffer *source, AudioInBuffer **released);
* @brief Waits for audio capture to finish.
* @param released AudioInBuffer to receive the first captured buffer after being released.
* @param released_count Pointer to receive the number of captured buffers.
* @param timeout Timeout value, use U64_MAX to wait until all finished.
* @param timeout Timeout value, use UINT64_MAX to wait until all finished.
*/
Result audinWaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout);

View File

@ -51,6 +51,17 @@ Result audoutAppendAudioOutBuffer(AudioOutBuffer *Buffer);
Result audoutGetReleasedAudioOutBuffer(AudioOutBuffer **Buffer, u32 *ReleasedBuffersCount);
Result audoutContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer);
/// Only available with [4.0.0+].
Result audoutGetAudioOutBufferCount(u32 *count);
/// Only available with [4.0.0+].
Result audoutGetAudioOutPlayedSampleCount(u64 *count);
/// Only available with [4.0.0+].
Result audoutFlushAudioOutBuffers(bool *flushed);
/// Only available with [6.0.0+].
Result audoutSetAudioOutVolume(float volume);
/// Only available with [6.0.0+].
Result audoutGetAudioOutVolume(float *volume);
/**
* @brief Submits an audio sample data buffer for playing and waits for it to finish playing.
* @brief Uses \ref audoutAppendAudioOutBuffer and \ref audoutWaitPlayFinish internally.
@ -63,7 +74,7 @@ Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer **released);
* @brief Waits for audio playback to finish.
* @param released AudioOutBuffer to receive the first played buffer after being released.
* @param released_count Pointer to receive the number of played buffers.
* @param timeout Timeout value, use U64_MAX to wait until all finished.
* @param timeout Timeout value, use UINT64_MAX to wait until all finished.
*/
Result audoutWaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout);

View File

@ -0,0 +1,50 @@
/**
* @file audrec.h
* @brief Audio Recorder IPC wrapper.
* @author plutoo
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../audio/audio.h"
#include "../sf/service.h"
#include "../kernel/event.h"
typedef struct {
u64 released_ns;
u64 next_buffer_ptr;
u64 sample_buffer_ptr;
u64 sample_buffer_capacity;
u64 data_size;
u64 data_offset;
} FinalOutputRecorderBuffer;
typedef struct {
u32 sample_rate;
u32 channel_count;
} FinalOutputRecorderParameter;
typedef struct {
u32 sample_rate;
u32 channel_count;
u32 sample_format;
u32 state;
} FinalOutputRecorderParameterInternal;
typedef struct {
Service s;
} AudrecRecorder;
Result audrecInitialize(void);
void audrecExit(void);
Service* audrecGetServiceSession(void);
Result audrecOpenFinalOutputRecorder(AudrecRecorder* recorder_out, FinalOutputRecorderParameter* param_in, u64 aruid, FinalOutputRecorderParameterInternal* param_out);
Result audrecRecorderStart(AudrecRecorder* recorder);
Result audrecRecorderStop(AudrecRecorder* recorder);
Result audrecRecorderRegisterBufferEvent(AudrecRecorder* recorder, Event* out_event);
Result audrecRecorderAppendFinalOutputRecorderBuffer(AudrecRecorder* recorder, u64 buffer_client_ptr, FinalOutputRecorderBuffer* param);
Result audrecRecorderGetReleasedFinalOutputRecorderBuffers(AudrecRecorder* recorder, u64* out_buffers, u64* inout_count, u64* out_released);
void audrecRecorderClose(AudrecRecorder* recorder);

View File

@ -0,0 +1,45 @@
/**
* @file avm.h
* @brief AVM services IPC wrapper. Only available on [6.0.0+].
* @author Behemoth
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
typedef struct {
u64 application_id;
u32 version;
u32 required;
} AvmVersionListEntry;
typedef struct {
u64 application_id;
u32 version;
} AvmRequiredVersionEntry;
typedef struct {
Service s;
} AvmVersionListImporter;
Result avmInitialize(void);
void avmExit(void);
Service *avmGetServiceSession(void);
Result avmGetHighestAvailableVersion(u64 id_1, u64 id_2, u32 *version);
Result avmGetHighestRequiredVersion(u64 id_1, u64 id_2, u32 *version);
Result avmGetVersionListEntry(u64 application_id, AvmVersionListEntry *entry);
Result avmGetVersionListImporter(AvmVersionListImporter *out);
Result avmGetLaunchRequiredVersion(u64 application_id, u32 *version);
Result avmUpgradeLaunchRequiredVersion(u64 application_id, u32 version);
Result avmPushLaunchVersion(u64 application_id, u32 version);
Result avmListVersionList(AvmVersionListEntry *buffer, size_t count, u32 *out);
Result avmListRequiredVersion(AvmRequiredVersionEntry *buffer, size_t count, u32 *out);
void avmVersionListImporterClose(AvmVersionListImporter *srv);
Result avmVersionListImporterSetTimestamp(AvmVersionListImporter *srv, u64 timestamp);
Result avmVersionListImporterSetData(AvmVersionListImporter *srv, const AvmVersionListEntry *entries, u32 count);
Result avmVersionListImporterFlush(AvmVersionListImporter *srv);

View File

@ -24,4 +24,5 @@ Service* bpcGetServiceSession(void);
Result bpcShutdownSystem(void);
Result bpcRebootSystem(void);
Result bpcGetSleepButtonState(BpcSleepButtonState *out);
Result bpcGetSleepButtonState(BpcSleepButtonState *out); ///< [2.0.0-13.2.1]
Result bpcGetPowerButton(bool* out_is_pushed); ///< [6.0.0+]

View File

@ -18,8 +18,11 @@
typedef struct {
u32 version; ///< Observed 1 on [2.0.0+] LibAppletWeb, 2 on [3.0.0+].
void *tmem_buffer; ///< User-provided buffer to use as backing for transfer memory. If NULL, a buffer will be allocated automatically. Must be large enough and page-aligned.
size_t tmem_buffer_size; ///< Size of the user-provided transfer memory backing buffer. Must be large enough and page-aligned.
u32 tcp_tx_buf_size; ///< Size of the TCP transfer (send) buffer (initial or fixed).
u32 tcp_rx_buf_size; ///< Size of the TCP recieve buffer (initial or fixed).
u32 tcp_rx_buf_size; ///< Size of the TCP receive buffer (initial or fixed).
u32 tcp_tx_buf_max_size; ///< Maximum size of the TCP transfer (send) buffer. If it is 0, the size of the buffer is fixed to its initial value.
u32 tcp_rx_buf_max_size; ///< Maximum size of the TCP receive buffer. If it is 0, the size of the buffer is fixed to its initial value.
@ -75,5 +78,7 @@ ssize_t bsdRead(int fd, void *buf, size_t count);
int bsdClose(int fd);
/// Duplicate a socket (bsd:s).
int bsdDuplicateSocket(int sockfd);
int bsdRecvMMsg(int sockfd, void *buf, size_t size, unsigned int vlen, int flags, struct timespec *timeout);
int bsdSendMMsg(int sockfd, void *buf, size_t size, unsigned int vlen, int flags);
// TODO: Reverse-engineer GetResourceStatistics. Implement sendmmsg/recvmmsg (custom (un)serialization)
// TODO: Reverse-engineer GetResourceStatistics.

View File

@ -0,0 +1,132 @@
/**
* @file bt.h
* @brief Bluetooth user (bt) service IPC wrapper.
* @note See also btdev.
* @author yellows8, ndeadly
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/btdrv.h"
#include "../sf/service.h"
/// Initialize bt. Only available on [5.0.0+].
Result btInitialize(void);
/// Exit bt.
void btExit(void);
/// Gets the Service object for the actual bt service session.
Service* btGetServiceSession(void);
/**
* @brief LeClientReadCharacteristic
* @note This is essentially the same as \ref btdrvReadGattCharacteristic.
* @param[in] connection_handle ConnectionHandle
* @param[in] is_primary Is a primary service or not
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] auth_req \ref BtdrvGattAuthReqType
*/
Result btLeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req);
/**
* @brief LeClientReadDescriptor
* @note This is essentially the same as \ref btdrvReadGattDescriptor.
* @param[in] connection_handle ConnectionHandle
* @param[in] is_primary Is a primary service or not
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
* @param[in] auth_req \ref BtdrvGattAuthReqType
*/
Result btLeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req);
/**
* @brief LeClientWriteCharacteristic
* @note This is essentially the same as \ref btdrvWriteGattCharacteristic.
* @param[in] connection_handle ConnectionHandle
* @param[in] is_primary Is a primary service or not
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258.
* @param[in] auth_req \ref BtdrvGattAuthReqType
* @param[in] with_response Whether to use Write-With-Response write type or not
*/
Result btLeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response);
/**
* @brief LeClientWriteDescriptor
* @note This is essentially the same as \ref btdrvWriteGattDescriptor.
* @param[in] connection_handle ConnectionHandle
* @param[in] is_primary Is a primary service or not
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258.
* @param[in] auth_req \ref BtdrvGattAuthReqType
*/
Result btLeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req);
/**
* @brief LeClientRegisterNotification
* @note This is essentially the same as \ref btdrvRegisterGattNotification.
* @param[in] connection_handle ConnectionHandle
* @param[in] is_primary Is a primary service or not
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
*/
Result btLeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
/**
* @brief LeClientDeregisterNotification
* @note This is essentially the same as \ref btdrvUnregisterGattNotification.
* @param[in] connection_handle ConnectionHandle
* @param[in] is_primary Is a primary service or not
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
*/
Result btLeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
/**
* @brief SetLeResponse
* @param[in] server_if Server interface ID
* @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
* @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258.
*/
Result btSetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size);
/**
* @brief LeSendIndication
* @param[in] server_if Server interface ID
* @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
* @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, clamped to max size 0x258.
* @param[in] noconfirm Whether no confirmation is required (notification) or not (indication)
*/
Result btLeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm);
/**
* @brief GetLeEventInfo
* @note This is identical to \ref btdrvGetLeHidEventInfo except different state is used.
* @note The state used by this is reset after writing the data to output.
* @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo.
* @param[in] size Output buffer size.
* @param[out] type Output BtdrvBleEventType.
*/
Result btGetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type);
/**
* @brief RegisterBleEvent
* @note This is identical to \ref btdrvRegisterBleHidEvent except different state is used.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btRegisterBleEvent(Event* out_event);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,917 @@
/**
* @file btdrv_ids.h
* @brief Bluetooth SIG assigned number definitions (see https://www.bluetooth.com/specifications/assigned-numbers/).
* @author ndeadly
* @copyright libnx Authors
*/
#pragma once
/// Extract \ref BtdrvAppearanceCategoryType from \ref BtdrvAppearanceType.
#define APPEARANCE_CATEGORY(x) ((x & 0xFFC0) >> 6)
/// AdType
typedef enum {
BtdrvAdType_Flags = 0x01, ///< Flags
BtdrvAdType_ServiceClassUuid16ListIncomplete = 0x02, ///< Incomplete List of 16-bit Service Class UUIDs
BtdrvAdType_ServiceClassUuid16ListComplete = 0x03, ///< Complete List of 16-bit Service Class UUIDs
BtdrvAdType_ServiceClassUuid32ListIncomplete = 0x04, ///< Incomplete List of 32-bit Service Class UUIDs
BtdrvAdType_ServiceClassUuid32ListComplete = 0x05, ///< Complete List of 32-bit Service Class UUIDs
BtdrvAdType_ServiceClassUuid128ListIncomplete = 0x06, ///< Incomplete List of 128-bit Service Class UUIDs
BtdrvAdType_ServiceClassUuid128ListComplete = 0x07, ///< Complete List of 128-bit Service Class UUIDs
BtdrvAdType_ShortenedLocalName = 0x08, ///< Shortened Local Name
BtdrvAdType_CompleteLocalName = 0x09, ///< Complete Local Name
BtdrvAdType_TxPowerLevel = 0x0A, ///< Tx Power Level
BtdrvAdType_ClassOfDevice = 0x0D, ///< Class of Device
BtdrvAdType_SimplePairingHashC192 = 0x0E, ///< Simple Pairing Hash C-192
BtdrvAdType_SimplePairingRandomizerR192 = 0x0F, ///< Simple Pairing Randomizer R-192
BtdrvAdType_DeviceId = 0x10, ///< Device ID
BtdrvAdType_SecurityManagerTkValue = 0x10, ///< Security Manager TK Value
BtdrvAdType_SecurityManagerOutOfBandFlags = 0x11, ///< Security Manager Out of Band Flags
BtdrvAdType_PeripheralConnectionIntervalRange = 0x12, ///< Peripheral Connection Interval Range
BtdrvAdType_ServiceSolicitationUuid16List = 0x14, ///< List of 16-bit Service Solicitation UUIDs
BtdrvAdType_ServiceSolicitationUuid128List = 0x15, ///< List of 128-bit Service Solicitation UUIDs
BtdrvAdType_ServiceDataUuid16 = 0x16, ///< Service Data - 16-bit UUID
BtdrvAdType_PublicTargetAddress = 0x17, ///< Public Target Address
BtdrvAdType_RandomTargetAddress = 0x18, ///< Random Target Address
BtdrvAdType_Appearance = 0x19, ///< Appearance
BtdrvAdType_AdvertisingInterval = 0x1A, ///< Advertising Interval
BtdrvAdType_LeBluetoothDeviceAddress = 0x1B, ///< LE Bluetooth Device Address
BtdrvAdType_LeRole = 0x1C, ///< LE Role
BtdrvAdType_SimplePairingHashC256 = 0x1D, ///< Simple Pairing Hash C-256
BtdrvAdType_SimplePairingRandomizerR256 = 0x1E, ///< Simple Pairing Randomizer R-256
BtdrvAdType_ServiceSolicitationUuid32List = 0x1F, ///< List of 32-bit Service Solicitation UUIDs
BtdrvAdType_ServiceDataUuid32 = 0x20, ///< Service Data - 32-bit UUID
BtdrvAdType_ServiceDataUuid128 = 0x21, ///< Service Data - 128-bit UUID
BtdrvAdType_LeSecureConnectionsConfirmationValue = 0x22, ///< LE Secure Connections Confirmation Value
BtdrvAdType_LeSecureConnectionsRandomValue = 0x23, ///< LE Secure Connections Random Value
BtdrvAdType_Uri = 0x24, ///< URI
BtdrvAdType_IndoorPositioning = 0x25, ///< Indoor Positioning
BtdrvAdType_TransportDiscoveryData = 0x26, ///< Transport Discovery Data
BtdrvAdType_LeSupportedFeatures = 0x27, ///< LE Supported Features
BtdrvAdType_ChannelMapUpdateIndication = 0x28, ///< Channel Map Update Indication
BtdrvAdType_PbAdv = 0x29, ///< PB-ADV
BtdrvAdType_MeshMessage = 0x2A, ///< Mesh Message
BtdrvAdType_MeshBeacon = 0x2B, ///< Mesh Beacon
BtdrvAdType_Biginfo = 0x2C, ///< BIGInfo
BtdrvAdType_BroadcastCode = 0x2D, ///< Broadcast_Code
BtdrvAdType_ResolvableSetIdentifier = 0x2E, ///< Resolvable Set Identifier
BtdrvAdType_AdvertisingIntervalLong = 0x2F, ///< Advertising Interval - long
BtdrvAdType_BroadcastName = 0x30, ///< Broadcast_Name
BtdrvAdType_EncryptedAdvertisingData = 0x31, ///< Encrypted Advertising Data
BtdrvAdType_PeriodicAdvertisingResponseTimingInformation = 0x32, ///< Periodic Advertising Response Timing Information
BtdrvAdType_ElectronicShelfLabel = 0x34, ///< Electronic Shelf Label
BtdrvAdType_3DInformationData = 0x3D, ///< 3D Information Data
BtdrvAdType_ManufacturerSpecificData = 0xFF, ///< Manufacturer Specific Data
} BtdrvAdType;
/// AppearanceCategoryType
typedef enum {
BtdrvAppearanceCategoryType_Unknown = 0x000, ///< Unknown
BtdrvAppearanceCategoryType_Phone = 0x001, ///< Phone
BtdrvAppearanceCategoryType_Computer = 0x002, ///< Computer
BtdrvAppearanceCategoryType_Watch = 0x003, ///< Watch
BtdrvAppearanceCategoryType_Clock = 0x004, ///< Clock
BtdrvAppearanceCategoryType_Display = 0x005, ///< Display
BtdrvAppearanceCategoryType_RemoteControl = 0x006, ///< Remote Control
BtdrvAppearanceCategoryType_EyeGlasses = 0x007, ///< Eye-glasses
BtdrvAppearanceCategoryType_Tag = 0x008, ///< Tag
BtdrvAppearanceCategoryType_Keyring = 0x009, ///< Keyring
BtdrvAppearanceCategoryType_MediaPlayer = 0x00A, ///< Media Player
BtdrvAppearanceCategoryType_BarcodeScanner = 0x00B, ///< Barcode Scanner
BtdrvAppearanceCategoryType_Thermometer = 0x00C, ///< Thermometer
BtdrvAppearanceCategoryType_HeartRateSensor = 0x00D, ///< Heart Rate Sensor
BtdrvAppearanceCategoryType_BloodPressure = 0x00E, ///< Blood Pressure
BtdrvAppearanceCategoryType_HumanInterfaceDevice = 0x00F, ///< Human Interface Device
BtdrvAppearanceCategoryType_GlucoseMeter = 0x010, ///< Glucose Meter
BtdrvAppearanceCategoryType_RunningWalkingSensor = 0x011, ///< Running Walking Sensor
BtdrvAppearanceCategoryType_Cycling = 0x012, ///< Cycling
BtdrvAppearanceCategoryType_ControlDevice = 0x013, ///< Control Device
BtdrvAppearanceCategoryType_NetworkDevice = 0x014, ///< Network Device
BtdrvAppearanceCategoryType_Sensor = 0x015, ///< Sensor
BtdrvAppearanceCategoryType_LightFixtures = 0x016, ///< Light Fixtures
BtdrvAppearanceCategoryType_Fan = 0x017, ///< Fan
BtdrvAppearanceCategoryType_Hvac = 0x018, ///< HVAC
BtdrvAppearanceCategoryType_AirConditioning = 0x019, ///< Air Conditioning
BtdrvAppearanceCategoryType_Humidifier = 0x01A, ///< Humidifier
BtdrvAppearanceCategoryType_Heating = 0x01B, ///< Heating
BtdrvAppearanceCategoryType_AccessControl = 0x01C, ///< Access Control
BtdrvAppearanceCategoryType_MotorizedDevice = 0x01D, ///< Motorized Device
BtdrvAppearanceCategoryType_PowerDevice = 0x01E, ///< Power Device
BtdrvAppearanceCategoryType_LightSource = 0x01F, ///< Light Source
BtdrvAppearanceCategoryType_WindowCovering = 0x020, ///< Window Covering
BtdrvAppearanceCategoryType_AudioSink = 0x021, ///< Audio Sink
BtdrvAppearanceCategoryType_AudioSource = 0x022, ///< Audio Source
BtdrvAppearanceCategoryType_MotorizedVehicle = 0x023, ///< Motorized Vehicle
BtdrvAppearanceCategoryType_DomesticAppliance = 0x024, ///< Domestic Appliance
BtdrvAppearanceCategoryType_WearableAudioDevice = 0x025, ///< Wearable Audio Device
BtdrvAppearanceCategoryType_Aircraft = 0x026, ///< Aircraft
BtdrvAppearanceCategoryType_AvEquipment = 0x027, ///< AV Equipment
BtdrvAppearanceCategoryType_DisplayEquipment = 0x028, ///< Display Equipment
BtdrvAppearanceCategoryType_HearingAid = 0x029, ///< Hearing aid
BtdrvAppearanceCategoryType_Gaming = 0x02A, ///< Gaming
BtdrvAppearanceCategoryType_PulseOximeter = 0x031, ///< Pulse Oximeter
BtdrvAppearanceCategoryType_WeightScale = 0x032, ///< Weight Scale
BtdrvAppearanceCategoryType_PersonalMobilityDevice = 0x033, ///< Personal Mobility Device
BtdrvAppearanceCategoryType_ContinuousGlucoseMonitor = 0x034, ///< Continuous Glucose Monitor
BtdrvAppearanceCategoryType_InsulinPump = 0x035, ///< Insulin Pump
BtdrvAppearanceCategoryType_MedicationDelivery = 0x036, ///< Medication Delivery
BtdrvAppearanceCategoryType_Spirometer = 0x037, ///< Spirometer
BtdrvAppearanceCategoryType_OutdoorSportsActivity = 0x051, ///< Outdoor Sports Activity
} BtdrvAppearanceCategoryType;
/// AppearanceType
typedef enum {
BtdrvAppearanceType_DesktopWorkstation = 0x0081, ///< Desktop Workstation
BtdrvAppearanceType_ServerClassComputer = 0x0082, ///< Server-class Computer
BtdrvAppearanceType_Laptop = 0x0083, ///< Laptop
BtdrvAppearanceType_HandheldPcPdaClamshell = 0x0084, ///< Handheld PC/PDA (clamshell)
BtdrvAppearanceType_PalmSizePcPda = 0x0085, ///< Palm-size PC/PDA
BtdrvAppearanceType_WearableComputerWatchSize = 0x0086, ///< Wearable computer (watch size)
BtdrvAppearanceType_Tablet = 0x0087, ///< Tablet
BtdrvAppearanceType_DockingStation = 0x0088, ///< Docking Station
BtdrvAppearanceType_AllInOne = 0x0089, ///< All in One
BtdrvAppearanceType_BladeServer = 0x008A, ///< Blade Server
BtdrvAppearanceType_Convertible = 0x008B, ///< Convertible
BtdrvAppearanceType_Detachable = 0x008C, ///< Detachable
BtdrvAppearanceType_IotGateway = 0x008D, ///< IoT Gateway
BtdrvAppearanceType_MiniPc = 0x008E, ///< Mini PC
BtdrvAppearanceType_StickPc = 0x008F, ///< Stick PC
BtdrvAppearanceType_SportsWatch = 0x00C1, ///< Sports Watch
BtdrvAppearanceType_Smartwatch = 0x00C2, ///< Smartwatch
BtdrvAppearanceType_EarThermometer = 0x0301, ///< Ear Thermometer
BtdrvAppearanceType_HeartRateBelt = 0x0341, ///< Heart Rate Belt
BtdrvAppearanceType_ArmBloodPressure = 0x0381, ///< Arm Blood Pressure
BtdrvAppearanceType_WristBloodPressure = 0x0382, ///< Wrist Blood Pressure
BtdrvAppearanceType_Keyboard = 0x03C1, ///< Keyboard
BtdrvAppearanceType_Mouse = 0x03C2, ///< Mouse
BtdrvAppearanceType_Joystick = 0x03C3, ///< Joystick
BtdrvAppearanceType_Gamepad = 0x03C4, ///< Gamepad
BtdrvAppearanceType_DigitizerTablet = 0x03C5, ///< Digitizer Tablet
BtdrvAppearanceType_CardReader = 0x03C6, ///< Card Reader
BtdrvAppearanceType_DigitalPen = 0x03C7, ///< Digital Pen
BtdrvAppearanceType_BarcodeScanner = 0x03C8, ///< Barcode Scanner
BtdrvAppearanceType_Touchpad = 0x03C9, ///< Touchpad
BtdrvAppearanceType_PresentationRemote = 0x03CA, ///< Presentation Remote
BtdrvAppearanceType_InShoeRunningWalkingSensor = 0x0441, ///< In-Shoe Running Walking Sensor
BtdrvAppearanceType_OnShoeRunningWalkingSensor = 0x0442, ///< On-Shoe Running Walking Sensor
BtdrvAppearanceType_OnHipRunningWalkingSensor = 0x0443, ///< On-Hip Running Walking Sensor
BtdrvAppearanceType_CyclingComputer = 0x0481, ///< Cycling Computer
BtdrvAppearanceType_SpeedSensor = 0x0482, ///< Speed Sensor
BtdrvAppearanceType_CadenceSensor = 0x0483, ///< Cadence Sensor
BtdrvAppearanceType_PowerSensor = 0x0484, ///< Power Sensor
BtdrvAppearanceType_SpeedAndCadenceSensor = 0x0485, ///< Speed and Cadence Sensor
BtdrvAppearanceType_Switch = 0x04C1, ///< Switch
BtdrvAppearanceType_MultiSwitch = 0x04C2, ///< Multi-switch
BtdrvAppearanceType_Button = 0x04C3, ///< Button
BtdrvAppearanceType_Slider = 0x04C4, ///< Slider
BtdrvAppearanceType_RotarySwitch = 0x04C5, ///< Rotary Switch
BtdrvAppearanceType_TouchPanel = 0x04C6, ///< Touch Panel
BtdrvAppearanceType_SingleSwitch = 0x04C7, ///< Single Switch
BtdrvAppearanceType_DoubleSwitch = 0x04C8, ///< Double Switch
BtdrvAppearanceType_TripleSwitch = 0x04C9, ///< Triple Switch
BtdrvAppearanceType_BatterySwitch = 0x04CA, ///< Battery Switch
BtdrvAppearanceType_EnergyHarvestingSwitch = 0x04CB, ///< Energy Harvesting Switch
BtdrvAppearanceType_PushButton = 0x04CC, ///< Push Button
BtdrvAppearanceType_AccessPoint = 0x0501, ///< Access Point
BtdrvAppearanceType_MeshDevice = 0x0502, ///< Mesh Device
BtdrvAppearanceType_MeshNetworkProxy = 0x0503, ///< Mesh Network Proxy
BtdrvAppearanceType_MotionSensor = 0x0541, ///< Motion Sensor
BtdrvAppearanceType_AirQualitySensor = 0x0542, ///< Air quality Sensor
BtdrvAppearanceType_TemperatureSensor = 0x0543, ///< Temperature Sensor
BtdrvAppearanceType_HumiditySensor = 0x0544, ///< Humidity Sensor
BtdrvAppearanceType_LeakSensor = 0x0545, ///< Leak Sensor
BtdrvAppearanceType_SmokeSensor = 0x0546, ///< Smoke Sensor
BtdrvAppearanceType_OccupancySensor = 0x0547, ///< Occupancy Sensor
BtdrvAppearanceType_ContactSensor = 0x0548, ///< Contact Sensor
BtdrvAppearanceType_CarbonMonoxideSensor = 0x0549, ///< Carbon Monoxide Sensor
BtdrvAppearanceType_CarbonDioxideSensor = 0x054A, ///< Carbon Dioxide Sensor
BtdrvAppearanceType_AmbientLightSensor = 0x054B, ///< Ambient Light Sensor
BtdrvAppearanceType_EnergySensor = 0x054C, ///< Energy Sensor
BtdrvAppearanceType_ColorLightSensor = 0x054D, ///< Color Light Sensor
BtdrvAppearanceType_RainSensor = 0x054E, ///< Rain Sensor
BtdrvAppearanceType_FireSensor = 0x054F, ///< Fire Sensor
BtdrvAppearanceType_WindSensor = 0x0550, ///< Wind Sensor
BtdrvAppearanceType_ProximitySensor = 0x0551, ///< Proximity Sensor
BtdrvAppearanceType_MultiSensor = 0x0552, ///< Multi-Sensor
BtdrvAppearanceType_FlushMountedSensor = 0x0553, ///< Flush Mounted Sensor
BtdrvAppearanceType_CeilingMountedSensor = 0x0554, ///< Ceiling Mounted Sensor
BtdrvAppearanceType_WallMountedSensor = 0x0555, ///< Wall Mounted Sensor
BtdrvAppearanceType_Multisensor = 0x0556, ///< Multisensor
BtdrvAppearanceType_EnergyMeter = 0x0557, ///< Energy Meter
BtdrvAppearanceType_FlameDetector = 0x0558, ///< Flame Detector
BtdrvAppearanceType_VehicleTirePressureSensor = 0x0559, ///< Vehicle Tire Pressure Sensor
BtdrvAppearanceType_WallLight = 0x0581, ///< Wall Light
BtdrvAppearanceType_CeilingLight = 0x0582, ///< Ceiling Light
BtdrvAppearanceType_FloorLight = 0x0583, ///< Floor Light
BtdrvAppearanceType_CabinetLight = 0x0584, ///< Cabinet Light
BtdrvAppearanceType_DeskLight = 0x0585, ///< Desk Light
BtdrvAppearanceType_TrofferLight = 0x0586, ///< Troffer Light
BtdrvAppearanceType_PendantLight = 0x0587, ///< Pendant Light
BtdrvAppearanceType_InGroundLight = 0x0588, ///< In-ground Light
BtdrvAppearanceType_FloodLight = 0x0589, ///< Flood Light
BtdrvAppearanceType_UnderwaterLight = 0x058A, ///< Underwater Light
BtdrvAppearanceType_BollardWithLight = 0x058B, ///< Bollard with Light
BtdrvAppearanceType_PathwayLight = 0x058C, ///< Pathway Light
BtdrvAppearanceType_GardenLight = 0x058D, ///< Garden Light
BtdrvAppearanceType_PoleTopLight = 0x058E, ///< Pole-top Light
BtdrvAppearanceType_Spotlight = 0x058F, ///< Spotlight
BtdrvAppearanceType_LinearLight = 0x0590, ///< Linear Light
BtdrvAppearanceType_StreetLight = 0x0591, ///< Street Light
BtdrvAppearanceType_ShelvesLight = 0x0592, ///< Shelves Light
BtdrvAppearanceType_BayLight = 0x0593, ///< Bay Light
BtdrvAppearanceType_EmergencyExitLight = 0x0594, ///< Emergency Exit Light
BtdrvAppearanceType_LightController = 0x0595, ///< Light Controller
BtdrvAppearanceType_LightDriver = 0x0596, ///< Light Driver
BtdrvAppearanceType_Bulb = 0x0597, ///< Bulb
BtdrvAppearanceType_LowBayLight = 0x0598, ///< Low-bay Light
BtdrvAppearanceType_HighBayLight = 0x0599, ///< High-bay Light
BtdrvAppearanceType_CeilingFan = 0x05C1, ///< Ceiling Fan
BtdrvAppearanceType_AxialFan = 0x05C2, ///< Axial Fan
BtdrvAppearanceType_ExhaustFan = 0x05C3, ///< Exhaust Fan
BtdrvAppearanceType_PedestalFan = 0x05C4, ///< Pedestal Fan
BtdrvAppearanceType_DeskFan = 0x05C5, ///< Desk Fan
BtdrvAppearanceType_WallFan = 0x05C6, ///< Wall Fan
BtdrvAppearanceType_Thermostat = 0x0601, ///< Thermostat
BtdrvAppearanceType_Humidifier = 0x0602, ///< Humidifier
BtdrvAppearanceType_DeHumidifier = 0x0603, ///< De-humidifier
BtdrvAppearanceType_Heater = 0x0604, ///< Heater
BtdrvAppearanceType_HvacRadiator = 0x0605, ///< HVAC Radiator
BtdrvAppearanceType_HvacBoiler = 0x0606, ///< HVAC Boiler
BtdrvAppearanceType_HvacHeatPump = 0x0607, ///< HVAC Heat Pump
BtdrvAppearanceType_HvacInfraredHeater = 0x0608, ///< HVAC Infrared Heater
BtdrvAppearanceType_HvacRadiantPanelHeater = 0x0609, ///< HVAC Radiant Panel Heater
BtdrvAppearanceType_HvacFanHeater = 0x060A, ///< HVAC Fan Heater
BtdrvAppearanceType_HvacAirCurtain = 0x060B, ///< HVAC Air Curtain
BtdrvAppearanceType_HeatingRadiator = 0x06C1, ///< Heating Radiator
BtdrvAppearanceType_HeatingBoiler = 0x06C2, ///< Heating Boiler
BtdrvAppearanceType_HeatingHeatPump = 0x06C3, ///< Heating Heat Pump
BtdrvAppearanceType_HeatingInfraredHeater = 0x06C4, ///< Heating Infrared Heater
BtdrvAppearanceType_HeatingRadiantPanelHeater = 0x06C5, ///< Heating Radiant Panel Heater
BtdrvAppearanceType_HeatingFanHeater = 0x06C6, ///< Heating Fan Heater
BtdrvAppearanceType_HeatingAirCurtain = 0x06C7, ///< Heating Air Curtain
BtdrvAppearanceType_AccessDoor = 0x0701, ///< Access Door
BtdrvAppearanceType_GarageDoor = 0x0702, ///< Garage Door
BtdrvAppearanceType_EmergencyExitDoor = 0x0703, ///< Emergency Exit Door
BtdrvAppearanceType_AccessLock = 0x0704, ///< Access Lock
BtdrvAppearanceType_Elevator = 0x0705, ///< Elevator
BtdrvAppearanceType_Window = 0x0706, ///< Window
BtdrvAppearanceType_EntranceGate = 0x0707, ///< Entrance Gate
BtdrvAppearanceType_DoorLock = 0x0708, ///< Door Lock
BtdrvAppearanceType_Locker = 0x0709, ///< Locker
BtdrvAppearanceType_MotorizedGate = 0x0741, ///< Motorized Gate
BtdrvAppearanceType_Awning = 0x0742, ///< Awning
BtdrvAppearanceType_BlindsOrShades = 0x0743, ///< Blinds or Shades
BtdrvAppearanceType_Curtains = 0x0744, ///< Curtains
BtdrvAppearanceType_Screen = 0x0745, ///< Screen
BtdrvAppearanceType_PowerOutlet = 0x0781, ///< Power Outlet
BtdrvAppearanceType_PowerStrip = 0x0782, ///< Power Strip
BtdrvAppearanceType_Plug = 0x0783, ///< Plug
BtdrvAppearanceType_PowerSupply = 0x0784, ///< Power Supply
BtdrvAppearanceType_LedDriver = 0x0785, ///< LED Driver
BtdrvAppearanceType_FluorescentLampGear = 0x0786, ///< Fluorescent Lamp Gear
BtdrvAppearanceType_HidLampGear = 0x0787, ///< HID Lamp Gear
BtdrvAppearanceType_ChargeCase = 0x0788, ///< Charge Case
BtdrvAppearanceType_PowerBank = 0x0789, ///< Power Bank
BtdrvAppearanceType_IncandescentLightBulb = 0x07C1, ///< Incandescent Light Bulb
BtdrvAppearanceType_LedLamp = 0x07C2, ///< LED Lamp
BtdrvAppearanceType_HidLamp = 0x07C3, ///< HID Lamp
BtdrvAppearanceType_FluorescentLamp = 0x07C4, ///< Fluorescent Lamp
BtdrvAppearanceType_LedArray = 0x07C5, ///< LED Array
BtdrvAppearanceType_MultiColorLedArray = 0x07C6, ///< Multi-Color LED Array
BtdrvAppearanceType_LowVoltageHalogen = 0x07C7, ///< Low voltage halogen
BtdrvAppearanceType_OrganicLightEmittingDiodeOled = 0x07C8, ///< Organic light emitting diode (OLED)
BtdrvAppearanceType_WindowShades = 0x0801, ///< Window Shades
BtdrvAppearanceType_WindowBlinds = 0x0802, ///< Window Blinds
BtdrvAppearanceType_WindowAwning = 0x0803, ///< Window Awning
BtdrvAppearanceType_WindowCurtain = 0x0804, ///< Window Curtain
BtdrvAppearanceType_ExteriorShutter = 0x0805, ///< Exterior Shutter
BtdrvAppearanceType_ExteriorScreen = 0x0806, ///< Exterior Screen
BtdrvAppearanceType_StandaloneSpeaker = 0x0841, ///< Standalone Speaker
BtdrvAppearanceType_Soundbar = 0x0842, ///< Soundbar
BtdrvAppearanceType_BookshelfSpeaker = 0x0843, ///< Bookshelf Speaker
BtdrvAppearanceType_StandmountedSpeaker = 0x0844, ///< Standmounted Speaker
BtdrvAppearanceType_Speakerphone = 0x0845, ///< Speakerphone
BtdrvAppearanceType_Microphone = 0x0881, ///< Microphone
BtdrvAppearanceType_Alarm = 0x0882, ///< Alarm
BtdrvAppearanceType_Bell = 0x0883, ///< Bell
BtdrvAppearanceType_Horn = 0x0884, ///< Horn
BtdrvAppearanceType_BroadcastingDevice = 0x0885, ///< Broadcasting Device
BtdrvAppearanceType_ServiceDesk = 0x0886, ///< Service Desk
BtdrvAppearanceType_Kiosk = 0x0887, ///< Kiosk
BtdrvAppearanceType_BroadcastingRoom = 0x0888, ///< Broadcasting Room
BtdrvAppearanceType_Auditorium = 0x0889, ///< Auditorium
BtdrvAppearanceType_Car = 0x08C1, ///< Car
BtdrvAppearanceType_LargeGoodsVehicle = 0x08C2, ///< Large Goods Vehicle
BtdrvAppearanceType_2WheeledVehicle = 0x08C3, ///< 2-Wheeled Vehicle
BtdrvAppearanceType_Motorbike = 0x08C4, ///< Motorbike
BtdrvAppearanceType_Scooter = 0x08C5, ///< Scooter
BtdrvAppearanceType_Moped = 0x08C6, ///< Moped
BtdrvAppearanceType_3WheeledVehicle = 0x08C7, ///< 3-Wheeled Vehicle
BtdrvAppearanceType_LightVehicle = 0x08C8, ///< Light Vehicle
BtdrvAppearanceType_QuadBike = 0x08C9, ///< Quad Bike
BtdrvAppearanceType_Minibus = 0x08CA, ///< Minibus
BtdrvAppearanceType_Bus = 0x08CB, ///< Bus
BtdrvAppearanceType_Trolley = 0x08CC, ///< Trolley
BtdrvAppearanceType_AgriculturalVehicle = 0x08CD, ///< Agricultural Vehicle
BtdrvAppearanceType_CamperCaravan = 0x08CE, ///< Camper / Caravan
BtdrvAppearanceType_RecreationalVehicleMotorHome = 0x08CF, ///< Recreational Vehicle / Motor Home
BtdrvAppearanceType_Refrigerator = 0x0901, ///< Refrigerator
BtdrvAppearanceType_Freezer = 0x0902, ///< Freezer
BtdrvAppearanceType_Oven = 0x0903, ///< Oven
BtdrvAppearanceType_Microwave = 0x0904, ///< Microwave
BtdrvAppearanceType_Toaster = 0x0905, ///< Toaster
BtdrvAppearanceType_WashingMachine = 0x0906, ///< Washing Machine
BtdrvAppearanceType_Dryer = 0x0907, ///< Dryer
BtdrvAppearanceType_CoffeeMaker = 0x0908, ///< Coffee maker
BtdrvAppearanceType_ClothesIron = 0x0909, ///< Clothes iron
BtdrvAppearanceType_CurlingIron = 0x090A, ///< Curling iron
BtdrvAppearanceType_HairDryer = 0x090B, ///< Hair dryer
BtdrvAppearanceType_VacuumCleaner = 0x090C, ///< Vacuum cleaner
BtdrvAppearanceType_RoboticVacuumCleaner = 0x090D, ///< Robotic vacuum cleaner
BtdrvAppearanceType_RiceCooker = 0x090E, ///< Rice cooker
BtdrvAppearanceType_ClothesSteamer = 0x090F, ///< Clothes steamer
BtdrvAppearanceType_Earbud = 0x0941, ///< Earbud
BtdrvAppearanceType_Headset = 0x0942, ///< Headset
BtdrvAppearanceType_Headphones = 0x0943, ///< Headphones
BtdrvAppearanceType_NeckBand = 0x0944, ///< Neck Band
BtdrvAppearanceType_LightAircraft = 0x0981, ///< Light Aircraft
BtdrvAppearanceType_Microlight = 0x0982, ///< Microlight
BtdrvAppearanceType_Paraglider = 0x0983, ///< Paraglider
BtdrvAppearanceType_LargePassengerAircraft = 0x0984, ///< Large Passenger Aircraft
BtdrvAppearanceType_Amplifier = 0x09C1, ///< Amplifier
BtdrvAppearanceType_Receiver = 0x09C2, ///< Receiver
BtdrvAppearanceType_Radio = 0x09C3, ///< Radio
BtdrvAppearanceType_Tuner = 0x09C4, ///< Tuner
BtdrvAppearanceType_Turntable = 0x09C5, ///< Turntable
BtdrvAppearanceType_CdPlayer = 0x09C6, ///< CD Player
BtdrvAppearanceType_DvdPlayer = 0x09C7, ///< DVD Player
BtdrvAppearanceType_BlurayPlayer = 0x09C8, ///< Bluray Player
BtdrvAppearanceType_OpticalDiscPlayer = 0x09C9, ///< Optical Disc Player
BtdrvAppearanceType_SetTopBox = 0x09CA, ///< Set-Top Box
BtdrvAppearanceType_Television = 0x0A01, ///< Television
BtdrvAppearanceType_Monitor = 0x0A02, ///< Monitor
BtdrvAppearanceType_Projector = 0x0A03, ///< Projector
BtdrvAppearanceType_InEarHearingAid = 0x0A41, ///< In-ear hearing aid
BtdrvAppearanceType_BehindEarHearingAid = 0x0A42, ///< Behind-ear hearing aid
BtdrvAppearanceType_CochlearImplant = 0x0A43, ///< Cochlear Implant
BtdrvAppearanceType_HomeVideoGameConsole = 0x0A81, ///< Home Video Game Console
BtdrvAppearanceType_PortableHandheldConsole = 0x0A82, ///< Portable handheld console
BtdrvAppearanceType_FingertipPulseOximeter = 0x0C41, ///< Fingertip Pulse Oximeter
BtdrvAppearanceType_WristWornPulseOximeter = 0x0C42, ///< Wrist Worn Pulse Oximeter
BtdrvAppearanceType_PoweredWheelchair = 0x0CC1, ///< Powered Wheelchair
BtdrvAppearanceType_MobilityScooter = 0x0CC2, ///< Mobility Scooter
BtdrvAppearanceType_InsulinPumpDurablePump = 0x0D41, ///< Insulin Pump, durable pump
BtdrvAppearanceType_InsulinPumpPatchPump = 0x0D44, ///< Insulin Pump, patch pump
BtdrvAppearanceType_InsulinPen = 0x0D48, ///< Insulin Pen
BtdrvAppearanceType_HandheldSpirometer = 0x0DC1, ///< Handheld Spirometer
BtdrvAppearanceType_LocationDisplay = 0x1441, ///< Location Display
BtdrvAppearanceType_LocationAndNavigationDisplay = 0x1442, ///< Location and Navigation Display
BtdrvAppearanceType_LocationPod = 0x1443, ///< Location Pod
BtdrvAppearanceType_LocationAndNavigationPod = 0x1444, ///< Location and Navigation Pod
} BtdrvAppearanceType;
/// GattServiceUuidType
typedef enum {
BtdrvGattServiceUuidType_GenericAccess = 0x1800, ///< Generic Access
BtdrvGattServiceUuidType_GenericAttribute = 0x1801, ///< Generic Attribute
BtdrvGattServiceUuidType_ImmediateAlert = 0x1802, ///< Immediate Alert
BtdrvGattServiceUuidType_LinkLoss = 0x1803, ///< Link Loss
BtdrvGattServiceUuidType_TxPower = 0x1804, ///< Tx Power
BtdrvGattServiceUuidType_CurrentTime = 0x1805, ///< Current Time
BtdrvGattServiceUuidType_ReferenceTimeUpdate = 0x1806, ///< Reference Time Update
BtdrvGattServiceUuidType_NextDstChange = 0x1807, ///< Next DST Change
BtdrvGattServiceUuidType_Glucose = 0x1808, ///< Glucose
BtdrvGattServiceUuidType_HealthThermometer = 0x1809, ///< Health Thermometer
BtdrvGattServiceUuidType_DeviceInformation = 0x180A, ///< Device Information
BtdrvGattServiceUuidType_HeartRate = 0x180D, ///< Heart Rate
BtdrvGattServiceUuidType_PhoneAlertStatus = 0x180E, ///< Phone Alert Status
BtdrvGattServiceUuidType_Battery = 0x180F, ///< Battery
BtdrvGattServiceUuidType_BloodPressure = 0x1810, ///< Blood Pressure
BtdrvGattServiceUuidType_AlertNotification = 0x1811, ///< Alert Notification
BtdrvGattServiceUuidType_HumanInterfaceDevice = 0x1812, ///< Human Interface Device
BtdrvGattServiceUuidType_ScanParameters = 0x1813, ///< Scan Parameters
BtdrvGattServiceUuidType_RunningSpeedAndCadence = 0x1814, ///< Running Speed and Cadence
BtdrvGattServiceUuidType_AutomationIo = 0x1815, ///< Automation IO
BtdrvGattServiceUuidType_CyclingSpeedAndCadence = 0x1816, ///< Cycling Speed and Cadence
BtdrvGattServiceUuidType_CyclingPower = 0x1818, ///< Cycling Power
BtdrvGattServiceUuidType_LocationAndNavigation = 0x1819, ///< Location and Navigation
BtdrvGattServiceUuidType_EnvironmentalSensing = 0x181A, ///< Environmental Sensing
BtdrvGattServiceUuidType_BodyComposition = 0x181B, ///< Body Composition
BtdrvGattServiceUuidType_UserData = 0x181C, ///< User Data
BtdrvGattServiceUuidType_WeightScale = 0x181D, ///< Weight Scale
BtdrvGattServiceUuidType_BondManagement = 0x181E, ///< Bond Management
BtdrvGattServiceUuidType_ContinuousGlucoseMonitoring = 0x181F, ///< Continuous Glucose Monitoring
BtdrvGattServiceUuidType_InternetProtocolSupport = 0x1820, ///< Internet Protocol Support
BtdrvGattServiceUuidType_IndoorPositioning = 0x1821, ///< Indoor Positioning
BtdrvGattServiceUuidType_PulseOximeter = 0x1822, ///< Pulse Oximeter
BtdrvGattServiceUuidType_HttpProxy = 0x1823, ///< HTTP Proxy
BtdrvGattServiceUuidType_TransportDiscovery = 0x1824, ///< Transport Discovery
BtdrvGattServiceUuidType_ObjectTransfer = 0x1825, ///< Object Transfer
BtdrvGattServiceUuidType_FitnessMachine = 0x1826, ///< Fitness Machine
BtdrvGattServiceUuidType_MeshProvisioning = 0x1827, ///< Mesh Provisioning
BtdrvGattServiceUuidType_MeshProxy = 0x1828, ///< Mesh Proxy
BtdrvGattServiceUuidType_ReconnectionConfiguration = 0x1829, ///< Reconnection Configuration
BtdrvGattServiceUuidType_InsulinDelivery = 0x183A, ///< Insulin Delivery
BtdrvGattServiceUuidType_BinarySensor = 0x183B, ///< Binary Sensor
BtdrvGattServiceUuidType_EmergencyConfiguration = 0x183C, ///< Emergency Configuration
BtdrvGattServiceUuidType_AuthorizationControl = 0x183D, ///< Authorization Control
BtdrvGattServiceUuidType_PhysicalActivityMonitor = 0x183E, ///< Physical Activity Monitor
BtdrvGattServiceUuidType_ElapsedTime = 0x183F, ///< Elapsed Time
BtdrvGattServiceUuidType_GenericHealthSensor = 0x1840, ///< Generic Health Sensor
BtdrvGattServiceUuidType_AudioInputControl = 0x1843, ///< Audio Input Control
BtdrvGattServiceUuidType_VolumeControl = 0x1844, ///< Volume Control
BtdrvGattServiceUuidType_VolumeOffsetControl = 0x1845, ///< Volume Offset Control
BtdrvGattServiceUuidType_CoordinatedSetIdentification = 0x1846, ///< Coordinated Set Identification
BtdrvGattServiceUuidType_DeviceTime = 0x1847, ///< Device Time
BtdrvGattServiceUuidType_MediaControl = 0x1848, ///< Media Control
BtdrvGattServiceUuidType_GenericMediaControl = 0x1849, ///< Generic Media Control
BtdrvGattServiceUuidType_ConstantToneExtension = 0x184A, ///< Constant Tone Extension
BtdrvGattServiceUuidType_TelephoneBearer = 0x184B, ///< Telephone Bearer
BtdrvGattServiceUuidType_GenericTelephoneBearer = 0x184C, ///< Generic Telephone Bearer
BtdrvGattServiceUuidType_MicrophoneControl = 0x184D, ///< Microphone Control
BtdrvGattServiceUuidType_AudioStreamControl = 0x184E, ///< Audio Stream Control
BtdrvGattServiceUuidType_BroadcastAudioScan = 0x184F, ///< Broadcast Audio Scan
BtdrvGattServiceUuidType_PublishedAudioCapabilities = 0x1850, ///< Published Audio Capabilities
BtdrvGattServiceUuidType_BasicAudioAnnouncement = 0x1851, ///< Basic Audio Announcement
BtdrvGattServiceUuidType_BroadcastAudioAnnouncement = 0x1852, ///< Broadcast Audio Announcement
BtdrvGattServiceUuidType_CommonAudio = 0x1853, ///< Common Audio
BtdrvGattServiceUuidType_HearingAccess = 0x1854, ///< Hearing Access
BtdrvGattServiceUuidType_TelephonyAndMediaAudio = 0x1855, ///< Telephony and Media Audio
BtdrvGattServiceUuidType_PublicBroadcastAnnouncement = 0x1856, ///< Public Broadcast Announcement
BtdrvGattServiceUuidType_ElectronicShelfLabel = 0x1857, ///< Electronic Shelf Label
} BtdrvGattServiceUuidType;
/// GattCharacteristicUuidType
typedef enum {
BtdrvGattCharacteristicUuidType_DeviceName = 0x2A00, ///< Device Name
BtdrvGattCharacteristicUuidType_Appearance = 0x2A01, ///< Appearance
BtdrvGattCharacteristicUuidType_PeripheralPrivacyFlag = 0x2A02, ///< Peripheral Privacy Flag
BtdrvGattCharacteristicUuidType_ReconnectionAddress = 0x2A03, ///< Reconnection Address
BtdrvGattCharacteristicUuidType_PeripheralPreferredConnectionParameters = 0x2A04, ///< Peripheral Preferred Connection Parameters
BtdrvGattCharacteristicUuidType_ServiceChanged = 0x2A05, ///< Service Changed
BtdrvGattCharacteristicUuidType_AlertLevel = 0x2A06, ///< Alert Level
BtdrvGattCharacteristicUuidType_TxPowerLevel = 0x2A07, ///< Tx Power Level
BtdrvGattCharacteristicUuidType_DateTime = 0x2A08, ///< Date Time
BtdrvGattCharacteristicUuidType_DayOfWeek = 0x2A09, ///< Day of Week
BtdrvGattCharacteristicUuidType_DayDateTime = 0x2A0A, ///< Day Date Time
BtdrvGattCharacteristicUuidType_ExactTime256 = 0x2A0C, ///< Exact Time 256
BtdrvGattCharacteristicUuidType_DstOffset = 0x2A0D, ///< DST Offset
BtdrvGattCharacteristicUuidType_TimeZone = 0x2A0E, ///< Time Zone
BtdrvGattCharacteristicUuidType_LocalTimeInformation = 0x2A0F, ///< Local Time Information
BtdrvGattCharacteristicUuidType_TimeWithDst = 0x2A11, ///< Time with DST
BtdrvGattCharacteristicUuidType_TimeAccuracy = 0x2A12, ///< Time Accuracy
BtdrvGattCharacteristicUuidType_TimeSource = 0x2A13, ///< Time Source
BtdrvGattCharacteristicUuidType_ReferenceTimeInformation = 0x2A14, ///< Reference Time Information
BtdrvGattCharacteristicUuidType_TimeUpdateControlPoint = 0x2A16, ///< Time Update Control Point
BtdrvGattCharacteristicUuidType_TimeUpdateState = 0x2A17, ///< Time Update State
BtdrvGattCharacteristicUuidType_GlucoseMeasurement = 0x2A18, ///< Glucose Measurement
BtdrvGattCharacteristicUuidType_BatteryLevel = 0x2A19, ///< Battery Level
BtdrvGattCharacteristicUuidType_TemperatureMeasurement = 0x2A1C, ///< Temperature Measurement
BtdrvGattCharacteristicUuidType_TemperatureType = 0x2A1D, ///< Temperature Type
BtdrvGattCharacteristicUuidType_IntermediateTemperature = 0x2A1E, ///< Intermediate Temperature
BtdrvGattCharacteristicUuidType_MeasurementInterval = 0x2A21, ///< Measurement Interval
BtdrvGattCharacteristicUuidType_BootKeyboardInputReport = 0x2A22, ///< Boot Keyboard Input Report
BtdrvGattCharacteristicUuidType_SystemId = 0x2A23, ///< System ID
BtdrvGattCharacteristicUuidType_ModelNumberString = 0x2A24, ///< Model Number String
BtdrvGattCharacteristicUuidType_SerialNumberString = 0x2A25, ///< Serial Number String
BtdrvGattCharacteristicUuidType_FirmwareRevisionString = 0x2A26, ///< Firmware Revision String
BtdrvGattCharacteristicUuidType_HardwareRevisionString = 0x2A27, ///< Hardware Revision String
BtdrvGattCharacteristicUuidType_SoftwareRevisionString = 0x2A28, ///< Software Revision String
BtdrvGattCharacteristicUuidType_ManufacturerNameString = 0x2A29, ///< Manufacturer Name String
BtdrvGattCharacteristicUuidType_IeeeRegulatoryCertificationDataList = 0x2A2A, ///< IEEE 11073-20601 Regulatory Certification Data List
BtdrvGattCharacteristicUuidType_CurrentTime = 0x2A2B, ///< Current Time
BtdrvGattCharacteristicUuidType_MagneticDeclination = 0x2A2C, ///< Magnetic Declination
BtdrvGattCharacteristicUuidType_ScanRefresh = 0x2A31, ///< Scan Refresh
BtdrvGattCharacteristicUuidType_BootKeyboardOutputReport = 0x2A32, ///< Boot Keyboard Output Report
BtdrvGattCharacteristicUuidType_BootMouseInputReport = 0x2A33, ///< Boot Mouse Input Report
BtdrvGattCharacteristicUuidType_GlucoseMeasurementContext = 0x2A34, ///< Glucose Measurement Context
BtdrvGattCharacteristicUuidType_BloodPressureMeasurement = 0x2A35, ///< Blood Pressure Measurement
BtdrvGattCharacteristicUuidType_IntermediateCuffPressure = 0x2A36, ///< Intermediate Cuff Pressure
BtdrvGattCharacteristicUuidType_HeartRateMeasurement = 0x2A37, ///< Heart Rate Measurement
BtdrvGattCharacteristicUuidType_BodySensorLocation = 0x2A38, ///< Body Sensor Location
BtdrvGattCharacteristicUuidType_HeartRateControlPoint = 0x2A39, ///< Heart Rate Control Point
BtdrvGattCharacteristicUuidType_AlertStatus = 0x2A3F, ///< Alert Status
BtdrvGattCharacteristicUuidType_RingerControlPoint = 0x2A40, ///< Ringer Control Point
BtdrvGattCharacteristicUuidType_RingerSetting = 0x2A41, ///< Ringer Setting
BtdrvGattCharacteristicUuidType_AlertCategoryIdBitMask = 0x2A42, ///< Alert Category ID Bit Mask
BtdrvGattCharacteristicUuidType_AlertCategoryId = 0x2A43, ///< Alert Category ID
BtdrvGattCharacteristicUuidType_AlertNotificationControlPoint = 0x2A44, ///< Alert Notification Control Point
BtdrvGattCharacteristicUuidType_UnreadAlertStatus = 0x2A45, ///< Unread Alert Status
BtdrvGattCharacteristicUuidType_NewAlert = 0x2A46, ///< New Alert
BtdrvGattCharacteristicUuidType_SupportedNewAlertCategory = 0x2A47, ///< Supported New Alert Category
BtdrvGattCharacteristicUuidType_SupportedUnreadAlertCategory = 0x2A48, ///< Supported Unread Alert Category
BtdrvGattCharacteristicUuidType_BloodPressureFeature = 0x2A49, ///< Blood Pressure Feature
BtdrvGattCharacteristicUuidType_HidInformation = 0x2A4A, ///< HID Information
BtdrvGattCharacteristicUuidType_ReportMap = 0x2A4B, ///< Report Map
BtdrvGattCharacteristicUuidType_HidControlPoint = 0x2A4C, ///< HID Control Point
BtdrvGattCharacteristicUuidType_Report = 0x2A4D, ///< Report
BtdrvGattCharacteristicUuidType_ProtocolMode = 0x2A4E, ///< Protocol Mode
BtdrvGattCharacteristicUuidType_ScanIntervalWindow = 0x2A4F, ///< Scan Interval Window
BtdrvGattCharacteristicUuidType_PnpId = 0x2A50, ///< PnP ID
BtdrvGattCharacteristicUuidType_GlucoseFeature = 0x2A51, ///< Glucose Feature
BtdrvGattCharacteristicUuidType_RecordAccessControlPoint = 0x2A52, ///< Record Access Control Point
BtdrvGattCharacteristicUuidType_RscMeasurement = 0x2A53, ///< RSC Measurement
BtdrvGattCharacteristicUuidType_RscFeature = 0x2A54, ///< RSC Feature
BtdrvGattCharacteristicUuidType_ScControlPoint = 0x2A55, ///< SC Control Point
BtdrvGattCharacteristicUuidType_Aggregate = 0x2A5A, ///< Aggregate
BtdrvGattCharacteristicUuidType_CscMeasurement = 0x2A5B, ///< CSC Measurement
BtdrvGattCharacteristicUuidType_CscFeature = 0x2A5C, ///< CSC Feature
BtdrvGattCharacteristicUuidType_SensorLocation = 0x2A5D, ///< Sensor Location
BtdrvGattCharacteristicUuidType_PlxSpotCheckMeasurement = 0x2A5E, ///< PLX Spot-Check Measurement
BtdrvGattCharacteristicUuidType_PlxContinuousMeasurement = 0x2A5F, ///< PLX Continuous Measurement
BtdrvGattCharacteristicUuidType_PlxFeatures = 0x2A60, ///< PLX Features
BtdrvGattCharacteristicUuidType_CyclingPowerMeasurement = 0x2A63, ///< Cycling Power Measurement
BtdrvGattCharacteristicUuidType_CyclingPowerVector = 0x2A64, ///< Cycling Power Vector
BtdrvGattCharacteristicUuidType_CyclingPowerFeature = 0x2A65, ///< Cycling Power Feature
BtdrvGattCharacteristicUuidType_CyclingPowerControlPoint = 0x2A66, ///< Cycling Power Control Point
BtdrvGattCharacteristicUuidType_LocationAndSpeed = 0x2A67, ///< Location and Speed
BtdrvGattCharacteristicUuidType_Navigation = 0x2A68, ///< Navigation
BtdrvGattCharacteristicUuidType_PositionQuality = 0x2A69, ///< Position Quality
BtdrvGattCharacteristicUuidType_LnFeature = 0x2A6A, ///< LN Feature
BtdrvGattCharacteristicUuidType_LnControlPoint = 0x2A6B, ///< LN Control Point
BtdrvGattCharacteristicUuidType_Elevation = 0x2A6C, ///< Elevation
BtdrvGattCharacteristicUuidType_Pressure = 0x2A6D, ///< Pressure
BtdrvGattCharacteristicUuidType_Temperature = 0x2A6E, ///< Temperature
BtdrvGattCharacteristicUuidType_Humidity = 0x2A6F, ///< Humidity
BtdrvGattCharacteristicUuidType_TrueWindSpeed = 0x2A70, ///< True Wind Speed
BtdrvGattCharacteristicUuidType_TrueWindDirection = 0x2A71, ///< True Wind Direction
BtdrvGattCharacteristicUuidType_ApparentWindSpeed = 0x2A72, ///< Apparent Wind Speed
BtdrvGattCharacteristicUuidType_ApparentWindDirection = 0x2A73, ///< Apparent Wind Direction
BtdrvGattCharacteristicUuidType_GustFactor = 0x2A74, ///< Gust Factor
BtdrvGattCharacteristicUuidType_PollenConcentration = 0x2A75, ///< Pollen Concentration
BtdrvGattCharacteristicUuidType_UvIndex = 0x2A76, ///< UV Index
BtdrvGattCharacteristicUuidType_Irradiance = 0x2A77, ///< Irradiance
BtdrvGattCharacteristicUuidType_Rainfall = 0x2A78, ///< Rainfall
BtdrvGattCharacteristicUuidType_WindChill = 0x2A79, ///< Wind Chill
BtdrvGattCharacteristicUuidType_HeatIndex = 0x2A7A, ///< Heat Index
BtdrvGattCharacteristicUuidType_DewPoint = 0x2A7B, ///< Dew Point
BtdrvGattCharacteristicUuidType_DescriptorValueChanged = 0x2A7D, ///< Descriptor Value Changed
BtdrvGattCharacteristicUuidType_AerobicHeartRateLowerLimit = 0x2A7E, ///< Aerobic Heart Rate Lower Limit
BtdrvGattCharacteristicUuidType_AerobicThreshold = 0x2A7F, ///< Aerobic Threshold
BtdrvGattCharacteristicUuidType_Age = 0x2A80, ///< Age
BtdrvGattCharacteristicUuidType_AnaerobicHeartRateLowerLimit = 0x2A81, ///< Anaerobic Heart Rate Lower Limit
BtdrvGattCharacteristicUuidType_AnaerobicHeartRateUpperLimit = 0x2A82, ///< Anaerobic Heart Rate Upper Limit
BtdrvGattCharacteristicUuidType_AnaerobicThreshold = 0x2A83, ///< Anaerobic Threshold
BtdrvGattCharacteristicUuidType_AerobicHeartRateUpperLimit = 0x2A84, ///< Aerobic Heart Rate Upper Limit
BtdrvGattCharacteristicUuidType_DateOfBirth = 0x2A85, ///< Date of Birth
BtdrvGattCharacteristicUuidType_DateOfThresholdAssessment = 0x2A86, ///< Date of Threshold Assessment
BtdrvGattCharacteristicUuidType_EmailAddress = 0x2A87, ///< Email Address
BtdrvGattCharacteristicUuidType_FatBurnHeartRateLowerLimit = 0x2A88, ///< Fat Burn Heart Rate Lower Limit
BtdrvGattCharacteristicUuidType_FatBurnHeartRateUpperLimit = 0x2A89, ///< Fat Burn Heart Rate Upper Limit
BtdrvGattCharacteristicUuidType_FirstName = 0x2A8A, ///< First Name
BtdrvGattCharacteristicUuidType_FiveZoneHeartRateLimits = 0x2A8B, ///< Five Zone Heart Rate Limits
BtdrvGattCharacteristicUuidType_Gender = 0x2A8C, ///< Gender
BtdrvGattCharacteristicUuidType_HeartRateMax = 0x2A8D, ///< Heart Rate Max
BtdrvGattCharacteristicUuidType_Height = 0x2A8E, ///< Height
BtdrvGattCharacteristicUuidType_HipCircumference = 0x2A8F, ///< Hip Circumference
BtdrvGattCharacteristicUuidType_LastName = 0x2A90, ///< Last Name
BtdrvGattCharacteristicUuidType_MaximumRecommendedHeartRate = 0x2A91, ///< Maximum Recommended Heart Rate
BtdrvGattCharacteristicUuidType_RestingHeartRate = 0x2A92, ///< Resting Heart Rate
BtdrvGattCharacteristicUuidType_SportTypeForAerobicAndAnaerobicThresholds = 0x2A93, ///< Sport Type for Aerobic and Anaerobic Thresholds
BtdrvGattCharacteristicUuidType_ThreeZoneHeartRateLimits = 0x2A94, ///< Three Zone Heart Rate Limits
BtdrvGattCharacteristicUuidType_TwoZoneHeartRateLimits = 0x2A95, ///< Two Zone Heart Rate Limits
BtdrvGattCharacteristicUuidType_Vo2Max = 0x2A96, ///< VO2 Max
BtdrvGattCharacteristicUuidType_WaistCircumference = 0x2A97, ///< Waist Circumference
BtdrvGattCharacteristicUuidType_Weight = 0x2A98, ///< Weight
BtdrvGattCharacteristicUuidType_DatabaseChangeIncrement = 0x2A99, ///< Database Change Increment
BtdrvGattCharacteristicUuidType_UserIndex = 0x2A9A, ///< User Index
BtdrvGattCharacteristicUuidType_BodyCompositionFeature = 0x2A9B, ///< Body Composition Feature
BtdrvGattCharacteristicUuidType_BodyCompositionMeasurement = 0x2A9C, ///< Body Composition Measurement
BtdrvGattCharacteristicUuidType_WeightMeasurement = 0x2A9D, ///< Weight Measurement
BtdrvGattCharacteristicUuidType_WeightScaleFeature = 0x2A9E, ///< Weight Scale Feature
BtdrvGattCharacteristicUuidType_UserControlPoint = 0x2A9F, ///< User Control Point
BtdrvGattCharacteristicUuidType_MagneticFluxDensity2D = 0x2AA0, ///< Magnetic Flux Density - 2D
BtdrvGattCharacteristicUuidType_MagneticFluxDensity3D = 0x2AA1, ///< Magnetic Flux Density - 3D
BtdrvGattCharacteristicUuidType_Language = 0x2AA2, ///< Language
BtdrvGattCharacteristicUuidType_BarometricPressureTrend = 0x2AA3, ///< Barometric Pressure Trend
BtdrvGattCharacteristicUuidType_BondManagementControlPoint = 0x2AA4, ///< Bond Management Control Point
BtdrvGattCharacteristicUuidType_BondManagementFeature = 0x2AA5, ///< Bond Management Feature
BtdrvGattCharacteristicUuidType_CentralAddressResolution = 0x2AA6, ///< Central Address Resolution
BtdrvGattCharacteristicUuidType_CgmMeasurement = 0x2AA7, ///< CGM Measurement
BtdrvGattCharacteristicUuidType_CgmFeature = 0x2AA8, ///< CGM Feature
BtdrvGattCharacteristicUuidType_CgmStatus = 0x2AA9, ///< CGM Status
BtdrvGattCharacteristicUuidType_CgmSessionStartTime = 0x2AAA, ///< CGM Session Start Time
BtdrvGattCharacteristicUuidType_CgmSessionRunTime = 0x2AAB, ///< CGM Session Run Time
BtdrvGattCharacteristicUuidType_CgmSpecificOpsControlPoint = 0x2AAC, ///< CGM Specific Ops Control Point
BtdrvGattCharacteristicUuidType_IndoorPositioningConfiguration = 0x2AAD, ///< Indoor Positioning Configuration
BtdrvGattCharacteristicUuidType_Latitude = 0x2AAE, ///< Latitude
BtdrvGattCharacteristicUuidType_Longitude = 0x2AAF, ///< Longitude
BtdrvGattCharacteristicUuidType_LocalNorthCoordinate = 0x2AB0, ///< Local North Coordinate
BtdrvGattCharacteristicUuidType_LocalEastCoordinate = 0x2AB1, ///< Local East Coordinate
BtdrvGattCharacteristicUuidType_FloorNumber = 0x2AB2, ///< Floor Number
BtdrvGattCharacteristicUuidType_Altitude = 0x2AB3, ///< Altitude
BtdrvGattCharacteristicUuidType_Uncertainty = 0x2AB4, ///< Uncertainty
BtdrvGattCharacteristicUuidType_LocationName = 0x2AB5, ///< Location Name
BtdrvGattCharacteristicUuidType_Uri = 0x2AB6, ///< URI
BtdrvGattCharacteristicUuidType_HttpHeaders = 0x2AB7, ///< HTTP Headers
BtdrvGattCharacteristicUuidType_HttpStatusCode = 0x2AB8, ///< HTTP Status Code
BtdrvGattCharacteristicUuidType_HttpEntityBody = 0x2AB9, ///< HTTP Entity Body
BtdrvGattCharacteristicUuidType_HttpControlPoint = 0x2ABA, ///< HTTP Control Point
BtdrvGattCharacteristicUuidType_HttpsSecurity = 0x2ABB, ///< HTTPS Security
BtdrvGattCharacteristicUuidType_TdsControlPoint = 0x2ABC, ///< TDS Control Point
BtdrvGattCharacteristicUuidType_OtsFeature = 0x2ABD, ///< OTS Feature
BtdrvGattCharacteristicUuidType_ObjectName = 0x2ABE, ///< Object Name
BtdrvGattCharacteristicUuidType_ObjectType = 0x2ABF, ///< Object Type
BtdrvGattCharacteristicUuidType_ObjectSize = 0x2AC0, ///< Object Size
BtdrvGattCharacteristicUuidType_ObjectFirstCreated = 0x2AC1, ///< Object First-Created
BtdrvGattCharacteristicUuidType_ObjectLastModified = 0x2AC2, ///< Object Last-Modified
BtdrvGattCharacteristicUuidType_ObjectId = 0x2AC3, ///< Object ID
BtdrvGattCharacteristicUuidType_ObjectProperties = 0x2AC4, ///< Object Properties
BtdrvGattCharacteristicUuidType_ObjectActionControlPoint = 0x2AC5, ///< Object Action Control Point
BtdrvGattCharacteristicUuidType_ObjectListControlPoint = 0x2AC6, ///< Object List Control Point
BtdrvGattCharacteristicUuidType_ObjectListFilter = 0x2AC7, ///< Object List Filter
BtdrvGattCharacteristicUuidType_ObjectChanged = 0x2AC8, ///< Object Changed
BtdrvGattCharacteristicUuidType_ResolvablePrivateAddressOnly = 0x2AC9, ///< Resolvable Private Address Only
BtdrvGattCharacteristicUuidType_FitnessMachineFeature = 0x2ACC, ///< Fitness Machine Feature
BtdrvGattCharacteristicUuidType_TreadmillData = 0x2ACD, ///< Treadmill Data
BtdrvGattCharacteristicUuidType_CrossTrainerData = 0x2ACE, ///< Cross Trainer Data
BtdrvGattCharacteristicUuidType_StepClimberData = 0x2ACF, ///< Step Climber Data
BtdrvGattCharacteristicUuidType_StairClimberData = 0x2AD0, ///< Stair Climber Data
BtdrvGattCharacteristicUuidType_RowerData = 0x2AD1, ///< Rower Data
BtdrvGattCharacteristicUuidType_IndoorBikeData = 0x2AD2, ///< Indoor Bike Data
BtdrvGattCharacteristicUuidType_TrainingStatus = 0x2AD3, ///< Training Status
BtdrvGattCharacteristicUuidType_SupportedSpeedRange = 0x2AD4, ///< Supported Speed Range
BtdrvGattCharacteristicUuidType_SupportedInclinationRange = 0x2AD5, ///< Supported Inclination Range
BtdrvGattCharacteristicUuidType_SupportedResistanceLevelRange = 0x2AD6, ///< Supported Resistance Level Range
BtdrvGattCharacteristicUuidType_SupportedHeartRateRange = 0x2AD7, ///< Supported Heart Rate Range
BtdrvGattCharacteristicUuidType_SupportedPowerRange = 0x2AD8, ///< Supported Power Range
BtdrvGattCharacteristicUuidType_FitnessMachineControlPoint = 0x2AD9, ///< Fitness Machine Control Point
BtdrvGattCharacteristicUuidType_FitnessMachineStatus = 0x2ADA, ///< Fitness Machine Status
BtdrvGattCharacteristicUuidType_MeshProvisioningDataIn = 0x2ADB, ///< Mesh Provisioning Data In
BtdrvGattCharacteristicUuidType_MeshProvisioningDataOut = 0x2ADC, ///< Mesh Provisioning Data Out
BtdrvGattCharacteristicUuidType_MeshProxyDataIn = 0x2ADD, ///< Mesh Proxy Data In
BtdrvGattCharacteristicUuidType_MeshProxyDataOut = 0x2ADE, ///< Mesh Proxy Data Out
BtdrvGattCharacteristicUuidType_AverageCurrent = 0x2AE0, ///< Average Current
BtdrvGattCharacteristicUuidType_AverageVoltage = 0x2AE1, ///< Average Voltage
BtdrvGattCharacteristicUuidType_Boolean = 0x2AE2, ///< Boolean
BtdrvGattCharacteristicUuidType_ChromaticDistanceFromPlanckian = 0x2AE3, ///< Chromatic Distance from Planckian
BtdrvGattCharacteristicUuidType_ChromaticityCoordinates = 0x2AE4, ///< Chromaticity Coordinates
BtdrvGattCharacteristicUuidType_ChromaticityInCctAndDuvValues = 0x2AE5, ///< Chromaticity in CCT and Duv Values
BtdrvGattCharacteristicUuidType_ChromaticityTolerance = 0x2AE6, ///< Chromaticity Tolerance
BtdrvGattCharacteristicUuidType_CieColorRenderingIndex = 0x2AE7, ///< CIE 13.3-1995 Color Rendering Index
BtdrvGattCharacteristicUuidType_Coefficient = 0x2AE8, ///< Coefficient
BtdrvGattCharacteristicUuidType_CorrelatedColorTemperature = 0x2AE9, ///< Correlated Color Temperature
BtdrvGattCharacteristicUuidType_Count16 = 0x2AEA, ///< Count 16
BtdrvGattCharacteristicUuidType_Count24 = 0x2AEB, ///< Count 24
BtdrvGattCharacteristicUuidType_CountryCode = 0x2AEC, ///< Country Code
BtdrvGattCharacteristicUuidType_DateUtc = 0x2AED, ///< Date UTC
BtdrvGattCharacteristicUuidType_ElectricCurrent = 0x2AEE, ///< Electric Current
BtdrvGattCharacteristicUuidType_ElectricCurrentRange = 0x2AEF, ///< Electric Current Range
BtdrvGattCharacteristicUuidType_ElectricCurrentSpecification = 0x2AF0, ///< Electric Current Specification
BtdrvGattCharacteristicUuidType_ElectricCurrentStatistics = 0x2AF1, ///< Electric Current Statistics
BtdrvGattCharacteristicUuidType_Energy = 0x2AF2, ///< Energy
BtdrvGattCharacteristicUuidType_EnergyInAPeriodOfDay = 0x2AF3, ///< Energy in a Period of Day
BtdrvGattCharacteristicUuidType_EventStatistics = 0x2AF4, ///< Event Statistics
BtdrvGattCharacteristicUuidType_FixedString16 = 0x2AF5, ///< Fixed String 16
BtdrvGattCharacteristicUuidType_FixedString24 = 0x2AF6, ///< Fixed String 24
BtdrvGattCharacteristicUuidType_FixedString36 = 0x2AF7, ///< Fixed String 36
BtdrvGattCharacteristicUuidType_FixedString8 = 0x2AF8, ///< Fixed String 8
BtdrvGattCharacteristicUuidType_GenericLevel = 0x2AF9, ///< Generic Level
BtdrvGattCharacteristicUuidType_GlobalTradeItemNumber = 0x2AFA, ///< Global Trade Item Number
BtdrvGattCharacteristicUuidType_Illuminance = 0x2AFB, ///< Illuminance
BtdrvGattCharacteristicUuidType_LuminousEfficacy = 0x2AFC, ///< Luminous Efficacy
BtdrvGattCharacteristicUuidType_LuminousEnergy = 0x2AFD, ///< Luminous Energy
BtdrvGattCharacteristicUuidType_LuminousExposure = 0x2AFE, ///< Luminous Exposure
BtdrvGattCharacteristicUuidType_LuminousFlux = 0x2AFF, ///< Luminous Flux
BtdrvGattCharacteristicUuidType_LuminousFluxRange = 0x2B00, ///< Luminous Flux Range
BtdrvGattCharacteristicUuidType_LuminousIntensity = 0x2B01, ///< Luminous Intensity
BtdrvGattCharacteristicUuidType_MassFlow = 0x2B02, ///< Mass Flow
BtdrvGattCharacteristicUuidType_PerceivedLightness = 0x2B03, ///< Perceived Lightness
BtdrvGattCharacteristicUuidType_Percentage8 = 0x2B04, ///< Percentage 8
BtdrvGattCharacteristicUuidType_Power = 0x2B05, ///< Power
BtdrvGattCharacteristicUuidType_PowerSpecification = 0x2B06, ///< Power Specification
BtdrvGattCharacteristicUuidType_RelativeRuntimeInACurrentRange = 0x2B07, ///< Relative Runtime in a Current Range
BtdrvGattCharacteristicUuidType_RelativeRuntimeInAGenericLevelRange = 0x2B08, ///< Relative Runtime in a Generic Level Range
BtdrvGattCharacteristicUuidType_RelativeValueInAVoltageRange = 0x2B09, ///< Relative Value in a Voltage Range
BtdrvGattCharacteristicUuidType_RelativeValueInAnIlluminanceRange = 0x2B0A, ///< Relative Value in an Illuminance Range
BtdrvGattCharacteristicUuidType_RelativeValueInAPeriodOfDay = 0x2B0B, ///< Relative Value in a Period of Day
BtdrvGattCharacteristicUuidType_RelativeValueInATemperatureRange = 0x2B0C, ///< Relative Value in a Temperature Range
BtdrvGattCharacteristicUuidType_Temperature8 = 0x2B0D, ///< Temperature 8
BtdrvGattCharacteristicUuidType_Temperature8InAPeriodOfDay = 0x2B0E, ///< Temperature 8 in a Period of Day
BtdrvGattCharacteristicUuidType_Temperature8Statistics = 0x2B0F, ///< Temperature 8 Statistics
BtdrvGattCharacteristicUuidType_TemperatureRange = 0x2B10, ///< Temperature Range
BtdrvGattCharacteristicUuidType_TemperatureStatistics = 0x2B11, ///< Temperature Statistics
BtdrvGattCharacteristicUuidType_TimeDecihour8 = 0x2B12, ///< Time Decihour 8
BtdrvGattCharacteristicUuidType_TimeExponential8 = 0x2B13, ///< Time Exponential 8
BtdrvGattCharacteristicUuidType_TimeHour24 = 0x2B14, ///< Time Hour 24
BtdrvGattCharacteristicUuidType_TimeMillisecond24 = 0x2B15, ///< Time Millisecond 24
BtdrvGattCharacteristicUuidType_TimeSecond16 = 0x2B16, ///< Time Second 16
BtdrvGattCharacteristicUuidType_TimeSecond8 = 0x2B17, ///< Time Second 8
BtdrvGattCharacteristicUuidType_Voltage = 0x2B18, ///< Voltage
BtdrvGattCharacteristicUuidType_VoltageSpecification = 0x2B19, ///< Voltage Specification
BtdrvGattCharacteristicUuidType_VoltageStatistics = 0x2B1A, ///< Voltage Statistics
BtdrvGattCharacteristicUuidType_VolumeFlow = 0x2B1B, ///< Volume Flow
BtdrvGattCharacteristicUuidType_ChromaticityCoordinate = 0x2B1C, ///< Chromaticity Coordinate
BtdrvGattCharacteristicUuidType_RcFeature = 0x2B1D, ///< RC Feature
BtdrvGattCharacteristicUuidType_RcSettings = 0x2B1E, ///< RC Settings
BtdrvGattCharacteristicUuidType_ReconnectionConfigurationControlPoint = 0x2B1F, ///< Reconnection Configuration Control Point
BtdrvGattCharacteristicUuidType_IddStatusChanged = 0x2B20, ///< IDD Status Changed
BtdrvGattCharacteristicUuidType_IddStatus = 0x2B21, ///< IDD Status
BtdrvGattCharacteristicUuidType_IddAnnunciationStatus = 0x2B22, ///< IDD Annunciation Status
BtdrvGattCharacteristicUuidType_IddFeatures = 0x2B23, ///< IDD Features
BtdrvGattCharacteristicUuidType_IddStatusReaderControlPoint = 0x2B24, ///< IDD Status Reader Control Point
BtdrvGattCharacteristicUuidType_IddCommandControlPoint = 0x2B25, ///< IDD Command Control Point
BtdrvGattCharacteristicUuidType_IddCommandData = 0x2B26, ///< IDD Command Data
BtdrvGattCharacteristicUuidType_IddRecordAccessControlPoint = 0x2B27, ///< IDD Record Access Control Point
BtdrvGattCharacteristicUuidType_IddHistoryData = 0x2B28, ///< IDD History Data
BtdrvGattCharacteristicUuidType_ClientSupportedFeatures = 0x2B29, ///< Client Supported Features
BtdrvGattCharacteristicUuidType_DatabaseHash = 0x2B2A, ///< Database Hash
BtdrvGattCharacteristicUuidType_BssControlPoint = 0x2B2B, ///< BSS Control Point
BtdrvGattCharacteristicUuidType_BssResponse = 0x2B2C, ///< BSS Response
BtdrvGattCharacteristicUuidType_EmergencyId = 0x2B2D, ///< Emergency ID
BtdrvGattCharacteristicUuidType_EmergencyText = 0x2B2E, ///< Emergency Text
BtdrvGattCharacteristicUuidType_AcsStatus = 0x2B2F, ///< ACS Status
BtdrvGattCharacteristicUuidType_AcsDataIn = 0x2B30, ///< ACS Data In
BtdrvGattCharacteristicUuidType_AcsDataOutNotify = 0x2B31, ///< ACS Data Out Notify
BtdrvGattCharacteristicUuidType_AcsDataOutIndicate = 0x2B32, ///< ACS Data Out Indicate
BtdrvGattCharacteristicUuidType_AcsControlPoint = 0x2B33, ///< ACS Control Point
BtdrvGattCharacteristicUuidType_EnhancedBloodPressureMeasurement = 0x2B34, ///< Enhanced Blood Pressure Measurement
BtdrvGattCharacteristicUuidType_EnhancedIntermediateCuffPressure = 0x2B35, ///< Enhanced Intermediate Cuff Pressure
BtdrvGattCharacteristicUuidType_BloodPressureRecord = 0x2B36, ///< Blood Pressure Record
BtdrvGattCharacteristicUuidType_RegisteredUser = 0x2B37, ///< Registered User
BtdrvGattCharacteristicUuidType_BrEdrHandoverData = 0x2B38, ///< BR-EDR Handover Data
BtdrvGattCharacteristicUuidType_BluetoothSigData = 0x2B39, ///< Bluetooth SIG Data
BtdrvGattCharacteristicUuidType_ServerSupportedFeatures = 0x2B3A, ///< Server Supported Features
BtdrvGattCharacteristicUuidType_PhysicalActivityMonitorFeatures = 0x2B3B, ///< Physical Activity Monitor Features
BtdrvGattCharacteristicUuidType_GeneralActivityInstantaneousData = 0x2B3C, ///< General Activity Instantaneous Data
BtdrvGattCharacteristicUuidType_GeneralActivitySummaryData = 0x2B3D, ///< General Activity Summary Data
BtdrvGattCharacteristicUuidType_CardiorespiratoryActivityInstantaneousData = 0x2B3E, ///< CardioRespiratory Activity Instantaneous Data
BtdrvGattCharacteristicUuidType_CardiorespiratoryActivitySummaryData = 0x2B3F, ///< CardioRespiratory Activity Summary Data
BtdrvGattCharacteristicUuidType_StepCounterActivitySummaryData = 0x2B40, ///< Step Counter Activity Summary Data
BtdrvGattCharacteristicUuidType_SleepActivityInstantaneousData = 0x2B41, ///< Sleep Activity Instantaneous Data
BtdrvGattCharacteristicUuidType_SleepActivitySummaryData = 0x2B42, ///< Sleep Activity Summary Data
BtdrvGattCharacteristicUuidType_PhysicalActivityMonitorControlPoint = 0x2B43, ///< Physical Activity Monitor Control Point
BtdrvGattCharacteristicUuidType_ActivityCurrentSession = 0x2B44, ///< Activity Current Session
BtdrvGattCharacteristicUuidType_PhysicalActivitySessionDescriptor = 0x2B45, ///< Physical Activity Session Descriptor
BtdrvGattCharacteristicUuidType_PreferredUnits = 0x2B46, ///< Preferred Units
BtdrvGattCharacteristicUuidType_HighResolutionHeight = 0x2B47, ///< High Resolution Height
BtdrvGattCharacteristicUuidType_MiddleName = 0x2B48, ///< Middle Name
BtdrvGattCharacteristicUuidType_StrideLength = 0x2B49, ///< Stride Length
BtdrvGattCharacteristicUuidType_Handedness = 0x2B4A, ///< Handedness
BtdrvGattCharacteristicUuidType_DeviceWearingPosition = 0x2B4B, ///< Device Wearing Position
BtdrvGattCharacteristicUuidType_FourZoneHeartRateLimits = 0x2B4C, ///< Four Zone Heart Rate Limits
BtdrvGattCharacteristicUuidType_HighIntensityExerciseThreshold = 0x2B4D, ///< High Intensity Exercise Threshold
BtdrvGattCharacteristicUuidType_ActivityGoal = 0x2B4E, ///< Activity Goal
BtdrvGattCharacteristicUuidType_SedentaryIntervalNotification = 0x2B4F, ///< Sedentary Interval Notification
BtdrvGattCharacteristicUuidType_CaloricIntake = 0x2B50, ///< Caloric Intake
BtdrvGattCharacteristicUuidType_TmapRole = 0x2B51, ///< TMAP Role
BtdrvGattCharacteristicUuidType_AudioInputState = 0x2B77, ///< Audio Input State
BtdrvGattCharacteristicUuidType_GainSettingsAttribute = 0x2B78, ///< Gain Settings Attribute
BtdrvGattCharacteristicUuidType_AudioInputType = 0x2B79, ///< Audio Input Type
BtdrvGattCharacteristicUuidType_AudioInputStatus = 0x2B7A, ///< Audio Input Status
BtdrvGattCharacteristicUuidType_AudioInputControlPoint = 0x2B7B, ///< Audio Input Control Point
BtdrvGattCharacteristicUuidType_AudioInputDescription = 0x2B7C, ///< Audio Input Description
BtdrvGattCharacteristicUuidType_VolumeState = 0x2B7D, ///< Volume State
BtdrvGattCharacteristicUuidType_VolumeControlPoint = 0x2B7E, ///< Volume Control Point
BtdrvGattCharacteristicUuidType_VolumeFlags = 0x2B7F, ///< Volume Flags
BtdrvGattCharacteristicUuidType_VolumeOffsetState = 0x2B80, ///< Volume Offset State
BtdrvGattCharacteristicUuidType_AudioLocation = 0x2B81, ///< Audio Location
BtdrvGattCharacteristicUuidType_VolumeOffsetControlPoint = 0x2B82, ///< Volume Offset Control Point
BtdrvGattCharacteristicUuidType_AudioOutputDescription = 0x2B83, ///< Audio Output Description
BtdrvGattCharacteristicUuidType_SetIdentityResolvingKey = 0x2B84, ///< Set Identity Resolving Key
BtdrvGattCharacteristicUuidType_CoordinatedSetSize = 0x2B85, ///< Coordinated Set Size
BtdrvGattCharacteristicUuidType_SetMemberLock = 0x2B86, ///< Set Member Lock
BtdrvGattCharacteristicUuidType_SetMemberRank = 0x2B87, ///< Set Member Rank
BtdrvGattCharacteristicUuidType_EncryptedDataKeyMaterial = 0x2B88, ///< Encrypted Data Key Material
BtdrvGattCharacteristicUuidType_ApparentEnergy32 = 0x2B89, ///< Apparent Energy 32
BtdrvGattCharacteristicUuidType_ApparentPower = 0x2B8A, ///< Apparent Power
BtdrvGattCharacteristicUuidType_LiveHealthObservations = 0x2B8B, ///< Live Health Observations
BtdrvGattCharacteristicUuidType_CoTextsubscript2Concentration = 0x2B8C, ///< CO\textsubscript{2} Concentration
BtdrvGattCharacteristicUuidType_CosineOfTheAngle = 0x2B8D, ///< Cosine of the Angle
BtdrvGattCharacteristicUuidType_DeviceTimeFeature = 0x2B8E, ///< Device Time Feature
BtdrvGattCharacteristicUuidType_DeviceTimeParameters = 0x2B8F, ///< Device Time Parameters
BtdrvGattCharacteristicUuidType_DeviceTime = 0x2B90, ///< Device Time
BtdrvGattCharacteristicUuidType_DeviceTimeControlPoint = 0x2B91, ///< Device Time Control Point
BtdrvGattCharacteristicUuidType_TimeChangeLogData = 0x2B92, ///< Time Change Log Data
BtdrvGattCharacteristicUuidType_MediaPlayerName = 0x2B93, ///< Media Player Name
BtdrvGattCharacteristicUuidType_MediaPlayerIconObjectId = 0x2B94, ///< Media Player Icon Object ID
BtdrvGattCharacteristicUuidType_MediaPlayerIconUrl = 0x2B95, ///< Media Player Icon URL
BtdrvGattCharacteristicUuidType_TrackChanged = 0x2B96, ///< Track Changed
BtdrvGattCharacteristicUuidType_TrackTitle = 0x2B97, ///< Track Title
BtdrvGattCharacteristicUuidType_TrackDuration = 0x2B98, ///< Track Duration
BtdrvGattCharacteristicUuidType_TrackPosition = 0x2B99, ///< Track Position
BtdrvGattCharacteristicUuidType_PlaybackSpeed = 0x2B9A, ///< Playback Speed
BtdrvGattCharacteristicUuidType_SeekingSpeed = 0x2B9B, ///< Seeking Speed
BtdrvGattCharacteristicUuidType_CurrentTrackSegmentsObjectId = 0x2B9C, ///< Current Track Segments Object ID
BtdrvGattCharacteristicUuidType_CurrentTrackObjectId = 0x2B9D, ///< Current Track Object ID
BtdrvGattCharacteristicUuidType_NextTrackObjectId = 0x2B9E, ///< Next Track Object ID
BtdrvGattCharacteristicUuidType_ParentGroupObjectId = 0x2B9F, ///< Parent Group Object ID
BtdrvGattCharacteristicUuidType_CurrentGroupObjectId = 0x2BA0, ///< Current Group Object ID
BtdrvGattCharacteristicUuidType_PlayingOrder = 0x2BA1, ///< Playing Order
BtdrvGattCharacteristicUuidType_PlayingOrdersSupported = 0x2BA2, ///< Playing Orders Supported
BtdrvGattCharacteristicUuidType_MediaState = 0x2BA3, ///< Media State
BtdrvGattCharacteristicUuidType_MediaControlPoint = 0x2BA4, ///< Media Control Point
BtdrvGattCharacteristicUuidType_MediaControlPointOpcodesSupported = 0x2BA5, ///< Media Control Point Opcodes Supported
BtdrvGattCharacteristicUuidType_SearchResultsObjectId = 0x2BA6, ///< Search Results Object ID
BtdrvGattCharacteristicUuidType_SearchControlPoint = 0x2BA7, ///< Search Control Point
BtdrvGattCharacteristicUuidType_Energy32 = 0x2BA8, ///< Energy 32
BtdrvGattCharacteristicUuidType_MediaPlayerIconObjectType = 0x2BA9, ///< Media Player Icon Object Type
BtdrvGattCharacteristicUuidType_TrackSegmentsObjectType = 0x2BAA, ///< Track Segments Object Type
BtdrvGattCharacteristicUuidType_TrackObjectType = 0x2BAB, ///< Track Object Type
BtdrvGattCharacteristicUuidType_GroupObjectType = 0x2BAC, ///< Group Object Type
BtdrvGattCharacteristicUuidType_ConstantToneExtensionEnable = 0x2BAD, ///< Constant Tone Extension Enable
BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionMinimumLength = 0x2BAE, ///< Advertising Constant Tone Extension Minimum Length
BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionMinimumTransmitCount = 0x2BAF, ///< Advertising Constant Tone Extension Minimum Transmit Count
BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionTransmitDuration = 0x2BB0, ///< Advertising Constant Tone Extension Transmit Duration
BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionInterval = 0x2BB1, ///< Advertising Constant Tone Extension Interval
BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionPhy = 0x2BB2, ///< Advertising Constant Tone Extension PHY
BtdrvGattCharacteristicUuidType_BearerProviderName = 0x2BB3, ///< Bearer Provider Name
BtdrvGattCharacteristicUuidType_BearerUci = 0x2BB4, ///< Bearer UCI
BtdrvGattCharacteristicUuidType_BearerTechnology = 0x2BB5, ///< Bearer Technology
BtdrvGattCharacteristicUuidType_BearerUriSchemesSupportedList = 0x2BB6, ///< Bearer URI Schemes Supported List
BtdrvGattCharacteristicUuidType_BearerSignalStrength = 0x2BB7, ///< Bearer Signal Strength
BtdrvGattCharacteristicUuidType_BearerSignalStrengthReportingInterval = 0x2BB8, ///< Bearer Signal Strength Reporting Interval
BtdrvGattCharacteristicUuidType_BearerListCurrentCalls = 0x2BB9, ///< Bearer List Current Calls
BtdrvGattCharacteristicUuidType_ContentControlId = 0x2BBA, ///< Content Control ID
BtdrvGattCharacteristicUuidType_StatusFlags = 0x2BBB, ///< Status Flags
BtdrvGattCharacteristicUuidType_IncomingCallTargetBearerUri = 0x2BBC, ///< Incoming Call Target Bearer URI
BtdrvGattCharacteristicUuidType_CallState = 0x2BBD, ///< Call State
BtdrvGattCharacteristicUuidType_CallControlPoint = 0x2BBE, ///< Call Control Point
BtdrvGattCharacteristicUuidType_CallControlPointOptionalOpcodes = 0x2BBF, ///< Call Control Point Optional Opcodes
BtdrvGattCharacteristicUuidType_TerminationReason = 0x2BC0, ///< Termination Reason
BtdrvGattCharacteristicUuidType_IncomingCall = 0x2BC1, ///< Incoming Call
BtdrvGattCharacteristicUuidType_CallFriendlyName = 0x2BC2, ///< Call Friendly Name
BtdrvGattCharacteristicUuidType_Mute = 0x2BC3, ///< Mute
BtdrvGattCharacteristicUuidType_SinkAse = 0x2BC4, ///< Sink ASE
BtdrvGattCharacteristicUuidType_SourceAse = 0x2BC5, ///< Source ASE
BtdrvGattCharacteristicUuidType_AseControlPoint = 0x2BC6, ///< ASE Control Point
BtdrvGattCharacteristicUuidType_BroadcastAudioScanControlPoint = 0x2BC7, ///< Broadcast Audio Scan Control Point
BtdrvGattCharacteristicUuidType_BroadcastReceiveState = 0x2BC8, ///< Broadcast Receive State
BtdrvGattCharacteristicUuidType_SinkPac = 0x2BC9, ///< Sink PAC
BtdrvGattCharacteristicUuidType_SinkAudioLocations = 0x2BCA, ///< Sink Audio Locations
BtdrvGattCharacteristicUuidType_SourcePac = 0x2BCB, ///< Source PAC
BtdrvGattCharacteristicUuidType_SourceAudioLocations = 0x2BCC, ///< Source Audio Locations
BtdrvGattCharacteristicUuidType_AvailableAudioContexts = 0x2BCD, ///< Available Audio Contexts
BtdrvGattCharacteristicUuidType_SupportedAudioContexts = 0x2BCE, ///< Supported Audio Contexts
BtdrvGattCharacteristicUuidType_AmmoniaConcentration = 0x2BCF, ///< Ammonia Concentration
BtdrvGattCharacteristicUuidType_CarbonMonoxideConcentration = 0x2BD0, ///< Carbon Monoxide Concentration
BtdrvGattCharacteristicUuidType_MethaneConcentration = 0x2BD1, ///< Methane Concentration
BtdrvGattCharacteristicUuidType_NitrogenDioxideConcentration = 0x2BD2, ///< Nitrogen Dioxide Concentration
BtdrvGattCharacteristicUuidType_NonMethaneVolatileOrganicCompoundsConcentration = 0x2BD3, ///< Non-Methane Volatile Organic Compounds Concentration
BtdrvGattCharacteristicUuidType_OzoneConcentration = 0x2BD4, ///< Ozone Concentration
BtdrvGattCharacteristicUuidType_ParticulateMatterPm1Concentration = 0x2BD5, ///< Particulate Matter - PM1 Concentration
BtdrvGattCharacteristicUuidType_ParticulateMatterPm25Concentration = 0x2BD6, ///< Particulate Matter - PM2.5 Concentration
BtdrvGattCharacteristicUuidType_ParticulateMatterPm10Concentration = 0x2BD7, ///< Particulate Matter - PM10 Concentration
BtdrvGattCharacteristicUuidType_SulfurDioxideConcentration = 0x2BD8, ///< Sulfur Dioxide Concentration
BtdrvGattCharacteristicUuidType_SulfurHexafluorideConcentration = 0x2BD9, ///< Sulfur Hexafluoride Concentration
BtdrvGattCharacteristicUuidType_HearingAidFeatures = 0x2BDA, ///< Hearing Aid Features
BtdrvGattCharacteristicUuidType_HearingAidPresetControlPoint = 0x2BDB, ///< Hearing Aid Preset Control Point
BtdrvGattCharacteristicUuidType_ActivePresetIndex = 0x2BDC, ///< Active Preset Index
BtdrvGattCharacteristicUuidType_StoredHealthObservations = 0x2BDD, ///< Stored Health Observations
BtdrvGattCharacteristicUuidType_FixedString64 = 0x2BDE, ///< Fixed String 64
BtdrvGattCharacteristicUuidType_HighTemperature = 0x2BDF, ///< High Temperature
BtdrvGattCharacteristicUuidType_HighVoltage = 0x2BE0, ///< High Voltage
BtdrvGattCharacteristicUuidType_LightDistribution = 0x2BE1, ///< Light Distribution
BtdrvGattCharacteristicUuidType_LightOutput = 0x2BE2, ///< Light Output
BtdrvGattCharacteristicUuidType_LightSourceType = 0x2BE3, ///< Light Source Type
BtdrvGattCharacteristicUuidType_Noise = 0x2BE4, ///< Noise
BtdrvGattCharacteristicUuidType_RelativeRuntimeInACorrelatedColorTemperatureRange = 0x2BE5, ///< Relative Runtime in a Correlated Color Temperature Range
BtdrvGattCharacteristicUuidType_TimeSecond32 = 0x2BE6, ///< Time Second 32
BtdrvGattCharacteristicUuidType_VocConcentration = 0x2BE7, ///< VOC Concentration
BtdrvGattCharacteristicUuidType_VoltageFrequency = 0x2BE8, ///< Voltage Frequency
BtdrvGattCharacteristicUuidType_BatteryCriticalStatus = 0x2BE9, ///< Battery Critical Status
BtdrvGattCharacteristicUuidType_BatteryHealthStatus = 0x2BEA, ///< Battery Health Status
BtdrvGattCharacteristicUuidType_BatteryHealthInformation = 0x2BEB, ///< Battery Health Information
BtdrvGattCharacteristicUuidType_BatteryInformation = 0x2BEC, ///< Battery Information
BtdrvGattCharacteristicUuidType_BatteryLevelStatus = 0x2BED, ///< Battery Level Status
BtdrvGattCharacteristicUuidType_BatteryTimeStatus = 0x2BEE, ///< Battery Time Status
BtdrvGattCharacteristicUuidType_EstimatedServiceDate = 0x2BEF, ///< Estimated Service Date
BtdrvGattCharacteristicUuidType_BatteryEnergyStatus = 0x2BF0, ///< Battery Energy Status
BtdrvGattCharacteristicUuidType_ObservationScheduleChanged = 0x2BF1, ///< Observation Schedule Changed
BtdrvGattCharacteristicUuidType_CurrentElapsedTime = 0x2BF2, ///< Current Elapsed Time
BtdrvGattCharacteristicUuidType_HealthSensorFeatures = 0x2BF3, ///< Health Sensor Features
BtdrvGattCharacteristicUuidType_GhsControlPoint = 0x2BF4, ///< GHS Control Point
BtdrvGattCharacteristicUuidType_LeGattSecurityLevels = 0x2BF5, ///< LE GATT Security Levels
BtdrvGattCharacteristicUuidType_EslAddress = 0x2BF6, ///< ESL Address
BtdrvGattCharacteristicUuidType_ApSyncKeyMaterial = 0x2BF7, ///< AP Sync Key Material
BtdrvGattCharacteristicUuidType_EslResponseKeyMaterial = 0x2BF8, ///< ESL Response Key Material
BtdrvGattCharacteristicUuidType_EslCurrentAbsoluteTime = 0x2BF9, ///< ESL Current Absolute Time
BtdrvGattCharacteristicUuidType_EslDisplayInformation = 0x2BFA, ///< ESL Display Information
BtdrvGattCharacteristicUuidType_EslImageInformation = 0x2BFB, ///< ESL Image Information
BtdrvGattCharacteristicUuidType_EslSensorInformation = 0x2BFC, ///< ESL Sensor Information
BtdrvGattCharacteristicUuidType_EslLedInformation = 0x2BFD, ///< ESL LED Information
BtdrvGattCharacteristicUuidType_EslControlPoint = 0x2BFE, ///< ESL Control Point
BtdrvGattCharacteristicUuidType_UdiForMedicalDevices = 0x2BFF, ///< UDI for Medical Devices
} BtdrvGattCharacteristicUuidType;
/// GattDescriptorUuidType
typedef enum {
BtdrvGattDescriptorUuidType_CharacteristicExtendedProperties = 0x2900, ///< Characteristic Extended Properties
BtdrvGattDescriptorUuidType_CharacteristicUserDescription = 0x2901, ///< Characteristic User Description
BtdrvGattDescriptorUuidType_ClientCharacteristicConfiguration = 0x2902, ///< Client Characteristic Configuration
BtdrvGattDescriptorUuidType_ServerCharacteristicConfiguration = 0x2903, ///< Server Characteristic Configuration
BtdrvGattDescriptorUuidType_CharacteristicPresentationFormat = 0x2904, ///< Characteristic Presentation Format
BtdrvGattDescriptorUuidType_CharacteristicAggregateFormat = 0x2905, ///< Characteristic Aggregate Format
BtdrvGattDescriptorUuidType_ValidRange = 0x2906, ///< Valid Range
BtdrvGattDescriptorUuidType_ExternalReportReference = 0x2907, ///< External Report Reference
BtdrvGattDescriptorUuidType_ReportReference = 0x2908, ///< Report Reference
BtdrvGattDescriptorUuidType_NumberOfDigitals = 0x2909, ///< Number of Digitals
BtdrvGattDescriptorUuidType_ValueTriggerSetting = 0x290A, ///< Value Trigger Setting
BtdrvGattDescriptorUuidType_EnvironmentalSensingConfiguration = 0x290B, ///< Environmental Sensing Configuration
BtdrvGattDescriptorUuidType_EnvironmentalSensingMeasurement = 0x290C, ///< Environmental Sensing Measurement
BtdrvGattDescriptorUuidType_EnvironmentalSensingTriggerSetting = 0x290D, ///< Environmental Sensing Trigger Setting
BtdrvGattDescriptorUuidType_TimeTriggerSetting = 0x290E, ///< Time Trigger Setting
BtdrvGattDescriptorUuidType_CompleteBrEdrTransportBlockData = 0x290F, ///< Complete BR-EDR Transport Block Data
BtdrvGattDescriptorUuidType_ObservationSchedule = 0x2910, ///< Observation Schedule
BtdrvGattDescriptorUuidType_ValidRangeAndAccuracy = 0x2911, ///< Valid Range and Accuracy
} BtdrvGattDescriptorUuidType;

View File

@ -0,0 +1,455 @@
/**
* @file btdrv_types.h
* @brief Bluetooth driver (btdrv) service types (see btdrv.h for the rest).
* @author yellows8, ndeadly
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "btdrv_ids.h"
/// BluetoothPropertyType [1.0.0-11.0.1]
typedef enum {
BtdrvBluetoothPropertyType_Name = 1, ///< Name. String, max length 0xF8 excluding NUL-terminator.
BtdrvBluetoothPropertyType_Address = 2, ///< \ref BtdrvAddress
BtdrvBluetoothPropertyType_Unknown3 = 3, ///< Only available with \ref btdrvSetAdapterProperty. Unknown, \ref BtdrvAddress.
BtdrvBluetoothPropertyType_ClassOfDevice = 5, ///< 3-bytes, Class of Device.
BtdrvBluetoothPropertyType_FeatureSet = 6, ///< 1-byte, FeatureSet. The default is value 0x68.
} BtdrvBluetoothPropertyType;
/// AdapterPropertyType [12.0.0+]
typedef enum {
BtdrvAdapterPropertyType_Address = 0, ///< \ref BtdrvAddress
BtdrvAdapterPropertyType_Name = 1, ///< Name. String, max length 0xF8 excluding NUL-terminator.
BtdrvAdapterPropertyType_ClassOfDevice = 2, ///< 3-bytes, Class of Device.
BtdrvAdapterPropertyType_Unknown3 = 3, ///< Only available with \ref btdrvSetAdapterProperty. Unknown, \ref BtdrvAddress.
} BtdrvAdapterPropertyType;
/// EventType
typedef enum {
///< BtdrvEventType_* should be used on [12.0.0+]
BtdrvEventType_InquiryDevice = 0, ///< Device found during Inquiry.
BtdrvEventType_InquiryStatus = 1, ///< Inquiry status changed.
BtdrvEventType_PairingPinCodeRequest = 2, ///< Pairing PIN code request.
BtdrvEventType_SspRequest = 3, ///< SSP confirm request / SSP passkey notification.
BtdrvEventType_Connection = 4, ///< Connection
BtdrvEventType_Tsi = 5, ///< SetTsi (\ref btdrvSetTsi)
BtdrvEventType_BurstMode = 6, ///< SetBurstMode (\ref btdrvEnableBurstMode)
BtdrvEventType_SetZeroRetransmission = 7, ///< \ref btdrvSetZeroRetransmission
BtdrvEventType_PendingConnections = 8, ///< \ref btdrvGetPendingConnections
BtdrvEventType_MoveToSecondaryPiconet = 9, ///< \ref btdrvMoveToSecondaryPiconet
BtdrvEventType_BluetoothCrash = 10, ///< BluetoothCrash
///< BtdrvEventTypeOld_* should be used on [1.0.0-11.0.1]
BtdrvEventTypeOld_Unknown0 = 0, ///< Unused
BtdrvEventTypeOld_InquiryDevice = 3, ///< Device found during Inquiry.
BtdrvEventTypeOld_InquiryStatus = 4, ///< Inquiry status changed.
BtdrvEventTypeOld_PairingPinCodeRequest = 5, ///< Pairing PIN code request.
BtdrvEventTypeOld_SspRequest = 6, ///< SSP confirm request / SSP passkey notification.
BtdrvEventTypeOld_Connection = 7, ///< Connection
BtdrvEventTypeOld_BluetoothCrash = 13, ///< BluetoothCrash
} BtdrvEventType;
/// BtdrvInquiryStatus
typedef enum {
BtdrvInquiryStatus_Stopped = 0, ///< Inquiry stopped.
BtdrvInquiryStatus_Started = 1, ///< Inquiry started.
} BtdrvInquiryStatus;
/// ConnectionEventType
typedef enum {
BtdrvConnectionEventType_Status = 0, ///< BtdrvEventInfo::connection::status
BtdrvConnectionEventType_SspConfirmRequest = 1, ///< SSP confirm request.
BtdrvConnectionEventType_Suspended = 2, ///< ACL Link is now Suspended.
} BtdrvConnectionEventType;
/// ExtEventType [1.0.0-11.0.1]
typedef enum {
BtdrvExtEventType_SetTsi = 0, ///< SetTsi (\ref btdrvSetTsi)
BtdrvExtEventType_ExitTsi = 1, ///< ExitTsi (\ref btdrvSetTsi)
BtdrvExtEventType_SetBurstMode = 2, ///< SetBurstMode (\ref btdrvEnableBurstMode)
BtdrvExtEventType_ExitBurstMode = 3, ///< ExitBurstMode (\ref btdrvEnableBurstMode)
BtdrvExtEventType_SetZeroRetransmission = 4, ///< \ref btdrvSetZeroRetransmission
BtdrvExtEventType_PendingConnections = 5, ///< \ref btdrvGetPendingConnections
BtdrvExtEventType_MoveToSecondaryPiconet = 6, ///< \ref btdrvMoveToSecondaryPiconet
} BtdrvExtEventType;
/// BluetoothHhReportType
/// Bit0-1 directly control the HID bluetooth transaction report-type value.
/// Bit2-3: these directly control the Parameter Reserved field for SetReport, for GetReport these control the Parameter Reserved and Size bits.
typedef enum {
BtdrvBluetoothHhReportType_Other = 0, ///< Other
BtdrvBluetoothHhReportType_Input = 1, ///< Input
BtdrvBluetoothHhReportType_Output = 2, ///< Output
BtdrvBluetoothHhReportType_Feature = 3, ///< Feature
} BtdrvBluetoothHhReportType;
/// HidEventType
typedef enum {
///< BtdrvHidEventType_* should be used on [12.0.0+]
BtdrvHidEventType_Connection = 0, ///< Connection. Only used with \ref btdrvGetHidEventInfo.
BtdrvHidEventType_Data = 1, ///< DATA report on the Interrupt channel.
BtdrvHidEventType_SetReport = 2, ///< Response to SET_REPORT.
BtdrvHidEventType_GetReport = 3, ///< Response to GET_REPORT.
///< BtdrvHidEventTypeOld_* should be used on [1.0.0-11.0.1]
BtdrvHidEventTypeOld_Connection = 0, ///< Connection. Only used with \ref btdrvGetHidEventInfo.
BtdrvHidEventTypeOld_Data = 4, ///< DATA report on the Interrupt channel.
BtdrvHidEventTypeOld_Ext = 7, ///< Response for extensions. Only used with \ref btdrvGetHidEventInfo.
BtdrvHidEventTypeOld_SetReport = 8, ///< Response to SET_REPORT.
BtdrvHidEventTypeOld_GetReport = 9, ///< Response to GET_REPORT.
} BtdrvHidEventType;
/// HidConnectionStatus [12.0.0+]
typedef enum {
///< BtdrvHidConnectionStatus_* should be used on [12.0.0+]
BtdrvHidConnectionStatus_Closed = 0,
BtdrvHidConnectionStatus_Opened = 1,
BtdrvHidConnectionStatus_Failed = 2,
///< BtdrvHidConnectionStatusOld_* should be used on [1.0.0-11.0.1]
BtdrvHidConnectionStatusOld_Opened = 0,
BtdrvHidConnectionStatusOld_Closed = 2,
BtdrvHidConnectionStatusOld_Failed = 8,
} BtdrvHidConnectionStatus;
/// This determines the u16 data to write into a CircularBuffer.
typedef enum {
BtdrvFatalReason_Invalid = 0, ///< Only for \ref BtdrvEventInfo: invalid.
BtdrvFatalReason_Unknown1 = 1, ///< Can only be triggered by \ref btdrvEmulateBluetoothCrash, not triggered by the sysmodule otherwise.
BtdrvFatalReason_CommandTimeout = 2, ///< HCI command timeout.
BtdrvFatalReason_HardwareError = 3, ///< HCI event HCI_Hardware_Error occurred.
BtdrvFatalReason_Enable = 7, ///< Only for \ref BtdrvEventInfo: triggered after enabling bluetooth, depending on the value of a global state field.
BtdrvFatalReason_Audio = 9, ///< [12.0.0+] Only for \ref BtdrvEventInfo: triggered by Audio cmds in some cases.
} BtdrvFatalReason;
/// BleEventType
typedef enum {
BtdrvBleEventType_ClientRegistration = 0, ///< GATT client registration.
BtdrvBleEventType_ServerRegistration = 1, ///< GATT server registration.
BtdrvBleEventType_ConnectionUpdate = 2, ///< Connection update.
BtdrvBleEventType_PreferredConnectionParameters = 3, ///< Preferred connection parameters.
BtdrvBleEventType_ClientConnection = 4, ///< GATT client connection.
BtdrvBleEventType_ServerConnection = 5, ///< GATT server connection.
BtdrvBleEventType_ScanResult = 6, ///< Scan result.
BtdrvBleEventType_ScanFilter = 7, ///< Scan filter status.
BtdrvBleEventType_ClientNotify = 8, ///< GATT client notify.
BtdrvBleEventType_ClientCacheSave = 9, ///< GATT client cache save.
BtdrvBleEventType_ClientCacheLoad = 10, ///< GATT client cache load.
BtdrvBleEventType_ClientConfigureMtu = 11, ///< GATT client configure MTU.
BtdrvBleEventType_ServerAddAttribute = 12, ///< GATT server add attribute.
BtdrvBleEventType_ServerAttributeOperation = 13, ///< GATT server attribute operation.
} BtdrvBleEventType;
/// GattAttributeType
typedef enum {
BtdrvGattAttributeType_IncludedService = 0, ///< Included service
BtdrvGattAttributeType_Characteristic = 1, ///< Characteristic
BtdrvGattAttributeType_Descriptor = 2, ///< Descriptor
BtdrvGattAttributeType_Service = 3, ///< Service
} BtdrvGattAttributeType;
/// GattAttributePermission
typedef enum {
BtdrvGattAttributePermission_Read = BIT(0),
BtdrvGattAttributePermission_ReadEncrypted = BIT(1),
BtdrvGattAttributePermission_ReadEncryptedMitm = BIT(2),
BtdrvGattAttributePermission_Write = BIT(4),
BtdrvGattAttributePermission_WriteEncrypted = BIT(5),
BtdrvGattAttributePermission_WriteEncryptedMitm = BIT(6),
BtdrvGattAttributePermission_WriteSigned = BIT(7),
BtdrvGattAttributePermission_WriteSignedMitm = BIT(8),
BtdrvGattAttributePermission_ReadAllowed = BtdrvGattAttributePermission_Read | BtdrvGattAttributePermission_ReadEncrypted | BtdrvGattAttributePermission_ReadEncryptedMitm,
BtdrvGattAttributePermission_ReadAuthRequired = BtdrvGattAttributePermission_ReadEncrypted,
BtdrvGattAttributePermission_ReadMitmRequired = BtdrvGattAttributePermission_ReadEncryptedMitm,
BtdrvGattAttributePermission_ReadEncryptedRequired = BtdrvGattAttributePermission_ReadEncrypted | BtdrvGattAttributePermission_ReadEncryptedMitm,
BtdrvGattAttributePermission_WriteAllowed = BtdrvGattAttributePermission_Write | BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteEncryptedMitm | BtdrvGattAttributePermission_WriteSigned | BtdrvGattAttributePermission_WriteSignedMitm,
BtdrvGattAttributePermission_WriteAuthRequired = BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteSigned,
BtdrvGattAttributePermission_WriteMitmRequired = BtdrvGattAttributePermission_WriteEncryptedMitm | BtdrvGattAttributePermission_WriteSignedMitm,
BtdrvGattAttributePermission_WriteEncryptedRequired = BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteEncryptedMitm,
BtdrvGattAttributePermission_WriteSignedRequired = BtdrvGattAttributePermission_WriteSigned | BtdrvGattAttributePermission_WriteSignedMitm,
} BtdrvGattAttributePermission;
/// GattCharacteristicProperty
typedef enum {
BtdrvGattCharacteristicProperty_Broadcast = BIT(0),
BtdrvGattCharacteristicProperty_Read = BIT(1),
BtdrvGattCharacteristicProperty_WriteNoResponse = BIT(2),
BtdrvGattCharacteristicProperty_Write = BIT(3),
BtdrvGattCharacteristicProperty_Notify = BIT(4),
BtdrvGattCharacteristicProperty_Indicate = BIT(5),
BtdrvGattCharacteristicProperty_Authentication = BIT(6),
BtdrvGattCharacteristicProperty_ExtendedProperties = BIT(7),
} BtdrvGattCharacteristicProperty;
/// GattAuthReqType
typedef enum {
BtdrvGattAuthReqType_None = 0,
BtdrvGattAuthReqType_NoMitm = 1,
BtdrvGattAuthReqType_Mitm = 2,
BtdrvGattAuthReqType_SignedNoMitm = 3,
BtdrvGattAuthReqType_SignedMitm = 4,
} BtdrvGattAuthReqType;
/// BtdrvBleAdBit
typedef enum {
BtdrvBleAdBit_DeviceName = BIT(0),
BtdrvBleAdBit_Flags = BIT(1),
BtdrvBleAdBit_Manufacturer = BIT(2),
BtdrvBleAdBit_TxPower = BIT(3),
BtdrvBleAdBit_Service32 = BIT(4),
BtdrvBleAdBit_IntRange = BIT(5),
BtdrvBleAdBit_Service = BIT(6),
BtdrvBleAdBit_ServiceSol = BIT(7),
BtdrvBleAdBit_ServiceData = BIT(8),
BtdrvBleAdBit_SignData = BIT(9),
BtdrvBleAdBit_Service128Sol = BIT(10),
BtdrvBleAdBit_Appearance = BIT(11),
BtdrvBleAdBit_PublicAddress = BIT(12),
BtdrvBleAdBit_RandomAddress = BIT(13),
BtdrvBleAdBit_Service32Sol = BIT(14),
BtdrvBleAdBit_Proprietary = BIT(15),
BtdrvBleAdBit_Service128 = BIT(16),
} BtdrvBleAdBit;
/// BtdrvBleAdFlag
typedef enum {
BtdrvBleAdFlag_None = 0,
BtdrvBleAdFlag_LimitedDiscovery = BIT(0),
BtdrvBleAdFlag_GeneralDiscovery = BIT(1),
BtdrvBleAdFlag_BrEdrNotSupported = BIT(2),
BtdrvBleAdFlag_DualModeControllerSupport = BIT(3),
BtdrvBleAdFlag_DualModeHostSupport = BIT(4),
} BtdrvBleAdFlag;
/// AudioEventType
typedef enum {
BtdrvAudioEventType_None = 0, ///< None
BtdrvAudioEventType_Connection = 1, ///< Connection
} BtdrvAudioEventType;
/// AudioOutState
typedef enum {
BtdrvAudioOutState_Stopped = 0, ///< Stopped
BtdrvAudioOutState_Started = 1, ///< Started
} BtdrvAudioOutState;
/// AudioCodec
typedef enum {
BtdrvAudioCodec_Pcm = 0, ///< Raw PCM
} BtdrvAudioCodec;
/// Address
typedef struct {
u8 address[0x6]; ///< Address
} BtdrvAddress;
/// ClassOfDevice
typedef struct {
u8 class_of_device[0x3]; ///< ClassOfDevice
} BtdrvClassOfDevice;
/// AdapterProperty [1.0.0-11.0.1]
typedef struct {
BtdrvAddress addr; ///< Same as the data for ::BtdrvBluetoothPropertyType_Address.
BtdrvClassOfDevice class_of_device; ///< Same as the data for ::BtdrvBluetoothPropertyType_ClassOfDevice.
char name[0xF9]; ///< Same as the data for ::BtdrvBluetoothPropertyType_Name (last byte is not initialized).
u8 feature_set; ///< Set to hard-coded value 0x68 (same as the data for ::BtdrvBluetoothPropertyType_FeatureSet).
} BtdrvAdapterPropertyOld;
/// AdapterProperty [12.0.0+]
typedef struct {
u8 type; ///< \ref BtdrvAdapterPropertyType
u8 size; ///< Data size.
u8 data[0x100]; ///< Data (above size), as specified by the type.
} BtdrvAdapterProperty;
/// AdapterPropertySet [12.0.0+]
typedef struct {
BtdrvAddress addr; ///< Same as the data for ::BtdrvBluetoothPropertyType_Address.
BtdrvClassOfDevice class_of_device; ///< Same as the data for ::BtdrvBluetoothPropertyType_ClassOfDevice.
char name[0xF9]; ///< Same as the data for ::BtdrvBluetoothPropertyType_Name.
} BtdrvAdapterPropertySet;
/// BluetoothPinCode [1.0.0-11.0.1]
typedef struct {
char code[0x10]; ///< PinCode
} BtdrvBluetoothPinCode;
/// BtdrvPinCode [12.0.0+]
typedef struct {
char code[0x10]; ///< PinCode
u8 length; ///< Length
} BtdrvPinCode;
/// HidData [1.0.0-8.1.1]
typedef struct {
u16 size; ///< Size of data.
u8 data[0x280]; ///< Data
} BtdrvHidData;
/// HidReport [9.0.0+].
typedef struct {
u16 size; ///< Size of data.
u8 data[0x2BC]; ///< Data
} BtdrvHidReport;
/// PlrStatistics
typedef struct {
u8 unk_x0[0x84]; ///< Unknown
} BtdrvPlrStatistics;
/// PlrList
typedef struct {
u8 unk_x0[0xA4]; ///< Unknown
} BtdrvPlrList;
/// ChannelMapList
typedef struct {
u8 unk_x0[0x88]; ///< Unknown
} BtdrvChannelMapList;
/// GattAttributeUuid
typedef struct {
u32 size; ///< UUID size, must be 0x2, 0x4, or 0x10.
u8 uuid[0x10]; ///< UUID with the above size.
} BtdrvGattAttributeUuid;
/// GattId
typedef struct {
u8 instance_id; ///< InstanceId
u8 pad[3]; ///< Padding
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
} BtdrvGattId;
/// GattAttribute
typedef struct {
BtdrvGattId id; ///< \ref BtdrvGattId
u16 type; ///< \ref BtdrvGattAttributeType
u16 handle;
u16 group_end_handle;
u8 property; ///< Only used when type is characteristic. \ref BtdrvGattCharacteristicProperty
bool is_primary; ///< Only used when type is service
} BtdrvGattAttribute;
/// LeConnectionParams [5.0.0-8.1.1]
typedef struct {
BtdrvAddress addr; ///< \ref BtdrvAddress
u16 min_conn_interval; ///< Minimum connection interval
u16 max_conn_interval; ///< Maximum connection interval
u16 scan_interval; ///< Scan interval
u16 scan_window; ///< Scan window
u16 slave_latency; ///< Slave latency
u16 supervision_tout; ///< Connection supervision timeout multiplier
u8 preference; ///< Unused
u8 pad; ///< Padding
} BtdrvLeConnectionParams;
/// BleConnectionParameter [9.0.0+]
typedef struct {
u16 min_conn_interval; ///< Minimum connection interval
u16 max_conn_interval; ///< Maximum connection interval
u16 scan_interval; ///< Scan interval
u16 scan_window; ///< Scan window
u16 slave_latency; ///< Slave latency
u16 supervision_tout; ///< Connection supervision timeout multiplier
} BtdrvBleConnectionParameter;
/// BtdrvBleAdvertisePacketData
typedef struct {
u32 adv_data_mask; ///< Bitmask of following AD data to be included in advertising packets \ref BtdrvBleAdBit
u8 flag; ///< AD flag value to be advertised \ref BtdrvBleAdFlag. Included with BtdrvBleAdBit_Flags
u8 manu_data_len; ///< Size of manu_data below
u8 manu_data[0x1F]; ///< Manufacturer-specific data to be advertised. Included with BtdrvBleAdBit_Manufacturer
u8 pad[1]; ///< Padding
u16 appearance_data; ///< Device appearance data to be advertised \ref BtdrvAppearanceType. Included with BtdrvBleAdBit_Appearance
u8 num_service; ///< Number of services in uuid_val array below
u8 pad2[3]; ///< Padding
BtdrvGattAttributeUuid uuid_val[0x6]; ///< Array of 16-bit UUIDs to be advertised \ref BtdrvGattAttributeUuid. Included with BtdrvBleAdBit_Service
u8 service_data_len; ///< Size of service_data below
u8 pad3[1]; ///< Padding
u16 service_data_uuid; ///< 16-bit UUID of service_data below
u8 service_data[0x1F]; ///< Service data to be advertised. Included with BtdrvBleAdBit_ServiceData
bool is_scan_rsp; ///< Whether this is an inquiry scan response or advertising data
u8 tx_power; ///< Inquiry transmit power to be advertised. Included with BtdrvBleAdBit_TxPower
u8 pad4[3]; ///< Padding
} BtdrvBleAdvertisePacketData;
/// BleAdvertisement
typedef struct {
u8 size; ///< Size of data below.
u8 type; ///< \ref BtdrvAdType
u8 data[0x1D]; ///< Advertisement data
} BtdrvBleAdvertisement;
/// BleAdvertiseFilter
typedef struct {
u8 index; ///< Filter index
BtdrvBleAdvertisement adv; ///< \ref BtdrvBleAdvertisement
u8 mask[0x1D]; ///< Mask for advertisement data above
u8 mask_size; ///< Size of mask above.
} BtdrvBleAdvertiseFilter;
/// BleAdvertisePacketParameter
typedef struct {
u16 company_id;
u8 pattern_data[6];
} BtdrvBleAdvertisePacketParameter;
/// BleScanResult
typedef struct {
u8 unk_x0; ///< Unknown
BtdrvAddress addr; ///< \ref BtdrvAddress
u8 unk_x7[0x139]; ///< Unknown
s32 count; ///< Unknown
s32 unk_x144; ///< Unknown
} BtdrvBleScanResult;
/// BleConnectionInfo
typedef struct {
u32 connection_handle; ///< ConnectionHandle, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid.
BtdrvAddress addr; ///< \ref BtdrvAddress
u8 pad[2]; ///< Padding
} BtdrvBleConnectionInfo;
/// LeEventInfo
typedef struct {
u32 unk_x0; ///< Unknown
u32 unk_x4; ///< Unknown
u8 unk_x8; ///< Unknown
u8 pad[3]; ///< Padding
BtdrvGattAttributeUuid uuid0; ///< \ref BtdrvGattAttributeUuid
BtdrvGattAttributeUuid uuid1; ///< \ref BtdrvGattAttributeUuid
BtdrvGattAttributeUuid uuid2; ///< \ref BtdrvGattAttributeUuid
u16 size; ///< Size of the below data.
u8 data[0x3B6]; ///< Data.
} BtdrvLeEventInfo;
/// BleClientGattOperationInfo
typedef struct {
u8 unk_x0; ///< Converted from BtdrvLeEventInfo::unk_x0.
u8 pad[3]; ///< Padding
u32 unk_x4; ///< BtdrvLeEventInfo::unk_x4
u8 unk_x8; ///< BtdrvLeEventInfo::unk_x8
u8 pad2[3]; ///< Padding
BtdrvGattAttributeUuid uuid0; ///< BtdrvLeEventInfo::uuid0
BtdrvGattAttributeUuid uuid1; ///< BtdrvLeEventInfo::uuid1
BtdrvGattAttributeUuid uuid2; ///< BtdrvLeEventInfo::uuid2
u64 size; ///< BtdrvLeEventInfo::size
u8 data[0x200]; ///< BtdrvLeEventInfo::data
} BtdrvBleClientGattOperationInfo;
/// PcmParameter
typedef struct {
u32 unk_x0; ///< Must be 0-3. Controls number of channels: 0 = mono, non-zero = stereo.
s32 sample_rate; ///< Sample rate. Must be one of the following: 16000, 32000, 44100, 48000.
u32 bits_per_sample; ///< Bits per sample. Must be 8 or 16.
} BtdrvPcmParameter;
/// AudioControlButtonState
typedef struct {
u8 unk_x0[0x10]; ///< Unknown
} BtdrvAudioControlButtonState;

View File

@ -0,0 +1,491 @@
/**
* @file btm.h
* @brief btm service IPC wrapper.
* @note See also: https://switchbrew.org/wiki/BTM_services
* @author yellows8
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/btdrv_types.h"
#include "../services/btm_types.h"
#include "../sf/service.h"
/// Initialize btm.
Result btmInitialize(void);
/// Exit btm.
void btmExit(void);
/// Gets the Service object for the actual btm service session.
Service* btmGetServiceSession(void);
/**
* @brief GetState
* @param[out] out \ref BtmState
*/
Result btmGetState(BtmState *out);
/**
* @brief GetHostDeviceProperty
* @param[out] out \ref BtmHostDeviceProperty
*/
Result btmGetHostDeviceProperty(BtmHostDeviceProperty *out);
/**
* @brief AcquireDeviceConditionEvent
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireDeviceConditionEvent(Event* out_event);
/**
* @brief GetDeviceCondition [1.0.0-12.1.0]
* @param[out] out \ref BtmDeviceCondition
*/
Result btmLegacyGetDeviceCondition(BtmDeviceCondition *out);
/**
* @brief GetDeviceCondition [13.0.0+]
* @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile.
* @param[out] out \ref BtmConnectedDeviceV13
* @param[in] count Size of the out array in entries.
* @param[out] total_out Total output entries.
*/
Result btmGetDeviceCondition(BtmProfile profile, BtmConnectedDeviceV13 *out, size_t count, s32 *total_out);
/**
* @brief SetBurstMode
* @param[in] addr \ref BtdrvAddress
* @param[in] flag Flag
*/
Result btmSetBurstMode(BtdrvAddress addr, bool flag);
/**
* @brief SetSlotMode
* @param[in] list \ref BtmDeviceSlotModeList
*/
Result btmSetSlotMode(const BtmDeviceSlotModeList *list);
/**
* @brief SetBluetoothMode
* @note Only available on pre-9.0.0.
* @param[in] mode \ref BtmBluetoothMode
*/
Result btmSetBluetoothMode(BtmBluetoothMode mode);
/**
* @brief SetWlanMode
* @param[in] mode \ref BtmWlanMode
*/
Result btmSetWlanMode(BtmWlanMode mode);
/**
* @brief AcquireDeviceInfoEvent
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireDeviceInfoEvent(Event* out_event);
/**
* @brief GetDeviceInfo [1.0.0-12.1.0]
* @param[out] out \ref BtmDeviceInfoList
*/
Result btmLegacyGetDeviceInfo(BtmDeviceInfoList *out);
/**
* @brief GetDeviceInfo [13.0.0+]
* @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile.
* @param[out] out \ref BtmDeviceInfoV13
* @param[in] count Size of the out array in entries.
* @param[out] total_out Total output entries.
*/
Result btmGetDeviceInfo(BtmProfile profile, BtmDeviceInfoV13 *out, size_t count, s32 *total_out);
/**
* @brief AddDeviceInfo
* @param[in] info \ref BtmDeviceInfo
*/
Result btmAddDeviceInfo(const BtmDeviceInfo *info);
/**
* @brief RemoveDeviceInfo
* @param[in] addr \ref BtdrvAddress
*/
Result btmRemoveDeviceInfo(BtdrvAddress addr);
/**
* @brief IncreaseDeviceInfoOrder
* @param[in] addr \ref BtdrvAddress
*/
Result btmIncreaseDeviceInfoOrder(BtdrvAddress addr);
/**
* @brief LlrNotify
* @param[in] addr \ref BtdrvAddress
* @param[in] unk [9.0.0+] Unknown
*/
Result btmLlrNotify(BtdrvAddress addr, s32 unk);
/**
* @brief EnableRadio
*/
Result btmEnableRadio(void);
/**
* @brief DisableRadio
*/
Result btmDisableRadio(void);
/**
* @brief HidDisconnect
* @param[in] addr \ref BtdrvAddress
*/
Result btmHidDisconnect(BtdrvAddress addr);
/**
* @brief HidSetRetransmissionMode
* @param[in] addr \ref BtdrvAddress
* @param[in] list \ref BtmZeroRetransmissionList
*/
Result btmHidSetRetransmissionMode(BtdrvAddress addr, const BtmZeroRetransmissionList *list);
/**
* @brief AcquireAwakeReqEvent
* @note Only available on [2.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireAwakeReqEvent(Event* out_event);
/**
* @brief AcquireLlrStateEvent
* @note Only available on [4.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireLlrStateEvent(Event* out_event);
/**
* @brief IsLlrStarted
* @note Only available on [4.0.0+].
* @param[out] out Output flag.
*/
Result btmIsLlrStarted(bool *out);
/**
* @brief EnableSlotSaving
* @note Only available on [4.0.0+].
* @param[in] flag Flag
*/
Result btmEnableSlotSaving(bool flag);
/**
* @brief ProtectDeviceInfo
* @note Only available on [5.0.0+].
* @param[in] addr \ref BtdrvAddress
* @param[in] flag Flag
*/
Result btmProtectDeviceInfo(BtdrvAddress addr, bool flag);
/**
* @brief AcquireBleScanEvent
* @note Only available on [5.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleScanEvent(Event* out_event);
/**
* @brief GetBleScanParameterGeneral
* @note Only available on [5.1.0+].
* @param[in] parameter_id Must be value 0x1 or 0xFFFF.
* @param[out] out \ref BtdrvBleAdvertisePacketParameter
*/
Result btmGetBleScanParameterGeneral(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out);
/**
* @brief GetBleScanParameterSmartDevice
* @note Only available on [5.1.0+].
* @param[in] parameter_id Must be value 0x2.
* @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0.
*/
Result btmGetBleScanParameterSmartDevice(u16 parameter_id, BtdrvGattAttributeUuid *out);
/**
* @brief StartBleScanForGeneral
* @note Only available on [5.1.0+].
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmStartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param);
/**
* @brief StopBleScanForGeneral
* @note Only available on [5.1.0+].
*/
Result btmStopBleScanForGeneral(void);
/**
* @brief GetBleScanResultsForGeneral
* @note Only available on [5.1.0+].
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries. The max is 10.
* @param[out] total_out Total output entries.
*/
Result btmGetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/**
* @brief StartBleScanForPaired
* @note Only available on [5.1.0+].
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmStartBleScanForPaired(BtdrvBleAdvertisePacketParameter param);
/**
* @brief StopBleScanForPaired
* @note Only available on [5.1.0+].
*/
Result btmStopBleScanForPaired(void);
/**
* @brief StartBleScanForSmartDevice
* @note Only available on [5.1.0+].
* @param[in] uuid \ref BtdrvGattAttributeUuid
*/
Result btmStartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid);
/**
* @brief StopBleScanForSmartDevice
* @note Only available on [5.1.0+].
*/
Result btmStopBleScanForSmartDevice(void);
/**
* @brief GetBleScanResultsForSmartDevice
* @note Only available on [5.1.0+].
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries. The max is 10.
* @param[out] total_out Total output entries.
*/
Result btmGetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/**
* @brief AcquireBleConnectionEvent
* @note Only available on [5.1.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleConnectionEvent(Event* out_event);
/**
* @brief BleConnect
* @note Only available on [5.0.0+].
* @note The \ref BtdrvAddress must not be already connected. A maximum of 4 devices can be connected.
* @param[in] addr \ref BtdrvAddress
*/
Result btmBleConnect(BtdrvAddress addr);
/**
* @brief BleOverrideConnection
* @note Only available on [5.1.0+].
* @param[in] id Same as \ref btmBleDisconnect.
*/
Result btmBleOverrideConnection(u32 id);
/**
* @brief BleDisconnect
* @note Only available on [5.0.0+].
* @param[in] connection_handle This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
*/
Result btmBleDisconnect(u32 connection_handle);
/**
* @brief BleGetConnectionState
* @note Only available on [5.0.0+].
* @param[out] info Output array of \ref BtdrvBleConnectionInfo.
* @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4.
* @param[out] total_out Total output entries.
*/
Result btmBleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out);
/**
* @brief BleGetGattClientConditionList
* @note Only available on [5.0.0+].
* @param[out] list \ref BtmGattClientConditionList
*/
Result btmBleGetGattClientConditionList(BtmGattClientConditionList *list);
/**
* @brief AcquireBlePairingEvent
* @note Only available on [5.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBlePairingEvent(Event* out_event);
/**
* @brief BlePairDevice
* @note Only available on [5.1.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnpairDeviceOnBoth
* @note Only available on [5.1.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmBleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnPairDevice
* @note Only available on [5.1.0+].
* @param[in] addr \ref BtdrvAddress
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmBleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleGetPairedAddresses
* @note Only available on [5.1.0+].
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
* @param[out] addrs Output array of \ref BtdrvAddress.
* @param[in] count Size of the addrs array in entries.
* @param[out] total_out Total output entries. The max is 10.
*/
Result btmBleGetPairedAddresses(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out);
/**
* @brief AcquireBleServiceDiscoveryEvent
* @note Only available on [5.1.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleServiceDiscoveryEvent(Event* out_event);
/**
* @brief GetGattServices
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[out] services Output array of \ref BtmGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out);
/**
* @brief Same as \ref btmGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid.
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
/**
* @brief Same as \ref btmGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields.
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] service_handle ServiceHandle
* @param[out] services \ref BtmGattService
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] out Output value.
*/
Result btmGetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out);
/**
* @brief This is similar to \ref btmGetGattIncludedServices except this only returns 1 \ref BtmGattService.
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] attribute_handle AttributeHandle
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmGetBelongingService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag);
/**
* @brief GetGattCharacteristics
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return.
* @param[out] characteristics \ref BtmGattCharacteristic
* @param[in] count Size of the characteristics array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
/**
* @brief GetGattDescriptors
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return.
* @param[out] descriptors \ref BtmGattDescriptor
* @param[in] count Size of the descriptors array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
/**
* @brief AcquireBleMtuConfigEvent
* @note Only available on [5.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleMtuConfigEvent(Event* out_event);
/**
* @brief ConfigureBleMtu
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] mtu MTU
*/
Result btmConfigureBleMtu(u32 connection_handle, u16 mtu);
/**
* @brief GetBleMtu
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[out] out Output MTU.
*/
Result btmGetBleMtu(u32 connection_handle, u16 *out);
/**
* @brief RegisterBleGattDataPath
* @note Only available on [5.0.0+].
* @param[in] path \ref BtmBleDataPath
*/
Result btmRegisterBleGattDataPath(const BtmBleDataPath *path);
/**
* @brief UnregisterBleGattDataPath
* @note Only available on [5.0.0+].
* @param[in] path \ref BtmBleDataPath
*/
Result btmUnregisterBleGattDataPath(const BtmBleDataPath *path);
/**
* @brief RegisterAppletResourceUserId
* @note Only available on [5.0.0+].
* @param[in] AppletResourceUserId AppletResourceUserId
* @param[in] unk Unknown
*/
Result btmRegisterAppletResourceUserId(u64 AppletResourceUserId, u32 unk);
/**
* @brief UnregisterAppletResourceUserId
* @note Only available on [5.0.0+].
* @param[in] AppletResourceUserId AppletResourceUserId
*/
Result btmUnregisterAppletResourceUserId(u64 AppletResourceUserId);
/**
* @brief SetAppletResourceUserId
* @note Only available on [5.0.0+].
* @param[in] AppletResourceUserId AppletResourceUserId
*/
Result btmSetAppletResourceUserId(u64 AppletResourceUserId);

View File

@ -0,0 +1,305 @@
/**
* @file btm_types.h
* @brief btm service types.
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
/// BtmState
typedef enum {
BtmState_NotInitialized = 0, ///< NotInitialized
BtmState_RadioOff = 1, ///< RadioOff
BtmState_MinorSlept = 2, ///< MinorSlept
BtmState_RadioOffMinorSlept = 3, ///< RadioOffMinorSlept
BtmState_Slept = 4, ///< Slept
BtmState_RadioOffSlept = 5, ///< RadioOffSlept
BtmState_Initialized = 6, ///< Initialized
BtmState_Working = 7, ///< Working
} BtmState;
/// BluetoothMode
typedef enum {
BtmBluetoothMode_Dynamic2Slot = 0, ///< Dynamic2Slot
BtmBluetoothMode_StaticJoy = 1, ///< StaticJoy
} BtmBluetoothMode;
/// WlanMode
typedef enum {
BtmWlanMode_Local4 = 0, ///< Local4
BtmWlanMode_Local8 = 1, ///< Local8
BtmWlanMode_None = 2, ///< None
} BtmWlanMode;
/// TsiMode
typedef enum {
BtmTsiMode_0Fd3Td3Si10 = 0, ///< 0Fd3Td3Si10
BtmTsiMode_1Fd1Td1Si5 = 1, ///< 1Fd1Td1Si5
BtmTsiMode_2Fd1Td3Si10 = 2, ///< 2Fd1Td3Si10
BtmTsiMode_3Fd1Td5Si15 = 3, ///< 3Fd1Td5Si15
BtmTsiMode_4Fd3Td1Si10 = 4, ///< 4Fd3Td1Si10
BtmTsiMode_5Fd3Td3Si15 = 5, ///< 5Fd3Td3Si15
BtmTsiMode_6Fd5Td1Si15 = 6, ///< 6Fd5Td1Si15
BtmTsiMode_7Fd1Td3Si15 = 7, ///< 7Fd1Td3Si15
BtmTsiMode_8Fd3Td1Si15 = 8, ///< 8Fd3Td1Si15
BtmTsiMode_9Fd1Td1Si10 = 9, ///< 9Fd1Td1Si10
BtmTsiMode_10Fd1Td1Si15 = 10, ///< 10Fd1Td1Si15
BtmTsiMode_Active = 255, ///< Active
} BtmTsiMode;
/// SlotMode
typedef enum {
BtmSlotMode_2 = 0, ///< 2
BtmSlotMode_4 = 1, ///< 4
BtmSlotMode_6 = 2, ///< 6
BtmSlotMode_Active = 3, ///< Active
} BtmSlotMode;
/// Profile
typedef enum {
BtmProfile_None = 0, ///< None
BtmProfile_Hid = 1, ///< Hid
BtmProfile_Audio = 2, ///< [13.0.0+] Audio
} BtmProfile;
/// BdName
typedef struct {
char name[0x20]; ///< Name string.
} BtmBdName;
/// ClassOfDevice
typedef struct {
u8 class_of_device[0x3]; ///< ClassOfDevice
} BtmClassOfDevice;
/// LinkKey
typedef struct {
u8 link_key[0x10]; ///< LinkKey
} BtmLinkKey;
/// HidDeviceInfo
typedef struct {
u16 vid; ///< Vid
u16 pid; ///< Pid
} BtmHidDeviceInfo;
/// HostDeviceProperty
typedef struct {
union {
struct {
BtdrvAddress addr; ///< Same as BtdrvAdapterProperty::addr.
BtmClassOfDevice class_of_device; ///< Same as BtdrvAdapterProperty::class_of_device.
BtmBdName name; ///< Same as BtdrvAdapterProperty::name (except the last byte which is always zero).
u8 feature_set; ///< Same as BtdrvAdapterProperty::feature_set.
} v1; ///< [1.0.0-12.1.0]
struct {
BtdrvAddress addr; ///< Same as BtdrvAdapterProperty::addr.
BtmClassOfDevice class_of_device; ///< Same as BtdrvAdapterProperty::class_of_device.
char name[0xF9]; ///< Same as BtdrvAdapterProperty::name (except the last byte which is always zero).
u8 feature_set; ///< Same as BtdrvAdapterProperty::feature_set.
} v13; ///< [13.0.0+]
};
} BtmHostDeviceProperty;
/// BtmConnectedDevice [1.0.0-12.1.0]
typedef struct {
BtdrvAddress address;
u8 pad[2];
u32 unk_x8;
char name[0x20];
u8 unk_x2C[0x1C];
u16 vid;
u16 pid;
u8 unk_x4C[0x20];
} BtmConnectedDeviceV1;
/// BtmConnectedDevice [13.0.0+]
typedef struct {
BtdrvAddress address;
u8 pad[2];
u32 profile; ///< \ref BtmProfile
u8 unk_xC[0x40];
char name[0x20];
u8 unk_x6C[0xD9];
u8 pad2[3];
} BtmConnectedDeviceV13;
/// DeviceCondition [1.0.0-5.0.2]
typedef struct {
u32 unk_x0;
u32 unk_x4;
u8 unk_x8;
u8 unk_x9;
u8 max_count;
u8 connected_count;
BtmConnectedDeviceV1 devices[8];
} BtmDeviceConditionV100;
/// DeviceCondition [5.1.0-7.0.1]
typedef struct {
u32 unk_x0;
u32 unk_x4;
u8 unk_x8;
u8 unk_x9[2];
u8 max_count;
u8 connected_count;
u8 pad[3];
BtmConnectedDeviceV1 devices[8];
} BtmDeviceConditionV510;
/// DeviceCondition [8.0.0-8.1.1]
typedef struct {
u32 unk_x0;
u32 unk_x4;
u8 unk_x8;
u8 unk_x9;
u8 max_count;
u8 connected_count;
BtmConnectedDeviceV1 devices[8];
} BtmDeviceConditionV800;
/// DeviceCondition [9.0.0-12.1.0]
typedef struct {
u32 unk_x0;
u8 unk_x4;
u8 unk_x5;
u8 max_count;
u8 connected_count;
BtmConnectedDeviceV1 devices[8];
} BtmDeviceConditionV900;
/// DeviceCondition [1.0.0-12.1.0]
typedef union {
BtmDeviceConditionV100 v100;
BtmDeviceConditionV510 v510;
BtmDeviceConditionV800 v800;
BtmDeviceConditionV900 v900;
} BtmDeviceCondition;
/// DeviceSlotMode
typedef struct {
BtdrvAddress addr; ///< \ref BtdrvAddress
u8 reserved[2]; ///< Reserved
u32 slot_mode; ///< \ref BtmSlotMode
} BtmDeviceSlotMode;
/// DeviceSlotModeList
typedef struct {
u8 device_count; ///< DeviceCount
u8 reserved[3]; ///< Reserved
BtmDeviceSlotMode devices[8]; ///< Array of \ref BtmDeviceSlotMode with the above count.
} BtmDeviceSlotModeList;
/// DeviceInfo [1.0.0-12.1.0]
typedef struct {
BtdrvAddress addr; ///< \ref BtdrvAddress
BtmClassOfDevice class_of_device; ///< ClassOfDevice
BtmBdName name; ///< BdName
BtmLinkKey link_key; ///< LinkKey
u8 reserved[3]; ///< Reserved
u32 profile; ///< \ref BtmProfile
union {
u8 data[0x4]; ///< Empty (Profile = None)
BtmHidDeviceInfo hid_device_info; ///< \ref BtmHidDeviceInfo (Profile = Hid)
} profile_info;
u8 reserved2[0x1C]; ///< Reserved
} BtmDeviceInfoV1;
/// DeviceInfo [13.0.0+]
typedef struct {
BtdrvAddress addr; ///< \ref BtdrvAddress
BtmClassOfDevice class_of_device; ///< ClassOfDevice
BtmLinkKey link_key; ///< LinkKey
u8 reserved[3]; ///< Reserved
u32 profile; ///< \ref BtmProfile
union {
u8 data[0x4]; ///< Empty (Profile = None)
BtmHidDeviceInfo hid_device_info; ///< \ref BtmHidDeviceInfo (Profile = Hid)
} profile_info;
u8 reserved2[0x1C]; ///< Reserved
char name[0xF9]; ///< Name
u8 pad[3]; ///< Padding
} BtmDeviceInfoV13;
/// DeviceInfo [1.0.0-13.0.0]
typedef union {
BtmDeviceInfoV1 v1;
BtmDeviceInfoV13 v13;
} BtmDeviceInfo;
/// DeviceInfoList
typedef struct {
u8 device_count; ///< DeviceCount
u8 reserved[3]; ///< Reserved
BtmDeviceInfoV1 devices[10]; ///< Array of \ref BtmDeviceInfoV1 with the above count.
} BtmDeviceInfoList;
/// DeviceProperty
typedef struct {
BtdrvAddress addr; ///< \ref BtdrvAddress
BtmClassOfDevice class_of_device; ///< ClassOfDevice
BtmBdName name; ///< BdName
} BtmDeviceProperty;
/// DevicePropertyList
typedef struct {
u8 device_count; ///< DeviceCount
BtmDeviceProperty devices[15]; ///< Array of \ref BtmDeviceProperty.
} BtmDevicePropertyList;
/// ZeroRetransmissionList
typedef struct {
u8 enabled_report_id_count; ///< EnabledReportIdCount
u8 enabled_report_id[0x10]; ///< Array of EnabledReportId.
} BtmZeroRetransmissionList;
/// GattClientConditionList
typedef struct {
u8 unk_x0[0x74]; ///< Unknown
} BtmGattClientConditionList;
/// GattService
typedef struct {
u8 unk_x0[0x4]; ///< Unknown
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
u16 handle; ///< Handle
u8 unk_x1A[0x2]; ///< Unknown
u16 instance_id; ///< InstanceId
u16 end_group_handle; ///< EndGroupHandle
u8 primary_service; ///< PrimaryService
u8 pad[3]; ///< Padding
} BtmGattService;
/// GattCharacteristic
typedef struct {
u8 unk_x0[0x4]; ///< Unknown
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
u16 handle; ///< Handle
u8 unk_x1A[0x2]; ///< Unknown
u16 instance_id; ///< InstanceId
u8 properties; ///< Properties
u8 unk_x1F[0x5]; ///< Unknown
} BtmGattCharacteristic;
/// GattDescriptor
typedef struct {
u8 unk_x0[0x4]; ///< Unknown
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
u16 handle; ///< Handle
u8 unk_x1A[0x6]; ///< Unknown
} BtmGattDescriptor;
/// BleDataPath
typedef struct {
u8 unk_x0; ///< Unknown
u8 pad[3]; ///< Padding
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
} BtmBleDataPath;
/// AudioDevice
typedef struct {
BtdrvAddress addr; ///< Device address
char name[0xF9]; ///< Device name
} BtmAudioDevice;

View File

@ -0,0 +1,185 @@
/**
* @file btmsys.h
* @brief btm:sys (btm system) service IPC wrapper.
* @author yellows8
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/btdrv_types.h"
#include "../services/btm_types.h"
#include "../sf/service.h"
/// Initialize btm:sys.
Result btmsysInitialize(void);
/// Exit btm:sys.
void btmsysExit(void);
/// Gets the Service object for the actual btm:sys service session. This object must be closed by the user once finished using cmds with this.
Result btmsysGetServiceSession(Service* srv_out);
/// Gets the Service object for IBtmSystemCore.
Service* btmsysGetServiceSession_IBtmSystemCore(void);
/**
* @brief StartGamepadPairing
*/
Result btmsysStartGamepadPairing(void);
/**
* @brief CancelGamepadPairing
*/
Result btmsysCancelGamepadPairing(void);
/**
* @brief ClearGamepadPairingDatabase
*/
Result btmsysClearGamepadPairingDatabase(void);
/**
* @brief GetPairedGamepadCount
* @param[out] out Output count.
*/
Result btmsysGetPairedGamepadCount(u8 *out);
/**
* @brief EnableRadio
*/
Result btmsysEnableRadio(void);
/**
* @brief DisableRadio
*/
Result btmsysDisableRadio(void);
/**
* @brief GetRadioOnOff
* @param[out] out Output flag.
*/
Result btmsysGetRadioOnOff(bool *out);
/**
* @brief AcquireRadioEvent
* @note Only available on [3.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmsysAcquireRadioEvent(Event* out_event);
/**
* @brief AcquireGamepadPairingEvent
* @note Only available on [3.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmsysAcquireGamepadPairingEvent(Event* out_event);
/**
* @brief IsGamepadPairingStarted
* @note Only available on [3.0.0+].
* @param[out] out Output flag.
*/
Result btmsysIsGamepadPairingStarted(bool *out);
/**
* @brief StartAudioDeviceDiscovery
* @note Only available on [13.0.0+].
*/
Result btmsysStartAudioDeviceDiscovery(void);
/**
* @brief StopAudioDeviceDiscovery
* @note Only available on [13.0.0+].
*/
Result btmsysStopAudioDeviceDiscovery(void);
/**
* @brief IsDiscoveryingAudioDevice
* @note Only available on [13.0.0+].
* @param[out] out Output flag.
*/
Result btmsysIsDiscoveryingAudioDevice(bool *out);
/**
* @brief GetDiscoveredAudioDevice
* @note Only available on [13.0.0+].
* @param[out] out Output array of \ref BtmAudioDevice.
* @param[in] count Size of the out array in entries. The max is 15.
* @param[out] total_out Total output entries.
*/
Result btmsysGetDiscoveredAudioDevice(BtmAudioDevice *out, s32 count, s32 *total_out);
/**
* @brief AcquireAudioDeviceConnectionEvent
* @note Only available on [13.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmsysAcquireAudioDeviceConnectionEvent(Event* out_event);
/**
* @brief ConnectAudioDevice
* @note Only available on [13.0.0+].
* @param[in] addr \ref BtdrvAddress
*/
Result btmsysConnectAudioDevice(BtdrvAddress addr);
/**
* @brief IsConnectingAudioDevice
* @note Only available on [13.0.0+].
* @param[out] out Output flag.
*/
Result btmsysIsConnectingAudioDevice(bool *out);
/**
* @brief GetConnectedAudioDevices
* @note Only available on [13.0.0+].
* @param[out] out Output array of \ref BtmAudioDevice.
* @param[in] count Size of the out array in entries. The max is 8.
* @param[out] total_out Total output entries.
*/
Result btmsysGetConnectedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out);
/**
* @brief DisconnectAudioDevice
* @note Only available on [13.0.0+].
* @param[in] addr \ref BtdrvAddress
*/
Result btmsysDisconnectAudioDevice(BtdrvAddress addr);
/**
* @brief AcquirePairedAudioDeviceInfoChangedEvent
* @note Only available on [13.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmsysAcquirePairedAudioDeviceInfoChangedEvent(Event* out_event);
/**
* @brief GetPairedAudioDevices
* @note Only available on [13.0.0+].
* @param[out] out Output array of \ref BtmAudioDevice.
* @param[in] count Size of the out array in entries. The max is 10.
* @param[out] total_out Total output entries.
*/
Result btmsysGetPairedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out);
/**
* @brief RemoveAudioDevicePairing
* @note Only available on [13.0.0+].
* @param[in] addr \ref BtdrvAddress
*/
Result btmsysRemoveAudioDevicePairing(BtdrvAddress addr);
/**
* @brief RequestAudioDeviceConnectionRejection
* @note Only available on [13.0.0+].
*/
Result btmsysRequestAudioDeviceConnectionRejection(void);
/**
* @brief CancelAudioDeviceConnectionRejection
* @note Only available on [13.0.0+].
*/
Result btmsysCancelAudioDeviceConnectionRejection(void);

View File

@ -0,0 +1,290 @@
/**
* @file btmu.h
* @brief btm:u (btm user) service IPC wrapper.
* @note Only available on [5.0.0+].
* @note See also btdev.
* @note See also: https://switchbrew.org/wiki/BTM_services
* @author yellows8
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/btdrv_types.h"
#include "../services/btm.h"
#include "../sf/service.h"
/// Initialize btm:u.
Result btmuInitialize(void);
/// Exit btm:u.
void btmuExit(void);
/// Gets the Service object for the actual btm:u service session. This object must be closed by the user once finished using cmds with this.
Result btmuGetServiceSession(Service* srv_out);
/// Gets the Service object for IBtmUserCore.
Service* btmuGetServiceSession_IBtmUserCore(void);
/**
* @brief AcquireBleScanEvent
* @note This is similar to \ref btmAcquireBleScanEvent.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmuAcquireBleScanEvent(Event* out_event);
/**
* @brief GetBleScanFilterParameter
* @note This is the same as \ref btmGetBleScanParameterGeneral.
* @param[in] parameter_id Must be value 0x1 or 0xFFFF.
* @param[out] out \ref BtdrvBleAdvertisePacketParameter
*/
Result btmuGetBleScanFilterParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out);
/**
* @brief GetBleScanFilterParameter2
* @note This is the same as \ref btmGetBleScanParameterSmartDevice.
* @param[in] parameter_id Must be value 0x2.
* @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0.
*/
Result btmuGetBleScanFilterParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out);
/**
* @brief StartBleScanForGeneral
* @note This is similar to \ref btmStartBleScanForGeneral.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmuStartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param);
/**
* @brief StopBleScanForGeneral
* @note This is similar to \ref btmStopBleScanForGeneral.
*/
Result btmuStopBleScanForGeneral(void);
/**
* @brief GetBleScanResultsForGeneral
* @note This is similar to \ref btmGetBleScanResultsForGeneral.
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries. The max is 10.
* @param[out] total_out Total output entries.
*/
Result btmuGetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/**
* @brief StartBleScanForPaired
* @note This is similar to \ref btmStartBleScanForPaired.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmuStartBleScanForPaired(BtdrvBleAdvertisePacketParameter param);
/**
* @brief StopBleScanForPaired
* @note This is similar to \ref btmStopBleScanForPaired.
*/
Result btmuStopBleScanForPaired(void);
/**
* @brief StartBleScanForSmartDevice
* @note This is similar to \ref btmStartBleScanForSmartDevice.
* @param[in] uuid \ref BtdrvGattAttributeUuid
*/
Result btmuStartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid);
/**
* @brief StopBleScanForSmartDevice
* @note This is similar to \ref btmStopBleScanForSmartDevice.
*/
Result btmuStopBleScanForSmartDevice(void);
/**
* @brief GetBleScanResultsForSmartDevice
* @note This is similar to \ref btmGetBleScanResultsForSmartDevice.
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries. The max is 10.
* @param[out] total_out Total output entries.
*/
Result btmuGetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/**
* @brief AcquireBleConnectionEvent
* @note This is similar to \ref btmAcquireBleConnectionEvent.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmuAcquireBleConnectionEvent(Event* out_event);
/**
* @brief BleConnect
* @note This is similar to \ref btmBleConnect.
* @param[in] addr \ref BtdrvAddress
*/
Result btmuBleConnect(BtdrvAddress addr);
/**
* @brief BleDisconnect
* @note This is similar to \ref btmBleDisconnect.
* @param[in] connection_handle This must match a BtdrvBleConnectionInfo::connection_handle from \ref btmuBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
*/
Result btmuBleDisconnect(u32 connection_handle);
/**
* @brief BleGetConnectionState
* @note This is similar to \ref btmBleGetConnectionState.
* @param[out] info Output array of \ref BtdrvBleConnectionInfo.
* @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4.
* @param[out] total_out Total output entries.
*/
Result btmuBleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out);
/**
* @brief AcquireBlePairingEvent
* @note This is similar to \ref btmAcquireBlePairingEvent.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmuAcquireBlePairingEvent(Event* out_event);
/**
* @brief BlePairDevice
* @note This is similar to \ref btmBlePairDevice.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmuBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnPairDevice
* @note This is similar to \ref btmBleUnpairDeviceOnBoth.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmuBleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnPairDevice2
* @note This is similar to \ref btmBleUnPairDevice.
* @param[in] addr \ref BtdrvAddress
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmuBleUnPairDevice2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleGetPairedDevices
* @note This is similar to \ref btmBleGetPairedAddresses.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
* @param[out] addrs Output array of \ref BtdrvAddress.
* @param[in] count Size of the addrs array in entries.
* @param[out] total_out Total output entries. The max is 10.
*/
Result btmuBleGetPairedDevices(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out);
/**
* @brief AcquireBleServiceDiscoveryEvent
* @note This is similar to \ref btmAcquireBleServiceDiscoveryEvent.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmuAcquireBleServiceDiscoveryEvent(Event* out_event);
/**
* @brief GetGattServices
* @note This is similar to \ref btmGetGattServices.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[out] services Output array of \ref BtmGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmuGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out);
/**
* @brief Same as \ref btmuGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid.
* @note This is similar to \ref btmGetGattService.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmuGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
/**
* @brief Same as \ref btmuGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields.
* @note This is similar to \ref btmGetGattIncludedServices.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] service_handle ServiceHandle
* @param[out] services \ref BtmGattService
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] out Output value.
*/
Result btmuGetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out);
/**
* @brief This is similar to \ref btmuGetGattIncludedServices except this only returns 1 \ref BtmGattService.
* @note This is similar to \ref btmGetBelongingService.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] attribute_handle AttributeHandle
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmuGetBelongingGattService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag);
/**
* @brief GetGattCharacteristics
* @note This is similar to \ref btmGetGattCharacteristics.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return.
* @param[out] characteristics \ref BtmGattCharacteristic
* @param[in] count Size of the characteristics array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmuGetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
/**
* @brief GetGattDescriptors
* @note This is similar to \ref btmGetGattDescriptors.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return.
* @param[out] descriptors \ref BtmGattDescriptor
* @param[in] count Size of the descriptors array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmuGetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
/**
* @brief AcquireBleMtuConfigEvent
* @note This is similar to \ref btmAcquireBleMtuConfigEvent.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmuAcquireBleMtuConfigEvent(Event* out_event);
/**
* @brief ConfigureBleMtu
* @note This is similar to \ref btmConfigureBleMtu.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] mtu MTU
*/
Result btmuConfigureBleMtu(u32 connection_handle, u16 mtu);
/**
* @brief GetBleMtu
* @note This is similar to \ref btmGetBleMtu.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[out] out Output MTU.
*/
Result btmuGetBleMtu(u32 connection_handle, u16 *out);
/**
* @brief RegisterBleGattDataPath
* @note This is similar to \ref btmRegisterBleGattDataPath.
* @param[in] path \ref BtmBleDataPath
*/
Result btmuRegisterBleGattDataPath(const BtmBleDataPath *path);
/**
* @brief UnregisterBleGattDataPath
* @note This is similar to \ref btmUnregisterBleGattDataPath.
* @param[in] path \ref BtmBleDataPath
*/
Result btmuUnregisterBleGattDataPath(const BtmBleDataPath *path);

View File

@ -0,0 +1,24 @@
/**
* @file capmtp.h
* @brief capmtp service IPC wrapper.
* @note Only available on [11.0.0+].
* @author Behemoth
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../sf/service.h"
Result capmtpInitialize(void* mem, size_t size, u32 app_count, u32 max_img, u32 max_vid, const char *other_name);
void capmtpExit(void);
Service* capmtpGetRootServiceSession(void);
Service* capmtpGetServiceSession(void);
Result capmtpStartCommandHandler(void);
Result capmtpStopCommandHandler(void);
bool capmtpIsRunning(void);
Event *capmtpGetConnectionEvent(void);
bool capmtpIsConnected(void);
Event *capmtpGetScanErrorEvent(void);
Result capmtpGetScanError(void);

View File

@ -18,10 +18,15 @@ typedef enum {
/// AlbumReportOption
typedef enum {
AlbumReportOption_Disable = 0, ///< Don't display the screenshot-taken Overlay-applet notification.
AlbumReportOption_Enable = 1, ///< Display the screenshot-taken Overlay notification.
AlbumReportOption_Disable = 0, ///< Don't display the screenshot-taken Overlay-applet notification.
AlbumReportOption_Enable = 1, ///< Display the screenshot-taken Overlay notification.
} AlbumReportOption;
typedef enum {
CapsAlbumStorage_Nand = 0, ///< Nand
CapsAlbumStorage_Sd = 1, ///< Sd
} CapsAlbumStorage;
/// ContentType
typedef enum {
CapsContentType_Screenshot = 0, ///< Album screenshots.
@ -58,68 +63,114 @@ typedef struct {
u8 reserved[0x18]; ///< Always zero.
} CapsScreenShotAttributeForApplication;
/// ScreenShotDecoderFlag
typedef enum {
CapsScreenShotDecoderFlag_None = 0, ///< No special processing.
CapsScreenShotDecoderFlag_EnableFancyUpsampling = BIT(0), ///< See libjpeg-turbo do_fancy_upsampling.
CapsScreenShotDecoderFlag_EnableBlockSmoothing = BIT(1), ///< See libjpeg-turbo do_block_smoothing.
} CapsScreenShotDecoderFlag;
/// ScreenShotDecodeOption
typedef struct {
u8 unk_x0[0x20]; ///< Unknown. Set to all-zero by official sw.
u64 flags; ///< Bitflags, see \ref CapsScreenShotDecoderFlag.
u64 reserved[0x3]; ///< Reserved. Unused by official sw.
} CapsScreenShotDecodeOption;
/// AlbumFileDateTime. This corresponds to each field in the Album entry filename, prior to the "-": "YYYYMMDDHHMMSSII".
typedef struct {
u16 year; ///< Year.
u8 month; ///< Month.
u8 day; ///< Day of the month.
u8 hour; ///< Hour.
u8 minute; ///< Minute.
u8 second; ///< Second.
u8 id; ///< Unique ID for when there's multiple Album files with the same timestamp.
u16 year; ///< Year.
u8 month; ///< Month.
u8 day; ///< Day of the month.
u8 hour; ///< Hour.
u8 minute; ///< Minute.
u8 second; ///< Second.
u8 id; ///< Unique ID for when there's multiple Album files with the same timestamp.
} CapsAlbumFileDateTime;
/// AlbumEntryId
typedef struct {
u64 program_id; ///< ProgramId.
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
u8 unk_x10; ///< Unknown.
u8 unk_x11; ///< Unknown.
u8 pad[6]; ///< Padding?
} CapsAlbumEntryId;
u64 application_id; ///< ApplicationId
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
u8 storage; ///< \ref CapsAlbumStorage
u8 content; ///< \ref CapsAlbumFileContents
u8 unknown_12; ///< [19.0.0+]
u8 unknown_13; ///< [19.0.0+]
u8 pad_x14[0x4]; ///< padding
} CapsAlbumFileId;
/// AlbumEntry
typedef struct {
u8 unk_x0[0x8]; ///< Unknown.
CapsAlbumEntryId id; ///< \ref CapsAlbumEntryId
u64 size; ///< Size.
CapsAlbumFileId file_id; ///< \ref CapsAlbumFileId
} CapsAlbumEntry;
/// ApplicationAlbumEntry
typedef struct {
union {
u8 data[0x20]; ///< Data.
u8 data[0x20]; ///< Data.
struct {
u8 unk_x0[0x20]; ///< Unknown.
u8 unk_x0[0x20]; ///< aes256 with random key over \ref AlbumEntry.
} v0; ///< Pre-7.0.0
struct {
u8 unk_x0[0x8]; ///< Unknown.
u8 unk_x8[0x8]; ///< Unknown.
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
u8 unk_x18[0x8]; ///< Unknown.
u64 size; ///< size of the entry
u64 hash; ///< aes256 with hardcoded key over \ref AlbumEntry.
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
u8 storage; ///< \ref CapsAlbumStorage
u8 content; ///< \ref CapsAlbumFileContents
u8 pad_x1a[0x5]; ///< padding
u8 unk_x1f; ///< Set to 1 by official software
} v1; ///< [7.0.0+]
};
} CapsApplicationAlbumEntry;
/// ApplicationAlbumFileEntry
typedef struct {
CapsApplicationAlbumEntry entry; ///< \ref CapsApplicationAlbumEntry
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
u64 unk_x28; ///< Unknown.
CapsApplicationAlbumEntry entry; ///< \ref CapsApplicationAlbumEntry
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
u64 unk_x28; ///< Unknown.
} CapsApplicationAlbumFileEntry;
/// ApplicationData
typedef struct {
u8 userdata[0x400]; ///< UserData.
u32 size; ///< UserData size.
u8 userdata[0x400]; ///< UserData.
u32 size; ///< UserData size.
} CapsApplicationData;
/// AlbumFileContents
typedef enum {
CapsAlbumFileContents_ScreenShot = 0,
CapsAlbumFileContents_Movie = 1,
CapsAlbumFileContents_ExtraScreenShot = 2,
CapsAlbumFileContents_ExtraMovie = 3,
} CapsAlbumFileContents;
typedef enum {
CapsAlbumContentsUsageFlag_HasGreaterUsage = BIT(0), ///< Indicates that there are additional files not captured by the count/size fields of CapsAlbumContentsUsage
CapsAlbumContentsUsageFlag_IsUnknownContents = BIT(1), ///< Indicates that the file is not a known content type
} CapsAlbumContentsUsageFlag;
typedef struct {
s64 count; ///< Count.
s64 size; ///< Size. Used storage space.
u32 flags; ///< \ref CapsAlbumContentsUsageFlag
u8 file_contents; ///< \ref CapsAlbumFileContents
u8 pad_x15[0x3]; ///< Unused
} CapsAlbumContentsUsage;
typedef struct {
CapsAlbumContentsUsage usages[2]; ///< \ref CapsAlbumContentsUsage
} CapsAlbumUsage2;
typedef struct {
CapsAlbumContentsUsage usages[3]; ///< \ref CapsAlbumContentsUsage
} CapsAlbumUsage3;
typedef struct {
CapsAlbumContentsUsage usages[16]; ///< \ref CapsAlbumContentsUsage
} CapsAlbumUsage16;
/// UserIdList
typedef struct {
AccountUid uids[ACC_USER_LIST_SIZE]; ///< \ref AccountUid
@ -136,6 +187,26 @@ typedef struct {
u8 reserved[0xac]; ///< Unused.
} CapsLoadAlbumScreenShotImageOutputForApplication;
/// LoadAlbumScreenShotImageOutput
typedef struct {
s64 width; ///< Width. Official sw copies this to a s32 output field.
s64 height; ///< Height. Official sw copies this to a s32 output field.
CapsScreenShotAttribute attr; ///< \ref CapsScreenShotAttribute
u8 unk_x50[0x400]; ///< Unused.
} CapsLoadAlbumScreenShotImageOutput;
/// AlbumFileContentsFlag
typedef enum {
CapsAlbumFileContentsFlag_ScreenShot = BIT(0), ///< Query for ScreenShot files.
CapsAlbumFileContentsFlag_Movie = BIT(1), ///< Query for Movie files.
} CapsAlbumFileContentsFlag;
/// AlbumCache
typedef struct {
u64 count; ///< Count
u64 unk_x8; ///< Unknown
} CapsAlbumCache;
/// Gets the ShimLibraryVersion.
u64 capsGetShimLibraryVersion(void);

View File

@ -0,0 +1,414 @@
/**
* @file capsa.h
* @brief Album Accessor (caps:a) service IPC wrapper.
* @author Behemoth
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
#include "../services/caps.h"
/// Initialize caps:a.
Result capsaInitialize(void);
/// Exit caps:a.
void capsaExit(void);
/// Gets the Service for caps:a.
Service* capsaGetServiceSession(void);
/// Gets the Service for IAlbumAccessorSession, only initialized after \ref capsaOpenAlbumMovieStream was used (unaffected by using \ref capsaCloseAlbumMovieStream).
Service* capsaGetServiceSession_Accessor(void);
/**
* @brief Gets the amount of files at a AlbumStorage.
* @param[in] storage \ref CapsAlbumStorage
* @param[out] count Amount of files.
*/
Result capsaGetAlbumFileCount(CapsAlbumStorage storage, u64 *count);
/**
* @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage matches the input one.
* @param[in] storage \ref CapsAlbumStorage
* @param[out] out Total output entries.
* @param[out] entries Output array of \ref CapsAlbumEntry.
* @param[in] count Reserved entry count.
*/
Result capsaGetAlbumFileList(CapsAlbumStorage storage, u64 *out, CapsAlbumEntry *entries, u64 count);
/**
* @brief Loads a file into the specified buffer.
* @param[in] file_id \ref CapsAlbumFileId
* @param[out] out_size Size of the AlbumFile.
* @param[out] filebuf File output buffer.
* @param[in] filebuf_size Size of the filebuf.
*/
Result capsaLoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* filebuf, u64 filebuf_size);
/**
* @brief Deletes an AlbumFile corresponding to the specified \ref CapsAlbumFileId.
* @param[in] file_id \ref CapsAlbumFileId
*/
Result capsaDeleteAlbumFile(const CapsAlbumFileId *file_id);
/**
* @brief Copies an AlbumFile to the specified \ref CapsAlbumStorage.
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] dst_storage \ref CapsAlbumStorage
*/
Result capsaStorageCopyAlbumFile(const CapsAlbumFileId *file_id, CapsAlbumStorage dst_storage);
/**
* @brief Gets the mount status of the specified \ref CapsAlbumStorage.
* @param[in] storage \ref CapsAlbumStorage
* @param[out] is_mounted Boolean over whether the storage is mounted or not.
*/
Result capsaIsAlbumMounted(CapsAlbumStorage storage, bool *is_mounted);
/**
* @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage.
* @param[in] storage \ref CapsAlbumStorage
* @param[out] out \ref CapsAlbumUsage2
*/
Result capsaGetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out);
/**
* @brief Gets the size for the specified AlbumFile.
* @param[in] file_id \ref CapsAlbumFileId
* @param[out] size Size of the file.
*/
Result capsaGetAlbumFileSize(const CapsAlbumFileId *file_id, u64 *size);
/**
* @brief Load the Thumbnail for the specified AlbumFile.
* @note Will always be 320x180.
* @param[in] file_id \ref CapsAlbumFileId
* @param[out] out_size Size of the Thumbnail.
* @param[out] image JPEG image output buffer.
* @param[in] image_size Image buffer size.
*/
Result capsaLoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size);
/**
* @brief Load the ScreenShotImage for the specified AlbumFile.
* @note Only available on [2.0.0+].
* @param[out] width Output image width. Optional, can be NULL.
* @param[out] height Output image height. Optional, can be NULL.
* @param[in] file_id \ref CapsAlbumFileId
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsaLoadAlbumScreenShotImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
* @note Only available on [2.0.0+].
* @param[out] width Output image width. Optional, can be NULL.
* @param[out] height Output image height. Optional, can be NULL.
* @param[in] file_id \ref CapsAlbumFileId
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsaLoadAlbumScreenShotThumbnailImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an ApplicationId.
* @note Only available on [2.0.0+].
* @param[out] entry \ref CapsAlbumEntry
* @param[in] application_entry \ref CapsApplicationAlbumEntry
* @param[in] application_id ApplicationId
*/
Result capsaGetAlbumEntryFromApplicationAlbumEntry(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry, u64 application_id);
/**
* @brief Load the ScreenShotImage for the specified AlbumFile.
* @note Only available on [3.0.0+].
* @param[out] width Output image width. Optional, can be NULL.
* @param[out] height Output image height. Optional, can be NULL.
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] opts \ref CapsScreenShotDecodeOption
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsaLoadAlbumScreenShotImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
* @note Only available on [3.0.0+].
* @param[out] width Output image width. Optional, can be NULL.
* @param[out] height Output image height. Optional, can be NULL.
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] opts \ref CapsScreenShotDecodeOption
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsaLoadAlbumScreenShotThumbnailImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Load the ScreenShotImage for the specified AlbumFile.
* @note Only available on [3.0.0+].
* @param[out] width Output image width. Optional, can be NULL.
* @param[out] height Output image height. Optional, can be NULL.
* @param[out] attr \ref CapsScreenShotAttribute
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] opts \ref CapsScreenShotDecodeOption
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsaLoadAlbumScreenShotImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage.
* @note Only available on [4.0.0+].
* @param[in] storage \ref CapsAlbumStorage
* @param[out] out \ref CapsAlbumUsage3
*/
Result capsaGetAlbumUsage3(CapsAlbumStorage storage, CapsAlbumUsage3 *out);
/**
* @brief Returns the result for a AlbumStorage mount.
* @note Only available on [4.0.0+].
* @param[in] storage \ref CapsAlbumStorage
*/
Result capsaGetAlbumMountResult(CapsAlbumStorage storage);
/**
* @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage.
* @note Only available on [4.0.0+].
* @param[in] storage \ref CapsAlbumStorage
* @param[in] flags \ref CapsAlbumFileContentsFlag
* @param[out] out \ref CapsAlbumUsage16
*/
Result capsaGetAlbumUsage16(CapsAlbumStorage storage, u8 flags, CapsAlbumUsage16 *out);
/**
* @brief Returns the start and end of the Applet Id range.
* @note Only available on [6.0.0+].
* @param[out] success Returns bool over whether the call was handled or not.
* @param[out] min Mimimum applet id. Always 0x0100000000001000
* @param[out] max Maximum applet id. Always 0x0100000000001FFF
*/
Result capsaGetMinMaxAppletId(bool* success, u64* min, u64* max);
/**
* @brief Gets the amount of files of the specified type at a AlbumStorage.
* @note Only available on [5.0.0+].
* @param[in] storage \ref CapsAlbumStorage
* @param[in] flags \ref CapsAlbumFileContentsFlag
* @param[out] count Amount of files.
*/
Result capsaGetAlbumFileCountEx0(CapsAlbumStorage storage, u8 flags, u64 *count);
/**
* @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage and type matches the input one.
* @note Only available on [5.0.0+].
* @param[in] storage \ref CapsAlbumStorage
* @param[in] flags \ref CapsAlbumFileContentsFlag
* @param[out] out Total output entries.
* @param[out] entries Output array of \ref CapsAlbumEntry.
* @param[in] count Reserved entry count.
*/
Result capsaGetAlbumFileListEx0(CapsAlbumStorage storage, u8 flags, u64 *out, CapsAlbumEntry *entries, u64 count);
/**
* @brief Returns the image from the last shown ScreenShot Overlay.
* @param[out] file_id \ref CapsAlbumFileId
* @param[out] out_size Size of the thumbnail image. Always 0x5100.
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54.
*/
Result capsaGetLastOverlayScreenShotThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size);
/**
* @brief Returns the image from the last shown Movie Overlay.
* @note Only available on [4.0.0+].
* @param[out] file_id \ref CapsAlbumFileId
* @param[out] out_size Size of the thumbnail image. Always 0x5100.
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54.
*/
Result capsaGetLastOverlayMovieThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size);
/**
* @brief Gets the currently set autosaving storage.
* @note Wrapper around setsysGetPrimaryAlbumStorage but defaults to NAND if SD isn't available.
* @param[out] storage \ref CapsAlbumStorage
*/
Result capsaGetAutoSavingStorage(CapsAlbumStorage *storage);
/**
* @brief Gets required size to copy all files from one Storage to another.
* @param[in] dst_storage \ref CapsAlbumStorage
* @param[in] src_storage \ref CapsAlbumStorage
* @param[out] out Required storage space size.
*/
Result capsaGetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64 *out);
/**
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
* @note Only available on [3.0.0+].
* @param[out] width Output image width. Optional, can be NULL.
* @param[out] height Output image height. Optional, can be NULL.
* @param[out] attr \ref CapsScreenShotAttribute
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] opts \ref CapsScreenShotDecodeOption
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsLoadAlbumScreenShotThumbnailImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Load the ScreenShotImage for the specified AlbumFile.
* @note Only available on [4.0.0+].
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] opts \ref CapsScreenShotDecodeOption
* @param[out] out \ref CapsLoadAlbumScreenShotImageOutput
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsaLoadAlbumScreenShotImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
* @note Only available on [4.0.0+].
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] opts \ref CapsScreenShotDecodeOption
* @param[out] out \ref CapsLoadAlbumScreenShotImageOutput
* @param[out] image RGBA8 image output buffer.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
*/
Result capsaLoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
/**
* @brief Unmounts the specified AlbumStorage.
* @param[in] storage \ref CapsAlbumStorage
*/
Result capsaForceAlbumUnmounted(CapsAlbumStorage storage);
/**
* @brief Resets mount status for the specified AlbumStorage.
* @note Mounts the Storage if available.
* @param[in] storage \ref CapsAlbumStorage
*/
Result capsaResetAlbumMountStatus(CapsAlbumStorage storage);
/**
* @brief Refreshs Album Cache for the specified AlbumStorage.
* @param[in] storage \ref CapsAlbumStorage
*/
Result capsaRefreshAlbumCache(CapsAlbumStorage storage);
/**
* @brief Gets the AlbumCache of the specified AlbumStorage.
* @note Stubbed on [4.0.0+].
* @note use \ref capsaGetAlbumCacheEx instead.
* @param[in] storage \ref CapsAlbumStorage
* @param[out] cache \ref CapsAlbumCache
*/
Result capsaGetAlbumCache(CapsAlbumStorage storage, CapsAlbumCache *cache);
/**
* @brief Gets the AlbumCache for the specified type of the specified AlbumStorage.
* @param[in] storage \ref CapsAlbumStorage
* @param[in] contents \ref CapsAlbumFileContents
* @param[out] cache \ref CapsAlbumCache
*/
Result capsaGetAlbumCacheEx(CapsAlbumStorage storage, CapsAlbumFileContents contents, CapsAlbumCache *cache);
/**
* @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an AppletResourceUserId.
* @note Only available on [2.0.0+].
* @param[out] entry \ref CapsAlbumEntry
* @param[in] application_entry \ref CapsApplicationAlbumEntry
*/
Result capsaGetAlbumEntryFromApplicationAlbumEntryAruid(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry);
/**
* @brief Opens an AlbumMovieStream.
* @note This opens IAlbumAccessorSession if not previously opened, it's closed during \ref capsaExit.
* @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId.
* @note Only available on [4.0.0+].
* @param[out] stream Stream handle.
* @param[in] entry \ref CapsAlbumFileId
*/
Result capsaOpenAlbumMovieStream(u64 *stream, const CapsAlbumFileId *file_id);
/**
* @brief Closes an AlbumMovieStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capsaCloseAlbumMovieStream(u64 stream);
/**
* @brief Gets the data size of an AlbumMovieStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] size Size of the actual MP4, without the JPEG at the end.
*/
Result capsaGetAlbumMovieStreamSize(u64 stream, u64 *size);
/**
* @brief Reads data from an AlbumMovieStream.
* @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes.
* @note When offset(+size) goes beyond the size from \ref capsaGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[in] offset Offset.
* @param[out] Output data buffer.
* @param[in] size Data buffer size.
* @param[out] actual_size Actual read size.
*/
Result capsaReadMovieDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size);
/**
* @brief Gets the BrokenReason for an AlbumMovieStream.
* @note Official sw doesn't use this.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capsaGetAlbumMovieReadStreamBrokenReason(u64 stream);
/**
* @brief Gets the data size of an Image taken from an AlbumMovieStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] size Expected size of an Image.
*/
Result capsaGetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size);
/**
* @brief Reads data of an Image taken from an AlbumMovieStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[in] offset Offset.
* @param[out] Output data buffer.
* @param[in] size Data buffer size.
* @param[out] actual_size Actual read size.
*/
Result capsaReadImageDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size);
/**
* @brief Gets the file attribute of an AlbumMovieStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] attr \ref CapsScreenShotAttribute
*/
Result capsaReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attr);

View File

@ -0,0 +1,340 @@
/**
* @file capsc.h
* @brief Album Control (caps:c) service IPC wrapper.
* @author Behemoth
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
#include "../services/caps.h"
typedef struct {
u64 application_id;
u8 unknown_08;
u8 unknown_09;
u8 reserved[6];
} CapsApplicationId;
/// Initialize caps:c
Result capscInitialize(void);
/// Exit caps:c.
void capscExit(void);
/// Gets the Service for caps:c.
Service* capscGetServiceSession(void);
/**
* @brief Notify the service that a storage is now available.
* @note This will result in capsrv mounting the image directory on that storage medium.
* @param[in] storage \ref CapsAlbumStorage
*/
Result capscNotifyAlbumStorageIsAvailable(CapsAlbumStorage storage);
/**
* @brief Notify the service that a storage is now unavailable.
* @note This will result in capsrv unmounting the image directory on that storage medium.
* @param[in] storage \ref CapsAlbumStorage
*/
Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage);
/**
* @brief Register an applet for later usage.
* @note Called at application launch by the system.
* @note Will generate a random AES-256 key for this application for use on Shim-Version 0.
* @note Only available on [2.0.0+].
* @param[in] appletResourceUserId AppletResourceUserId.
* @param[in] application_id ApplicationId.
*/
Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id);
/**
* @brief Unregister an applet.
* @note Called at application exit by the system.
* @note Only available on [2.0.0+].
* @param[in] appletResourceUserId AppletResourceUserId.
* @param[in] application_id ApplicationId.
*/
Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id);
/**
* @brief Get an ApplicationId that corresponds to an AppletResourceUserId.
* @note Returns value set by \ref capscRegisterAppletResourceUserId.
* @note Only available on [2.0.0+].
* @param[out] application_id ApplicationId.
* @param[in] appletResourceUserId AppletResourceUserId.
*/
Result capscGetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid);
/**
* @brief Checks whether an ApplicationId is registered.
* @note Only available on [2.0.0+].
* @param[in] application_id ApplicationId.
*/
Result capscCheckApplicationIdRegistered(u64 application_id);
/**
* @brief Generate an AlbumFileId based on parameters and current time.
* @param[in] application_id ApplicationId.
* @note Only available on [2.0.0+].
* @param[in] contents \ref CapsAlbumFileContents
* @param[out] file_id \ref CapsAlbumFileId
*/
Result capscGenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id);
/**
* @brief Generate an ApplicationAlbumEntry based on parameters.
* @note Output will be different between Shim Version 0 and 1.
* @note Only available on [2.0.0+].
* @param[out] appEntry \ref CapsApplicationAlbumEntry
* @param[in] entry \ref CapsAlbumEntry
* @param[in] application_id ApplicationId.
*/
Result capscGenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id);
/**
* @brief Save a jpeg image.
* @note Only available on [2.0.0-3.0.2].
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] buffer JPEG image buffer.
* @param[in] buffer_size Size of the JPEG image.
*/
Result capscSaveAlbumScreenShotFile(const CapsAlbumFileId *file_id, const void* buffer, u64 buffer_size);
/**
* @brief Save a jpeg image.
* @note Only available on [4.0.0+].
* @note Version 3 as of [9.1.0].
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] version Revision number.
* @param[in] makernote_offset Offset to makernote in JPEG buffer.
* @param[in] makernote_size Size of the makernote in JPEG buffer.
* @param[in] buffer JPEG image buffer.
* @param[in] buffer_size Size of the JPEG image.
*/
Result capscSaveAlbumScreenShotFileEx(const CapsAlbumFileId *file_id, u64 version, u64 makernote_offset, u64 makernote_size, const void* buffer, u64 buffer_size);
/**
* @brief Sets thumbnail data for the last taken screenshot.
* @note 96×54 Image will get saved.
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] image RGBA8 image buffer.
* @param[in] image_size size of the RGBA8 image buffer.
*/
Result capscSetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size);
/**
* @brief Sets thumbnail data for the last recorded movie.
* @note Only availabe on [4.0.0+].
* @note 96×54 Image will get saved.
* @param[in] file_id \ref CapsAlbumFileId
* @param[in] image RGBA8 image buffer.
* @param[in] image_size size of the RGBA8 image buffer.
*/
Result capscSetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size);
/**
* @brief Opens an AlbumMovieReadStream.
* @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capscExit.
* @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId.
* @note Only available on [4.0.0+].
* @param[out] stream Stream handle.
* @param[in] entry \ref CapsAlbumFileId
*/
Result capscOpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id);
/**
* @brief Closes an AlbumMovieReadStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscCloseAlbumMovieStream(u64 stream);
/**
* @brief Gets the data size of an AlbumMovieReadStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] size Size of the actual MP4, without the JPEG at the end.
*/
Result capscGetAlbumMovieStreamSize(u64 stream, u64 *size);
/**
* @brief Reads data from an AlbumMovieReadStream.
* @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes.
* @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[in] offset Offset.
* @param[out] Output data buffer.
* @param[in] size Data buffer size.
* @param[out] actual_size Actual read size.
*/
Result capscReadMovieDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size);
/**
* @brief Gets the BrokenReason for an AlbumMovieReadStream.
* @note Official sw doesn't use this.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscGetAlbumMovieReadStreamBrokenReason(u64 stream);
/**
* @brief Gets the data size of an Image taken from an AlbumMovieReadStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] size Expected size of an Image.
*/
Result capscGetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size);
/**
* @brief Reads data of an Image taken from an AlbumMovieReadStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[in] offset Offset.
* @param[out] buffer Output data buffer.
* @param[in] size Data buffer size.
* @param[out] actual_size Actual read size.
*/
Result capscReadImageDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size);
/**
* @brief Gets the file attribute of an AlbumMovieReadStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] attr \ref CapsScreenShotAttribute
*/
Result capscReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attribute);
/**
* @brief Opens an AlbumMovieWriteStream.
* @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capsaExit.
* @note Up to 2 streams can be open at the same time.
* @note Only available on [4.0.0+].
* @param[out] stream Stream handle.
* @param[in] entry \ref CapsAlbumFileId
*/
Result capscOpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_id);
/**
* @brief Finish write to AlbumMovieWriteStream.
* @note Copies file from save to destination storage and deletes the temporary file.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscFinishAlbumMovieWriteStream(u64 stream);
/**
* @brief Closes a finished AlbumMovieWriteStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscCommitAlbumMovieWriteStream(u64 stream);
/**
* @brief Closes an AlbumMovieWriteStream in any state.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscDiscardAlbumMovieWriteStream(u64 stream);
/**
* @brief Closes an AlbumMovieWriteStream in any state without deleting the temporary file.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscDiscardAlbumMovieWriteStreamNoDelete(u64 stream);
/**
* @brief Closes a finished AlbumMovieWriteStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] entry \ref CapsAlbumEntry
*/
Result capscCommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry);
/**
* @brief Start AlbumMovieWriteStream data section.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscStartAlbumMovieWriteStreamDataSection(u64 stream);
/**
* @brief End AlbumMovieWriteStream data section.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscEndAlbumMovieWriteStreamDataSection(u64 stream);
/**
* @brief Start AlbumMovieWriteStream meta section.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscStartAlbumMovieWriteStreamMetaSection(u64 stream);
/**
* @brief End AlbumMovieWriteStream meta section.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscEndAlbumMovieWriteStreamMetaSection(u64 stream);
/**
* @brief Reads data from an AlbumMovieWriteStream.
* @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes.
* @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[in] offset Offset.
* @param[out] buffer Output data buffer.
* @param[in] size Data buffer size.
* @param[out] actual_size Actual read size.
*/
Result capscReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size);
/**
* @brief Write data to an AlbumMovieWriteStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[in] offset Offset.
* @param[in] buffer Input data buffer.
* @param[in] size Data buffer size.
*/
Result capscWriteDataToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size);
/**
* @brief Write meta data to an AlbumMovieWriteStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[in] offset Offset.
* @param[in] buffer Input data buffer.
* @param[in] size Data buffer size.
*/
Result capscWriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size);
/**
* @brief Gets the BrokenReason for an AlbumMovieWriteStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
*/
Result capscGetAlbumMovieWriteStreamBrokenReason(u64 stream);
/**
* @brief Gets the data size of an AlbumMovieWriteStream.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] size Size of the data section.
*/
Result capscGetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size);
/**
* @brief Sets the data size of an AlbumMovieWriteStream.
* @note Must not be bigger than 2GiB.
* @note Only available on [4.0.0+].
* @param[in] stream Stream handle.
* @param[out] size Size of the data section.
*/
Result capscSetAlbumMovieWriteStreamDataSize(u64 stream, u64 size);

View File

@ -0,0 +1,63 @@
/**
* @file capsdc.h
* @brief Jpeg Decoder (caps:dc) service IPC wrapper. Only available on [4.0.0+].
* @note Only holds one session that is occupied by capsrv.
* @author Behemoth
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
#include "../services/caps.h"
/// Initialize caps:dc
Result capsdcInitialize(void);
/// Exit caps:dc.
void capsdcExit(void);
/// Gets the Service for caps:dc.
Service* capsdcGetServiceSession(void);
/**
* @brief Decodes a jpeg buffer into RGBX.
* @param[in] width Image width.
* @param[in] height Image height.
* @param[in] opts \ref CapsScreenShotDecodeOption.
* @param[in] jpeg Jpeg image input buffer.
* @param[in] jpeg_size Input image buffer size.
* @param[out] out_image RGBA8 image output buffer.
* @param[in] out_image_size Output image buffer size, should be at least large enough for RGBA8 width x height.
*/
Result capsdcDecodeJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_image, size_t out_image_size);
/**
* @brief Shrinks a jpeg's dimensions by 2.
* @note Tries to compress with jpeg quality in this order: 98, 95, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0.
* @note Only available on [17.0.0+].
* @param[in] width Input image width.
* @param[in] height Input image width.
* @param[in] opts \ref CapsScreenShotDecodeOption.
* @param[in] jpeg Jpeg image input buffer.
* @param[in] jpeg_size Input image buffer size.
* @param[out] out_jpeg Jpeg image output buffer
* @param[in] out_jpeg_size Output image buffer size.
* @param[out] out_result_size size of the resulting JPEG.
*/
Result capsdcShrinkJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size);
/**
* @brief Shrinks a jpeg.
* @note Fails if the scaled size is larger than the original or the output buffer isn't large enough.
* @note Only available on [19.0.0+].
* @param[in] scaled_width Wanted image width.
* @param[in] scaled_height Wanted image width.
* @param[in] jpeg_quality has to be in range 0-100.
* @param[in] opts \ref CapsScreenShotDecodeOption.
* @param[in] jpeg Jpeg image input buffer.
* @param[in] jpeg_size Input image buffer size.
* @param[out] out_jpeg Jpeg image output buffer
* @param[in] out_jpeg_size Output image buffer size.
* @param[out] out_result_size size of the resulting jpeg.
*/
Result capsdcShrinkJpegEx(u32 scaled_width, u32 scaled_height, u32 jpeg_quality, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size);

View File

@ -7,6 +7,9 @@
#pragma once
#include "../types.h"
#include "../sf/service.h"
#include "vi.h"
#define CAPSSC_JPEG_BUFFER_SIZE 0x80000
/// Initialize caps:sc. Only available on [2.0.0+].
Result capsscInitialize(void);
@ -23,12 +26,49 @@ Service* capsscGetServiceSession(void);
* @note buffer_index and buffer_count correspond to buffers with size 0x384000(1280*720*4). These must not be negative.
* @param buf Output buffer containing the RGBA8 image.
* @param size Size of buf, should be 0x384000(1280*720*4) * buffer_count.
* @param layer_stack Value 0 can be used for this.
* @param layer_stack \ref ViLayerStack
* @param width Image width, must be 1280.
* @param height Image height, must be 720.
* @param buffer_count Total number of output image buffers.
* @param buffer_index Starting image buffer index. Must be < buffer_count.
* @param timeout Timeout in nanoseconds. A default value of 100000000 can be used.
*/
Result capsscCaptureRawImageWithTimeout(void* buf, size_t size, u32 layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, u64 timeout);
Result capsscCaptureRawImageWithTimeout(void* buf, size_t size, ViLayerStack layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, s64 timeout);
/**
* @brief This takes a raw screenshot, with the screenshot being held until \ref capsscCloseRawScreenShotReadStream is called.
* @note Only available on [3.0.0+]. Requires debug mode.
* @param out_size Pointer to write the size of the captured raw image to. Always 0x384000(1280*720*4).
* @param out_width Pointer to write the width of the captured raw image to. Always 1280.
* @param out_height Pointer to write the height of the captured raw image to. Always 720.
* @param layer_stack \ref ViLayerStack
* @param timeout Timeout in nanoseconds.
*/
Result capsscOpenRawScreenShotReadStream(u64 *out_size, u64 *out_width, u64 *out_height, ViLayerStack layer_stack, s64 timeout);
/**
* @brief Discards a stream opened by \ref capsscOpenRawScreenShotReadStream.
* @note Only available on [3.0.0+]. Requires debug mode.
*/
Result capsscCloseRawScreenShotReadStream(void);
/**
* @brief Reads from a stream opened by \ref capsscOpenRawScreenShotReadStream.
* @note Only available on [3.0.0+]. Requires debug mode.
* @param bytes_read Pointer to write the amounts of bytes written to buffer.
* @param buf Output buffer containing the RGBA8 image.
* @param size Size of buf.
* @param offset Offset in image where read should start.
*/
Result capsscReadRawScreenShotReadStream(u64 *bytes_read, void* buf, size_t size, u64 offset);
/**
* @brief This takes a screenshot, with the screenshot being written as jpeg into the output buffer.
* @note Only available on [9.0.0+]. Requires debug mode before [10.0.0].
* @param out_jpeg_size Pointer to write the size of the captured jpeg to.
* @param jpeg_buf Output buffer containing the JPEG image.
* @param jpeg_buf_size Size of jpeg_buf, official software uses 0x80000.
* @param layer_stack \ref ViLayerStack
* @param timeout Timeout in nanoseconds.
*/
Result capsscCaptureJpegScreenShot(u64* out_jpeg_size, void* jpeg_buf, size_t jpeg_buf_size, ViLayerStack layer_stack, s64 timeout);

View File

@ -98,9 +98,9 @@ Result capsuGetAlbumFileSize(const CapsApplicationAlbumFileEntry *entry, u64 *si
* @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0.
* @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed.
* @param[out] image RGBA8 image output buffer.
* @param[out] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[out] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
* @param[in] entry \ref CapsApplicationAlbumFileEntry
* @param[in] option \ref CapsScreenShotDecodeOption
*/
@ -115,9 +115,9 @@ Result capsuLoadAlbumScreenShotImage(s32 *width, s32 *height, CapsScreenShotAttr
* @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0.
* @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed.
* @param[out] image RGBA8 image output buffer.
* @param[out] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
* @param[out] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
* @param[in] entry \ref CapsApplicationAlbumFileEntry
* @param[in] option \ref CapsScreenShotDecodeOption
*/

View File

@ -27,3 +27,4 @@ Result clkrstOpenSession(ClkrstSession* session_out, PcvModuleId module_id, u32
void clkrstCloseSession(ClkrstSession* session);
Result clkrstSetClockRate(ClkrstSession* session, u32 hz);
Result clkrstGetClockRate(ClkrstSession* session, u32 *out_hz);
Result clkrstGetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count);

View File

@ -0,0 +1,32 @@
/**
* @file ectx.h
* @brief [11.0.0+] Error Context services IPC wrapper.
* @author SciresM
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../sf/service.h"
/// Initialize ectx:r.
Result ectxrInitialize(void);
/// Exit ectx:r.
void ectxrExit(void);
/// Gets the Service object for the actual ectx:r service session.
Service* ectxrGetServiceSession(void);
/**
* @brief Retrieves the error context associated with an error descriptor and result.
* @param[out] out0 Output value.
* @param[out] out_total_size Total error context size.
* @param[out] out_size Error context size.
* @param[out] dst Buffer for output error context.
* @param[in] dst_size Buffer size for output error context.
* @param[in] descriptor Error descriptor.
* @param[in] result Error result.
* @return Result code.
*/
Result ectxrPullContext(s32 *out0, u32 *out_total_size, u32 *out_size, void *dst, size_t dst_size, u32 descriptor, Result result);

View File

@ -0,0 +1,32 @@
/**
* @file fan.h
* @brief Fan service IPC wrapper.
* @author Behemoth
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
typedef struct {
Service s;
} FanController;
/// Initialize fan.
Result fanInitialize(void);
/// Exit fan.
void fanExit(void);
/// Gets the Service object for the actual fan service session.
Service* fanGetServiceSession(void);
/// Opens IController session.
Result fanOpenController(FanController *out, u32 device_code);
/// Close IController session.
void fanControllerClose(FanController *controller);
/// @warning Disabling your fan can damage your system.
Result fanControllerSetRotationSpeedLevel(FanController *controller, float level);
Result fanControllerGetRotationSpeedLevel(FanController *controller, float *level);

View File

@ -79,7 +79,7 @@ typedef struct {
* @note This function does not return.
* @note This uses \ref fatalThrowWithPolicy with \ref FatalPolicy_ErrorScreen internally.
*/
void NORETURN fatalThrow(Result err);
void NX_NORETURN fatalThrow(Result err);
/**
* @brief Triggers a system fatal error with a custom \ref FatalPolicy.

View File

@ -11,6 +11,14 @@
#include "../services/acc.h"
#include "../sf/service.h"
typedef enum {
FriendsServiceType_User = 0, ///< Initializes friend:u
FriendsServiceType_Viewer = 1, ///< Initializes friend:v
FriendsServiceType_Manager = 2, ///< Initializes friend:m
FriendsServiceType_System = 3, ///< Initializes friend:s
FriendsServiceType_Administrator = 4, ///< Initializes friend:a
} FriendsServiceType;
/// InAppScreenName
typedef struct {
char name[0x40]; ///< UTF-8 string, NUL-terminated.
@ -32,6 +40,36 @@ typedef struct {
u64 id; ///< Id.
} FriendsFriendInvitationGroupId;
/// FriendsUserSetting
typedef struct {
AccountUid uid; ///< User ID
u32 presence_permission; ///< Presence permission
u32 play_log_permission; ///< Play log permission
u64 friend_request_reception; ///< Unknown
char friend_code[0x20]; ///< Friend Code
u64 friend_code_next_issuable_time; ///< Unknown
u8 unk_x48[0x7C8]; ///< Unknown
} FriendsUserSetting;
/// Initialize friends
Result friendsInitialize(FriendsServiceType service_type);
/// Exit friends
void friendsExit(void);
/// Gets the Service object for the friends service session.
Service* friendsGetServiceSession(void);
/// Gets the Service object for the actual IFriendsService service session.
Service* friendsGetServiceSession_IFriendsService(void);
/**
* @brief Gets the \ref FriendsUserSetting details
* @param[in] uid \ref User AccountUid.
* @param[out] user_setting \ref FriendsUserSetting
*/
Result friendsGetUserSetting(AccountUid uid, FriendsUserSetting *user_setting);
/**
* @brief Gets an Event which is signaled when data is available with \ref friendsTryPopFriendInvitationNotificationInfo.
* @note This is a wrapper for \ref appletGetFriendInvitationStorageChannelEvent, see that for the usage requirements.
@ -51,4 +89,3 @@ NX_INLINE Result friendsGetFriendInvitationNotificationEvent(Event *out_event) {
* @param[out] out_size Size of the data which was written into the output buffer. Optional, can be NULL.
*/
Result friendsTryPopFriendInvitationNotificationInfo(AccountUid *uid, void* buffer, u64 size, u64 *out_size);

View File

@ -88,6 +88,13 @@ typedef struct {
u8 unused[0x190]; ///< Uninitialized.
} FsSaveDataExtraData;
/// SaveDataMetaInfo
typedef struct {
u32 size;
u8 type; ///< \ref FsSaveDataMetaType
u8 reserved[0x0B];
} FsSaveDataMetaInfo;
/// SaveDataCreationInfo
typedef struct {
s64 save_data_size; ///< Size of the save data.
@ -115,6 +122,18 @@ typedef struct {
u8 unk_x3b[0x25]; ///< Unknown. Usually zeros?
} FsSaveDataInfo;
/// SaveDataFilter
typedef struct {
bool filter_by_application_id; ///< Filter by \ref FsSaveDataAttribute::application_id
bool filter_by_save_data_type; ///< Filter by \ref FsSaveDataAttribute::save_data_type
bool filter_by_user_id; ///< Filter by \ref FsSaveDataAttribute::uid
bool filter_by_system_save_data_id; ///< Filter by \ref FsSaveDataAttribute::system_save_data_id
bool filter_by_index; ///< Filter by \ref FsSaveDataAttribute::save_data_index
u8 save_data_rank; ///< \ref FsSaveDataRank
u8 padding[0x2]; ///< Padding
FsSaveDataAttribute attr; ///< \ref FsSaveDataAttribute
} FsSaveDataFilter;
typedef struct {
u64 created; ///< POSIX timestamp.
u64 modified; ///< POSIX timestamp.
@ -123,6 +142,11 @@ typedef struct {
u8 padding[7];
} FsTimeStampRaw;
/// This is nn::fssystem::ArchiveMacKey. Used by \ref setsysGetThemeKey and \ref setsysSetThemeKey. Does not appear to be in use elsewhere.
typedef struct {
u8 key[0x10];
} FsArchiveMacKey;
/// Returned by fsFsGetEntryType.
typedef enum {
FsDirEntryType_Dir = 0, ///< Entry is a directory.
@ -160,9 +184,10 @@ typedef enum {
} FsWriteOption;
typedef enum {
FsContentStorageId_System = 0,
FsContentStorageId_User = 1,
FsContentStorageId_SdCard = 2,
FsContentStorageId_System = 0, ///< System
FsContentStorageId_User = 1, ///< User
FsContentStorageId_SdCard = 2, ///< SdCard
FsContentStorageId_System0 = 3, ///< [16.0.0+] System0
} FsContentStorageId;
typedef enum {
@ -170,6 +195,12 @@ typedef enum {
FsCustomStorageId_SdCard = 1,
} FsCustomStorageId;
/// ImageDirectoryId
typedef enum {
FsImageDirectoryId_Nand = 0,
FsImageDirectoryId_Sd = 1,
} FsImageDirectoryId;
/// SaveDataSpaceId
typedef enum {
FsSaveDataSpaceId_System = 0, ///< System
@ -208,6 +239,13 @@ typedef enum {
FsSaveDataFlags_NeedsSecureDelete = BIT(3),
} FsSaveDataFlags;
/// SaveDataMetaType
typedef enum {
FsSaveDataMetaType_None = 0,
FsSaveDataMetaType_Thumbnail = 1,
FsSaveDataMetaType_ExtensionContext = 2,
} FsSaveDataMetaType;
typedef enum {
FsGameCardAttribute_AutoBootFlag = BIT(0), ///< Causes the cartridge to automatically start on bootup
FsGameCardAttribute_HistoryEraseFlag = BIT(1), ///< Causes NS to throw an error on attempt to load the cartridge
@ -227,6 +265,12 @@ typedef struct {
u32 value;
} FsGameCardHandle;
typedef struct {
u32 version;
u8 pad[0x4];
u64 id;
} FsGameCardUpdatePartitionInfo;
typedef struct {
u32 aes_ctr_key_type; ///< Contains bitflags describing how data is AES encrypted.
u32 speed_emulation_type; ///< Contains bitflags describing how data is emulated.
@ -261,6 +305,8 @@ typedef enum {
FsBisPartitionId_SystemProperEncryption = 32,
FsBisPartitionId_SystemProperPartition = 33,
FsBisPartitionId_SignedSystemPartitionOnSafeMode = 34,
FsBisPartitionId_DeviceTreeBlob = 35,
FsBisPartitionId_System0 = 36,
} FsBisPartitionId;
/// FileSystemType
@ -280,6 +326,38 @@ typedef enum {
FsFileSystemQueryId_IsValidSignedSystemPartitionOnSdCard = 2, ///< [8.0.0+]
} FsFileSystemQueryId;
/// FileSystemAttribute
typedef struct {
bool directory_name_length_max_has_value;
bool file_name_length_max_has_value;
bool directory_path_length_max_has_value;
bool file_path_length_max_has_value;
bool utf16_create_directory_path_length_max_has_value;
bool utf16_delete_directory_path_length_max_has_value;
bool utf16_rename_source_directory_path_length_max_has_value;
bool utf16_rename_destination_directory_path_length_max_has_value;
bool utf16_open_directory_path_length_max_has_value;
bool utf16_directory_name_length_max_has_value;
bool utf16_file_name_length_max_has_value;
bool utf16_directory_path_length_max_has_value;
bool utf16_file_path_length_max_has_value;
u8 reserved1[0x1B];
s32 directory_name_length_max;
s32 file_name_length_max;
s32 directory_path_length_max;
s32 file_path_length_max;
s32 utf16_create_directory_path_length_max;
s32 utf16_delete_directory_path_length_max;
s32 utf16_rename_source_directory_path_length_max;
s32 utf16_rename_destination_directory_path_length_max;
s32 utf16_open_directory_path_length_max;
s32 utf16_directory_name_length_max;
s32 utf16_file_name_length_max;
s32 utf16_directory_path_length_max;
s32 utf16_file_path_length_max;
u8 reserved2[0x64];
} FsFileSystemAttribute;
/// FsPriority
typedef enum {
FsPriority_Normal = 0,
@ -288,6 +366,120 @@ typedef enum {
FsPriority_Background = 3,
} FsPriority;
/// FsContentAttributes
typedef enum {
FsContentAttributes_None = 0x0,
FsContentAttributes_All = 0xF,
} FsContentAttributes;
/// For use with fsOpenHostFileSystemWithOption
typedef enum {
FsMountHostOptionFlag_None = 0, ///< Host filesystem will be case insensitive.
FsMountHostOptionFlag_PseudoCaseSensitive = BIT(0), ///< Host filesystem will be pseudo case sensitive.
} FsMountHostOption;
/// FsStorageErrorInfo
typedef struct {
u32 num_activation_failures;
u32 num_activation_error_corrections;
u32 num_read_write_failures;
u32 num_read_write_error_corrections;
} FsStorageErrorInfo;
/// FatFatError
typedef struct {
s32 error;
s32 extra_error;
s32 drive_id;
char name[16];
u8 reserved[4];
} FatFatError;
/// FatFatReportInfo1
typedef struct {
u16 open_file_peak_count;
u16 open_directory_peak_count;
} FatFatReportInfo1;
/// FatFatReportInfo2
typedef struct {
u16 open_unique_file_entry_peak_count;
u16 open_unique_directory_entry_peak_count;
} FatFatReportInfo2;
/// FatFatSafeInfo
typedef struct {
u32 result;
u32 error_number;
u32 safe_error_number;
} FatFatSafeInfo;
/// FsFileSystemProxyErrorInfo
typedef struct {
u32 rom_fs_remount_for_data_corruption_count;
u32 rom_fs_unrecoverable_data_corruption_by_remount_count;
FatFatError fat_fs_error;
u32 rom_fs_recovered_by_invalidate_cache_count;
u32 save_data_index_count;
FatFatReportInfo1 bis_system_fat_report_info_1;
FatFatReportInfo1 bis_user_fat_report_info_1;
FatFatReportInfo1 sd_card_fat_report_info_1;
FatFatReportInfo2 bis_system_fat_report_info_2;
FatFatReportInfo2 bis_user_fat_report_info_2;
FatFatReportInfo2 sd_card_fat_report_info_2;
u32 rom_fs_deep_retry_start_count;
u32 rom_fs_unrecoverable_by_game_card_access_failed_count;
FatFatSafeInfo bis_system_fat_safe_info;
FatFatSafeInfo bis_user_fat_safe_info;
u8 reserved[0x18];
} FsFileSystemProxyErrorInfo;
/// FsMemoryReportInfo
typedef struct {
u64 pooled_buffer_peak_free_size;
u64 pooled_buffer_retried_count;
u64 pooled_buffer_reduce_allocation_count;
u64 buffer_manager_peak_free_size;
u64 buffer_manager_retried_count;
u64 exp_heap_peak_free_size;
u64 buffer_pool_peak_free_size;
u64 patrol_read_allocate_buffer_success_count;
u64 patrol_read_allocate_buffer_failure_count;
u64 buffer_manager_peak_total_allocatable_size;
u64 buffer_pool_max_allocate_size;
u64 pooled_buffer_failed_ideal_allocation_count_on_async_access;
u8 reserved[0x20];
} FsMemoryReportInfo;
/// FsGameCardErrorReportInfo
typedef struct {
u16 game_card_crc_error_num;
u16 reserved1;
u16 asic_crc_error_num;
u16 reserved2;
u16 refresh_num;
u16 reserved3;
u16 retry_limit_out_num;
u16 timeout_retry_num;
u16 asic_reinitialize_failure_detail;
u16 insertion_count;
u16 removal_count;
u16 asic_reinitialize_num;
u32 initialize_count;
u16 asic_reinitialize_failure_num;
u16 awaken_failure_num;
u16 reserved4;
u16 refresh_succeeded_count;
u32 last_read_error_page_address;
u32 last_read_error_page_count;
u32 awaken_count;
u32 read_count_from_insert;
u32 read_count_from_awaken;
u8 reserved5[8];
} FsGameCardErrorReportInfo;
/// Initialize fsp-srv. Used automatically during app startup.
Result fsInitialize(void);
@ -302,26 +494,34 @@ void fsSetPriority(FsPriority prio);
/// Mount requested filesystem type from content file
Result fsOpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath); ///< same as calling fsOpenFileSystemWithId with 0 as id
Result fsOpenDataFileSystemByCurrentProcess(FsFileSystem *out);
Result fsOpenFileSystemWithPatch(FsFileSystem* out, u64 id, FsFileSystemType fsType); ///< [2.0.0+], like OpenFileSystemWithId but without content path.
Result fsOpenFileSystemWithId(FsFileSystem* out, u64 id, FsFileSystemType fsType, const char* contentPath); ///< works on all firmwares, id is ignored on [1.0.0]
Result fsOpenFileSystemWithId(FsFileSystem* out, u64 id, FsFileSystemType fsType, const char* contentPath, FsContentAttributes attr); ///< works on all firmwares, id is ignored on [1.0.0], attr is ignored before [16.0.0]
Result fsOpenDataFileSystemByProgramId(FsFileSystem *out, u64 program_id); ///< [3.0.0+]
Result fsOpenBisFileSystem(FsFileSystem* out, FsBisPartitionId partitionId, const char* string);
Result fsOpenBisStorage(FsStorage* out, FsBisPartitionId partitionId);
/// Do not call this directly, see fs_dev.h.
Result fsOpenSdCardFileSystem(FsFileSystem* out);
Result fsOpenHostFileSystem(FsFileSystem* out, const char *path);
Result fsOpenHostFileSystemWithOption(FsFileSystem* out, const char *path, u32 flags); ///< [9.0.0+]
Result fsDeleteSaveDataFileSystem(u64 application_id);
Result fsCreateSaveDataFileSystem(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info, const FsSaveDataMetaInfo* meta);
Result fsCreateSaveDataFileSystemBySystemSaveDataId(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info);
Result fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID); /// [2.0.0+]
Result fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID); ///< [2.0.0+]
Result fsDeleteSaveDataFileSystemBySaveDataAttribute(FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute* attr); ///< [4.0.0+]
Result fsIsExFatSupported(bool* out);
Result fsOpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartition partition);
Result fsExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize); /// [3.0.0+]
Result fsExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize); ///< [3.0.0+]
Result fsOpenSaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr);
Result fsOpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr);
Result fsOpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); ///< [2.0.0+].
Result fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID);
Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID);
@ -329,38 +529,85 @@ Result fsWriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDat
Result fsOpenSaveDataInfoReader(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id);
Result fsOpenSaveDataInfoReaderWithFilter(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataFilter *save_data_filter); ///< [6.0.0+]
Result fsOpenImageDirectoryFileSystem(FsFileSystem* out, FsImageDirectoryId image_directory_id);
Result fsOpenContentStorageFileSystem(FsFileSystem* out, FsContentStorageId content_storage_id);
Result fsOpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id); /// [7.0.0+]
Result fsOpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id); ///< [7.0.0+]
Result fsOpenDataStorageByCurrentProcess(FsStorage* out);
Result fsOpenDataStorageByProgramId(FsStorage *out, u64 program_id); /// <[3.0.0+]
Result fsOpenDataStorageByDataId(FsStorage* out, u64 dataId, NcmStorageId storageId);
Result fsOpenPatchDataStorageByCurrentProcess(FsStorage* out);
Result fsOpenDeviceOperator(FsDeviceOperator* out);
Result fsOpenSdCardDetectionEventNotifier(FsEventNotifier* out);
/// Retrieves the rights id corresponding to the content path. Only available on [2.0.0+].
Result fsIsSignedSystemPartitionOnSdCardValid(bool *out);
Result fsGetProgramId(u64* out, const char *path, FsContentAttributes attr); ///< [17.0.0+]
/// Retrieves the rights id corresponding to the content path. Only available on [2.0.0-15.0.1].
Result fsGetRightsIdByPath(const char* path, FsRightsId* out_rights_id);
/// Retrieves the rights id and key generation corresponding to the content path. Only available on [3.0.0+].
Result fsGetRightsIdAndKeyGenerationByPath(const char* path, u8* out_key_generation, FsRightsId* out_rights_id);
/// Retrieves the rights id and key generation corresponding to the content path. Only available on [3.0.0+], attr is ignored before [16.0.0].
Result fsGetRightsIdAndKeyGenerationByPath(const char* path, FsContentAttributes attr, u8* out_key_generation, FsRightsId* out_rights_id);
Result fsGetContentStorageInfoIndex(s32 *out); ///< [19.0.0+]
Result fsDisableAutoSaveDataCreation(void);
Result fsSetGlobalAccessLogMode(u32 mode);
Result fsGetGlobalAccessLogMode(u32* out_mode);
Result fsOutputAccessLogToSdCard(const char *log, size_t size);
Result fsGetAndClearErrorInfo(FsFileSystemProxyErrorInfo *out); ///< [2.0.0+]
Result fsGetAndClearMemoryReportInfo(FsMemoryReportInfo* out); ///< [4.0.0+]
/// Only available on [7.0.0+].
Result fsGetProgramIndexForAccessLog(u32 *out_program_index, u32 *out_program_count);
// Wrapper(s) for fsCreateSaveDataFileSystem.
Result fsCreate_TemporaryStorage(u64 application_id, u64 owner_id, s64 size, u32 flags);
// Wrapper(s) for fsCreateSaveDataFileSystemBySystemSaveDataId.
Result fsCreate_SystemSaveDataWithOwner(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid, u64 owner_id, s64 size, s64 journal_size, u32 flags);
Result fsCreate_SystemSaveData(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, s64 size, s64 journal_size, u32 flags);
/// Wrapper(s) for fsOpenSaveDataFileSystem.
/// See FsSave for program_id and uid.
/// Wrapper for fsOpenSaveDataFileSystem.
/// See \ref FsSaveDataAttribute for application_id and uid.
Result fsOpen_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid);
/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId.
/// Wrapper for fsOpenReadOnlySaveDataFileSystem.
/// Only available on [2.0.0+].
/// See \ref FsSaveDataAttribute for application_id and uid.
Result fsOpen_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid);
/// Wrapper for fsOpenSaveDataFileSystem, for opening BcatSaveData.
Result fsOpen_BcatSaveData(FsFileSystem* out, u64 application_id);
/// Wrapper for fsOpenSaveDataFileSystem, for opening DeviceSaveData.
/// See \ref FsSaveDataAttribute for application_id.
Result fsOpen_DeviceSaveData(FsFileSystem* out, u64 application_id);
/// Wrapper for fsOpenSaveDataFileSystem, for opening TemporaryStorage.
/// Only available on [3.0.0+].
Result fsOpen_TemporaryStorage(FsFileSystem* out);
/// Wrapper for fsOpenSaveDataFileSystem, for opening CacheStorage.
/// Only available on [3.0.0+].
/// See \ref FsSaveDataAttribute for application_id.
Result fsOpen_CacheStorage(FsFileSystem* out, u64 application_id, u16 save_data_index);
/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemSaveData.
/// WARNING: You can brick when writing to SystemSaveData, if the data is corrupted etc.
Result fsOpen_SystemSaveData(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid);
/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemBcatSaveData.
/// Only available on [4.0.0+].
Result fsOpen_SystemBcatSaveData(FsFileSystem* out, u64 system_save_data_id);
// IFileSystem
Result fsFsCreateFile(FsFileSystem* fs, const char* path, s64 size, u32 option);
Result fsFsDeleteFile(FsFileSystem* fs, const char* path);
@ -378,6 +625,7 @@ Result fsFsGetTotalSpace(FsFileSystem* fs, const char* path, s64* out);
Result fsFsGetFileTimeStampRaw(FsFileSystem* fs, const char* path, FsTimeStampRaw *out); ///< [3.0.0+]
Result fsFsCleanDirectoryRecursively(FsFileSystem* fs, const char* path); ///< [3.0.0+]
Result fsFsQueryEntry(FsFileSystem* fs, void *out, size_t out_size, const void *in, size_t in_size, const char* path, FsFileSystemQueryId query_id); ///< [4.0.0+]
Result fsFsGetFileSystemAttribute(FsFileSystem* fs, FsFileSystemAttribute *out); ///< [15.0.0+]
void fsFsClose(FsFileSystem* fs);
/// Uses \ref fsFsQueryEntry to set the archive bit on the specified absolute directory path.
@ -423,7 +671,23 @@ void fsEventNotifierClose(FsEventNotifier* e);
// IDeviceOperator
Result fsDeviceOperatorIsSdCardInserted(FsDeviceOperator* d, bool* out);
Result fsDeviceOperatorGetSdCardSpeedMode(FsDeviceOperator* d, s64* out);
Result fsDeviceOperatorGetSdCardCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size);
Result fsDeviceOperatorGetSdCardUserAreaSize(FsDeviceOperator* d, s64* out);
Result fsDeviceOperatorGetSdCardProtectedAreaSize(FsDeviceOperator* d, s64* out);
Result fsDeviceOperatorGetAndClearSdCardErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size);
Result fsDeviceOperatorGetMmcCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size);
Result fsDeviceOperatorGetMmcSpeedMode(FsDeviceOperator* d, s64* out);
Result fsDeviceOperatorGetMmcPatrolCount(FsDeviceOperator* d, u32* out);
Result fsDeviceOperatorGetAndClearMmcErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size);
Result fsDeviceOperatorGetMmcExtendedCsd(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size);
Result fsDeviceOperatorIsGameCardInserted(FsDeviceOperator* d, bool* out);
Result fsDeviceOperatorGetGameCardHandle(FsDeviceOperator* d, FsGameCardHandle* out);
Result fsDeviceOperatorGetGameCardUpdatePartitionInfo(FsDeviceOperator* d, const FsGameCardHandle* handle, FsGameCardUpdatePartitionInfo* out);
Result fsDeviceOperatorGetGameCardAttribute(FsDeviceOperator* d, const FsGameCardHandle* handle, u8 *out);
Result fsDeviceOperatorGetGameCardDeviceCertificate(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, s64* out_size, s64 size);
Result fsDeviceOperatorGetGameCardIdSet(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size);
Result fsDeviceOperatorGetGameCardErrorReportInfo(FsDeviceOperator* d, FsGameCardErrorReportInfo* out);
Result fsDeviceOperatorGetGameCardDeviceId(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size);
Result fsDeviceOperatorChallengeCardExistence(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, void* seed, size_t seed_size, void* value, size_t value_size);
void fsDeviceOperatorClose(FsDeviceOperator* d);

View File

@ -8,6 +8,15 @@
#include "../types.h"
#include "../sf/service.h"
#include "../services/fs.h"
#include "../crypto/sha256.h"
#include "../services/ncm_types.h"
typedef struct {
u8 signature[0x100];
u8 hash[SHA256_HASH_SIZE];
bool is_signed;
u8 reserved[3];
} FsCodeInfo;
/// Initialize fsp-ldr.
Result fsldrInitialize(void);
@ -18,6 +27,5 @@ void fsldrExit(void);
/// Gets the Service object for the actual fsp-ldr service session.
Service* fsldrGetServiceSession(void);
Result fsldrOpenCodeFileSystem(u64 tid, const char *path, FsFileSystem* out);
Result fsldrOpenCodeFileSystem(FsCodeInfo* out_code_info, u64 tid, NcmStorageId storage_id, const char *path, FsContentAttributes attr, FsFileSystem* out);
Result fsldrIsArchivedProgram(u64 pid, bool *out);
Result fsldrSetCurrentProcess(void);

View File

@ -18,7 +18,7 @@ void fsprExit(void);
/// Gets the Service object for the actual fsp-pr service session.
Service* fsprGetServiceSession(void);
Result fsprRegisterProgram(u64 pid, u64 tid, NcmStorageId sid, const void *fs_access_header, size_t fah_size, const void *fs_access_control, size_t fac_size);
Result fsprRegisterProgram(u64 pid, u64 tid, NcmStorageId sid, const void *fs_access_header, size_t fah_size, const void *fs_access_control, size_t fac_size, u8 fs_access_control_restriction_mode);
Result fsprUnregisterProgram(u64 pid);
Result fsprSetCurrentProcess(void);
Result fsprSetEnabledProgramVerification(bool enabled);

View File

@ -6,12 +6,14 @@
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../sf/service.h"
typedef enum {
GpioPadName_AudioCodec = 1,
GpioPadName_ButtonVolUp = 25,
GpioPadName_AudioCodec = 1,
GpioPadName_ButtonVolUp = 25,
GpioPadName_ButtonVolDown = 26,
GpioPadName_SdCd = 56,
} GpioPadName;
typedef struct {
@ -19,15 +21,28 @@ typedef struct {
} GpioPadSession;
typedef enum {
GpioDirection_Input = 0,
GpioDirection_Input = 0,
GpioDirection_Output = 1,
} GpioDirection;
typedef enum {
GpioValue_Low = 0,
GpioValue_Low = 0,
GpioValue_High = 1,
} GpioValue;
typedef enum {
GpioInterruptMode_LowLevel = 0,
GpioInterruptMode_HighLevel = 1,
GpioInterruptMode_RisingEdge = 2,
GpioInterruptMode_FallingEdge = 3,
GpioInterruptMode_AnyEdge = 4,
} GpioInterruptMode;
typedef enum {
GpioInterruptStatus_Inactive = 0,
GpioInterruptStatus_Active = 1,
} GpioInterruptStatus;
/// Initialize gpio.
Result gpioInitialize(void);
@ -38,9 +53,25 @@ void gpioExit(void);
Service* gpioGetServiceSession(void);
Result gpioOpenSession(GpioPadSession *out, GpioPadName name);
Result gpioOpenSession2(GpioPadSession *out, u32 device_code, u32 access_mode);
Result gpioIsWakeEventActive(bool *out, GpioPadName name);
Result gpioIsWakeEventActive2(bool *out, u32 device_code);
Result gpioPadSetDirection(GpioPadSession *p, GpioDirection dir);
Result gpioPadGetDirection(GpioPadSession *p, GpioDirection *out);
Result gpioPadSetInterruptMode(GpioPadSession *p, GpioInterruptMode mode);
Result gpioPadGetInterruptMode(GpioPadSession *p, GpioInterruptMode *out);
Result gpioPadSetInterruptEnable(GpioPadSession *p, bool en);
Result gpioPadGetInterruptEnable(GpioPadSession *p, bool *out);
Result gpioPadGetInterruptStatus(GpioPadSession *p, GpioInterruptStatus *out); ///< [1.0.0-16.1.0]
Result gpioPadClearInterruptStatus(GpioPadSession *p); ///< [1.0.0-16.1.0]
Result gpioPadSetValue(GpioPadSession *p, GpioValue val);
Result gpioPadGetValue(GpioPadSession *p, GpioValue *out);
Result gpioPadBindInterrupt(GpioPadSession *p, Event *out);
Result gpioPadUnbindInterrupt(GpioPadSession *p);
Result gpioPadSetDebounceEnabled(GpioPadSession *p, bool en);
Result gpioPadGetDebounceEnabled(GpioPadSession *p, bool *out);
Result gpioPadSetDebounceTime(GpioPadSession *p, s32 ms);
Result gpioPadGetDebounceTime(GpioPadSession *p, s32 *out);
void gpioPadClose(GpioPadSession *p);

View File

@ -40,7 +40,7 @@ typedef struct {
/// GameMovieId
typedef struct {
CapsAlbumEntryId album_id; ///< \ref CapsAlbumEntryId
CapsAlbumFileId file_id; ///< \ref CapsAlbumFileId
u8 reserved[0x28]; ///< Unused, always zero.
} GrcGameMovieId;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,219 @@
/**
* @file hidbus.h
* @brief hidbus service IPC wrapper, for using external devices attached to HID controllers. See also: https://switchbrew.org/wiki/HID_services#hidbus
* @note Only available on [5.0.0+].
* @author yellows8
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/hid.h"
#include "../sf/service.h"
/// BusType
typedef enum {
HidbusBusType_LeftJoyRail = 0, ///< LeftJoyRail
HidbusBusType_RightJoyRail = 1, ///< RightJoyRail
HidbusBusType_RightLarkRail = 2, ///< [6.0.0+] RightLarkRail (for microphone).
} HidbusBusType;
/// JoyPollingMode
typedef enum {
HidbusJoyPollingMode_SixAxisSensorDisable = 0, ///< SixAxisSensorDisable
HidbusJoyPollingMode_SixAxisSensorEnable = 1, ///< JoyEnableSixAxisPollingData
HidbusJoyPollingMode_ButtonOnly = 2, ///< [6.0.0+] ButtonOnly
} HidbusJoyPollingMode;
/// BusHandle
typedef struct {
u32 abstracted_pad_id; ///< AbstractedPadId
u8 internal_index; ///< InternalIndex
u8 player_number; ///< PlayerNumber
u8 bus_type_id; ///< BusTypeId
u8 is_valid; ///< IsValid
} HidbusBusHandle;
/// JoyPollingReceivedData
typedef struct {
u8 data[0x30]; ///< Data.
u64 out_size; ///< Size of data.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyPollingReceivedData;
/// HidbusDataAccessorHeader
typedef struct {
Result res; ///< Result.
u32 pad; ///< Padding.
u8 unused[0x18]; ///< Initialized sysmodule-side, not used by sdknso.
u64 latest_entry; ///< Latest entry.
u64 total_entries; ///< Total entries.
} HidbusDataAccessorHeader;
/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData
typedef struct {
u8 data[0x26]; ///< Data.
u8 out_size; ///< Size of data.
u8 pad; ///< Padding.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyDisableSixAxisPollingDataAccessorEntryData;
/// HidbusJoyDisableSixAxisPollingDataAccessorEntry
typedef struct {
u64 sampling_number; ///< SamplingNumber
HidbusJoyDisableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyDisableSixAxisPollingDataAccessorEntryData
} HidbusJoyDisableSixAxisPollingDataAccessorEntry;
/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData
typedef struct {
u8 data[0x8]; ///< Data.
u8 out_size; ///< Size of data.
u8 pad[7]; ///< Padding.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyEnableSixAxisPollingDataAccessorEntryData;
/// HidbusJoyEnableSixAxisPollingDataAccessorEntry
typedef struct {
u64 sampling_number; ///< SamplingNumber
HidbusJoyEnableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
} HidbusJoyEnableSixAxisPollingDataAccessorEntry;
/// HidbusJoyButtonOnlyPollingDataAccessorEntryData
typedef struct {
u8 data[0x2c]; ///< Data.
u8 out_size; ///< Size of data.
u8 pad[3]; ///< Padding.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyButtonOnlyPollingDataAccessorEntryData;
/// HidbusJoyButtonOnlyPollingDataAccessorEntry
typedef struct {
u64 sampling_number; ///< SamplingNumber
HidbusJoyButtonOnlyPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
} HidbusJoyButtonOnlyPollingDataAccessorEntry;
/// HidbusJoyDisableSixAxisPollingDataAccessor
typedef struct {
HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
HidbusJoyDisableSixAxisPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyDisableSixAxisPollingDataAccessorEntry
} HidbusJoyDisableSixAxisPollingDataAccessor;
/// HidbusJoyEnableSixAxisPollingDataAccessor
typedef struct {
HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
HidbusJoyEnableSixAxisPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntry
} HidbusJoyEnableSixAxisPollingDataAccessor;
/// HidbusJoyButtonOnlyPollingDataAccessor
typedef struct {
HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
HidbusJoyButtonOnlyPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyButtonOnlyPollingDataAccessorEntry
} HidbusJoyButtonOnlyPollingDataAccessor;
/// Common data for HidbusStatusManagerEntry*.
typedef struct {
u8 is_connected; ///< IsConnected
u8 pad[3]; ///< Padding.
Result is_connected_result; ///< IsConnectedResult
u8 is_enabled; ///< Flag indicating whether a device is enabled (\ref hidbusEnableExternalDevice).
u8 is_in_focus; ///< Flag indicating whether this entry is valid.
u8 is_polling_mode; ///< Flag indicating whether polling is enabled (\ref hidbusEnableJoyPollingReceiveMode).
u8 reserved; ///< Reserved
u32 polling_mode; ///< \ref HidbusJoyPollingMode
} HidbusStatusManagerEntryCommon;
/// HidbusStatusManagerEntry on 5.x.
typedef struct {
HidbusStatusManagerEntryCommon common; ///< \ref HidbusStatusManagerEntryCommon
u8 unk_x10[0xf0]; ///< Ignored by official sw.
} HidbusStatusManagerEntryV5;
/// HidbusStatusManagerEntry
typedef struct {
HidbusStatusManagerEntryCommon common; ///< \ref HidbusStatusManagerEntryCommon
u8 unk_x10[0x70]; ///< Ignored by official sw.
} HidbusStatusManagerEntry;
/// StatusManager on 5.x.
typedef struct {
HidbusStatusManagerEntryV5 entries[0x10]; ///< \ref HidbusStatusManagerEntryV5
} HidbusStatusManagerV5;
/// StatusManager
typedef struct {
HidbusStatusManagerEntry entries[0x13]; ///< \ref HidbusStatusManagerEntry
u8 unused[0x680]; ///< Unused.
} HidbusStatusManager;
/// Gets the Service object for the actual hidbus service session. This object must be closed by the user once finished using cmds with this.
Result hidbusGetServiceSession(Service* srv_out);
/// Gets the SharedMemory addr (\ref HidbusStatusManagerV5 on 5.x, otherwise \ref HidbusStatusManager). Only valid when at least one BusHandle is currently initialized (\ref hidbusInitialize).
void* hidbusGetSharedmemAddr(void);
/**
* @brief GetBusHandle
* @param[out] handle \ref HidbusBusHandle
* @param[out] flag Output flag indicating whether the handle is valid.
* @param[in] id \ref HidNpadIdType
* @param[in] bus_type \ref HidbusBusType
*/
Result hidbusGetBusHandle(HidbusBusHandle *handle, bool *flag, HidNpadIdType id, HidbusBusType bus_type);
/**
* @brief Initialize
* @param[in] handle \ref HidbusBusHandle
*/
Result hidbusInitialize(HidbusBusHandle handle);
/**
* @brief Finalize
* @param[in] handle \ref HidbusBusHandle
*/
Result hidbusFinalize(HidbusBusHandle handle);
/**
* @brief EnableExternalDevice
* @note This uses \ref hidLaShowControllerFirmwareUpdate if needed.
* @param[in] handle \ref HidbusBusHandle
* @param[in] flag Whether to enable the device (true = enable, false = disable). When false, this will internally use \ref hidbusDisableJoyPollingReceiveMode if needed.
* @param[in] device_id ExternalDeviceId which must match the connected device. Only used when flag is set.
*/
Result hidbusEnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_id);
/**
* @brief SendAndReceive
* @param[in] handle \ref HidbusBusHandle
* @param[in] inbuf Input buffer, containing the command data.
* @param[in] inbuf_size Input buffer size, must be <0x26.
* @param[out] outbuf Output buffer, containing the command reply data.
* @param[in] outbuf_size Output buffer max size.
* @param[out] out_size Actual output size.
*/
Result hidbusSendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* outbuf, size_t outbuf_size, u64 *out_size);
/**
* @brief EnableJoyPollingReceiveMode
* @param[in] handle \ref HidbusBusHandle
* @param[in] inbuf Input buffer, containing the command data.
* @param[in] inbuf_size Input buffer size, must be <0x26.
* @param[out] workbuf TransferMemory buffer, must be 0x1000-byte aligned. This buffer must not be written to until after \ref hidbusDisableJoyPollingReceiveMode is used.
* @param[in] workbuf_size TransferMemory buffer size, must be 0x1000-byte aligned.
* @param[in] polling_mode \ref HidbusJoyPollingMode
*/
Result hidbusEnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode);
/**
* @brief DisableJoyPollingReceiveMode
* @note This can also be used via \ref hidbusEnableExternalDevice with flag=false.
* @param[in] handle \ref HidbusBusHandle
*/
Result hidbusDisableJoyPollingReceiveMode(HidbusBusHandle handle);
/**
* @brief GetJoyPollingReceivedData
* @param[in] handle \ref HidbusBusHandle
* @param[out] recv_data Output array of \ref HidbusJoyPollingReceivedData.
* @param[in] count Total entries for the recv_data array. The maximum is 0xa. Official apps use range 0x1-0x9.
*/
Result hidbusGetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingReceivedData *recv_data, s32 count);

View File

@ -6,8 +6,61 @@
#pragma once
#include "../types.h"
#include "../services/hid.h"
#include "../services/hidsys.h"
#include "../sf/service.h"
/// HiddbgNpadButton. For the remaining buttons, see \ref HidNpadButton.
typedef enum {
HiddbgNpadButton_Home = BIT(18), ///< HOME button
HiddbgNpadButton_Capture = BIT(19), ///< Capture button
} HiddbgNpadButton;
/// HdlsAttribute
typedef enum {
HiddbgHdlsAttribute_HasVirtualSixAxisSensorAcceleration = BIT(0), ///< HasVirtualSixAxisSensorAcceleration
HiddbgHdlsAttribute_HasVirtualSixAxisSensorAngle = BIT(1), ///< HasVirtualSixAxisSensorAngle
} HiddbgHdlsAttribute;
/// State for overriding \ref HidDebugPadState.
typedef struct {
u32 attributes; ///< Bitfield of \ref HidDebugPadAttribute.
u32 buttons; ///< Bitfield of \ref HidDebugPadButton.
HidAnalogStickState analog_stick_l; ///< AnalogStickL
HidAnalogStickState analog_stick_r; ///< AnalogStickR
} HiddbgDebugPadAutoPilotState;
/// State for overriding \ref HidMouseState.
typedef struct {
s32 x; ///< X
s32 y; ///< Y
s32 delta_x; ///< DeltaX
s32 delta_y; ///< DeltaY
s32 wheel_delta; ///< WheelDelta
u32 buttons; ///< Bitfield of \ref HidMouseButton.
u32 attributes; ///< Bitfield of \ref HidMouseAttribute.
} HiddbgMouseAutoPilotState;
/// State for overriding \ref HidKeyboardState.
typedef struct {
u64 modifiers; ///< Bitfield of \ref HidKeyboardModifier.
u64 keys[4];
} HiddbgKeyboardAutoPilotState;
/// State for overriding SleepButtonState.
typedef struct {
u64 buttons; ///< Bitfield of buttons, only bit0 is used.
} HiddbgSleepButtonAutoPilotState;
/// HdlsHandle
typedef struct {
u64 handle; ///< Handle
} HiddbgHdlsHandle;
/// HdlsSessionId, returned by \ref hiddbgAttachHdlsWorkBuffer.
typedef struct {
u64 id; ///< Id
} HiddbgHdlsSessionId;
/// HdlsDeviceInfo, for [7.0.0-8.1.0].
typedef struct {
u32 deviceTypeInternal; ///< Only one bit can be set. BIT(N*4+0) = Pro-Controller, BIT(N*4+1) = Joy-Con Left, BIT(N*4+2) = Joy-Con Right, BIT(N*4+3) = invalid. Where N is 0-1. BIT(8-10) = Pro-Controller, BIT(11) = Famicom-Controller, BIT(12) = Famicom-Controller II with microphone, BIT(13) = NES-Controller(DeviceType=0x200), BIT(14) = NES-Controller(DeviceType=0x400), BIT(15-16) = invalid, BIT(17) = unknown(DeviceType=0x8000), BIT(18-20) = invalid, BIT(21-23) = unknown(DeviceType=0x80000000).
@ -20,7 +73,7 @@ typedef struct {
/// HdlsDeviceInfo, for [9.0.0+]. Converted to/from \ref HiddbgHdlsDeviceInfoV7 on prior sysvers.
typedef struct {
u8 deviceType; ///< \ref HidDeviceType
u8 npadInterfaceType; ///< \ref HidNpadInterfaceType. Additional type field used with the above type field (only applies to ::HidDeviceType_JoyRight1, ::HidDeviceType_JoyLeft2, ::HidDeviceType_FullKey3, and ::HidDeviceType_System19), if the value doesn't match one of the following a default is used. ::HidDeviceType_FullKey3: ::NpadInterfaceType_USB indicates that the controller is connected via USB. :::HidDeviceType_System19: ::NpadInterfaceType_USB = unknown. When value is ::NpadInterfaceType_Rail, state is merged with an existing controller (with ::HidDeviceType_JoyRight1 / ::HidDeviceType_JoyLeft2). Otherwise, it's a dedicated controller.
u8 npadInterfaceType; ///< \ref HidNpadInterfaceType. Additional type field used with the above type field (only applies to ::HidDeviceType_JoyRight1, ::HidDeviceType_JoyLeft2, ::HidDeviceType_FullKey3, and ::HidDeviceType_System19), if the value doesn't match one of the following a default is used. ::HidDeviceType_FullKey3: ::HidNpadInterfaceType_USB indicates that the controller is connected via USB. :::HidDeviceType_System19: ::HidNpadInterfaceType_USB = unknown. When value is ::HidNpadInterfaceType_Rail, state is merged with an existing controller (with ::HidDeviceType_JoyRight1 / ::HidDeviceType_JoyLeft2). Otherwise, it's a dedicated controller.
u8 pad[0x2]; ///< Padding.
u32 singleColorBody; ///< RGBA Single Body Color.
u32 singleColorButtons; ///< RGBA Single Buttons Color.
@ -30,29 +83,45 @@ typedef struct {
/// HdlsState, for [7.0.0-8.1.0].
typedef struct {
u8 powerConnected; ///< powerConnected for the main PowerInfo, see \ref HidFlags.
u8 flags; ///< ORRed with powerConnected to set the value of the first byte for \ref HidFlags. For example, value 1 here will set isCharging for the main PowerInfo.
u8 is_powered; ///< IsPowered for the main PowerInfo, see \ref HidNpadSystemProperties.
u8 flags; ///< ORRed with IsPowered to set the value of the first byte for \ref HidNpadSystemProperties. For example, value 1 here will set IsCharging for the main PowerInfo.
u8 unk_x2[0x6]; ///< Unknown
u32 batteryCharge; ///< batteryCharge for the main PowerInfo, see \ref HidPowerInfo.
u32 buttons; ///< See \ref HidControllerKeys.
JoystickPosition joysticks[JOYSTICK_NUM_STICKS]; ///< \ref JoystickPosition
u8 unk_x20; ///< Unused for input. Set with output from \ref hiddbgDumpHdlsStates. Not set by \ref hiddbgGetAbstractedPadsState.
u32 battery_level; ///< BatteryLevel for the main PowerInfo, see \ref HidPowerInfo.
u32 buttons; ///< See \ref HiddbgNpadButton.
HidAnalogStickState analog_stick_l; ///< AnalogStickL
HidAnalogStickState analog_stick_r; ///< AnalogStickR
u8 indicator; ///< Indicator. Unused for input. Set with output from \ref hiddbgDumpHdlsStates. Not set by \ref hiddbgGetAbstractedPadsState.
u8 padding[0x3]; ///< Padding
} HiddbgHdlsStateV7;
/// HdlsState, for [9.0.0+]. Converted to/from \ref HiddbgHdlsDeviceInfoV7 on prior sysvers.
/// HdlsState, for [9.0.0-11.0.1].
typedef struct {
u32 batteryCharge; ///< batteryCharge for the main PowerInfo, see \ref HidPowerInfo.
u32 flags; ///< Used to set the main PowerInfo for \ref HidFlags. BIT(0) -> powerConnected, BIT(1) -> isCharging.
u64 buttons; ///< See \ref HidControllerKeys. [9.0.0+] Masked with 0xfffffffff00fffff.
JoystickPosition joysticks[JOYSTICK_NUM_STICKS]; ///< \ref JoystickPosition
u8 unk_x20; ///< Unused for input. Set with output from \ref hiddbgDumpHdlsStates.
u32 battery_level; ///< BatteryLevel for the main PowerInfo, see \ref HidPowerInfo.
u32 flags; ///< Used to set the main PowerInfo for \ref HidNpadSystemProperties. BIT(0) -> IsPowered, BIT(1) -> IsCharging.
u64 buttons; ///< See \ref HiddbgNpadButton. [9.0.0+] Masked with 0xfffffffff00fffff.
HidAnalogStickState analog_stick_l; ///< AnalogStickL
HidAnalogStickState analog_stick_r; ///< AnalogStickR
u8 indicator; ///< Indicator. Unused for input. Set with output from \ref hiddbgDumpHdlsStates.
u8 padding[0x3]; ///< Padding
} HiddbgHdlsStateV9;
/// HdlsState, for [12.0.0+].
typedef struct {
u32 battery_level; ///< BatteryLevel for the main PowerInfo, see \ref HidPowerInfo.
u32 flags; ///< Used to set the main PowerInfo for \ref HidNpadSystemProperties. BIT(0) -> IsPowered, BIT(1) -> IsCharging.
u64 buttons; ///< See \ref HiddbgNpadButton. [9.0.0+] Masked with 0xfffffffff00fffff.
HidAnalogStickState analog_stick_l; ///< AnalogStickL
HidAnalogStickState analog_stick_r; ///< AnalogStickR
HidVector six_axis_sensor_acceleration; ///< VirtualSixAxisSensorAcceleration
HidVector six_axis_sensor_angle; ///< VirtualSixAxisSensorAngle
u32 attribute; ///< Bitfield of \ref HiddbgHdlsAttribute.
u8 indicator; ///< Indicator. Unused for input.
u8 padding[0x3]; ///< Padding
} HiddbgHdlsState;
/// HdlsNpadAssignmentEntry
typedef struct {
u64 HdlsHandle; ///< HdlsHandle
HiddbgHdlsHandle handle; ///< \ref HiddbgHdlsHandle
u32 unk_x8; ///< Unknown
u32 unk_xc; ///< Unknown
u64 unk_x10; ///< Unknown
@ -69,9 +138,9 @@ typedef struct {
/// HdlsStateListEntryV7, for [7.0.0-8.1.0].
typedef struct {
u64 HdlsHandle; ///< HdlsHandle
HiddbgHdlsHandle handle; ///< \ref HiddbgHdlsHandle
HiddbgHdlsDeviceInfoV7 device; ///< \ref HiddbgHdlsDeviceInfoV7. With \ref hiddbgApplyHdlsStateList this is only used when creating new devices.
HiddbgHdlsStateV7 state; ///< \ref HiddbgHdlsState
HiddbgHdlsStateV7 state; ///< \ref HiddbgHdlsStateV7
} HiddbgHdlsStateListEntryV7;
/// HdlsStateListV7, for [7.0.0-8.1.0]. This contains a list of all controllers, including non-virtual controllers.
@ -81,14 +150,28 @@ typedef struct {
HiddbgHdlsStateListEntryV7 entries[0x10]; ///< \ref HiddbgHdlsStateListEntryV7
} HiddbgHdlsStateListV7;
/// HdlsStateListEntry, for [9.0.0+]. Converted to/from \ref HiddbgHdlsStateListEntryV7 on prior sysvers.
/// HdlsStateListEntry, for [9.0.0-11.0.1].
typedef struct {
u64 HdlsHandle; ///< HdlsHandle
HiddbgHdlsHandle handle; ///< \ref HiddbgHdlsHandle
HiddbgHdlsDeviceInfo device; ///< \ref HiddbgHdlsDeviceInfo. With \ref hiddbgApplyHdlsStateList this is only used when creating new devices.
alignas(8) HiddbgHdlsStateV9 state; ///< \ref HiddbgHdlsStateV9
} HiddbgHdlsStateListEntryV9;
/// HdlsStateList, for [9.0.0-11.0.1].
typedef struct {
s32 total_entries; ///< Total entries for the below entries.
u32 pad; ///< Padding
HiddbgHdlsStateListEntryV9 entries[0x10]; ///< \ref HiddbgHdlsStateListEntryV9
} HiddbgHdlsStateListV9;
/// HdlsStateListEntry, for [12.0.0+].
typedef struct {
HiddbgHdlsHandle handle; ///< \ref HiddbgHdlsHandle
HiddbgHdlsDeviceInfo device; ///< \ref HiddbgHdlsDeviceInfo. With \ref hiddbgApplyHdlsStateList this is only used when creating new devices.
alignas(8) HiddbgHdlsState state; ///< \ref HiddbgHdlsState
} HiddbgHdlsStateListEntry;
/// HdlsStateList, for [9.0.0+]. Converted to/from \ref HiddbgHdlsStateListV7 on prior sysvers.
/// HdlsStateList, for [12.0.0+].
/// This contains a list of all controllers, including non-virtual controllers.
typedef struct {
s32 total_entries; ///< Total entries for the below entries.
@ -96,10 +179,15 @@ typedef struct {
HiddbgHdlsStateListEntry entries[0x10]; ///< \ref HiddbgHdlsStateListEntry
} HiddbgHdlsStateList;
/// AbstractedPadHandle
typedef struct {
u64 handle; ///< Handle
} HiddbgAbstractedPadHandle;
/// AbstractedPadState
typedef struct {
u32 type; ///< Type. Converted to HiddbgHdlsDeviceInfoV7::type internally by \ref hiddbgSetAutoPilotVirtualPadState. BIT(0) -> BIT(0), BIT(1) -> BIT(15), BIT(2-3) -> BIT(1-2), BIT(4-5) -> BIT(1-2), BIT(6) -> BIT(3). BIT(7-11) -> BIT(11-15), BIT(12-14) -> BIT(12-14), BIT(15) -> BIT(17), BIT(31) -> BIT(21).
u8 flags; ///< Flags. Only bit0 is used by \ref hiddbgSetAutoPilotVirtualPadState: when clear it will skip using the rest of the input and run \ref hiddbgUnsetAutoPilotVirtualPadState internally.
u8 flags; ///< Flags. Only bit0 is used by \ref hiddbgSetAutoPilotVirtualPadState, when clear it will skip using the rest of the input and run \ref hiddbgUnsetAutoPilotVirtualPadState internally.
u8 pad[0x3]; ///< Padding
u32 singleColorBody; ///< RGBA Single Body Color
@ -107,9 +195,9 @@ typedef struct {
u8 npadInterfaceType; ///< See HiddbgHdlsDeviceInfo::npadInterfaceType.
u8 pad2[0x3]; ///< Padding
HiddbgHdlsStateV7 state; ///< State
HiddbgHdlsStateV7 state; ///< State
u8 unused[0x60]; ///< Unused with \ref hiddbgSetAutoPilotVirtualPadState. Not set by \ref hiddbgGetAbstractedPadsState.
u8 unused[0x60]; ///< Unused with \ref hiddbgSetAutoPilotVirtualPadState. Not set by \ref hiddbgGetAbstractedPadsState.
} HiddbgAbstractedPadState;
/// Initialize hiddbg.
@ -121,89 +209,276 @@ void hiddbgExit(void);
/// Gets the Service object for the actual hiddbg service session.
Service* hiddbgGetServiceSession(void);
/// Writes the input RGB colors to the spi-flash for the specified controller (offset 0x6050 size 0x6). See hidsys.h for UniquePadId. Only available with [3.0.0+].
Result hiddbgUpdateControllerColor(u32 colorBody, u32 colorButtons, u64 UniquePadId);
/**
* @brief SetDebugPadAutoPilotState
* @param[in] state \ref HiddbgDebugPadAutoPilotState
*/
Result hiddbgSetDebugPadAutoPilotState(const HiddbgDebugPadAutoPilotState *state);
/// Writes the input RGB colors followed by inval to the spi-flash for the specified controller (offset 0x6050 size 0xD). See hidsys.h for UniquePadId. Only available with [5.0.0+].
Result hiddbgUpdateDesignInfo(u32 colorBody, u32 colorButtons, u32 colorLeftGrip, u32 colorRightGrip, u8 inval, u64 UniquePadId);
/**
* @brief UnsetDebugPadAutoPilotState
*/
Result hiddbgUnsetDebugPadAutoPilotState(void);
/// Get the OperationEvent for the specified controller. See hidsys.h for UniquePadId.
/// The Event must be closed by the user once finished with it.
/// Only available with [6.0.0+].
Result hiddbgAcquireOperationEventHandle(Event* out_event, bool autoclear, u64 UniquePadId);
/**
* @brief SetTouchScreenAutoPilotState
* @param[in] states Input array of \ref HiddbgMouseAutoPilotState.
* @param[in] count Total entries in the states array. Max is 16.
*/
Result hiddbgSetTouchScreenAutoPilotState(const HidTouchState *states, s32 count);
/// Reads spi-flash for the specified controller. See hidsys.h for UniquePadId.
/// This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used.
/// Only available with [6.0.0+].
Result hiddbgReadSerialFlash(u32 offset, void* buffer, size_t size, u64 UniquePadId);
/**
* @brief UnsetTouchScreenAutoPilotState
*/
Result hiddbgUnsetTouchScreenAutoPilotState(void);
/// Writes spi-flash for the specified controller. See hidsys.h for UniquePadId.
/// buffer and tmem_size must be page-aligned. size is the actual transfer size.
/// This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used.
/// Only available with [6.0.0+].
Result hiddbgWriteSerialFlash(u32 offset, void* buffer, size_t tmem_size, size_t size, u64 UniquePadId);
/**
* @brief SetMouseAutoPilotState
* @param[in] state \ref HiddbgMouseAutoPilotState
*/
Result hiddbgSetMouseAutoPilotState(const HiddbgMouseAutoPilotState *state);
/// Get the Result for the Operation and handles cleanup, for the specified controller. See hidsys.h for UniquePadId.
/// Only available with [6.0.0+].
Result hiddbgGetOperationResult(u64 UniquePadId);
/**
* @brief UnsetMouseAutoPilotState
*/
Result hiddbgUnsetMouseAutoPilotState(void);
/// Gets the internal DeviceType for the specified controller. See hidsys.h for UniquePadId.
/// Only available with [6.0.0+].
/// Pre-9.0.0 the output is an u32, with [9.0.0+] it's an u8.
Result hiddbgGetUniquePadDeviceTypeSetInternal(u64 UniquePadId, u32 *out);
/**
* @brief SetKeyboardAutoPilotState
* @param[in] state \ref HiddbgKeyboardAutoPilotState
*/
Result hiddbgSetKeyboardAutoPilotState(const HiddbgKeyboardAutoPilotState *state);
/// Gets a list of AbstractedPadHandles, where AbstractedPadHandles is the output array with max entries = count. total_entries is total entries written to the output array.
/// Only available with [5.0.0-8.1.0].
Result hiddbgGetAbstractedPadHandles(u64 *AbstractedPadHandles, s32 count, s32 *total_entries);
/**
* @brief UnsetKeyboardAutoPilotState
*/
Result hiddbgUnsetKeyboardAutoPilotState(void);
/// Gets the state for the specified AbstractedPadHandle.
/// Only available with [5.0.0-8.1.0].
Result hiddbgGetAbstractedPadState(u64 AbstractedPadHandle, HiddbgAbstractedPadState *state);
/**
* @brief Deactivates the HomeButton.
*/
Result hiddbgDeactivateHomeButton(void);
/// Similar to \ref hiddbgGetAbstractedPadHandles except this also returns the state for each pad in output array states.
/// Only available with [5.0.0-8.1.0].
Result hiddbgGetAbstractedPadsState(u64 *AbstractedPadHandles, HiddbgAbstractedPadState *states, s32 count, s32 *total_entries);
/**
* @brief SetSleepButtonAutoPilotState
* @param[in] state \ref HiddbgSleepButtonAutoPilotState
*/
Result hiddbgSetSleepButtonAutoPilotState(const HiddbgSleepButtonAutoPilotState *state);
/// Sets AutoPilot state for the specified pad.
/// AbstractedVirtualPadId can be any unique value as long as it's within bounds. For example, 0-7 is usable.
/// Only available with [5.0.0-8.1.0].
/**
* @brief UnsetSleepButtonAutoPilotState
*/
Result hiddbgUnsetSleepButtonAutoPilotState(void);
/**
* @brief Writes the input RGB colors to the spi-flash for the specified UniquePad (offset 0x6050 size 0x6).
* @note Only available with [3.0.0+].
* @param[in] colorBody RGB body color.
* @param[in] colorButtons RGB buttons color.
* @param[in] unique_pad_id \ref HidsysUniquePadId
*/
Result hiddbgUpdateControllerColor(u32 colorBody, u32 colorButtons, HidsysUniquePadId unique_pad_id);
/**
* @brief Writes the input RGB colors followed by inval to the spi-flash for the specified UniquePad (offset 0x6050 size 0xD).
* @note Only available with [5.0.0+].
* @param[in] colorBody RGB body color.
* @param[in] colorButtons RGB buttons color.
* @param[in] colorLeftGrip RGB left grip color.
* @param[in] colorRightGrip RGB right grip color.
* @param[in] inval Input value.
* @param[in] unique_pad_id \ref HidsysUniquePadId
*/
Result hiddbgUpdateDesignInfo(u32 colorBody, u32 colorButtons, u32 colorLeftGrip, u32 colorRightGrip, u8 inval, HidsysUniquePadId unique_pad_id);
/**
* @brief Get the OperationEvent for the specified UniquePad.
* @note The Event must be closed by the user once finished with it.
* @note Only available with [6.0.0+].
* @param[out] out_event Output Event.
* @param[in] autoclear The autoclear for the Event.
* @param[in] unique_pad_id \ref HidsysUniquePadId
**/
Result hiddbgAcquireOperationEventHandle(Event* out_event, bool autoclear, HidsysUniquePadId unique_pad_id);
/**
* @brief Reads spi-flash for the specified UniquePad.
* @note This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used.
* @note Only available with [6.0.0+].
* @param[in] offset Offset in spi-flash.
* @param[out] buffer Output buffer.
* @param[in] size Output buffer size.
* @param[in] unique_pad_id \ref HidsysUniquePadId
**/
Result hiddbgReadSerialFlash(u32 offset, void* buffer, size_t size, HidsysUniquePadId unique_pad_id);
/**
* @brief Writes spi-flash for the specified UniquePad.
* @note This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used.
* @note Only available with [6.0.0+].
* @param[in] offset Offset in spi-flash.
* @param[in] buffer Input buffer, must be 0x1000-byte aligned.
* @param[in] tmem_size Size of the buffer, must be 0x1000-byte aligned.
* @param[in] size Actual transfer size.
* @param[in] unique_pad_id \ref HidsysUniquePadId
**/
Result hiddbgWriteSerialFlash(u32 offset, void* buffer, size_t tmem_size, size_t size, HidsysUniquePadId unique_pad_id);
/**
* @brief Get the Result for the Operation and handles cleanup, for the specified UniquePad.
* @note Only available with [6.0.0+].
* @param[in] unique_pad_id \ref HidsysUniquePadId
**/
Result hiddbgGetOperationResult(HidsysUniquePadId unique_pad_id);
/**
* @brief Gets the internal DeviceType for the specified controller.
* @note Only available with [6.0.0+].
* @param[in] unique_pad_id \ref HidsysUniquePadId
* @param[out] out Pre-9.0.0 this is an u32, with [9.0.0+] it's an u8.
**/
Result hiddbgGetUniquePadDeviceTypeSetInternal(HidsysUniquePadId unique_pad_id, u32 *out);
/** @name AbstractedPad
* This is for virtual HID controllers. Only use this on pre-7.0.0, Hdls should be used otherwise.
*/
///@{
/**
* @brief Gets a list of \ref HiddbgAbstractedPadHandle.
* @note Only available with [5.0.0-8.1.0].
* @param[out] handles Output array of \ref HiddbgAbstractedPadHandle.
* @param[in] count Max number of entries for the handles array.
* @param[out] total_out Total output entries.
*/
Result hiddbgGetAbstractedPadHandles(HiddbgAbstractedPadHandle *handles, s32 count, s32 *total_out);
/**
* @brief Gets the state for the specified \ref HiddbgAbstractedPadHandle.
* @note Only available with [5.0.0-8.1.0].
* @param[in] handle \ref HiddbgAbstractedPadHandle
* @param[out] state \ref HiddbgAbstractedPadState
*/
Result hiddbgGetAbstractedPadState(HiddbgAbstractedPadHandle handle, HiddbgAbstractedPadState *state);
/**
* @brief Similar to \ref hiddbgGetAbstractedPadHandles except this also returns the state for each pad in output array states.
* @note Only available with [5.0.0-8.1.0].
* @param[out] handles Output array of \ref HiddbgAbstractedPadHandle.
* @param[out] states Output array of \ref HiddbgAbstractedPadState.
* @param[in] count Max number of entries for the handles/states arrays.
* @param[out] total_out Total output entries.
*/
Result hiddbgGetAbstractedPadsState(HiddbgAbstractedPadHandle *handles, HiddbgAbstractedPadState *states, s32 count, s32 *total_out);
/**
* @brief Sets AutoPilot state for the specified pad.
* @note Only available with [5.0.0-8.1.0].
* @param[in] AbstractedVirtualPadId This can be any unique value as long as it's within bounds. For example, 0-7 is usable.
* @param[in] state \ref HiddbgAbstractedPadState
*/
Result hiddbgSetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId, const HiddbgAbstractedPadState *state);
/// Clears AutoPilot state for the specified pad set by \ref hiddbgSetAutoPilotVirtualPadState.
/// Only available with [5.0.0-8.1.0].
/**
* @brief Clears AutoPilot state for the specified pad set by \ref hiddbgSetAutoPilotVirtualPadState.
* @note Only available with [5.0.0-8.1.0].
* @param[in] AbstractedVirtualPadId Id from \ref hiddbgSetAutoPilotVirtualPadState.
*/
Result hiddbgUnsetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId);
/// Clears AutoPilot state for all pads set by \ref hiddbgSetAutoPilotVirtualPadState.
/**
* @brief Clears AutoPilot state for all pads set by \ref hiddbgSetAutoPilotVirtualPadState.
*/
Result hiddbgUnsetAllAutoPilotVirtualPadState(void);
/// Initialize Hdls. Hdls is for virtual HID controllers. Only available with [7.0.0+].
Result hiddbgAttachHdlsWorkBuffer(void);
///@}
/// Exit Hdls, must be called at some point prior to hiddbgExit. Only available with [7.0.0+].
Result hiddbgReleaseHdlsWorkBuffer(void);
/** @name Hdls
* This is for virtual HID controllers.
*/
///@{
/// Checks if the given HdlsHandle is still attached, where the result is written to isAttached. Only available with [7.0.0+].
Result hiddbgIsHdlsVirtualDeviceAttached(u64 HdlsHandle, bool *isAttached);
/**
* @brief Initialize Hdls.
* @note Only available with [7.0.0+].
* @param[out] session_id [13.0.0+] \ref HiddbgHdlsSessionId
* @param[in] buffer An existing buffer to be used as transfer memory.
* @param[in] size Size of the supplied buffer.
*/
Result hiddbgAttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer, size_t size);
/// Gets state for \ref HiddbgHdlsNpadAssignment. Only available with [7.0.0+].
Result hiddbgDumpHdlsNpadAssignmentState(HiddbgHdlsNpadAssignment *state);
/**
* @brief Exit Hdls, must be called at some point prior to \ref hiddbgExit.
* @note Only available with [7.0.0+].
* @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId
*/
Result hiddbgReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id);
/// Gets state for \ref HiddbgHdlsStateList. Only available with [7.0.0+].
Result hiddbgDumpHdlsStates(HiddbgHdlsStateList *state);
/**
* @brief Checks if the given device is still attached.
* @note Only available with [7.0.0+].
* @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId
* @param[in] handle \ref HiddbgHdlsHandle
* @param[out] out Whether the device is attached.
*/
Result hiddbgIsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgHdlsHandle handle, bool *out);
/// Sets state for \ref HiddbgHdlsNpadAssignment. Only available with [7.0.0+].
Result hiddbgApplyHdlsNpadAssignmentState(const HiddbgHdlsNpadAssignment *state, bool flag);
/**
* @brief Gets state for \ref HiddbgHdlsNpadAssignment.
* @note Only available with [7.0.0+].
* @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId
* @param[out] state \ref HiddbgHdlsNpadAssignment
*/
Result hiddbgDumpHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, HiddbgHdlsNpadAssignment *state);
/// Sets state for \ref HiddbgHdlsStateList. Only available with [7.0.0+].
/// The HiddbgHdlsState will be applied for each HdlsHandle. If a HdlsHandle is not found, code similar to \ref hiddbgAttachHdlsVirtualDevice will run with the \ref HiddbgHdlsDeviceInfo, then it will continue with applying state with the new device.
Result hiddbgApplyHdlsStateList(const HiddbgHdlsStateList *state);
/**
* @brief Gets state for \ref HiddbgHdlsStateList.
* @note Only available with [7.0.0+].
* @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId
* @param[out] state \ref HiddbgHdlsStateList
*/
Result hiddbgDumpHdlsStates(HiddbgHdlsSessionId session_id, HiddbgHdlsStateList *state);
/// Attach a device with the input info, where the output handle is written to HdlsHandle. Only available with [7.0.0+].
Result hiddbgAttachHdlsVirtualDevice(u64 *HdlsHandle, const HiddbgHdlsDeviceInfo *info);
/**
* @brief Sets state for \ref HiddbgHdlsNpadAssignment.
* @note Only available with [7.0.0+].
* @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId
* @param[in] state \ref HiddbgHdlsNpadAssignment
* @param[in] flag Flag
*/
Result hiddbgApplyHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, const HiddbgHdlsNpadAssignment *state, bool flag);
/// Detach the specified device. Only available with [7.0.0+].
Result hiddbgDetachHdlsVirtualDevice(u64 HdlsHandle);
/**
* @brief Sets state for \ref HiddbgHdlsStateList.
* @note The \ref HiddbgHdlsState will be applied for each \ref HiddbgHdlsHandle. If a \ref HiddbgHdlsHandle is not found, code similar to \ref hiddbgAttachHdlsVirtualDevice will run with the \ref HiddbgHdlsDeviceInfo, then it will continue with applying state with the new device.
* @note Only available with [7.0.0+].
* @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId
* @param[in] state \ref HiddbgHdlsStateList
*/
Result hiddbgApplyHdlsStateList(HiddbgHdlsSessionId session_id, const HiddbgHdlsStateList *state);
/// Sets state for the specified device. Only available with [7.0.0+].
Result hiddbgSetHdlsState(u64 HdlsHandle, const HiddbgHdlsState *state);
/**
* @brief Attach a device with the input info.
* @note Only available with [7.0.0+].
* @param[out] handle \ref HiddbgHdlsHandle
* @param[in] info \ref HiddbgHdlsDeviceInfo
*/
Result hiddbgAttachHdlsVirtualDevice(HiddbgHdlsHandle *handle, const HiddbgHdlsDeviceInfo *info);
/**
* @brief Detach the specified device.
* @note Only available with [7.0.0+].
* @param[in] handle \ref HiddbgHdlsHandle
*/
Result hiddbgDetachHdlsVirtualDevice(HiddbgHdlsHandle handle);
/**
* @brief Sets state for the specified device.
* @note Only available with [7.0.0+].
* @param[in] handle \ref HiddbgHdlsHandle
* @param[in] state \ref HiddbgHdlsState
*/
Result hiddbgSetHdlsState(HiddbgHdlsHandle handle, const HiddbgHdlsState *state);
///@}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,150 @@
/**
* @file htcs.h
* @brief HTC sockets (htcs) service IPC wrapper. Please use <<TODO>> instead.
* @author SciresM
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
#define HTCS_PEER_NAME_MAX 32
#define HTCS_PORT_NAME_MAX 32
#define HTCS_SESSION_COUNT_MAX 0x10
#define HTCS_SOCKET_COUNT_MAX 40
#define HTCS_FD_SET_SIZE HTCS_SOCKET_COUNT_MAX
typedef uint16_t HtcsAddressFamilyType;
typedef struct {
char name[HTCS_PEER_NAME_MAX];
} HtcsPeerName;
typedef struct {
char name[HTCS_PORT_NAME_MAX];
} HtcsPortName;
typedef struct {
HtcsAddressFamilyType family;
HtcsPeerName peer_name;
HtcsPortName port_name;
} HtcsSockAddr;
typedef struct {
s64 tv_sec;
s64 tv_usec;
} HtcsTimeVal;
typedef struct {
int fds[HTCS_FD_SET_SIZE];
} HtcsFdSet;
typedef enum {
HTCS_ENONE = 0,
HTCS_EACCES = 2,
HTCS_EADDRINUSE = 3,
HTCS_EADDRNOTAVAIL = 4,
HTCS_EAGAIN = 6,
HTCS_EALREADY = 7,
HTCS_EBADF = 8,
HTCS_EBUSY = 10,
HTCS_ECONNABORTED = 13,
HTCS_ECONNREFUSED = 14,
HTCS_ECONNRESET = 15,
HTCS_EDESTADDRREQ = 17,
HTCS_EFAULT = 21,
HTCS_EINPROGRESS = 26,
HTCS_EINTR = 27,
HTCS_EINVAL = 28,
HTCS_EIO = 29,
HTCS_EISCONN = 30,
HTCS_EMFILE = 33,
HTCS_EMSGSIZE = 35,
HTCS_ENETDOWN = 38,
HTCS_ENETRESET = 39,
HTCS_ENOBUFS = 42,
HTCS_ENOMEM = 49,
HTCS_ENOTCONN = 56,
HTCS_ETIMEDOUT = 76,
HTCS_EUNKNOWN = 79,
HTCS_EWOULDBLOCK = HTCS_EAGAIN,
} HtcsSocketError;
typedef enum {
HTCS_MSG_PEEK = 1,
HTCS_MSG_WAITALL = 2,
} HtcsMessageFlag;
typedef enum {
HTCS_SHUT_RD = 0,
HTCS_SHUT_WR = 1,
HTCS_SHUT_RDWR = 2,
} HtcsShutdownType;
typedef enum {
HTCS_F_GETFL = 3,
HTCS_F_SETFL = 4,
} HtcsFcntlOperation;
typedef enum {
HTCS_O_NONBLOCK = 4,
} HtcsFcntlFlag;
typedef enum {
HTCS_AF_HTCS = 0,
} HtcsAddressFamily;
typedef struct {
Service s;
} HtcsSocket;
/// Initialize the HTCS service.
Result htcsInitialize(u32 num_sessions);
/// Exit the HTCS service.
void htcsExit(void);
/// Gets the Service object for the actual HTCS manager service session.
Service* htcsGetManagerServiceSession(void);
/// Gets the Service object for the actual HTCS monitor service session.
Service* htcsGetMonitorServiceSession(void);
/// Manager functionality.
Result htcsGetPeerNameAny(HtcsPeerName *out);
Result htcsGetDefaultHostName(HtcsPeerName *out);
Result htcsCreateSocket(s32 *out_err, HtcsSocket *out, bool enable_disconnection_emulation);
Result htcsStartSelect(u32 *out_task_id, Handle *out_event_handle, const s32 *read, size_t num_read, const s32 *write, size_t num_write, const s32 *except, size_t num_except, s64 tv_sec, s64 tv_usec);
Result htcsEndSelect(s32 *out_err, s32 *out_count, s32 *read, size_t num_read, s32 *write, size_t num_write, s32 *except, size_t num_except, u32 task_id);
/// Socket functionality.
Result htcsSocketClose(HtcsSocket *s, s32 *out_err, s32 *out_res);
Result htcsSocketConnect(HtcsSocket *s, s32 *out_err, s32 *out_res, const HtcsSockAddr *address);
Result htcsSocketBind(HtcsSocket *s, s32 *out_err, s32 *out_res, const HtcsSockAddr *address);
Result htcsSocketListen(HtcsSocket *s, s32 *out_err, s32 *out_res, s32 backlog_count);
Result htcsSocketShutdown(HtcsSocket *s, s32 *out_err, s32 *out_res, s32 how);
Result htcsSocketFcntl(HtcsSocket *s, s32 *out_err, s32 *out_res, s32 command, s32 value);
Result htcsSocketAcceptStart(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle);
Result htcsSocketAcceptResults(HtcsSocket *s, s32 *out_err, HtcsSocket *out_socket, HtcsSockAddr *out_address, u32 task_id);
Result htcsSocketRecvStart(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, s32 mem_size, s32 flags);
Result htcsSocketRecvResults(HtcsSocket *s, s32 *out_err, s64 *out_size, void *buffer, size_t buffer_size, u32 task_id);
Result htcsSocketSendStart(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, const void *buffer, size_t buffer_size, s32 flags);
Result htcsSocketSendResults(HtcsSocket *s, s32 *out_err, s64 *out_size, u32 task_id);
Result htcsSocketStartSend(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, s64 *out_max_size, s64 size, s32 flags);
Result htcsSocketContinueSend(HtcsSocket *s, s64 *out_size, bool *out_wait, const void *buffer, size_t buffer_size, u32 task_id);
Result htcsSocketEndSend(HtcsSocket *s, s32 *out_err, s64 *out_size, u32 task_id);
Result htcsSocketStartRecv(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, s64 size, s32 flags);
Result htcsSocketEndRecv(HtcsSocket *s, s32 *out_err, s64 *out_size, void *buffer, size_t buffer_size, u32 task_id);
Result htcsSocketGetPrimitive(HtcsSocket *s, s32 *out);
void htcsCloseSocket(HtcsSocket *s);

View File

@ -0,0 +1,55 @@
/**
* @file ins.h
* @brief INS services IPC wrapper.
* @author averne
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../sf/service.h"
/// Initialize ins:r.
Result insrInitialize(void);
/// Exit ins:r.
void insrExit(void);
/// Gets the Service object for the actual ins:r service session.
Service* insrGetServiceSession(void);
/**
* @brief Retrieves the last system tick the event corresponding to the ID was signaled at.
* @param[in] id Ins request ID (should be 0..4).
* @param[out] tick.
* @return Result code.
* @note The tick is only updated once per second at minimum.
*/
Result insrGetLastTick(u32 id, u64 *tick);
/**
* @brief Retrieves the event corresponding to the ID.
* @param[in] id Ins request ID (should be 0..4).
* @param[out] out.
* @return Result code.
* @note The event is only signaled once per second at minimum.
*/
Result insrGetReadableEvent(u32 id, Event *out);
/// Initialize ins:s.
Result inssInitialize(void);
/// Exit ins:s.
void inssExit(void);
/// Gets the Service object for the actual ins:s service session.
Service* inssGetServiceSession(void);
/**
* @brief Retrieves the event corresponding to the ID.
* @param[in] id Ins send ID (should be 0..11).
* @param[out] out.
* @return Result code.
* @note The returned event cannot be waited on, only signaled. Clearing is handled by the service.
*/
Result inssGetWritableEvent(u32 id, Event *out);

View File

@ -10,44 +10,373 @@
#include "../sf/service.h"
#include "../services/hid.h"
typedef struct {
u64 unk_x0;
u8 unk_x8;
u8 unk_x9;
u8 unk_xa;
u8 pad[5];
u16 unk_x10;
u32 unk_x12;
u16 unk_x16;
u32 unk_constant;//offset 0x18
u8 unk_x1c;
u8 unk_x1d;
u8 pad2[2];
} PACKED IrsPackedMomentProcessorConfig;
#define IRS_MAX_CAMERAS 0x9
/// IrCameraStatus
typedef enum {
IrsIrCameraStatus_Available = 0, ///< Available
IrsIrCameraStatus_Unsupported = 1, ///< Unsupported
IrsIrCameraStatus_Unconnected = 2, ///< Unconnected
} IrsIrCameraStatus;
/// IrCameraInternalStatus
typedef enum {
IrsIrCameraInternalStatus_Stopped = 0, ///< Stopped
IrsIrCameraInternalStatus_FirmwareUpdateNeeded = 1, ///< FirmwareUpdateNeeded
IrsIrCameraInternalStatus_Unknown2 = 2, ///< Unknown
IrsIrCameraInternalStatus_Unknown3 = 3, ///< Unknown
IrsIrCameraInternalStatus_Unknown4 = 4, ///< Unknown
IrsIrCameraInternalStatus_FirmwareVersionRequested = 5, ///< FirmwareVersionRequested
IrsIrCameraInternalStatus_FirmwareVersionIsInvalid = 6, ///< FirmwareVersionIsInvalid
IrsIrCameraInternalStatus_Ready = 7, ///< [4.0.0+] Ready
IrsIrCameraInternalStatus_Setting = 8, ///< [4.0.0+] Setting
} IrsIrCameraInternalStatus;
/// IrSensorMode
typedef enum {
IrsIrSensorMode_None = 0, ///< None
IrsIrSensorMode_MomentProcessor = 1, ///< MomentProcessor
IrsIrSensorMode_ClusteringProcessor = 2, ///< ClusteringProcessor
IrsIrSensorMode_ImageTransferProcessor = 3, ///< ImageTransferProcessor
IrsIrSensorMode_PointingProcessor = 4, ///< PointingProcessor
IrsIrSensorMode_TeraPluginProcessor = 5, ///< TeraPluginProcessor
IrsIrSensorMode_IrLedProcessor = 6, ///< IrLedProcessor (doesn't apply to IrsDeviceFormat::ir_sensor_mode)
} IrsIrSensorMode;
/// ImageProcessorStatus
typedef enum {
IrsImageProcessorStatus_Stopped = 0, ///< Stopped
IrsImageProcessorStatus_Running = 1, ///< Running
} IrsImageProcessorStatus;
/// ImageTransferProcessorFormat. IR Sensor image resolution.
typedef enum {
IrsImageTransferProcessorFormat_320x240 = 0, ///< 320x240
IrsImageTransferProcessorFormat_160x120 = 1, ///< 160x120
IrsImageTransferProcessorFormat_80x60 = 2, ///< 80x60
IrsImageTransferProcessorFormat_40x30 = 3, ///< [4.0.0+] 40x30
IrsImageTransferProcessorFormat_20x15 = 4, ///< [4.0.0+] 20x15
} IrsImageTransferProcessorFormat;
/// AdaptiveClusteringMode
typedef enum {
IrsAdaptiveClusteringMode_StaticFov = 0, ///< StaticFov
IrsAdaptiveClusteringMode_DynamicFov = 1, ///< DynamicFov
} IrsAdaptiveClusteringMode;
/// AdaptiveClusteringTargetDistance
typedef enum {
IrsAdaptiveClusteringTargetDistance_Near = 0, ///< Near
IrsAdaptiveClusteringTargetDistance_Middle = 1, ///< Middle
IrsAdaptiveClusteringTargetDistance_Far = 2, ///< Far
} IrsAdaptiveClusteringTargetDistance;
/// HandAnalysisMode
typedef enum {
IrsHandAnalysisMode_Silhouette = 1, ///< Silhouette
IrsHandAnalysisMode_Image = 2, ///< Image
IrsHandAnalysisMode_SilhouetteAndImage = 3, ///< SilhouetteAndImage
IrsHandAnalysisMode_SilhouetteOnly = 4, ///< [4.0.0+] SilhouetteOnly
} IrsHandAnalysisMode;
/// Internal validation callblack.
typedef bool (*IrsValidationCb)(void* userdata, void* arg);
/// IrCameraHandle
typedef struct {
u64 exposure; ///< IR Sensor exposure time in nanoseconds.
u32 ir_leds; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u32 digital_gain; ///< IR sensor signal's digital gain.
u8 color_invert; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 pad[7];
u32 sensor_res; ///< IR Sensor resolution. 0: 240x320, 1: 120x160, 2: 60x80.
u8 player_number; ///< PlayerNumber
u8 device_type; ///< DeviceType
u8 reserved[0x2]; ///< Reserved
} IrsIrCameraHandle;
/// PackedMcuVersion
typedef struct {
u16 major_version; ///< MajorVersion
u16 minor_version; ///< MinorVersion
} IrsPackedMcuVersion;
/// PackedFunctionLevel
typedef struct {
u8 ir_sensor_function_level; ///< IrSensorFunctionLevel
u8 reserved[0x3]; ///< Reserved
} IrsPackedFunctionLevel;
/// Rect
typedef struct {
s16 x; ///< X
s16 y; ///< Y
s16 width; ///< Width
s16 height; ///< Height
} IrsRect;
/// IrsMomentProcessorConfig
typedef struct {
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u32 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u32 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x7]; ///< Reserved.
IrsRect window_of_interest; ///< WindowOfInterest
u32 preprocess; ///< Preprocess
u32 preprocess_intensity_threshold; ///< PreprocessIntensityThreshold
} IrsMomentProcessorConfig;
/// PackedMomentProcessorConfig
typedef struct {
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u8 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u8 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x5]; ///< Reserved.
IrsRect window_of_interest; ///< WindowOfInterest
IrsPackedMcuVersion required_mcu_version; ///< RequiredMcuVersion
u8 preprocess; ///< Preprocess
u8 preprocess_intensity_threshold; ///< PreprocessIntensityThreshold
u8 reserved2[0x2]; ///< Reserved.
} IrsPackedMomentProcessorConfig;
/// ClusteringProcessorConfig
typedef struct {
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u32 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u32 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x7]; ///< Reserved.
IrsRect window_of_interest; ///< WindowOfInterest
u32 object_pixel_count_min; ///< ObjectPixelCountMin
u32 object_pixel_count_max; ///< ObjectPixelCountMax
u32 object_intensity_min; ///< ObjectIntensityMin
u8 is_external_light_filter_enabled; ///< IsExternalLightFilterEnabled
} IrsClusteringProcessorConfig;
/// PackedClusteringProcessorConfig
typedef struct {
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u8 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u8 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x5]; ///< Reserved.
IrsRect window_of_interest; ///< WindowOfInterest
IrsPackedMcuVersion required_mcu_version; ///< RequiredMcuVersion
u32 object_pixel_count_min; ///< ObjectPixelCountMin
u32 object_pixel_count_max; ///< ObjectPixelCountMax
u8 object_intensity_min; ///< ObjectIntensityMin
u8 is_external_light_filter_enabled; ///< IsExternalLightFilterEnabled
u8 reserved2[0x2]; ///< Reserved.
} IrsPackedClusteringProcessorConfig;
/// ImageTransferProcessorConfig
typedef struct {
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u32 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u32 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x7]; ///< Reserved.
u32 format; ///< \ref IrsImageTransferProcessorFormat
} IrsImageTransferProcessorConfig;
/// ImageTransferProcessorExConfig
typedef struct {
u64 exposure; ///< IR Sensor exposure time in nanoseconds.
u8 ir_leds; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u8 digital_gain; ///< IR sensor signal's digital gain.
u8 color_invert; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 pad[5];
u32 unk_constant;//offset 0x10
u8 sensor_res; ///< IR Sensor resolution. 0: 240x320, 1: 120x160, 2: 60x80.
u8 pad2[3];
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u32 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u32 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x7]; ///< Reserved.
u32 orig_format; ///< OrigFormat \ref IrsImageTransferProcessorFormat
u32 trimming_format; ///< TrimmingFormat \ref IrsImageTransferProcessorFormat
u16 trimming_start_x; ///< TrimmingStartX
u16 trimming_start_y; ///< TrimmingStartY
u8 is_external_light_filter_enabled; ///< IsExternalLightFilterEnabled
} IrsImageTransferProcessorExConfig;
/// PackedImageTransferProcessorConfig
typedef struct {
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u8 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u8 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x5]; ///< Reserved.
IrsPackedMcuVersion required_mcu_version; ///< RequiredMcuVersion
u8 format; ///< \ref IrsImageTransferProcessorFormat
u8 reserved2[0x3]; ///< Reserved.
} IrsPackedImageTransferProcessorConfig;
/// PackedImageTransferProcessorExConfig
typedef struct {
u8 unk_x0[0x10];
} PACKED IrsImageTransferProcessorState;
u64 exposure_time; ///< IR Sensor exposure time in nanoseconds.
u8 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u8 gain; ///< IR sensor signal's digital gain.
u8 is_negative_image_used; ///< Inverts the colors of the captured image. 0: Normal image, 1: Negative image.
u8 reserved[0x5]; ///< Reserved.
IrsPackedMcuVersion required_mcu_version; ///< RequiredMcuVersion
u8 orig_format; ///< OrigFormat \ref IrsImageTransferProcessorFormat
u8 trimming_format; ///< TrimmingFormat \ref IrsImageTransferProcessorFormat
u16 trimming_start_x; ///< TrimmingStartX
u16 trimming_start_y; ///< TrimmingStartY
u8 is_external_light_filter_enabled; ///< IsExternalLightFilterEnabled
u8 reserved2[0x5]; ///< Reserved.
} IrsPackedImageTransferProcessorExConfig;
/// ImageTransferProcessorState
typedef struct {
u64 sampling_number; ///< SamplingNumber
u32 ambient_noise_level; ///< AmbientNoiseLevel
u8 reserved[0x4]; ///< Reserved
} IrsImageTransferProcessorState;
/// PackedPointingProcessorConfig
typedef struct {
IrsRect window_of_interest; ///< WindowOfInterest
IrsPackedMcuVersion required_mcu_version; ///< RequiredMcuVersion
} IrsPackedPointingProcessorConfig;
/// TeraPluginProcessorConfig
typedef struct {
u8 mode; ///< Mode
u8 unk_x1; ///< [6.0.0+] Unknown
u8 unk_x2; ///< [6.0.0+] Unknown
u8 unk_x3; ///< [6.0.0+] Unknown
} IrsTeraPluginProcessorConfig;
/// PackedTeraPluginProcessorConfig
typedef struct {
IrsPackedMcuVersion required_mcu_version; ///< RequiredMcuVersion
u8 mode; ///< Mode
u8 unk_x5; ///< [6.0.0+] This is set to 0x2 | (IrsTeraPluginProcessorConfig::unk_x1 << 7).
u8 unk_x6; ///< [6.0.0+] IrsTeraPluginProcessorConfig::unk_x2
u8 unk_x7; ///< [6.0.0+] IrsTeraPluginProcessorConfig::unk_x3
} IrsPackedTeraPluginProcessorConfig;
/// IrLedProcessorConfig
typedef struct {
u32 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
} IrsIrLedProcessorConfig;
/// PackedIrLedProcessorConfig
typedef struct {
IrsPackedMcuVersion required_mcu_version; ///< RequiredMcuVersion
u8 light_target; ///< Controls the IR leds. 0: All leds, 1: Bright group, 2: Dim group, 3: None.
u8 pad[0x3]; ///< Padding
} IrsPackedIrLedProcessorConfig;
/// AdaptiveClusteringProcessorConfig
typedef struct {
u32 mode; ///< \ref IrsAdaptiveClusteringMode
u32 target_distance; ///< [6.0.0+] \ref IrsAdaptiveClusteringTargetDistance
} IrsAdaptiveClusteringProcessorConfig;
/// HandAnalysisConfig
typedef struct {
u32 mode; ///< \ref IrsHandAnalysisMode
} IrsHandAnalysisConfig;
/// MomentStatistic
typedef struct {
float average_intensity; ///< AverageIntensity
float centroid_x; ///< CentroidX
float centroid_y; ///< CentroidY
} IrsMomentStatistic;
/// MomentProcessorState
typedef struct {
s64 sampling_number; ///< SamplingNumber
u64 timestamp; ///< TimeStamp
u32 ambient_noise_level; ///< AmbientNoiseLevel
u8 reserved[0x4]; ///< Reserved
IrsMomentStatistic statistic[0x30]; ///< \ref IrsMomentStatistic
} IrsMomentProcessorState;
/// ClusteringData
typedef struct {
float average_intensity; ///< AverageIntensity
float centroid_x; ///< CentroidX
float centroid_y; ///< CentroidY
u32 pixel_count; ///< PixelCount
u16 bound_x; ///< BoundX
u16 bound_y; ///< BoundY
u16 boundt_width; ///< BoundtWidth
u16 bound_height; ///< BoundHeight
} IrsClusteringData;
/// ClusteringProcessorState
typedef struct {
s64 sampling_number; ///< SamplingNumber
u64 timestamp; ///< TimeStamp
u8 object_count; ///< ObjectCount
u8 reserved[0x3]; ///< Reserved
u32 ambient_noise_level; ///< AmbientNoiseLevel
IrsClusteringData data[0x10]; ///< \ref IrsClusteringData
} IrsClusteringProcessorState;
/// PointingProcessorMarkerState
typedef struct {
s64 sampling_number; ///< SamplingNumber
u64 timestamp; ///< TimeStamp
struct {
u8 pointing_status; ///< PointingStatus
u8 reserved[0x3]; ///< Reserved
u8 unk_x4[0x4]; ///< Unknown
float unk_x8; ///< Unknown
float position_x; ///< PositionX
float position_y; ///< PositionY
float unk_x14; ///< Unknown
IrsRect window_of_interest; ///< WindowOfInterest
} data[3];
} IrsPointingProcessorMarkerState;
/// PointingProcessorState
typedef struct {
s64 sampling_number; ///< SamplingNumber
u64 timestamp; ///< TimeStamp
u32 pointing_status; ///< PointingStatus
float position_x; ///< PositionX
float position_y; ///< PositionY
u8 reserved[0x4]; ///< Reserved
} IrsPointingProcessorState;
/// TeraPluginProcessorState
typedef struct {
s64 sampling_number; ///< SamplingNumber
u64 timestamp; ///< TimeStamp
u32 ambient_noise_level; ///< AmbientNoiseLevel
u8 plugin_data[0x12c]; ///< PluginData
} IrsTeraPluginProcessorState;
/// ProcessorState
typedef struct {
s64 start; ///< Start
u32 count; ///< Count
u32 pad; ///< Padding
u8 data[0xe10]; ///< Contains an array of *ProcessorState, depending on IrsDeviceFormat::ir_sensor_mode.
} IrsProcessorState;
/// DeviceFormat
typedef struct {
u32 ir_camera_status; ///< \ref IrsIrCameraStatus
u32 ir_camera_internal_status; ///< \ref IrsIrCameraInternalStatus
u32 ir_sensor_mode; ///< \ref IrsIrSensorMode
u32 pad; ///< Padding
IrsProcessorState processor_state; ///< \ref IrsProcessorState
} IrsDeviceFormat;
/// AruidFormat
typedef struct {
u64 ir_sensor_aruid; ///< IrSensorAruid
u32 ir_sensor_aruid_status; ///< IrSensorAruidStatus
u32 pad; ///< Padding
} IrsAruidFormat;
/// StatusManager
typedef struct {
IrsDeviceFormat device_format[IRS_MAX_CAMERAS];
IrsAruidFormat aruid_format[0x5];
} IrsStatusManager;
/// Initialize irs.
Result irsInitialize(void);
@ -58,36 +387,188 @@ void irsExit(void);
/// Gets the Service object for the actual irs service session.
Service* irsGetServiceSession(void);
/// Gets the address of the SharedMemory.
/// Gets the address of the SharedMemory (\ref IrsStatusManager).
void* irsGetSharedmemAddr(void);
/// (De)activate the IR sensor, this is automatically used by \ref irsExit. Must be called after irsInitialize() to activate the IR sensor.
Result irsActivateIrsensor(bool activate);
/// Gets the \ref IrsIrCameraHandle for the specified controller.
Result irsGetIrCameraHandle(IrsIrCameraHandle *handle, HidNpadIdType id);
/// Gets the IrCameraHandle for the specified controller.
Result irsGetIrCameraHandle(u32 *IrCameraHandle, HidControllerID id);
/// GetIrCameraStatus
Result irsGetIrCameraStatus(IrsIrCameraHandle handle, IrsIrCameraStatus *out);
/// CheckFirmwareUpdateNecessity
/// When successful where the output flag is set, the user should use \ref hidLaShowControllerFirmwareUpdate.
/// Only available on [4.0.0+].
Result irsCheckFirmwareUpdateNecessity(IrsIrCameraHandle handle, bool *out);
/// GetImageProcessorStatus
/// Only available on [4.0.0+].
Result irsGetImageProcessorStatus(IrsIrCameraHandle handle, IrsImageProcessorStatus *out);
/// Stop the current Processor.
/// \ref irsExit calls this with all IrCameraHandles which were not already used with \ref irsStopImageProcessor.
Result irsStopImageProcessor(IrsIrCameraHandle handle);
/// Stop the current Processor, async.
/// Only available on [4.0.0+].
Result irsStopImageProcessorAsync(IrsIrCameraHandle handle);
/**
* @brief Start ImageTransferProcessor.
* @param[in] IrCameraHandle Camera handle.
* @brief Run the MomentProcessor.
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
*/
Result irsRunMomentProcessor(IrsIrCameraHandle handle, const IrsMomentProcessorConfig *config);
/**
* @brief Gets the states for MomentProcessor or IrLedProcessor.
* @note The official GetIrLedProcessorState is essentially the same as this, except it uses hard-coded count=1 with output-array on stack, without returning that data. Hence we don't implement a seperate func for that.
* @param[in] handle \ref IrsIrCameraHandle
* @param[out] states Output array of \ref IrsMomentProcessorState.
* @param[in] count Size of the states array in entries. Must be 1-5.
* @param[out] total_out Total output entries.
*/
Result irsGetMomentProcessorStates(IrsIrCameraHandle handle, IrsMomentProcessorState *states, s32 count, s32 *total_out);
/**
* @brief Calculates an \ref IrsMomentStatistic from the specified region in the input \ref IrsMomentProcessorState.
* @param[in] state \ref IrsMomentProcessorState
* @param[in] rect \ref IrsRect, containing the image width and height.
* @param[in] region_x Region x, must be 0-5 (clamped to this range otherwise). region_x = image_x/6.
* @param[in] region_y Region y, must be 0-7 (clamped to this range otherwise). region_y = image_y/8.
* @param[in] region_width Region width. region_x+region_width must be <=6 (clamped to this range otherwise).
* @param[in] region_height Region height. region_y+region_height must be <=8 (clamped to this range otherwise).
*/
IrsMomentStatistic irsCalculateMomentRegionStatistic(const IrsMomentProcessorState *state, IrsRect rect, s32 region_x, s32 region_y, s32 region_width, s32 region_height);
/**
* @brief Run the ClusteringProcessor.
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
*/
Result irsRunClusteringProcessor(IrsIrCameraHandle handle, const IrsClusteringProcessorConfig *config);
/**
* @brief Gets the states for ClusteringProcessor.
* @param[in] handle \ref IrsIrCameraHandle
* @param[out] states Output array of \ref IrsClusteringProcessorState.
* @param[in] count Size of the states array in entries. Must be 1-5.
* @param[out] total_out Total output entries.
*/
Result irsGetClusteringProcessorStates(IrsIrCameraHandle handle, IrsClusteringProcessorState *states, s32 count, s32 *total_out);
/**
* @brief Run the ImageTransferProcessor.
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
* @param[in] size Work-buffer size, must be 0x1000-byte aligned.
* @note Do not use if already started.
*/
Result irsRunImageTransferProcessor(u32 IrCameraHandle, IrsImageTransferProcessorConfig *config, size_t size);
Result irsRunImageTransferProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorConfig *config, size_t size);
Result irsGetImageTransferProcessorState(u32 IrCameraHandle, void* buffer, size_t size, IrsImageTransferProcessorState *state);
/**
* @brief Run the ImageTransferExProcessor.
* @note Only available on [4.0.0+].
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
* @param[in] size Work-buffer size, must be 0x1000-byte aligned.
*/
Result irsRunImageTransferExProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorExConfig *config, size_t size);
/// Stop ImageTransferProcessor. Do not use if already stopped.
/// \ref irsExit calls this with all IrCameraHandles which were not already used with \ref irsStopImageProcessor.
Result irsStopImageProcessor(u32 IrCameraHandle);
/// GetImageTransferProcessorState
Result irsGetImageTransferProcessorState(IrsIrCameraHandle handle, void* buffer, size_t size, IrsImageTransferProcessorState *state);
/// "Suspend" ImageTransferProcessor.
/// TODO: What does this really do?
Result irsSuspendImageProcessor(u32 IrCameraHandle);
/**
* @brief Run the PointingProcessor.
* @param[in] handle \ref IrsIrCameraHandle
*/
Result irsRunPointingProcessor(IrsIrCameraHandle handle);
/**
* Gets the default configuration for Image Transfer mode.
* Defaults are exposure 300us, IR LEDs all ON, 8x digital gain, normal image and resolution 240 x 320.
/**
* @brief Gets the states for PointingProcessor.
* @param[in] handle \ref IrsIrCameraHandle
* @param[out] states Output array of \ref IrsPointingProcessorMarkerState.
* @param[in] count Size of the states array in entries. Must be 1-6.
* @param[out] total_out Total output entries.
*/
Result irsGetPointingProcessorMarkerStates(IrsIrCameraHandle handle, IrsPointingProcessorMarkerState *states, s32 count, s32 *total_out);
/**
* @brief Gets the states for \ref IrsPointingProcessorState.
* @note This uses \ref irsGetPointingProcessorMarkerStates, then converts the output to \ref IrsPointingProcessorState.
* @param[in] handle \ref IrsIrCameraHandle
* @param[out] states Output array of \ref IrsPointingProcessorState.
* @param[in] count Size of the states array in entries. Must be 1-6.
* @param[out] total_out Total output entries.
*/
Result irsGetPointingProcessorStates(IrsIrCameraHandle handle, IrsPointingProcessorState *states, s32 count, s32 *total_out);
/**
* @brief Run the TeraPluginProcessor.
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
*/
Result irsRunTeraPluginProcessor(IrsIrCameraHandle handle, const IrsTeraPluginProcessorConfig *config);
/**
* @brief Gets the states for TeraPluginProcessor, filtered using the input params.
* @param[in] handle \ref IrsIrCameraHandle
* @param[out] states Output array of \ref IrsTeraPluginProcessorState.
* @param[in] count Size of the states array in entries. Must be 1-5.
* @param[in] sampling_number Minimum value for IrsTeraPluginProcessorState::sampling_number.
* @param[in] prefix_data Only used when prefix_bitcount is not 0. The first prefix_bitcount bits from prefix_data must match the first prefix_bitcount bits in IrsTeraPluginProcessorState::plugin_data.
* @param[in] prefix_bitcount Total bits for prefix_data.
* @param[out] total_out Total output entries.
*/
Result irsGetTeraPluginProcessorStates(IrsIrCameraHandle handle, IrsTeraPluginProcessorState *states, s32 count, s64 sampling_number, u32 prefix_data, u32 prefix_bitcount, s32 *total_out);
/**
* @brief Run the IrLedProcessor.
* @note Only available on [4.0.0+].
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
*/
Result irsRunIrLedProcessor(IrsIrCameraHandle handle, const IrsIrLedProcessorConfig *config);
/**
* @brief Run the AdaptiveClusteringProcessor.
* @note Only available on [5.0.0+].
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
*/
Result irsRunAdaptiveClusteringProcessor(IrsIrCameraHandle handle, const IrsAdaptiveClusteringProcessorConfig *config);
/**
* @brief Run HandAnalysis.
* @param[in] handle \ref IrsIrCameraHandle
* @param[in] config Input config.
*/
Result irsRunHandAnalysis(IrsIrCameraHandle handle, const IrsHandAnalysisConfig *config);
/**
* Gets the default configuration for MomentProcessor.
*/
void irsGetMomentProcessorDefaultConfig(IrsMomentProcessorConfig *config);
/**
* Gets the default configuration for ClusteringProcessor.
*/
void irsGetClusteringProcessorDefaultConfig(IrsClusteringProcessorConfig *config);
/**
* Gets the default configuration for ImageTransferProcessor.
* Defaults are exposure 300us, 8x digital gain, the rest is all-zero. Format is ::IrsImageTransferProcessorFormat_320x240.
*/
void irsGetDefaultImageTransferProcessorConfig(IrsImageTransferProcessorConfig *config);
/**
* Gets the default configuration for ImageTransferProcessorEx.
* Defaults are exposure 300us, 8x digital gain, the rest is all-zero. OrigFormat/TrimmingFormat are ::IrsImageTransferProcessorFormat_320x240.
*/
void irsGetDefaultImageTransferProcessorExConfig(IrsImageTransferProcessorExConfig *config);
/**
* Gets the default configuration for IrLedProcessor.
*/
NX_CONSTEXPR void irsGetIrLedProcessorDefaultConfig(IrsIrLedProcessorConfig *config) {
config->light_target = 0;
}

View File

@ -8,6 +8,13 @@
#include "../types.h"
#include "../sf/service.h"
typedef enum {
LblBacklightSwitchStatus_Disabled = 0,
LblBacklightSwitchStatus_Enabled = 1,
LblBacklightSwitchStatus_Enabling = 2,
LblBacklightSwitchStatus_Disabling = 3,
} LblBacklightSwitchStatus;
/// Initialize lbl.
Result lblInitialize(void);
@ -17,8 +24,8 @@ void lblExit(void);
/// Gets the Service object for the actual lbl service session.
Service* lblGetServiceSession(void);
Result lblSwitchBacklightOn(u64 fade_time);
Result lblSwitchBacklightOff(u64 fade_time);
Result lblSaveCurrentSetting(void);
Result lblLoadCurrentSetting(void);
/**
* @note The brightness goes from 0 to 1.0.
@ -26,6 +33,58 @@ Result lblSwitchBacklightOff(u64 fade_time);
Result lblSetCurrentBrightnessSetting(float brightness);
Result lblGetCurrentBrightnessSetting(float *out_value);
Result lblApplyCurrentBrightnessSettingToBacklight(void);
Result lblGetBrightnessSettingAppliedToBacklight(float *out_value);
Result lblSwitchBacklightOn(u64 fade_time);
Result lblSwitchBacklightOff(u64 fade_time);
Result lblGetBacklightSwitchStatus(LblBacklightSwitchStatus *out_value);
Result lblEnableDimming(void);
Result lblDisableDimming(void);
Result lblIsDimmingEnabled(bool *out_value);
Result lblEnableAutoBrightnessControl(void);
Result lblDisableAutoBrightnessControl(void);
Result lblIsAutoBrightnessControlEnabled(bool *out_value);
Result lblSetAmbientLightSensorValue(float value);
/**
* @note Used internally by \ref appletGetAmbientLightSensorValue and \ref appletGetCurrentIlluminanceEx.
*/
Result lblGetAmbientLightSensorValue(bool *over_limit, float *lux);
/**
* @note Only available on [3.0.0+].
* @note Used internally by \ref appletIsIlluminanceAvailable.
*/
Result lblIsAmbientLightSensorAvailable(bool *out_value);
/**
* @note Only available on [3.0.0+].
*/
Result lblSetCurrentBrightnessSettingForVrMode(float brightness);
/**
* @note Only available on [3.0.0+].
*/
Result lblGetCurrentBrightnessSettingForVrMode(float *out_value);
/**
* @note Only available on [3.0.0+].
* @note Used internally by \ref appletSetVrModeEnabled.
*/
Result lblEnableVrMode(void);
/**
* @note Only available on [3.0.0+].
* @note Used internally by \ref appletSetVrModeEnabled.
*/
Result lblDisableVrMode(void);
/**
* @note Only available on [3.0.0+].
* @note Used internally by \ref appletIsVrModeEnabled.
*/
Result lblIsVrModeEnabled(bool *out_value);

View File

@ -0,0 +1,555 @@
/**
* @file ldn.h
* @brief LDN (local network communications) IPC wrapper. See also: https://switchbrew.org/wiki/LDN_services
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
#include "../kernel/event.h"
typedef enum {
LdnServiceType_User = 0, ///< Initializes ldn:u.
LdnServiceType_System = 1, ///< Initializes ldn:s.
} LdnServiceType;
/// State loaded by \ref ldnmGetStateForMonitor / \ref ldnGetState.
typedef enum {
LdnState_None = 0, ///< None
LdnState_Initialized = 1, ///< Initialized
LdnState_AccessPointOpened = 2, ///< AccessPointOpened (\ref ldnOpenAccessPoint)
LdnState_AccessPointCreated = 3, ///< AccessPointCreated (\ref ldnCreateNetwork / \ref ldnCreateNetworkPrivate)
LdnState_StationOpened = 4, ///< StationOpened (\ref ldnOpenStation)
LdnState_StationConnected = 5, ///< StationConnected (\ref ldnConnect / \ref ldnConnectPrivate)
LdnState_Error = 6, ///< Error
} LdnState;
/// DisconnectReason loaded by \ref ldnGetDisconnectReason.
typedef enum {
LdnDisconnectReason_None = 0, ///< None
LdnDisconnectReason_User = 1, ///< User
LdnDisconnectReason_SystemRequest = 2, ///< SystemRequest
LdnDisconnectReason_DestroyedByAdmin = 3, ///< DestroyedByAdmin
LdnDisconnectReason_DestroyedBySystemRequest = 4, ///< DestroyedBySystemRequest
LdnDisconnectReason_Admin = 5, ///< Admin
LdnDisconnectReason_SignalLost = 6, ///< SignalLost
} LdnDisconnectReason;
/// ScanFilterFlags
typedef enum {
LdnScanFilterFlags_LocalCommunicationId = BIT(0), ///< When set, enables using LdnScanFilter::local_communication_id.
LdnScanFilterFlags_NetworkId = BIT(1), ///< When set, enables using LdnScanFilter::network_id.
LdnScanFilterFlags_Unknown2 = BIT(2), ///< When set, enables using LdnScanFilter::unk_x20.
LdnScanFilterFlags_MacAddr = BIT(3), ///< When set, enables using LdnScanFilter::mac_addr. Only available with \ref ldnScanPrivate.
LdnScanFilterFlags_Ssid = BIT(4), ///< When set, enables using the LdnScanFilter::ssid.
LdnScanFilterFlags_UserData = BIT(5), ///< When set, enables using LdnScanFilter::userdata_filter.
} LdnScanFilterFlags;
/// AcceptPolicy
typedef enum {
LdnAcceptPolicy_AllowAll = 0, ///< Allow all.
LdnAcceptPolicy_DenyAll = 1, ///< Deny all.
LdnAcceptPolicy_Blacklist = 2, ///< Blacklist, addresses in the list (\ref ldnAddAcceptFilterEntry) are not allowed.
LdnAcceptPolicy_Whitelist = 3, ///< Whitelist, only addresses in the list (\ref ldnAddAcceptFilterEntry) are allowed.
} LdnAcceptPolicy;
/// OperationMode
typedef enum {
LdnOperationMode_Unknown0 = 0, ///< Unknown
LdnOperationMode_Unknown1 = 1, ///< Unknown
} LdnOperationMode;
/// WirelessControllerRestriction
typedef enum {
LdnWirelessControllerRestriction_Unknown0 = 0, ///< Unknown
LdnWirelessControllerRestriction_Unknown1 = 1, ///< Unknown
} LdnWirelessControllerRestriction;
/// Protocol
typedef enum {
LdnProtocol_NX = 1, ///< NX (default)
LdnProtocol_Unknown3 = 3, ///< (NXAndOunce?)
} LdnProtocol;
/// Ipv4Address. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required).
typedef struct {
u32 addr; ///< Address
} LdnIpv4Address;
/// SubnetMask. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required).
typedef struct {
u32 mask; ///< Mask
} LdnSubnetMask;
/// MacAddress
typedef struct {
u8 addr[6]; ///< Address
} LdnMacAddress;
/// Ssid
typedef struct {
u8 len; ///< Length excluding NUL-terminator, must be 0x1-0x20.
char str[0x21]; ///< SSID string including NUL-terminator, str[len_field] must be 0. The chars in this string must be be in the range of 0x20-0x7F, for when the Ssid is converted to a string (otherwise the byte written to the string will be 0).
} LdnSsid;
/// NodeLatestUpdate
typedef struct {
u8 val; ///< The field in state is reset to zero by \ref ldnGetNetworkInfoLatestUpdate after loading it.
u8 reserved[0x7]; ///< Not initialized with \ref ldnGetNetworkInfoLatestUpdate.
} LdnNodeLatestUpdate;
/// AddressEntry
typedef struct {
LdnIpv4Address ip_addr; ///< \ref LdnIpv4Address
LdnMacAddress mac_addr; ///< \ref LdnMacAddress
u8 pad[0x2]; ///< Padding
} LdnAddressEntry;
/// NodeInfo
typedef struct {
LdnIpv4Address ip_addr; ///< \ref LdnIpv4Address
LdnMacAddress mac_addr; ///< \ref LdnMacAddress
s8 id; ///< ID / index
u8 is_connected; ///< IsConnected flag
char nickname[0x20]; ///< LdnUserConfig::nickname
u8 reserved_x2C[0x2]; ///< Reserved
s16 local_communication_version; ///< LocalCommunicationVersion
u8 reserved_x30[0x10]; ///< Reserved
} LdnNodeInfo;
/// UserConfig. The input struct is copied to a tmp struct, which is then used with the cmd.
typedef struct {
char nickname[0x20]; ///< NUL-terminated string for the user nickname.
u8 reserved[0x10]; ///< Cleared to zero for the tmp struct.
} LdnUserConfig;
/// NetworkInfo
typedef struct {
u64 local_communication_id; ///< LocalCommunicationId
u8 reserved_x8[0x2]; ///< Reserved
u16 userdata_filter; ///< Arbitrary user data which can be used for filtering with \ref LdnScanFilter.
u8 reserved_xC[0x4]; ///< Reserved
u8 network_id[0x10]; ///< LdnSecurityParameter::network_id. NetworkId which is used to generate/overwrite the ssid. With \ref ldnScan / \ref ldnScanPrivate, this is only done after filtering when unk_x4B is value 0x2.
LdnMacAddress mac_addr; ///< \ref LdnMacAddress
LdnSsid ssid; ///< \ref LdnSsid
s16 network_channel; ///< NetworkChannel
s8 link_level; ///< LinkLevel
u8 unk_x4B; ///< Unknown. Set to hard-coded value 0x2 with output structs, except with \ref ldnScan / \ref ldnScanPrivate which can also set value 0x1 in certain cases.
u8 pad_x4C[0x4]; ///< Padding
u8 sec_param_data[0x10]; ///< LdnSecurityParameter::data
u16 sec_type; ///< LdnSecurityConfig::type
u8 accept_policy; ///< \ref LdnAcceptPolicy
u8 unk_x63; ///< Only set with \ref ldnScan / \ref ldnScanPrivate, when unk_x4B is value 0x2.
u8 pad_x64[0x2]; ///< Padding
s8 participant_max; ///< Maximum participants, for nodes.
u8 participant_num; ///< ParticipantNum, number of set entries in nodes. If unk_x4B is not 0x2, ParticipantNum should be handled as if it's 0.
LdnNodeInfo nodes[8]; ///< Array of \ref LdnNodeInfo, starting with the AccessPoint node.
u8 reserved_x268[0x2]; ///< Reserved
u16 advertise_data_size; ///< AdvertiseData size (\ref ldnSetAdvertiseData)
u8 advertise_data[0x180]; ///< AdvertiseData (\ref ldnSetAdvertiseData)
u8 reserved_x3EC[0x8C]; ///< Reserved
u64 auth_id; ///< Random AuthenticationId.
} LdnNetworkInfo;
/// ScanFilter. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnScan and \ref ldnScanPrivate).
typedef struct {
s64 local_communication_id; ///< See ::LdnScanFilterFlags_LocalCommunicationId. When enabled, this will be overwritten if it's -1 (written data is from the user-process control.nacp, with value 0 used instead if loading fails). During filtering if enabled, LdnNetworkInfo::unk_x4B must match 0x2, and this ScanFilter field must match LdnNetworkInfo::local_communication_id.
u8 pad_x8[0x2]; ///< Padding
u16 userdata_filter; ///< See ::LdnScanFilterFlags_UserData. During filtering if enabled, LdnNetworkInfo::unk_x4B must match 0x2, and this ScanFilter field must match LdnNetworkInfo::userdata_filter.
u8 pad_xC[0x4]; ///< Padding
u8 network_id[0x10]; ///< See ::LdnScanFilterFlags_NetworkId. During filtering if enabled, LdnNetworkInfo::unk_x4B must match 0x2, and this ScanFilter data must match LdnNetworkInfo::network_id.
u32 unk_x20; ///< See ::LdnScanFilterFlags_Unknown2. When enabled, this must be <=0x3, and during filtering must match LdnNetworkInfo::unk_x4B.
LdnMacAddress mac_addr; ///< \ref LdnMacAddress (::LdnScanFilterFlags_MacAddr, during filtering if enabled this must match LdnNetworkInfo::mac_addr)
LdnSsid ssid; ///< \ref LdnSsid (::LdnScanFilterFlags_Ssid, during filtering if enabled this must match LdnNetworkInfo::ssid)
u8 reserved[0x10]; ///< Cleared to zero for the tmp struct.
u32 flags; ///< Bitmask for \ref LdnScanFilterFlags. Masked with value 0x37 for \ref ldnScan, with \ref ldnScanPrivate this is masked with 0x3F.
} LdnScanFilter;
/// SecurityConfig
typedef struct {
u16 type; ///< Type, a default of value 0x1 can be used here. Overwritten by \ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnect, \ref ldnConnectPrivate.
u16 data_size; ///< Data size. Must be 0x10-0x40.
u8 data[0x40]; ///< Data, used with key derivation.
} LdnSecurityConfig;
/// SecurityParameter. The struct used by \ref ldnCreateNetwork internally is randomly-generated.
typedef struct {
u8 data[0x10]; ///< Data, used with the same key derivation as \ref LdnSecurityConfig.
u8 network_id[0x10]; ///< LdnNetworkInfo::network_id
} LdnSecurityParameter;
/// NetworkConfig. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnectPrivate).
typedef struct {
s64 local_communication_id; ///< LdnNetworkInfo::local_communication_id. \ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnect, \ref ldnConnectPrivate: When -1, this is overwritten with the first LocalCommunicationId from the user-process control.nacp, if loading fails value 0 is written instead. Otherwise when not -1, if control.nacp loading is successful, this field must match one of the LocalCommunicationIds from there.
u8 reserved_x8[2]; ///< Cleared to zero for the tmp struct.
u16 userdata_filter; ///< LdnNetworkInfo::userdata_filter
u8 reserved_xC[4]; ///< Cleared to zero for the tmp struct.
s16 network_channel; ///< LdnNetworkInfo::network_channel. Channel, can be zero. Overwritten internally by \ref ldnCreateNetwork.
s8 participant_max; ///< LdnNetworkInfo::participant_max. \ref ldnCreateNetwork / \ref ldnCreateNetworkPrivate: Must be 0x1-0x8.
u8 reserved_x13; ///< Cleared to zero for the tmp struct.
s16 local_communication_version; ///< LdnNodeInfo::local_communication_version, for the first entry in LdnNetworkInfo::nodes. Must not be negative.
u8 reserved_x16[0xA]; ///< Cleared to zero for the tmp struct.
} LdnNetworkConfig;
/// ActionFrameSettings
typedef struct {
s64 local_communication_id; ///< LocalCommunicationId (Same handling as LdnNetworkConfig::local_communication_id)
u8 reserved[0x34]; ///< Reserved
u16 security_mode; ///< SecurityMode (Must be 1-2, internally this is overriden)
u16 passphrase_size; ///< PassphraseSize (Must be 0x10-0x40)
u8 passphrase[0x40]; ///< Passphrase
} LdnActionFrameSettings;
///@name ldn:m
///@{
/// Initialize ldn:m.
Result ldnmInitialize(void);
/// Exit ldn:m.
void ldnmExit(void);
/// Gets the Service object for IMonitorService.
Service* ldnmGetServiceSession_MonitorService(void);
/**
* @brief GetStateForMonitor
* @param[out] out \ref LdnState
*/
Result ldnmGetStateForMonitor(LdnState *out);
/**
* @brief GetNetworkInfoForMonitor
* @param[out] out \ref LdnNetworkInfo
*/
Result ldnmGetNetworkInfoForMonitor(LdnNetworkInfo *out);
/**
* @brief GetIpv4AddressForMonitor
* @param[out] addr \ref LdnIpv4Address
* @param[out] mask \ref LdnSubnetMask
*/
Result ldnmGetIpv4AddressForMonitor(LdnIpv4Address *addr, LdnSubnetMask *mask);
/**
* @brief GetSecurityParameterForMonitor
* @note Not exposed by official sw.
* @param[out] out \ref LdnSecurityParameter
*/
Result ldnmGetSecurityParameterForMonitor(LdnSecurityParameter *out);
/**
* @brief GetNetworkConfigForMonitor
* @note Not exposed by official sw.
* @param[out] out \ref LdnNetworkConfig
*/
Result ldnmGetNetworkConfigForMonitor(LdnNetworkConfig *out);
///@}
///@name ldn
///@{
/// Initialize ldn.
Result ldnInitialize(LdnServiceType service_type);
/// Exit ldn.
void ldnExit(void);
/// Gets the Service object for IUserLocalCommunicationService/ISystemLocalCommunicationService.
Service* ldnGetServiceSession_LocalCommunicationService(void);
/**
* @brief GetState
* @param[out] out \ref LdnState
*/
Result ldnGetState(LdnState *out);
/**
* @brief GetNetworkInfo
* @param[out] out \ref LdnNetworkInfo
*/
Result ldnGetNetworkInfo(LdnNetworkInfo *out);
/**
* @brief GetIpv4Address
* @param[out] addr \ref LdnIpv4Address
* @param[out] mask \ref LdnSubnetMask
*/
Result ldnGetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask);
/**
* @brief GetDisconnectReason
* @param[out] out \ref LdnDisconnectReason
*/
Result ldnGetDisconnectReason(LdnDisconnectReason *out);
/**
* @brief GetSecurityParameter
* @param[out] out \ref LdnSecurityParameter
*/
Result ldnGetSecurityParameter(LdnSecurityParameter *out);
/**
* @brief GetNetworkConfig
* @param[out] out \ref LdnNetworkConfig
*/
Result ldnGetNetworkConfig(LdnNetworkConfig *out);
/**
* @brief AttachStateChangeEvent
* @note The Event must be closed by the user once finished with it.
* @note This is signaled when the data returned by \ref ldnGetNetworkInfo / \ref ldnGetNetworkInfoLatestUpdate is updated.
* @param[out] out_event Output Event with autoclear=true.
*/
Result ldnAttachStateChangeEvent(Event* out_event);
/**
* @brief GetNetworkInfoLatestUpdate
* @param[out] network_info \ref LdnNetworkInfo
* @param[out] nodes Output array of \ref LdnNodeLatestUpdate.
* @param[in] count Size of the nodes array in entries, must be 8.
*/
Result ldnGetNetworkInfoLatestUpdate(LdnNetworkInfo *network_info, LdnNodeLatestUpdate *nodes, s32 count);
/**
* @brief Scan
* @note \ref LdnState must be ::LdnState_AccessPointCreated, ::LdnState_StationOpened, or ::LdnState_StationConnected.
* @note This is the same as \ref ldnScanPrivate (minus the masking for LdnScanFilter::flags), except this has the same channel-override functionality as \ref ldnCreateNetwork.
* @param[in] channel Channel, value 0 can be used for this.
* @param[in] filter \ref LdnScanFilter
* @param[out] network_info Output array of \ref LdnNetworkInfo.
* @param[in] count Size of the network_info array in entries. Must be at least 1, this is clamped to a maximum of 0x18 internally.
* @param[out] total_out Total output entries.
*/
Result ldnScan(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out);
/**
* @brief ScanPrivate
* @note \ref LdnState must be ::LdnState_AccessPointCreated, ::LdnState_StationOpened, or ::LdnState_StationConnected.
* @note See \ref ldnScan.
* @param[in] channel Channel, value 0 can be used for this.
* @param[in] filter \ref LdnScanFilter
* @param[out] network_info Output array of \ref LdnNetworkInfo.
* @param[in] count Size of the network_info array in entries. Must be at least 1, this is clamped to a maximum of 0x18 internally.
* @param[out] total_out Total output entries.
*/
Result ldnScanPrivate(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out);
/**
* @brief SetWirelessControllerRestriction
* @note Only available on [5.0.0+].
* @note \ref LdnState must be ::LdnState_Initialized.
* @param[in] restriction \ref LdnWirelessControllerRestriction
*/
Result ldnSetWirelessControllerRestriction(LdnWirelessControllerRestriction restriction);
/**
* @brief SetProtocol
* @note This is only usable with [20.0.0+] (with [18.0.0-19-0.1] this is available but not usable).
* @note \ref LdnState must be ::LdnState_Initialized. If a non-default Protocol is wanted, use this after \ref ldnInitialize.
* @param[in] protocol \ref LdnProtocol
*/
Result ldnSetProtocol(LdnProtocol protocol);
/**
* @brief OpenAccessPoint
* @note \ref LdnState must be ::LdnState_Initialized, this eventually sets the State to ::LdnState_AccessPointOpened.
*/
Result ldnOpenAccessPoint(void);
/**
* @brief CloseAccessPoint
* @note \ref LdnState must be ::LdnState_AccessPointOpened or ::LdnState_AccessPointCreated, this eventually sets the State to ::LdnState_Initialized.
* @note Used automatically internally by \ref ldnExit if needed.
*/
Result ldnCloseAccessPoint(void);
/**
* @brief CreateNetwork
* @note \ref LdnState must be ::LdnState_AccessPointOpened, this eventually sets the State to ::LdnState_AccessPointCreated.
* @param[in] sec_config \ref LdnSecurityConfig
* @param[in] user_config \ref LdnUserConfig
* @param[in] network_config \ref LdnNetworkConfig
*/
Result ldnCreateNetwork(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config);
/**
* @brief CreateNetworkPrivate
* @note \ref LdnState must be ::LdnState_AccessPointOpened, this eventually sets the State to ::LdnState_AccessPointCreated.
* @note This is the same as \ref ldnCreateNetwork besides the additional user-specified params, and with this cmd LdnNetworkConfig::channel is not overwritten (unlike \ref ldnCreateNetwork).
* @param[in] sec_config \ref LdnSecurityConfig
* @param[in] sec_param \ref LdnSecurityParameter
* @param[in] user_config \ref LdnUserConfig
* @param[in] network_config \ref LdnNetworkConfig
* @param[in] addrs Input array of \ref LdnAddressEntry. This can be NULL.
* @param[in] count Size of the addrs array in entries. This must be <=8. This can be 0, in which case the network will be non-Private like \ref ldnCreateNetwork.
*/
Result ldnCreateNetworkPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config, const LdnAddressEntry *addrs, s32 count);
/**
* @brief DestroyNetwork
* @note \ref LdnState must be ::LdnState_AccessPointCreated, this eventually sets the State to ::LdnState_AccessPointOpened.
*/
Result ldnDestroyNetwork(void);
/**
* @brief Reject
* @note \ref LdnState must be ::LdnState_AccessPointCreated.
* @param[in] addr \ref LdnIpv4Address
*/
Result ldnReject(LdnIpv4Address addr);
/**
* @brief SetAdvertiseData
* @note An empty buffer (buffer=NULL/size=0) can be used to reset the AdvertiseData size in state to zero.
* @note \ref LdnState must be ::LdnState_AccessPointOpened or ::LdnState_AccessPointCreated.
* @param[in] buffer Input buffer containing arbitrary user data.
* @param[in] size Input buffer size, must be <=0x180. If this isn't enough space, you can for example also periodically use this cmd with different regions of your data with some sequence_number field (or use sockets while connected to the network).
*/
Result ldnSetAdvertiseData(const void* buffer, size_t size);
/**
* @brief SetStationAcceptPolicy
* @note \ref LdnState must be ::LdnState_AccessPointOpened or ::LdnState_AccessPointCreated.
* @param[in] policy \ref LdnAcceptPolicy
*/
Result ldnSetStationAcceptPolicy(LdnAcceptPolicy policy);
/**
* @brief AddAcceptFilterEntry
* @note \ref LdnState must be ::LdnState_AccessPointOpened or ::LdnState_AccessPointCreated.
* @note See \ref LdnAcceptPolicy.
* @param[in] addr \ref LdnMacAddress. If you want, you can also pass LdnNodeInfo::mac_addr for this.
*/
Result ldnAddAcceptFilterEntry(LdnMacAddress addr);
/**
* @brief ClearAcceptFilter
* @note \ref LdnState must be ::LdnState_AccessPointOpened or ::LdnState_AccessPointCreated.
*/
Result ldnClearAcceptFilter(void);
/**
* @brief OpenStation
* @note \ref LdnState must be ::LdnState_Initialized, this eventually sets the State to ::LdnState_StationOpened.
*/
Result ldnOpenStation(void);
/**
* @brief CloseStation
* @note \ref LdnState must be ::LdnState_StationOpened or ::LdnState_StationConnected, this eventually sets the State to ::LdnState_Initialized.
* @note Used automatically internally by \ref ldnExit if needed.
*/
Result ldnCloseStation(void);
/**
* @brief Connect
* @note \ref LdnState must be ::LdnState_StationOpened, this eventually sets the State to ::LdnState_StationConnected.
* @note This is identical to \ref ldnConnectPrivate besides the used params, the code overwriting LdnSecurityConfig::type also differs.
* @param[in] sec_config \ref LdnSecurityConfig
* @param[in] user_config \ref LdnUserConfig
* @param[in] version LocalCommunicationVersion, this must be 0x0-0x7FFF.
* @param[in] option ConnectOption bitmask, must be <=0x1. You can use value 0 for example here.
* @param[in] network_info \ref LdnNetworkInfo
*/
Result ldnConnect(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkInfo *network_info);
/**
* @brief ConnectPrivate
* @note \ref LdnState must be ::LdnState_StationOpened, this eventually sets the State to ::LdnState_StationConnected.
* @note See \ref ldnConnect.
* @param[in] sec_config \ref LdnSecurityConfig
* @param[in] sec_param \ref LdnSecurityParameter
* @param[in] user_config \ref LdnUserConfig
* @param[in] version LocalCommunicationVersion, this must be 0x0-0x7FFF.
* @param[in] option ConnectOption bitmask, must be <=0x1. You can use value 0 for example here.
* @param[in] network_config \ref LdnNetworkConfig
*/
Result ldnConnectPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkConfig *network_config);
/**
* @brief Disconnect
* @note \ref LdnState must be ::LdnState_StationConnected, this eventually sets the State to ::LdnState_StationOpened.
*/
Result ldnDisconnect(void);
/**
* @brief SetOperationMode
* @note Only available on [4.0.0+].
* @note Only available with ::LdnServiceType_System.
* @note \ref LdnState must be ::LdnState_Initialized.
* @param[in] mode \ref LdnOperationMode
*/
Result ldnSetOperationMode(LdnOperationMode mode);
/**
* @brief EnableActionFrame
* @note Only available on [18.0.0+].
* @note \ref LdnState must be ::LdnState_Initialized.
* @param[in] settings \ref LdnActionFrameSettings
*/
Result ldnEnableActionFrame(const LdnActionFrameSettings *settings);
/**
* @brief DisableActionFrame
* @note Only available on [18.0.0+].
* @note \ref LdnState must be ::LdnState_Initialized.
*/
Result ldnDisableActionFrame(void);
/**
* @brief SendActionFrame
* @note Only available on [18.0.0+].
* @note \ref LdnState must be ::LdnState_AccessPointCreated / ::LdnState_StationOpened.
* @param[in] data Data buffer.
* @param[in] size Data buffer size.
* @param[in] destination Destination \ref LdnMacAddress.
* @param[in] bssid Bssid \ref LdnMacAddress.
* @param[in] channel Channel, must be non-zero.
* @param[in] flags MessageFlag bit0 clear = block until the data can be sent, set = return error when the data can't be sent.
*/
Result ldnSendActionFrame(const void* data, size_t size, LdnMacAddress destination, LdnMacAddress bssid, s16 channel, u32 flags);
/**
* @brief RecvActionFrame
* @note Only available on [18.0.0+].
* @note \ref ldnEnableActionFrame must be used prior to this.
* @param[out] data Output data buffer.
* @param[in] size Max size of the data buffer.
* @param[out] addr0 First \ref LdnMacAddress.
* @param[out] addr1 Second \ref LdnMacAddress.
* @param[out] channel Channel
* @param[out] out_size Output size.
* @param[out] link_level LinkLevel
* @param[in] flags MessageFlag bit0 clear = block until data is available, set = return error when data is not available.
*/
Result ldnRecvActionFrame(void* data, size_t size, LdnMacAddress *addr0, LdnMacAddress *addr1, s16 *channel, u32 *out_size, s32 *link_level, u32 flags);
/**
* @brief SetHomeChannel
* @note Only available on [18.0.0+].
* @note \ref LdnState must be ::LdnState_StationOpened.
* @param[in] channel Channel, must be non-zero.
*/
Result ldnSetHomeChannel(s16 channel);
/**
* @brief SetTxPower
* @note Only available on [18.0.0+].
* @note \ref LdnState must be ::LdnState_AccessPoint* / ::LdnState_Station*.
* @param[in] power Power, must be 0x0..0xFF.
*/
Result ldnSetTxPower(s16 power);
/**
* @brief ResetTxPower
* @note Only available on [18.0.0+].
* @note \ref LdnState must be ::LdnState_AccessPoint* / ::LdnState_Station*.
*/
Result ldnResetTxPower(void);
///@}

View File

@ -20,6 +20,20 @@ typedef struct {
u32 acid_fac_size;
u32 aci0_fah_size;
u8 ac_buffer[0x3E0];
} LoaderProgramInfoV1;
typedef struct {
u8 main_thread_priority;
u8 default_cpu_id;
u16 application_type;
u32 main_thread_stack_size;
u64 program_id;
u32 acid_sac_size;
u32 aci0_sac_size;
u32 acid_fac_size;
u32 aci0_fah_size;
u8 unused_20[0x10];
u8 ac_buffer[0x3E0];
} LoaderProgramInfo;
typedef struct {
@ -28,6 +42,11 @@ typedef struct {
u64 size;
} LoaderModuleInfo;
typedef struct {
u8 platform; ///< NcmContentMetaPlatform
u8 content_attributes; ///< FsContentAttributes
} LoaderProgramAttributes;
/// Initialize ldr:shel.
Result ldrShellInitialize(void);
@ -62,7 +81,9 @@ Result ldrDmntSetProgramArguments(u64 program_id, const void *args, size_t args_
Result ldrDmntFlushArguments(void);
Result ldrDmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out);
Result ldrPmCreateProcess(u64 pin_id, u32 flags, Handle reslimit_h, Handle *out_process_h);
Result ldrPmGetProgramInfo(const NcmProgramLocation *loc, LoaderProgramInfo *out_program_info);
Result ldrPmCreateProcess(u64 pin_id, u32 flags, Handle reslimit_h, const LoaderProgramAttributes *attrs, Handle *out_process_h);
Result ldrPmGetProgramInfo(const NcmProgramLocation *loc, const LoaderProgramAttributes *attrs, LoaderProgramInfo *out_program_info); ///< [19.0.0+/Atmosphere]
Result ldrPmGetProgramInfoV1(const NcmProgramLocation *loc, LoaderProgramInfoV1 *out_program_info); ///< [1.0.0-18.1.0/Non-Atmosphere]
Result ldrPmPinProgram(const NcmProgramLocation *loc, u64 *out_pin_id);
Result ldrPmUnpinProgram(u64 pin_id);
Result ldrPmSetEnabledProgramVerification(bool enabled); ///< [10.0.0+]

View File

@ -0,0 +1,339 @@
/**
* @file lp2p.h
* @brief lp2p service IPC wrapper, for local-WLAN communications with accessories. See also: https://switchbrew.org/wiki/LDN_services
* @note Only available on [9.1.0+].
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
#include "../kernel/event.h"
typedef enum {
Lp2pServiceType_App = 0, ///< Initializes lp2p:app.
Lp2pServiceType_System = 1, ///< Initializes lp2p:sys.
} Lp2pServiceType;
/// MacAddress
typedef struct {
u8 addr[6]; ///< Address
} Lp2pMacAddress;
/// GroupId
typedef struct {
u8 id[0x6]; ///< BSSID
} Lp2pGroupId;
/// GroupInfo
/// \ref lp2pScan only uses the following fields for the cmd input struct: supported_platform/priority, frequency/channel, and preshared_key_binary_size/preshared_key.
typedef struct {
u8 unk_x0[0x10]; ///< When zero, this is set to randomly-generated data. Used during key derivation.
u64 local_communication_id; ///< LocalCommunicationId. When zero, the value from the user-process control.nacp is loaded. This is later validated by \ref lp2pJoin / \ref lp2pCreateGroup the same way as LdnNetworkConfig::local_communication_id. Used during key derivation.
Lp2pGroupId group_id; ///< Should be all-zero for the input struct so that the default is used.
char service_name[0x21]; ///< ServiceName. NUL-terminated string for the SSID. These characters must be '-' or alphanumeric (lowercase/uppercase). '_' must not be used, unless you generate valid data for that. The data for '_' will be automatically generated if it's not present.
s8 flags_count; ///< Must be <=0x3F.
s8 flags[0x40]; ///< Array of s8 with the above count. Each entry value must be <=0x3F. Each entry is an array index used to load a set of flags from a global array with the specified index.
u8 supported_platform; ///< SupportedPlatform. Must match value 1. 0 is PlatformIdNX, 1 is PlatformIdFuji.
s8 member_count_max; ///< MemberCountMax. Must be <=0x8. If zero during group-creation, a default of value 1 is used for the value passed to a service-cmd.
u8 unk_x82; ///< Unknown
u8 unk_x83; ///< Unknown
u16 frequency; ///< Wifi frequency: 24 = 2.4GHz, 50 = 5GHz.
s16 channel; ///< Wifi channel number. 0 = use default, otherwise this must be one of the following depending on the frequency field. 24: 1, 6, 11. 50: 36, 40, 44, 48.
u8 network_mode; ///< NetworkMode
u8 performance_requirement; ///< PerformanceRequirement
u8 security_type; ///< Security type, used during key derivation. 0 = use defaults, 1 = plaintext, 2 = encrypted. [11.0.0+] 3: Standard WPA2-PSK.
s8 static_aes_key_index; ///< StaticAesKeyIndex. Used as the array-index for selecting the KeySource used with GenerateAesKek during key derivation. Should be 1-2, otherwise GenerateAesKek is skipped and zeros are used for the AccessKey instead.
u8 unk_x8C; ///< Unknown
u8 priority; ///< Priority. Must match one of the following, depending on the used service (doesn't apply to \ref lp2pJoin): 55 = SystemPriority (lp2p:sys), 90 = ApplicationPriority (lp2p:app and lp2p:sys).
u8 stealth_enabled; ///< StealthEnabled. Bool flag, controls whether the SSID is hidden.
u8 unk_x8F; ///< If zero, a default value of 0x20 is used.
u8 unk_x90[0x130]; ///< Unknown
u8 preshared_key_binary_size; ///< PresharedKeyBinarySize
u8 preshared_key[0x3F]; ///< PresharedKey. Used during key derivation.
} Lp2pGroupInfo;
/// ScanResult
typedef struct {
Lp2pGroupInfo group_info; ///< \ref Lp2pGroupInfo
u8 unk_x200; ///< Unknown
u8 unk_x201[0x5]; ///< Unknown
u16 advertise_data_size; ///< Size of the following AdvertiseData.
u8 advertise_data[0x80]; ///< AdvertiseData, with the above size. This originates from \ref lp2pSetAdvertiseData.
u8 unk_x288[0x78]; ///< Unknown
} Lp2pScanResult;
/// NodeInfo
typedef struct {
u8 ip_addr[0x20]; ///< struct sockaddr for the IP address.
u8 unk_x20[0x4]; ///< Unknown
Lp2pMacAddress mac_addr; ///< \ref Lp2pMacAddress
u8 unk_x2A[0x56]; ///< Unknown
} Lp2pNodeInfo;
/// IpConfig. Only contains IPv4 addresses.
typedef struct {
u8 unk_x0[0x20]; ///< Always zeros.
u8 ip_addr[0x20]; ///< struct sockaddr for the IP address.
u8 subnet_mask[0x20]; ///< struct sockaddr for the subnet-mask.
u8 gateway[0x20]; ///< struct sockaddr for the gateway(?).
u8 unk_x80[0x80]; ///< Always zeros.
} Lp2pIpConfig;
/// Initialize lp2p.
Result lp2pInitialize(Lp2pServiceType service_type);
/// Exit lp2p.
void lp2pExit(void);
/// Gets the Service object for INetworkService.
Service* lp2pGetServiceSession_INetworkService(void);
/// Gets the Service object for INetworkServiceMonitor.
Service* lp2pGetServiceSession_INetworkServiceMonitor(void);
/**
* @brief Creates a default \ref Lp2pGroupInfo for use with \ref lp2pCreateGroup / \ref lp2pJoin.
* @param info \ref Lp2pGroupInfo
*/
void lp2pCreateGroupInfo(Lp2pGroupInfo *info);
/**
* @brief Creates a default \ref Lp2pGroupInfo for use with \ref lp2pScan.
* @param info \ref Lp2pGroupInfo
*/
void lp2pCreateGroupInfoScan(Lp2pGroupInfo *info);
/**
* @brief Sets Lp2pGroupInfo::service_name.
* @param info \ref Lp2pGroupInfo
* @param[in] name ServiceName / SSID.
*/
void lp2pGroupInfoSetServiceName(Lp2pGroupInfo *info, const char *name);
/**
* @brief Sets Lp2pGroupInfo::flags_count and Lp2pGroupInfo::flags.
* @note The default is count=1 flags[0]=1, which is used by \ref lp2pCreateGroupInfo. [11.0.0+] To use standard WPA2-PSK, you can use flags[0]=0.
* @param info \ref Lp2pGroupInfo
* @param[in] flags Lp2pGroupInfo::flags
* @param[in] count Lp2pGroupInfo::flags_count
*/
void lp2pGroupInfoSetFlags(Lp2pGroupInfo *info, s8 *flags, size_t count);
/**
* @brief Sets Lp2pGroupInfo::member_count_max.
* @param info \ref Lp2pGroupInfo
* @param[in] count MemberCountMax
*/
NX_CONSTEXPR void lp2pGroupInfoSetMemberCountMax(Lp2pGroupInfo *info, size_t count) {
info->member_count_max = count;
}
/**
* @brief Sets Lp2pGroupInfo::frequency and Lp2pGroupInfo::channel.
* @param info \ref Lp2pGroupInfo
* @param[in] frequency Lp2pGroupInfo::frequency
* @param[in] channel Lp2pGroupInfo::channel
*/
NX_CONSTEXPR void lp2pGroupInfoSetFrequencyChannel(Lp2pGroupInfo *info, u16 frequency, s16 channel) {
info->frequency = frequency;
info->channel = channel;
}
/**
* @brief Sets Lp2pGroupInfo::stealth_enabled.
* @param info \ref Lp2pGroupInfo
* @param[in] flag Lp2pGroupInfo::stealth_enabled
*/
NX_CONSTEXPR void lp2pGroupInfoSetStealthEnabled(Lp2pGroupInfo *info, bool flag) {
info->stealth_enabled = flag!=0;
}
/**
* @brief Sets the PresharedKey for the specified \ref Lp2pGroupInfo.
* @note Using this is required before using the \ref Lp2pGroupInfo as input for any cmds, so that Lp2pGroupInfo::preshared_key_binary_size gets initialized.
* @note If standard WPA2-PSK is being used, use \ref lp2pGroupInfoSetPassphrase instead.
* @param info \ref Lp2pGroupInfo
* @param[in] key Data for the PresharedKey.
* @param[in] size Size to copy into the PresharedKey, max is 0x20.
*/
void lp2pGroupInfoSetPresharedKey(Lp2pGroupInfo *info, const void* key, size_t size);
/**
* @brief Sets the passphrase, for when standard WPA2-PSK is being used.
* @note Configure standard WPA2-PSK usage via \ref lp2pGroupInfoSetFlags / Lp2pGroupInfo::security_type.
* @note Only available on [11.0.0+].
* @param info \ref Lp2pGroupInfo
* @param[in] passphrase Passphrase string, the required length is 0x8-0x3F.
*/
Result lp2pGroupInfoSetPassphrase(Lp2pGroupInfo *info, const char *passphrase);
///@name INetworkService
///@{
/**
* @brief Scan
* @param[in] info \ref Lp2pGroupInfo
* @param[out] results Output array of \ref Lp2pScanResult.
* @param[in] count Size of the results array in entries.
* @param[out] total_out Total output entries.
*/
Result lp2pScan(const Lp2pGroupInfo *info, Lp2pScanResult *results, s32 count, s32 *total_out);
/**
* @brief CreateGroup
* @note The role (\ref lp2pGetRole) must be 0. This eventually sets the role to value 1.
* @param[in] info \ref Lp2pGroupInfo
*/
Result lp2pCreateGroup(const Lp2pGroupInfo *info);
/**
* @brief This destroys the previously created group from \ref lp2pCreateGroup.
* @note If no group was previously created (role from \ref lp2pGetRole is not 1), this just returns 0.
*/
Result lp2pDestroyGroup(void);
/**
* @brief SetAdvertiseData
* @note The role (\ref lp2pGetRole) must be <=1.
* @note An empty buffer (buffer=NULL/size=0) can be used to reset the AdvertiseData size in state to zero.
* @param[out] buffer Input buffer containing arbitrary user data.
* @param[in] size Input buffer size, must be <=0x80.
*/
Result lp2pSetAdvertiseData(const void* buffer, size_t size);
/**
* @brief This sends an Action frame to the specified \ref Lp2pGroupId, with the specified destination \ref Lp2pMacAddress.
* @note The role (\ref lp2pGetRole) must be non-zero.
* @note The error from \ref lp2pGetNetworkInterfaceLastError will be returned if it's set.
* @note [11.0.0+] Lp2pGroupInfo::security_type must be value 2 (default encryption), otherwise an error is returned.
* @param[in] buffer Input buffer containing arbitrary user data.
* @param[in] size Input buffer size, must be <=0x400.
* @param[in] addr \ref Lp2pMacAddress, this can be a broadcast address. This must be non-zero.
* @param[in] group_id \ref Lp2pGroupId
* @param[in] frequency Must be >=1. See Lp2pGroupInfo::frequency.
* @param[in] channel Must be >=1. See Lp2pGroupInfo::channel.
* @param[in] flags Only bit0 is used: clear = block until the data can be sent, set = return error when the data can't be sent.
*/
Result lp2pSendToOtherGroup(const void* buffer, size_t size, Lp2pMacAddress addr, Lp2pGroupId group_id, s16 frequency, s16 channel, u32 flags);
/**
* @brief This receives an Action frame.
* @note The role (\ref lp2pGetRole) must be non-zero.
* @note When data is not available, the error from \ref lp2pGetNetworkInterfaceLastError will be returned if it's set.
* @param[out] buffer Output buffer containing arbitrary user data.
* @param[in] size Output buffer size.
* @param[in] flags Only bit0 is used: clear = block until data is available, set = return error when data is not available.
* @param[in] addr \ref Lp2pMacAddress
* @param[in] unk0 Unknown
* @param[in] unk1 Unknown
* @param[out] out_size This is the original size used for copying to the output buffer, before it's clamped to the output-buffer size.
* @param[out] unk2 Unknown
*/
Result lp2pRecvFromOtherGroup(void* buffer, size_t size, u32 flags, Lp2pMacAddress *addr, u16 *unk0, s32 *unk1, u64 *out_size, s32 *unk2);
/**
* @brief AddAcceptableGroupId
* @param[in] group_id \ref Lp2pGroupId
*/
Result lp2pAddAcceptableGroupId(Lp2pGroupId group_id);
/**
* @brief RemoveAcceptableGroupId
*/
Result lp2pRemoveAcceptableGroupId(void);
///@name INetworkServiceMonitor
///@{
/**
* @brief AttachNetworkInterfaceStateChangeEvent
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
*/
Result lp2pAttachNetworkInterfaceStateChangeEvent(Event* out_event);
/**
* @brief GetNetworkInterfaceLastError
*/
Result lp2pGetNetworkInterfaceLastError(void);
/**
* @brief GetRole
* @param[out] out Output Role.
*/
Result lp2pGetRole(u8 *out);
/**
* @brief GetAdvertiseData
* @note The role from \ref lp2pGetRole must be value 2.
* @param[out] buffer Output buffer data.
* @param[in] size Output buffer size.
* @param[out] transfer_size Size of the data copied into the buffer.
* @param[out] original_size Original size from state.
*/
Result lp2pGetAdvertiseData(void* buffer, size_t size, u16 *transfer_size, u16 *original_size);
/**
* @brief GetAdvertiseData2
* @note This is identical to \ref lp2pGetAdvertiseData except this doesn't run the role validation.
* @param[out] buffer Output buffer data.
* @param[in] size Output buffer size.
* @param[out] transfer_size Size of the data copied into the buffer.
* @param[out] original_size Original size from state.
*/
Result lp2pGetAdvertiseData2(void* buffer, size_t size, u16 *transfer_size, u16 *original_size);
/**
* @brief GetGroupInfo
* @note The role from \ref lp2pGetRole must be non-zero.
* @param[out] out \ref Lp2pGroupInfo
*/
Result lp2pGetGroupInfo(Lp2pGroupInfo *out);
/**
* @brief This runs the same code as \ref lp2pCreateGroup to generate the \ref Lp2pGroupInfo for the input struct.
* @param[out] out \ref Lp2pGroupInfo
* @param[in] info \ref Lp2pGroupInfo
*/
Result lp2pJoin(Lp2pGroupInfo *out, const Lp2pGroupInfo *info);
/**
* @brief GetGroupOwner
* @note The role from \ref lp2pGetRole must be non-zero.
* @param[out] out \ref Lp2pNodeInfo
*/
Result lp2pGetGroupOwner(Lp2pNodeInfo *out);
/**
* @brief GetIpConfig
* @note The role from \ref lp2pGetRole must be non-zero.
* @param[out] out \ref Lp2pIpConfig
*/
Result lp2pGetIpConfig(Lp2pIpConfig *out);
/**
* @brief Leave
* @param[out] out Output value.
*/
Result lp2pLeave(u32 *out);
/**
* @brief AttachJoinEvent
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
*/
Result lp2pAttachJoinEvent(Event* out_event);
/**
* @brief GetMembers
* @note The role from \ref lp2pGetRole must be value 1.
* @param[out] members Output array of \ref Lp2pNodeInfo.
* @param[in] count Size of the members array in entries. A maximum of 8 entries can be returned.
* @param[out] total_out Total output entries.
*/
Result lp2pGetMembers(Lp2pNodeInfo *members, s32 count, s32 *total_out);
///@}

View File

@ -42,6 +42,9 @@ Result lrLrResolveApplicationLegalInformationPath(LrLocationResolver* lr, u64 ti
Result lrLrRedirectApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path);
Result lrLrRefresh(LrLocationResolver* lr);
/// Only available on [5.0.0+].
Result lrLrEraseProgramRedirection(LrLocationResolver* lr, u64 tid);
// IRegisteredLocationResolver
Result lrRegLrResolveProgramPath(LrRegisteredLocationResolver* reg, u64 tid, char *out);
// TODO: Other IRegisteredLocationResolver commands

View File

@ -0,0 +1,197 @@
/**
* @file mii.h
* @brief Mii services (mii:*) IPC wrapper.
* @author XorTroll
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../sf/service.h"
typedef enum {
MiiServiceType_System = 0, ///< Initializes mii:e.
MiiServiceType_User = 1, ///< Initializes mii:u.
} MiiServiceType;
/// Mii age.
typedef enum {
MiiAge_Young = 0, ///< Young
MiiAge_Normal = 1, ///< Normal
MiiAge_Old = 2, ///< Old
MiiAge_All = 3, ///< All of them
} MiiAge;
/// Mii gender.
typedef enum {
MiiGender_Male = 0, ///< Male
MiiGender_Female = 1, ///< Female
MiiGender_All = 2, ///< Both of them
} MiiGender;
/// Mii face color.
typedef enum {
MiiFaceColor_Black = 0, ///< Black
MiiFaceColor_White = 1, ///< White
MiiFaceColor_Asian = 2, ///< Asian
MiiFaceColor_All = 3, ///< All of them
} MiiFaceColor;
// Mii source flag.
typedef enum {
MiiSourceFlag_Database = BIT(0), ///< Miis created by the user
MiiSourceFlag_Default = BIT(1), ///< Default console miis
MiiSourceFlag_All = MiiSourceFlag_Database | MiiSourceFlag_Default, ///< All of them
} MiiSourceFlag;
// Mii special key code
typedef enum {
MiiSpecialKeyCode_Normal = 0, ///< Normal miis
MiiSpecialKeyCode_Special = 0xA523B78F, ///< Special miis
} MiiSpecialKeyCode;
typedef struct {
Service s;
} MiiDatabase;
// Mii create ID.
typedef struct {
Uuid uuid;
} MiiCreateId;
// Mii data structure.
typedef struct {
MiiCreateId create_id;
u16 mii_name[10+1]; ///< utf-16be, null-terminated
u8 unk_x26;
u8 mii_color;
u8 mii_sex;
u8 mii_height;
u8 mii_width;
u8 unk_x2b[2];
u8 mii_face_shape;
u8 mii_face_color;
u8 mii_wrinkles_style;
u8 mii_makeup_style;
u8 mii_hair_style;
u8 mii_hair_color;
u8 mii_has_hair_flipped;
u8 mii_eye_style;
u8 mii_eye_color;
u8 mii_eye_size;
u8 mii_eye_thickness;
u8 mii_eye_angle;
u8 mii_eye_pos_x;
u8 mii_eye_pos_y;
u8 mii_eyebrow_style;
u8 mii_eyebrow_color;
u8 mii_eyebrow_size;
u8 mii_eyebrow_thickness;
u8 mii_eyebrow_angle;
u8 mii_eyebrow_pos_x;
u8 mii_eyebrow_pos_y;
u8 mii_nose_style;
u8 mii_nose_size;
u8 mii_nose_pos;
u8 mii_mouth_style;
u8 mii_mouth_color;
u8 mii_mouth_size;
u8 mii_mouth_thickness;
u8 mii_mouth_pos;
u8 mii_facial_hair_color;
u8 mii_beard_style;
u8 mii_mustache_style;
u8 mii_mustache_size;
u8 mii_mustache_pos;
u8 mii_glasses_style;
u8 mii_glasses_color;
u8 mii_glasses_size;
u8 mii_glasses_pos;
u8 mii_has_mole;
u8 mii_mole_size;
u8 mii_mole_pos_x;
u8 mii_mole_pos_y;
u8 unk_x57;
} MiiCharInfo;
typedef struct {
u8 data[0x44];
} MiiStoreData;
// Mii format used in 3DS (https://www.3dbrew.org/wiki/Mii#Mii_format).
typedef struct {
u8 data[0x5C];
} MiiVer3StoreData;
// Original Mii colors and types before Ver3StoreData conversion
typedef struct {
u8 faceline_color;
u8 hair_color;
u8 eye_color;
u8 eyebrow_color;
u8 mouth_color;
u8 beard_color;
u8 glass_color;
u8 glass_type;
} MiiNfpStoreDataExtension;
/// Initialize mii.
Result miiInitialize(MiiServiceType service_type);
/// Exit mii.
void miiExit(void);
/// Gets the Service object for the actual mii service session.
Service* miiGetServiceSession(void);
/**
* @brief Opens a mii database.
* @param[in] key_code Mii key code filter.
* @param[out] out Database.
*/
Result miiOpenDatabase(MiiDatabase *out, MiiSpecialKeyCode key_code);
/**
* @brief Returns whether the mii database is updated.
* @param[in] db Database.
* @param[in] flag Source flag.
* @param[out] out_updated Whether the mii database is updated.
*/
Result miiDatabaseIsUpdated(MiiDatabase *db, bool *out_updated, MiiSourceFlag flag);
/**
* @brief Returns whether the mii database is full.
* @param[in] db Database.
* @param[out] out_full Whether the mii database is full.
*/
Result miiDatabaseIsFull(MiiDatabase *db, bool *out_full);
/**
* @brief Returns number of miis in the database with the specified source flag.
* @param[in] db Database.
* @param[in] flag Source flag.
* @param[out] out_count Out mii count.
*/
Result miiDatabaseGetCount(MiiDatabase *db, s32 *out_count, MiiSourceFlag flag);
/**
* @brief Reads mii charinfo data from the specified source flag.
* @param[in] db Database.
* @param[in] flag Source flag.
* @param[out] out_infos Output mii charinfo array.
* @param[in] count Number of mii chainfos to read.
* @param[out] total_out Number of mii charinfos which were actually read.
*/
Result miiDatabaseGet1(MiiDatabase *db, MiiSourceFlag flag, MiiCharInfo *out_infos, s32 count, s32 *total_out);
/**
* @brief Generates a random mii charinfo (doesn't register it in the console database).
* @param[in] db Database.
* @param[in] age Mii's age.
* @param[in] gender Mii's gender.
* @param[in] face_color Mii's face color.
* @param[out] out_info Out mii charinfo data.
*/
Result miiDatabaseBuildRandom(MiiDatabase *db, MiiAge age, MiiGender gender, MiiFaceColor face_color, MiiCharInfo *out_info);
/// Closes a mii database.
void miiDatabaseClose(MiiDatabase *db);

Some files were not shown because too many files have changed in this diff Show More