mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
Compare commits
167 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
dfee0c8ba2 | ||
|
0a4ac1b87c | ||
|
638624cf02 | ||
|
2f471a1c26 | ||
|
d1dbd8db51 | ||
|
de7cfeb3d9 | ||
|
2fc81d8f35 | ||
|
29f6f4fa7a | ||
|
b88afc509c | ||
|
ceb7ee1cbf | ||
|
0ba4f96bfe | ||
|
17bcd07095 | ||
|
ce6bc0c3e8 | ||
|
8f1cce6946 | ||
|
60bf943ec1 | ||
|
0ae0792770 | ||
|
953c1b7a8a | ||
|
5da574f852 | ||
|
b2d7022e1b | ||
|
29a6691b66 | ||
|
88de3cbea7 | ||
|
218e3f3a04 | ||
|
a063ceb19c | ||
|
e79dd7ac52 | ||
|
2e2b110668 | ||
|
432b4e3900 | ||
|
eef44aa5e1 | ||
|
688e4dd14e | ||
|
d4f5f4b145 | ||
|
6c430b273a | ||
|
58f1fc6561 | ||
|
65c643f149 | ||
|
73d79d4a0f | ||
|
163fdddabf | ||
|
c7c9617290 | ||
|
250a5777f7 | ||
|
5d5d13c9d6 | ||
|
2bbf49377e | ||
|
81bed00b5b | ||
|
8cff58d5af | ||
|
d66e3aa487 | ||
|
7b4e02be35 | ||
|
3c851a3443 | ||
|
df0508200b | ||
|
c769852631 | ||
|
e8341a00fe | ||
|
e570e67704 | ||
|
bb65fec6eb | ||
|
510d85bf48 | ||
|
ff2e76daf9 | ||
|
c8c4406467 | ||
|
b69d2fa95e | ||
|
919e3d3938 | ||
|
b615b01d44 | ||
|
be45a91b9c | ||
|
827c6b6ddf | ||
|
ce1f87050d | ||
|
99edb1c0f0 | ||
|
7d68ad6bd4 | ||
|
fda4e6b105 | ||
|
8d10ef8745 | ||
|
a215ae2da2 | ||
|
933c5a12f0 | ||
|
bb0ae8ac74 | ||
|
1bb5a21453 | ||
|
9439b39631 | ||
|
386118d16b | ||
|
08373603f7 | ||
|
412c48eab5 | ||
|
0094af6d29 | ||
|
ae491ce57b | ||
|
94cfa2be1c | ||
|
4ff1c52869 | ||
|
3a5d0dae35 | ||
|
288a09c4eb | ||
|
3bb619f46e | ||
|
3cb556acb3 | ||
|
140400d566 | ||
|
6f9bc920c9 | ||
|
e322bdf82d | ||
|
e6626a7825 | ||
|
25a8f21796 | ||
|
cb6f366a2a | ||
|
edc000928b | ||
|
4fcdb6eb34 | ||
|
e2424fd8bf | ||
|
af5072c096 | ||
|
6bd6fa8907 | ||
|
b954aaf35d | ||
|
8ce306b9b6 | ||
|
2e80cf9bba | ||
|
95f973fe98 | ||
|
6602c440b4 | ||
|
99a29b97ca | ||
|
dc0de47eb1 | ||
|
77c2d18046 | ||
|
a6686ae27a | ||
|
8747689be1 | ||
|
d219884bfa | ||
|
db592d8aeb | ||
|
9d1fd27b62 | ||
|
2e2284109b | ||
|
dca4fb772a | ||
|
cbb49e2ce0 | ||
|
4c0991dd88 | ||
|
ab2c2fb256 | ||
|
c09a21d87d | ||
|
3332ee2f6f | ||
|
f64d2059c4 | ||
|
8d9959010f | ||
|
f7af27cd21 | ||
|
c3e110988a | ||
|
4ece4e5b8f | ||
|
ee873e34d0 | ||
|
b5e47b6b67 | ||
|
6175293d0f | ||
|
ada230a882 | ||
|
4d59d366a1 | ||
|
dcebe96e71 | ||
|
174b5066a5 | ||
|
7549d3b124 | ||
|
e768ac74f9 | ||
|
6ee5d8d148 | ||
|
7caf74af76 | ||
|
3b2d72a427 | ||
|
75290f912e | ||
|
cea3018de6 | ||
|
5ca15e7696 | ||
|
09338f80b2 | ||
|
c4c9a6af3c | ||
|
ac414d2bc5 | ||
|
ea145a8d3c | ||
|
8b77139a04 | ||
|
de4d19df1a | ||
|
1543e84627 | ||
|
328d041c5c | ||
|
1a05cb20a2 | ||
|
97fef5e48d | ||
|
d8a4f33192 | ||
|
8b17648d0b | ||
|
62755bebe0 | ||
|
bb42eab289 | ||
|
d33bb0ad6a | ||
|
3a508e13b1 | ||
|
d14f931eab | ||
|
bf50bfdbbe | ||
|
9865dbf921 | ||
|
a1d6b3be43 | ||
|
d42ddeff78 | ||
|
cdba7dc808 | ||
|
f9a27d6cc7 | ||
|
f60f82856a | ||
|
0a88426a6a | ||
|
e6c7ac7c0b | ||
|
04aa28c436 | ||
|
3d9e1a9c7b | ||
|
6d8d9fd2fc | ||
|
32370bd19c | ||
|
587115f10a | ||
|
4a33b32f43 | ||
|
74c639ec3a | ||
|
16f8547f4c | ||
|
c208dd0a57 | ||
|
431c99465c | ||
|
93db7abb03 | ||
|
65b8ed5582 | ||
|
cee75bbe13 |
4
.github/workflows/build.yaml
vendored
4
.github/workflows/build.yaml
vendored
@ -14,9 +14,9 @@ jobs:
|
||||
image: 'devkitpro/devkita64'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: build
|
||||
run: make -C nx -j2
|
||||
run: make -C nx -j$(nproc)
|
||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -13,3 +13,5 @@ debug/
|
||||
release/
|
||||
lib/
|
||||
docs/
|
||||
compile_commands.json
|
||||
.clangd
|
||||
|
181
Changelog.md
181
Changelog.md
@ -1,5 +1,186 @@
|
||||
# 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
|
||||
|
22
nx/Makefile
22
nx/Makefile
@ -8,13 +8,6 @@ endif
|
||||
|
||||
include $(DEVKITPRO)/devkitA64/base_rules
|
||||
|
||||
export LIBNX_MAJOR := 4
|
||||
export LIBNX_MINOR := 2
|
||||
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
|
||||
@ -95,17 +88,14 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||
#---------------------------------------------------------------------------------
|
||||
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
|
||||
|
31
nx/external/bsd/include/sys/socket.h
vendored
31
nx/external/bsd/include/sys/socket.h
vendored
@ -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) */
|
||||
|
@ -111,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 {
|
||||
@ -283,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);
|
||||
|
@ -116,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 {
|
||||
@ -850,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.
|
||||
@ -863,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);
|
||||
@ -879,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.
|
||||
@ -891,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.
|
||||
@ -908,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.
|
||||
*/
|
||||
@ -967,7 +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 avilable when \ref SwkbdState is above ::SwkbdState_Initialized.
|
||||
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized.
|
||||
* @param s SwkbdInline object.
|
||||
* @param flag Flag
|
||||
*/
|
||||
|
@ -95,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 {
|
||||
@ -133,7 +133,7 @@ typedef struct {
|
||||
u8 visible;
|
||||
u16 unk_x5;
|
||||
u8 unk_x7;
|
||||
} PACKED WebBootFooterButtonEntry;
|
||||
} NX_PACKED WebBootFooterButtonEntry;
|
||||
|
||||
/// StorageHandleQueue
|
||||
typedef struct {
|
||||
|
@ -11,7 +11,7 @@ typedef struct {
|
||||
} BqRect;
|
||||
|
||||
typedef struct {
|
||||
struct { s64 timestamp; } PACKED;
|
||||
struct { s64 timestamp; } NX_PACKED;
|
||||
s32 isAutoTimestamp;
|
||||
BqRect crop;
|
||||
s32 scalingMode;
|
||||
|
@ -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.
|
||||
@ -71,6 +73,7 @@ typedef enum {
|
||||
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,8 +94,8 @@ 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;
|
||||
|
||||
@ -106,7 +109,7 @@ typedef struct {
|
||||
/// Secure monitor arguments.
|
||||
typedef struct {
|
||||
u64 X[8]; ///< Values of X0 through X7.
|
||||
} PACKED SecmonArgs;
|
||||
} NX_PACKED SecmonArgs;
|
||||
|
||||
/// Break reasons
|
||||
typedef enum {
|
||||
@ -205,6 +208,11 @@ typedef enum {
|
||||
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_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;
|
||||
@ -256,9 +264,10 @@ typedef enum {
|
||||
|
||||
/// WaitForAddress behaviors.
|
||||
typedef enum {
|
||||
ArbitrationType_WaitIfLessThan = 0, ///< Wait if the value is less than argument.
|
||||
ArbitrationType_DecrementAndWaitIfLessThan = 1, ///< Decrement the value and wait if it is less than argument.
|
||||
ArbitrationType_WaitIfEqual = 2, ///< Wait if the value is equal to argument.
|
||||
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.
|
||||
@ -358,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.
|
||||
@ -378,7 +387,7 @@ 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.
|
||||
@ -664,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.
|
||||
@ -803,7 +812,7 @@ Result svcGetThreadContext3(ThreadContext* ctx, Handle thread);
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x34.
|
||||
*/
|
||||
Result svcWaitForAddress(void *address, u32 arb_type, s32 value, s64 timeout);
|
||||
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+]
|
||||
@ -1114,14 +1123,14 @@ Result svcQueryPhysicalAddress(PhysicalMemoryInfo *out, u64 virtaddr);
|
||||
* @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* out_size, 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 svcQueryIoMapping.
|
||||
* @warning Only exists on [1.0.0-9.2.0]. For newer versions use \ref svcQueryMemoryMapping.
|
||||
*/
|
||||
Result svcLegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size);
|
||||
|
||||
@ -1161,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.
|
||||
@ -1170,7 +1179,7 @@ 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]
|
||||
@ -1561,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);
|
||||
|
||||
///@}
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -10,6 +10,7 @@ typedef struct {
|
||||
|
||||
Result nvFenceInit(void);
|
||||
void nvFenceExit(void);
|
||||
u32 nvFenceGetFd(void);
|
||||
|
||||
Result nvFenceWait(NvFence* f, s32 timeout_us);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
@ -149,6 +154,9 @@ typedef struct {
|
||||
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 {
|
||||
@ -156,6 +164,11 @@ typedef struct {
|
||||
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
|
||||
@ -246,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);
|
||||
@ -278,5 +292,7 @@ Result nvioctlChannel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdb
|
||||
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);
|
||||
|
@ -125,6 +125,7 @@ enum {
|
||||
LibnxError_LibAppletBadExit,
|
||||
LibnxError_InvalidCmifOutHeader,
|
||||
LibnxError_ShouldNotHappen,
|
||||
LibnxError_Timeout,
|
||||
};
|
||||
|
||||
/// libnx binder error codes
|
||||
|
@ -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,6 +119,8 @@ 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 {
|
||||
|
@ -10,8 +10,6 @@ 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 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.
|
||||
@ -46,3 +44,15 @@ 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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
///@}
|
||||
|
@ -12,4 +12,4 @@
|
||||
* @brief Aborts program execution with a result code.
|
||||
* @param[in] res Result code.
|
||||
*/
|
||||
void NORETURN diagAbortWithResult(Result res);
|
||||
void NX_NORETURN diagAbortWithResult(Result res);
|
||||
|
@ -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);
|
||||
|
@ -344,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.
|
||||
@ -1732,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.
|
||||
*/
|
||||
@ -1770,7 +1770,7 @@ 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.
|
||||
*/
|
||||
@ -1778,14 +1778,14 @@ Result appletGetHomeButtonWriterLockAccessor(AppletLockAccessor *a);
|
||||
|
||||
/**
|
||||
* @brief IsSleepEnabled
|
||||
* @note Only available with AppletType_SystemApplet on [11.0.0+].
|
||||
* @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.
|
||||
@ -1795,21 +1795,21 @@ 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+].
|
||||
* @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);
|
||||
@ -1821,65 +1821,65 @@ Result appletSetLastApplicationExitReason(s32 reason);
|
||||
|
||||
/**
|
||||
* @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.
|
||||
*/
|
||||
@ -2689,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.
|
||||
*/
|
||||
|
@ -17,6 +17,7 @@ typedef enum {
|
||||
AudioTarget_Headphone = 2,
|
||||
AudioTarget_Tv = 3,
|
||||
AudioTarget_UsbOutputDevice = 4,
|
||||
AudioTarget_Bluetooth = 5,
|
||||
} AudioTarget;
|
||||
|
||||
typedef enum {
|
||||
@ -41,28 +42,29 @@ Result audctlInitialize(void);
|
||||
void audctlExit(void);
|
||||
Service* audctlGetServiceSession(void);
|
||||
|
||||
Result audctlGetTargetVolume(float* volume_out, AudioTarget target);
|
||||
Result audctlSetTargetVolume(AudioTarget target, float volume);
|
||||
Result audctlGetTargetVolumeMin(float* volume_out);
|
||||
Result audctlGetTargetVolumeMax(float* volume_out);
|
||||
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);
|
||||
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);
|
||||
Result audctlGetForceMutePolicy(AudioForceMutePolicy* policy_out);
|
||||
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+]
|
||||
Result audctlAcquireAudioOutputDeviceUpdateEventForPlayReport(Event* event_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);
|
||||
|
@ -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);
|
||||
|
@ -24,4 +24,5 @@ Service* bpcGetServiceSession(void);
|
||||
|
||||
Result bpcShutdownSystem(void);
|
||||
Result bpcRebootSystem(void);
|
||||
Result bpcGetSleepButtonState(BpcSleepButtonState *out); ///< [2.0.0+]
|
||||
Result bpcGetSleepButtonState(BpcSleepButtonState *out); ///< [2.0.0-13.2.1]
|
||||
Result bpcGetPowerButton(bool* out_is_pushed); ///< [6.0.0+]
|
||||
|
@ -2,7 +2,7 @@
|
||||
* @file bt.h
|
||||
* @brief Bluetooth user (bt) service IPC wrapper.
|
||||
* @note See also btdev.
|
||||
* @author yellows8
|
||||
* @author yellows8, ndeadly
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
@ -24,93 +24,93 @@ Service* btGetServiceSession(void);
|
||||
* @brief LeClientReadCharacteristic
|
||||
* @note This is essentially the same as \ref btdrvReadGattCharacteristic.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] unk Unknown
|
||||
* @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 primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk);
|
||||
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] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] id2 \ref BtdrvGattId
|
||||
* @param[in] unk Unknown
|
||||
* @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 primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk);
|
||||
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] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @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] unk Unknown
|
||||
* @param[in] flag Flag
|
||||
* @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 primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag);
|
||||
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] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] id2 \ref BtdrvGattId
|
||||
* @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] unk Unknown
|
||||
* @param[in] auth_req \ref BtdrvGattAuthReqType
|
||||
*/
|
||||
Result btLeClientWriteDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk);
|
||||
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] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @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 primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
|
||||
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] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @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 primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
|
||||
Result btLeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
|
||||
|
||||
/**
|
||||
* @brief SetLeResponse
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] uuid0 \ref BtdrvGattAttributeUuid
|
||||
* @param[in] uuid1 \ref BtdrvGattAttributeUuid
|
||||
* @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 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size);
|
||||
Result btSetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size);
|
||||
|
||||
/**
|
||||
* @brief LeSendIndication
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] uuid0 \ref BtdrvGattAttributeUuid
|
||||
* @param[in] uuid1 \ref BtdrvGattAttributeUuid
|
||||
* @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] flag Flag
|
||||
* @param[in] noconfirm Whether no confirmation is required (notification) or not (indication)
|
||||
*/
|
||||
Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size, bool flag);
|
||||
Result btLeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm);
|
||||
|
||||
/**
|
||||
* @brief GetLeEventInfo
|
||||
@ -118,9 +118,9 @@ Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const Btd
|
||||
* @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 BleEventType.
|
||||
* @param[out] type Output BtdrvBleEventType.
|
||||
*/
|
||||
Result btGetLeEventInfo(void* buffer, size_t size, u32 *type);
|
||||
Result btGetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type);
|
||||
|
||||
/**
|
||||
* @brief RegisterBleEvent
|
||||
|
@ -242,7 +242,7 @@ typedef struct {
|
||||
|
||||
struct {
|
||||
u32 res; ///< Always 0.
|
||||
u8 unk_x4; ///< Always 0.
|
||||
u8 proto_mode; ///< Protocol mode. Always 0 (report mode).
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
u8 pad; ///< Padding
|
||||
BtdrvHidReport report;
|
||||
@ -323,96 +323,137 @@ typedef struct {
|
||||
u8 initialized;
|
||||
} BtdrvCircularBuffer;
|
||||
|
||||
/// Data for \ref btdrvGetBleManagedEventInfo. The data stored here depends on the \ref BtdrvBleEventType.
|
||||
/// Data for \ref btdrvGetBleManagedEventInfo and \ref btdrvGetLeHidEventInfo. The data stored here depends on the \ref BtdrvBleEventType.
|
||||
typedef struct {
|
||||
union {
|
||||
u8 data[0x400];
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u8 handle;
|
||||
u8 registered;
|
||||
} type0;
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u8 client_if; ///< Client interface handle
|
||||
u8 status; ///< Registration status. 0 = Unregistered, 1 = Registered
|
||||
u8 pad[2]; ///< Padding
|
||||
} client_registration; ///< ::BtdrvBleEventType_ClientRegistration
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u32 conn_id;
|
||||
u32 unk_x8;
|
||||
u32 unk_xC;
|
||||
} type2;
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u8 server_if; ///< Server interface handle. Unused
|
||||
u8 status; ///< Registration status. 0 = Unregistered, 1 = Registered
|
||||
u8 pad[2]; ///< Padding
|
||||
} server_registration; ///< ::BtdrvBleEventType_ServerRegistration
|
||||
|
||||
struct {
|
||||
u32 conn_id;
|
||||
u16 min_interval;
|
||||
u16 max_interval;
|
||||
u16 slave_latency;
|
||||
u16 timeout_multiplier;
|
||||
} type3; ///< Connection params?
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u32 conn_id; ///< Connection ID
|
||||
u16 conn_interval; ///< Connection interval
|
||||
u16 conn_latency; ///< Connection latency
|
||||
u16 supervision_tout; ///< Connection supervision timeout multiplier
|
||||
u8 pad[2]; ///< Padding
|
||||
} connection_update; ///< ::BtdrvBleEventType_ConnectionUpdate
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u8 unk_x4;
|
||||
u8 unk_x5;
|
||||
u8 unk_x6;
|
||||
u8 unk_x7;
|
||||
u32 conn_id;
|
||||
BtdrvAddress address;
|
||||
u16 unk_x12;
|
||||
} type4; ///< Connection status?
|
||||
u32 conn_id; ///< Connection ID
|
||||
u16 min_conn_interval; ///< Minimum connection interval
|
||||
u16 max_conn_interval; ///< Maximum connection interval
|
||||
u16 slave_latency; ///< Slave latency
|
||||
u16 supervision_tout; ///< Connection supervision timeout multiplier
|
||||
} preferred_connection_parameters; ///< ::BtdrvBleEventType_PreferredConnectionParameters
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u8 unk_x4;
|
||||
u8 unk_x5;
|
||||
u8 unk_x6;
|
||||
BtdrvAddress address;
|
||||
BtdrvBleAdvertisementData adv[10];
|
||||
u8 count;
|
||||
u32 unk_x144;
|
||||
} type6; ///< Scan result?
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u8 status; ///< Connection status. 0 = Connected, 2 = Disconnected
|
||||
u8 client_if; ///< Client interface handle
|
||||
u8 pad[2]; ///< Padding
|
||||
u32 conn_id; ///< Connection ID
|
||||
BtdrvAddress address; ///< Device address
|
||||
u16 reason; ///< Disconnection reason
|
||||
} client_connection; ///< ::BtdrvBleEventType_ClientConnection
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u32 conn_id;
|
||||
} type7;
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u8 status; ///< Connection status. 0 = Connected, 2 = Disconnected
|
||||
u8 server_if; ///< Server interface handle
|
||||
u8 pad[2]; ///< Padding
|
||||
u32 conn_id; ///< Connection ID
|
||||
BtdrvAddress address; ///< Device address
|
||||
u16 reason; ///< Disconnection reason
|
||||
} server_connection; ///< ::BtdrvBleEventType_ServerConnection
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u8 interface;
|
||||
u8 unk_x5;
|
||||
u16 unk_x6;
|
||||
u32 unk_x8;
|
||||
BtdrvGattAttributeUuid svc_uuid;
|
||||
BtdrvGattAttributeUuid char_uuid;
|
||||
BtdrvGattAttributeUuid descr_uuid;
|
||||
u16 size;
|
||||
u8 data[0x202];
|
||||
} type8; ///< Notification?
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u8 status; ///< BLE scan status. 1 = Scan complete, 2 = New device found, 0xFF = Scan started
|
||||
u8 device_type; ///< Device type. 0 = BD/EDR, 1 = BLE, 2 = Dual Mode
|
||||
u8 ble_addr_type; ///< BLE address type. 0 = Public, 1 = Random, 2 = Public ID, 3 = Random ID
|
||||
BtdrvAddress address; ///< Device address
|
||||
BtdrvBleAdvertisement ad_list[10]; ///< BLE Advertisement list \ref BtdrvBleAdvertisement
|
||||
u8 count; ///< Number of entries above
|
||||
s32 rssi; ///< RSSI value
|
||||
} scan_result; ///< ::BtdrvBleEventType_ScanResult
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u32 conn_id;
|
||||
u32 unk_x8;
|
||||
u8 unk_xC[0x140];
|
||||
} type9;
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u32 action; ///< Scan filter action. 0 = Add, 1 = Delete, 2 = Clear, 3 = Enable, 4 = Disable
|
||||
} scan_filter; ///< ::BtdrvBleEventType_ScanFilter
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u32 conn_id;
|
||||
u8 unk_x8[0x24];
|
||||
u32 unk_x2C;
|
||||
u8 unk_x30[0x11c];
|
||||
} type10;
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u32 conn_id; ///< Connection ID
|
||||
u8 type; ///< Notification type. 4 = Notification, 5 = Indication.
|
||||
u8 pad[3]; ///< Padding
|
||||
BtdrvGattAttributeUuid serv_uuid; ///< GATT Service UUID \ref BtdrvGattAttributeUuid
|
||||
BtdrvGattAttributeUuid char_uuid; ///< GATT Characteristic UUID \ref BtdrvGattAttributeUuid
|
||||
BtdrvGattAttributeUuid desc_uuid; ///< GATT Descriptor UUID \ref BtdrvGattAttributeUuid
|
||||
u16 size; ///< Size of the below data
|
||||
u8 data[0x200]; ///< Notification data.
|
||||
u8 pad2[2]; ///< Padding
|
||||
} client_notify; ///< ::BtdrvBleEventType_ClientNotify
|
||||
|
||||
struct {
|
||||
u32 status;
|
||||
u32 conn_id;
|
||||
u16 unk_x8;
|
||||
} type11;
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u32 conn_id; ///< Connection ID
|
||||
u32 count; ///< Number of attributes below.
|
||||
BtdrvGattAttribute attr_list[10]; ///< List of Gatt attributes \ref BtdrvGattAttribute
|
||||
} client_cache_save; ///< ::BtdrvBleEventType_ClientCacheSave
|
||||
|
||||
struct {
|
||||
u8 unk_x0[0x218];
|
||||
} type13;
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u32 conn_id; ///< Connection ID
|
||||
u16 unk_x8; ///< Unknown. Always 0
|
||||
u8 unused[0x142]; ///< Unused
|
||||
} client_cache_load; ///< ::BtdrvBleEventType_ClientCacheLoad
|
||||
|
||||
struct {
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u32 conn_id; ///< Connection ID
|
||||
u16 mtu; ///< MTU value
|
||||
u8 pad[2]; ///< Padding
|
||||
} client_configure_mtu; ///< ::BtdrvBleEventType_ClientConfigureMtu
|
||||
|
||||
struct {
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u32 server_if; ///< Server interface handle
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
u16 service_id; ///< Service ID
|
||||
u16 attr_id; ///< Attribute ID
|
||||
u8 attr_type; ///< Attribute type \ref BtdrvGattAttributeType
|
||||
u8 property; ///< Characteristic properties. Only set if attr_type is 1 \ref BtdrvGattCharacteristicProperty
|
||||
u8 is_primary; ///< Is a primary service or not
|
||||
u8 pad; ///< Padding
|
||||
} server_add_attribute; ///< ::BtdrvBleEventType_ServerAddAttribute
|
||||
|
||||
struct {
|
||||
u32 result; ///< 0 for success, non-zero for error.
|
||||
u16 conn_id; ///< Connection ID
|
||||
u8 operation; ///< Operation. 0 = Read, 1 = Write
|
||||
u8 pad; ///< Padding
|
||||
u16 service_id; ///< Service ID
|
||||
u16 attr_id; ///< Attribute ID
|
||||
u8 attr_type; ///< Attribute type \ref BtdrvGattAttributeType
|
||||
u8 data[0x200]; ///< Data written during write operation
|
||||
u16 size; ///< Size of the above data
|
||||
u16 offset; ///< Offset
|
||||
u8 pad2[2]; ///< Padding
|
||||
} server_attribute_operation; ///< ::BtdrvBleEventType_ServerAttributeOperation
|
||||
};
|
||||
} BtdrvBleEventInfo;
|
||||
|
||||
@ -629,9 +670,9 @@ Result btdrvGetHidReport(BtdrvAddress addr, u8 report_id, BtdrvBluetoothHhReport
|
||||
* @brief TriggerConnection
|
||||
* @note This is used by btm-sysmodule.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] unk [9.0.0+] Unknown
|
||||
* @param[in] timeout [9.0.0+] Host trigger timeout
|
||||
*/
|
||||
Result btdrvTriggerConnection(BtdrvAddress addr, u16 unk);
|
||||
Result btdrvTriggerConnection(BtdrvAddress addr, u16 timeout);
|
||||
|
||||
/**
|
||||
* @brief AddPairedDeviceInfo
|
||||
@ -748,7 +789,7 @@ Result btdrvRegisterHidReportEvent(Event* out_event);
|
||||
* @note [7.0.0+] When data isn't available, the type is set to ::BtdrvHidEventType_Data, with the buffer cleared to all-zero.
|
||||
* @param[out] buffer Output buffer, see \ref BtdrvHidReportEventInfo.
|
||||
* @param[in] size Output buffer size.
|
||||
* @oaram[out] type \ref BtdrvHidEventType
|
||||
* @param[out] type \ref BtdrvHidEventType
|
||||
*/
|
||||
Result btdrvGetHidReportEventInfo(void* buffer, size_t size, BtdrvHidEventType *type);
|
||||
|
||||
@ -853,9 +894,9 @@ Result btdrvSetLeConnectionParameter(const BtdrvLeConnectionParams *param);
|
||||
* @note Only available on [9.0.0+]. This is the newer version of \ref btdrvSetLeConnectionParameter.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] param \ref BtdrvBleConnectionParameter
|
||||
* @param[in] flag Flag
|
||||
* @param[in] preference Unused
|
||||
*/
|
||||
Result btdrvSetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool flag);
|
||||
Result btdrvSetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool preference);
|
||||
|
||||
/**
|
||||
* @brief SetLeDefaultConnectionParameter
|
||||
@ -882,10 +923,10 @@ Result btdrvSetBleAdvertiseData(const BtdrvBleAdvertisePacketData *data);
|
||||
* @brief SetBleAdvertiseParameter
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] unk0 Unknown
|
||||
* @param[in] unk1 Unknown
|
||||
* @param[in] min_interval Minimum advertisement interval
|
||||
* @param[in] max_interval Maximum advertisement interval
|
||||
*/
|
||||
Result btdrvSetBleAdvertiseParameter(BtdrvAddress addr, u16 unk0, u16 unk1);
|
||||
Result btdrvSetBleAdvertiseParameter(BtdrvAddress addr, u16 min_interval, u16 max_interval);
|
||||
|
||||
/**
|
||||
* @brief StartBleScan
|
||||
@ -920,9 +961,9 @@ Result btdrvDeleteBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter);
|
||||
/**
|
||||
* @brief DeleteBleScanFilter
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] index Filter index
|
||||
*/
|
||||
Result btdrvDeleteBleScanFilter(u8 unk);
|
||||
Result btdrvDeleteBleScanFilter(u8 index);
|
||||
|
||||
/**
|
||||
* @brief ClearBleScanFilters
|
||||
@ -950,9 +991,9 @@ Result btdrvRegisterGattClient(const BtdrvGattAttributeUuid *uuid);
|
||||
/**
|
||||
* @brief UnregisterGattClient
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] client_if Client interface ID
|
||||
*/
|
||||
Result btdrvUnregisterGattClient(u8 unk);
|
||||
Result btdrvUnregisterGattClient(u8 client_if);
|
||||
|
||||
/**
|
||||
* @brief UnregisterAllGattClients
|
||||
@ -964,59 +1005,60 @@ Result btdrvUnregisterAllGattClients(void);
|
||||
* @brief ConnectGattServer
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note This is used by btm-sysmodule.
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] client_if Client interface ID
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] flag Flag
|
||||
* @param[in] is_direct Whether a direct connection or a background auto connection
|
||||
* @param[in] AppletResourceUserId AppletResourceUserId
|
||||
*/
|
||||
Result btdrvConnectGattServer(u8 unk, BtdrvAddress addr, bool flag, u64 AppletResourceUserId);
|
||||
Result btdrvConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct, u64 AppletResourceUserId);
|
||||
|
||||
/**
|
||||
* @brief CancelConnectGattServer
|
||||
* @note Only available on [5.1.0+].
|
||||
* @note This is used by btm-sysmodule.
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] client_if Client interface ID
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] flag Flag
|
||||
* @param[in] is_direct Whether a direct connection or a background auto connection
|
||||
*/
|
||||
Result btdrvCancelConnectGattServer(u8 unk, BtdrvAddress addr, bool flag);
|
||||
Result btdrvCancelConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct);
|
||||
|
||||
/**
|
||||
* @brief DisconnectGattServer
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note This is used by btm-sysmodule.
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] conn_id Connection ID
|
||||
*/
|
||||
Result btdrvDisconnectGattServer(u32 unk);
|
||||
Result btdrvDisconnectGattServer(u32 conn_id);
|
||||
|
||||
/**
|
||||
* @brief GetGattAttribute
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0.
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] conn_id Connection ID
|
||||
*/
|
||||
Result btdrvGetGattAttribute(BtdrvAddress addr, u32 unk);
|
||||
Result btdrvGetGattAttribute(BtdrvAddress addr, u32 conn_id);
|
||||
|
||||
/**
|
||||
* @brief GetGattService
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] conn_id Connection ID
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
Result btdrvGetGattService(u32 unk, const BtdrvGattAttributeUuid *uuid);
|
||||
Result btdrvGetGattService(u32 conn_id, const BtdrvGattAttributeUuid *uuid);
|
||||
|
||||
/**
|
||||
* @brief ConfigureAttMtu
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note This is used by btm-sysmodule.
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] conn_id Connection ID
|
||||
* @param[in] mtu MTU
|
||||
*/
|
||||
Result btdrvConfigureAttMtu(u32 unk, u16 mtu);
|
||||
Result btdrvConfigureAttMtu(u32 conn_id, u16 mtu);
|
||||
|
||||
/**
|
||||
* @brief RegisterGattServer
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note Event data generated by this call contains uninitialized junk instead of the server_if value received internally.
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
Result btdrvRegisterGattServer(const BtdrvGattAttributeUuid *uuid);
|
||||
@ -1024,125 +1066,129 @@ Result btdrvRegisterGattServer(const BtdrvGattAttributeUuid *uuid);
|
||||
/**
|
||||
* @brief UnregisterGattServer
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] server_if Server interface ID
|
||||
*/
|
||||
Result btdrvUnregisterGattServer(u8 unk);
|
||||
Result btdrvUnregisterGattServer(u8 server_if);
|
||||
|
||||
/**
|
||||
* @brief ConnectGattClient
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] server_if Server interface ID
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] flag Flag
|
||||
* @param[in] is_direct Whether a direct connection or a background auto connection
|
||||
*/
|
||||
Result btdrvConnectGattClient(u8 unk, BtdrvAddress addr, bool flag);
|
||||
Result btdrvConnectGattClient(u8 server_if, BtdrvAddress addr, bool is_direct);
|
||||
|
||||
/**
|
||||
* @brief DisconnectGattClient
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] conn_id Connection ID
|
||||
* @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0.
|
||||
*/
|
||||
Result btdrvDisconnectGattClient(u8 unk, BtdrvAddress addr);
|
||||
Result btdrvDisconnectGattClient(u8 conn_id, BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief AddGattService
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk0 Unknown
|
||||
* @note Broken behaviour due to internal bugs.
|
||||
* @param[in] server_if Server interface ID
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[in] unk1 Unknown
|
||||
* @param[in] flag Flag
|
||||
* @param[in] num_handle Number of handles
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
*/
|
||||
Result btdrvAddGattService(u8 unk0, const BtdrvGattAttributeUuid *uuid, u8 unk1, bool flag);
|
||||
Result btdrvAddGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid, u8 num_handle, bool is_primary);
|
||||
|
||||
/**
|
||||
* @brief EnableGattService
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @note Broken behaviour due to internal bugs.
|
||||
* @param[in] server_if Server interface ID
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
Result btdrvEnableGattService(u8 unk, const BtdrvGattAttributeUuid *uuid);
|
||||
Result btdrvEnableGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid);
|
||||
|
||||
/**
|
||||
* @brief AddGattCharacteristic
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk0 Unknown
|
||||
* @param[in] uuid0 \ref BtdrvGattAttributeUuid
|
||||
* @param[in] uuid1 \ref BtdrvGattAttributeUuid
|
||||
* @param[in] unk1 Unknown
|
||||
* @param[in] unk2 Unknown
|
||||
* @note Broken behaviour due to internal bugs.
|
||||
* @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] permissions \ref BtdrvGattAttributePermission
|
||||
* @param[in] property \ref BtdrvGattCharacteristicProperty
|
||||
*/
|
||||
Result btdrvAddGattCharacteristic(u8 unk0, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, u8 unk1, u16 unk2);
|
||||
Result btdrvAddGattCharacteristic(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, u16 permissions, u8 property);
|
||||
|
||||
/**
|
||||
* @brief AddGattDescriptor
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk0 Unknown
|
||||
* @param[in] uuid0 \ref BtdrvGattAttributeUuid
|
||||
* @param[in] uuid1 \ref BtdrvGattAttributeUuid
|
||||
* @param[in] unk1 Unknown
|
||||
* @note Broken behaviour due to internal bugs.
|
||||
* @param[in] server_if Server interface ID
|
||||
* @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[in] desc_uuid Descriptor UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[in] permissions \ref BtdrvGattAttributePermission
|
||||
*/
|
||||
Result btdrvAddGattDescriptor(u8 unk0, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, u16 unk1);
|
||||
Result btdrvAddGattDescriptor(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *desc_uuid, u16 permissions);
|
||||
|
||||
/**
|
||||
* @brief GetBleManagedEventInfo
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note This is used by btm-sysmodule.
|
||||
* @param[out] buffer Output buffer. 0x400-bytes from state is written here.
|
||||
* @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo.
|
||||
* @param[in] size Output buffer size.
|
||||
* @oaram[out] type Output BtdrvBleEventType.
|
||||
* @param[out] type Output BtdrvBleEventType.
|
||||
*/
|
||||
Result btdrvGetBleManagedEventInfo(void* buffer, size_t size, BtdrvBleEventType *type);
|
||||
|
||||
/**
|
||||
* @brief GetGattFirstCharacteristic
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] id \ref BtdrvGattId
|
||||
* @param[in] flag Flag
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_property Output Property.
|
||||
* @param[out] out_char_id Output CharacteristicId \ref BtdrvGattId
|
||||
* @param[in] conn_id Connection ID
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty
|
||||
* @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId
|
||||
*/
|
||||
Result btdrvGetGattFirstCharacteristic(u32 unk, const BtdrvGattId *id, bool flag, const BtdrvGattAttributeUuid *uuid, u8 *out_property, BtdrvGattId *out_char_id);
|
||||
Result btdrvGetGattFirstCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id);
|
||||
|
||||
/**
|
||||
* @brief GetGattNextCharacteristic
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] flag Flag
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_property Output Property.
|
||||
* @param[out] out_char_id Output CharacteristicId \ref BtdrvGattId
|
||||
* @param[in] conn_id Connection ID
|
||||
* @param[in] serv_id Service ID \ref BtdrvGattId
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] char_id Previous characteristic GATT ID \ref BtdrvGattId
|
||||
* @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty
|
||||
* @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId
|
||||
*/
|
||||
Result btdrvGetGattNextCharacteristic(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattAttributeUuid *uuid, u8 *out_property, BtdrvGattId *out_char_id);
|
||||
Result btdrvGetGattNextCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id);
|
||||
|
||||
/**
|
||||
* @brief GetGattFirstDescriptor
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] flag Flag
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_desc_id Output DescriptorId \ref BtdrvGattId
|
||||
* @param[in] conn_id Connection ID
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
* @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId
|
||||
*/
|
||||
Result btdrvGetGattFirstDescriptor(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattAttributeUuid *uuid, BtdrvGattId *out_desc_id);
|
||||
Result btdrvGetGattFirstDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id);
|
||||
|
||||
/**
|
||||
* @brief GetGattNextDescriptor
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unk Unknown
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] flag Flag
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] id2 \ref BtdrvGattId
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_desc_id Output DescriptorId \ref BtdrvGattId
|
||||
* @param[in] conn_id Connection ID
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
* @param[in] desc_id Previous descriptor GATT ID \ref BtdrvGattId
|
||||
* @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId
|
||||
*/
|
||||
Result btdrvGetGattNextDescriptor(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattId *id2, const BtdrvGattAttributeUuid *uuid, BtdrvGattId *out_desc_id);
|
||||
Result btdrvGetGattNextDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id);
|
||||
|
||||
/**
|
||||
* @brief RegisterGattManagedDataPath
|
||||
@ -1195,82 +1241,82 @@ Result btdrvUnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid);
|
||||
* @brief ReadGattCharacteristic
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] unk Unknown
|
||||
* @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 btdrvReadGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk);
|
||||
Result btdrvReadGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req);
|
||||
|
||||
/**
|
||||
* @brief ReadGattDescriptor
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] id2 \ref BtdrvGattId
|
||||
* @param[in] unk Unknown
|
||||
* @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 btdrvReadGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk);
|
||||
Result btdrvReadGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req);
|
||||
|
||||
/**
|
||||
* @brief WriteGattCharacteristic
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @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] unk Unknown
|
||||
* @param[in] flag Flag
|
||||
* @param[in] auth_req \ref BtdrvGattAuthReqType
|
||||
* @param[in] with_response Whether to use Write-With-Response write type or not
|
||||
*/
|
||||
Result btdrvWriteGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag);
|
||||
Result btdrvWriteGattCharacteristic(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 WriteGattDescriptor
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @param[in] id2 \ref BtdrvGattId
|
||||
* @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] unk Unknown
|
||||
* @param[in] auth_req \ref BtdrvGattAuthReqType
|
||||
*/
|
||||
Result btdrvWriteGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk);
|
||||
Result btdrvWriteGattDescriptor(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 RegisterGattNotification
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @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 btdrvRegisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
|
||||
Result btdrvRegisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
|
||||
|
||||
/**
|
||||
* @brief UnregisterGattNotification
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
* @param[in] id0 \ref BtdrvGattId
|
||||
* @param[in] id1 \ref BtdrvGattId
|
||||
* @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 btdrvUnregisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
|
||||
Result btdrvUnregisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
|
||||
|
||||
/**
|
||||
* @brief GetLeHidEventInfo
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note The state used by this is reset after writing the data to output.
|
||||
* @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo.
|
||||
* @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo.
|
||||
* @param[in] size Output buffer size.
|
||||
* @oaram[out] type Output BleEventType.
|
||||
* @param[out] type \ref BtdrvBleEventType.
|
||||
*/
|
||||
Result btdrvGetLeHidEventInfo(void* buffer, size_t size, u32 *type);
|
||||
Result btdrvGetLeHidEventInfo(void* buffer, size_t size, BtdrvBleEventType *type);
|
||||
|
||||
/**
|
||||
* @brief RegisterBleHidEvent
|
||||
@ -1284,10 +1330,10 @@ Result btdrvRegisterBleHidEvent(Event* out_event);
|
||||
* @brief SetBleScanParameter
|
||||
* @note Only available on [5.1.0+].
|
||||
* @note This is used by btm-sysmodule.
|
||||
* @param[in] unk0 Unknown
|
||||
* @param[in] unk1 Unknown
|
||||
* @param[in] scan_interval Scan interval
|
||||
* @param[in] scan_window Scan window
|
||||
*/
|
||||
Result btdrvSetBleScanParameter(u16 unk0, u16 unk1);
|
||||
Result btdrvSetBleScanParameter(u16 scan_interval, u16 scan_window);
|
||||
|
||||
/**
|
||||
* @brief MoveToSecondaryPiconet
|
||||
@ -1439,7 +1485,7 @@ Result btdrvGetAudioControlInputState(BtdrvAudioControlButtonState *states, s32
|
||||
|
||||
/**
|
||||
* @brief AcquireAudioConnectionStateChangedEvent
|
||||
* @note Only available on [12.0.0+].
|
||||
* @note Only available on [12.0.0-13.2.1].
|
||||
* @param[out] out_event Output Event.
|
||||
* @param[in] autoclear Event autoclear.
|
||||
*/
|
||||
@ -1447,7 +1493,7 @@ Result btdrvAcquireAudioConnectionStateChangedEvent(Event* out_event, bool autoc
|
||||
|
||||
/**
|
||||
* @brief GetConnectedAudioDevice
|
||||
* @note Only available on [12.0.0+].
|
||||
* @note Only available on [12.0.0-13.2.1].
|
||||
* @param[out] addrs Output array of \ref BtdrvAddress.
|
||||
* @param[in] count Size of the addrs array in entries, the maximum is 0x8.
|
||||
* @param[out] total_out Total output entries.
|
||||
|
917
nx/include/switch/services/btdrv_ids.h
Normal file
917
nx/include/switch/services/btdrv_ids.h
Normal 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;
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "btdrv_ids.h"
|
||||
|
||||
/// BluetoothPropertyType [1.0.0-11.0.1]
|
||||
typedef enum {
|
||||
@ -124,22 +125,105 @@ typedef enum {
|
||||
|
||||
/// BleEventType
|
||||
typedef enum {
|
||||
BtdrvBleEventType_Unknown0 = 0, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown1 = 1, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown2 = 2, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown3 = 3, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown4 = 4, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown5 = 5, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown6 = 6, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown7 = 7, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown8 = 8, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown9 = 9, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown10 = 10, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown11 = 11, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown12 = 12, ///< Unknown.
|
||||
BtdrvBleEventType_Unknown13 = 13, ///< Unknown.
|
||||
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
|
||||
@ -227,74 +311,6 @@ typedef struct {
|
||||
u8 unk_x0[0x88]; ///< Unknown
|
||||
} BtdrvChannelMapList;
|
||||
|
||||
/// LeConnectionParams
|
||||
typedef struct {
|
||||
u8 unk_x0[0x14]; ///< Unknown
|
||||
} BtdrvLeConnectionParams;
|
||||
|
||||
/// BleConnectionParameter
|
||||
typedef struct {
|
||||
u8 unk_x0[0xC]; ///< Unknown
|
||||
} BtdrvBleConnectionParameter;
|
||||
|
||||
/// BtdrvBleAdvertisePacketDataEntry
|
||||
typedef struct {
|
||||
u16 unk_x0; ///< Unknown
|
||||
u8 unused[0x12]; ///< Unused
|
||||
} BtdrvBleAdvertisePacketDataEntry;
|
||||
|
||||
/// BleAdvertisePacketData
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Unknown
|
||||
u8 unk_x4; ///< Unknown
|
||||
u8 size0; ///< Size of the data at unk_x6.
|
||||
u8 unk_x6[0x1F]; ///< Unknown, see size0.
|
||||
u8 pad[3]; ///< Padding
|
||||
u8 count; ///< Total array entries, see entries.
|
||||
u8 pad2[7]; ///< Padding
|
||||
BtdrvBleAdvertisePacketDataEntry entries[0x5]; ///< \ref BtdrvBleAdvertisePacketDataEntry
|
||||
u8 pad3[0x10]; ///< Padding
|
||||
u8 size2; ///< Size of the data at unk_xA8.
|
||||
u8 unk_xA5; ///< Unknown
|
||||
u8 pad4[2]; ///< Padding
|
||||
u8 unk_xA8[0x1F]; ///< Unknown, see size2.
|
||||
u8 unk_xC7; ///< Unknown
|
||||
u8 unk_xC8; ///< Unknown
|
||||
u8 pad5[3]; ///< Padding
|
||||
} BtdrvBleAdvertisePacketData;
|
||||
|
||||
typedef struct {
|
||||
u8 length;
|
||||
u8 type;
|
||||
u8 value[0x1d];
|
||||
} BtdrvBleAdvertisementData;
|
||||
|
||||
/// BleAdvertiseFilter
|
||||
typedef struct {
|
||||
u8 unk_x0[0x3E]; ///< Unknown
|
||||
} BtdrvBleAdvertiseFilter;
|
||||
|
||||
/// BleAdvertisePacketParameter
|
||||
typedef struct {
|
||||
u8 data[0x8]; ///< Unknown
|
||||
} BtdrvBleAdvertisePacketParameter;
|
||||
|
||||
/// BleScanResult
|
||||
typedef struct {
|
||||
u8 unk_x0; ///< Unknown
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
u8 unk_x7[0x139]; ///< Unknown
|
||||
s32 unk_x140; ///< 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;
|
||||
|
||||
/// GattAttributeUuid
|
||||
typedef struct {
|
||||
u32 size; ///< UUID size, must be 0x2, 0x4, or 0x10.
|
||||
@ -308,6 +324,96 @@ typedef struct {
|
||||
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
|
||||
|
@ -60,6 +60,7 @@ typedef enum {
|
||||
typedef enum {
|
||||
BtmProfile_None = 0, ///< None
|
||||
BtmProfile_Hid = 1, ///< Hid
|
||||
BtmProfile_Audio = 2, ///< [13.0.0+] Audio
|
||||
} BtmProfile;
|
||||
|
||||
/// BdName
|
||||
@ -297,3 +298,8 @@ typedef struct {
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
} BtmBleDataPath;
|
||||
|
||||
/// AudioDevice
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< Device address
|
||||
char name[0xF9]; ///< Device name
|
||||
} BtmAudioDevice;
|
||||
|
@ -6,6 +6,8 @@
|
||||
#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.
|
||||
@ -80,3 +82,104 @@ Result btmsysAcquireGamepadPairingEvent(Event* out_event);
|
||||
*/
|
||||
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);
|
||||
|
@ -93,7 +93,9 @@ typedef struct {
|
||||
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
|
||||
u8 storage; ///< \ref CapsAlbumStorage
|
||||
u8 content; ///< \ref CapsAlbumFileContents
|
||||
u8 pad_x12[0x6]; ///< padding
|
||||
u8 unknown_12; ///< [19.0.0+]
|
||||
u8 unknown_13; ///< [19.0.0+]
|
||||
u8 pad_x14[0x4]; ///< padding
|
||||
} CapsAlbumFileId;
|
||||
|
||||
/// AlbumEntry
|
||||
|
@ -9,6 +9,13 @@
|
||||
#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);
|
||||
|
||||
@ -40,7 +47,7 @@ Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage);
|
||||
* @param[in] appletResourceUserId AppletResourceUserId.
|
||||
* @param[in] application_id ApplicationId.
|
||||
*/
|
||||
Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id);
|
||||
Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id);
|
||||
|
||||
/**
|
||||
* @brief Unregister an applet.
|
||||
@ -49,7 +56,7 @@ Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 applicati
|
||||
* @param[in] appletResourceUserId AppletResourceUserId.
|
||||
* @param[in] application_id ApplicationId.
|
||||
*/
|
||||
Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id);
|
||||
Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id);
|
||||
|
||||
/**
|
||||
* @brief Get an ApplicationId that corresponds to an AppletResourceUserId.
|
||||
@ -58,7 +65,7 @@ Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 applica
|
||||
* @param[out] application_id ApplicationId.
|
||||
* @param[in] appletResourceUserId AppletResourceUserId.
|
||||
*/
|
||||
Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid);
|
||||
Result capscGetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid);
|
||||
|
||||
/**
|
||||
* @brief Checks whether an ApplicationId is registered.
|
||||
@ -74,7 +81,7 @@ Result capscCheckApplicationIdRegistered(u64 application_id);
|
||||
* @param[in] contents \ref CapsAlbumFileContents
|
||||
* @param[out] file_id \ref CapsAlbumFileId
|
||||
*/
|
||||
Result capscGenerateCurrentAlbumFileId(u64 application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id);
|
||||
Result capscGenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id);
|
||||
|
||||
/**
|
||||
* @brief Generate an ApplicationAlbumEntry based on parameters.
|
||||
|
@ -30,3 +30,34 @@ Service* capsdcGetServiceSession(void);
|
||||
* @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);
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -122,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.
|
||||
@ -172,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 {
|
||||
@ -252,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.
|
||||
@ -286,6 +305,8 @@ typedef enum {
|
||||
FsBisPartitionId_SystemProperEncryption = 32,
|
||||
FsBisPartitionId_SystemProperPartition = 33,
|
||||
FsBisPartitionId_SignedSystemPartitionOnSafeMode = 34,
|
||||
FsBisPartitionId_DeviceTreeBlob = 35,
|
||||
FsBisPartitionId_System0 = 36,
|
||||
} FsBisPartitionId;
|
||||
|
||||
/// FileSystemType
|
||||
@ -305,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,
|
||||
@ -313,12 +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);
|
||||
|
||||
@ -335,7 +496,7 @@ void fsSetPriority(FsPriority prio);
|
||||
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);
|
||||
@ -368,6 +529,8 @@ 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+]
|
||||
@ -382,11 +545,15 @@ Result fsOpenSdCardDetectionEventNotifier(FsEventNotifier* out);
|
||||
|
||||
Result fsIsSignedSystemPartitionOnSdCardValid(bool *out);
|
||||
|
||||
/// Retrieves the rights id corresponding to the content path. Only available on [2.0.0+].
|
||||
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);
|
||||
|
||||
@ -394,9 +561,16 @@ 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);
|
||||
@ -451,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.
|
||||
@ -496,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);
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "../sf/service.h"
|
||||
#include "../services/fs.h"
|
||||
#include "../crypto/sha256.h"
|
||||
#include "../services/ncm_types.h"
|
||||
|
||||
typedef struct {
|
||||
u8 signature[0x100];
|
||||
@ -26,5 +27,5 @@ void fsldrExit(void);
|
||||
/// Gets the Service object for the actual fsp-ldr service session.
|
||||
Service* fsldrGetServiceSession(void);
|
||||
|
||||
Result fsldrOpenCodeFileSystem(FsCodeInfo* out_code_info, 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);
|
||||
|
@ -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);
|
||||
|
@ -64,8 +64,8 @@ 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);
|
||||
Result gpioPadClearInterruptStatus(GpioPadSession *p);
|
||||
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);
|
||||
|
@ -236,7 +236,8 @@ typedef enum {
|
||||
HidNpadStyleTag_NpadLark = BIT(7), ///< NES/Famicom controller
|
||||
HidNpadStyleTag_NpadHandheldLark = BIT(8), ///< NES/Famicom controller in handheld mode
|
||||
HidNpadStyleTag_NpadLucia = BIT(9), ///< SNES controller
|
||||
HidNpadStyleTag_Npad10 = BIT(10),
|
||||
HidNpadStyleTag_NpadLagon = BIT(10), ///< N64 controller
|
||||
HidNpadStyleTag_NpadLager = BIT(11), ///< Sega Genesis controller
|
||||
HidNpadStyleTag_NpadSystemExt = BIT(29), ///< Generic external controller
|
||||
HidNpadStyleTag_NpadSystem = BIT(30), ///< Generic controller
|
||||
|
||||
@ -253,37 +254,41 @@ typedef enum {
|
||||
|
||||
/// HidNpadButton
|
||||
typedef enum {
|
||||
HidNpadButton_A = BIT(0), ///< A button / Right face button
|
||||
HidNpadButton_B = BIT(1), ///< B button / Down face button
|
||||
HidNpadButton_X = BIT(2), ///< X button / Up face button
|
||||
HidNpadButton_Y = BIT(3), ///< Y button / Left face button
|
||||
HidNpadButton_StickL = BIT(4), ///< Left Stick button
|
||||
HidNpadButton_StickR = BIT(5), ///< Right Stick button
|
||||
HidNpadButton_L = BIT(6), ///< L button
|
||||
HidNpadButton_R = BIT(7), ///< R button
|
||||
HidNpadButton_ZL = BIT(8), ///< ZL button
|
||||
HidNpadButton_ZR = BIT(9), ///< ZR button
|
||||
HidNpadButton_Plus = BIT(10), ///< Plus button
|
||||
HidNpadButton_Minus = BIT(11), ///< Minus button
|
||||
HidNpadButton_Left = BIT(12), ///< D-Pad Left button
|
||||
HidNpadButton_Up = BIT(13), ///< D-Pad Up button
|
||||
HidNpadButton_Right = BIT(14), ///< D-Pad Right button
|
||||
HidNpadButton_Down = BIT(15), ///< D-Pad Down button
|
||||
HidNpadButton_StickLLeft = BIT(16), ///< Left Stick pseudo-button when moved Left
|
||||
HidNpadButton_StickLUp = BIT(17), ///< Left Stick pseudo-button when moved Up
|
||||
HidNpadButton_StickLRight = BIT(18), ///< Left Stick pseudo-button when moved Right
|
||||
HidNpadButton_StickLDown = BIT(19), ///< Left Stick pseudo-button when moved Down
|
||||
HidNpadButton_StickRLeft = BIT(20), ///< Right Stick pseudo-button when moved Left
|
||||
HidNpadButton_StickRUp = BIT(21), ///< Right Stick pseudo-button when moved Up
|
||||
HidNpadButton_StickRRight = BIT(22), ///< Right Stick pseudo-button when moved Right
|
||||
HidNpadButton_StickRDown = BIT(23), ///< Right Stick pseudo-button when moved Left
|
||||
HidNpadButton_LeftSL = BIT(24), ///< SL button on Left Joy-Con
|
||||
HidNpadButton_LeftSR = BIT(25), ///< SR button on Left Joy-Con
|
||||
HidNpadButton_RightSL = BIT(26), ///< SL button on Right Joy-Con
|
||||
HidNpadButton_RightSR = BIT(27), ///< SR button on Right Joy-Con
|
||||
HidNpadButton_Palma = BIT(28), ///< Top button on Poké Ball Plus (Palma) controller
|
||||
HidNpadButton_29 = BIT(29),
|
||||
HidNpadButton_HandheldLeftB = BIT(30), ///< B button on Left NES/HVC controller in Handheld mode
|
||||
HidNpadButton_A = BITL(0), ///< A button / Right face button
|
||||
HidNpadButton_B = BITL(1), ///< B button / Down face button
|
||||
HidNpadButton_X = BITL(2), ///< X button / Up face button
|
||||
HidNpadButton_Y = BITL(3), ///< Y button / Left face button
|
||||
HidNpadButton_StickL = BITL(4), ///< Left Stick button
|
||||
HidNpadButton_StickR = BITL(5), ///< Right Stick button
|
||||
HidNpadButton_L = BITL(6), ///< L button
|
||||
HidNpadButton_R = BITL(7), ///< R button
|
||||
HidNpadButton_ZL = BITL(8), ///< ZL button
|
||||
HidNpadButton_ZR = BITL(9), ///< ZR button
|
||||
HidNpadButton_Plus = BITL(10), ///< Plus button
|
||||
HidNpadButton_Minus = BITL(11), ///< Minus button
|
||||
HidNpadButton_Left = BITL(12), ///< D-Pad Left button
|
||||
HidNpadButton_Up = BITL(13), ///< D-Pad Up button
|
||||
HidNpadButton_Right = BITL(14), ///< D-Pad Right button
|
||||
HidNpadButton_Down = BITL(15), ///< D-Pad Down button
|
||||
HidNpadButton_StickLLeft = BITL(16), ///< Left Stick pseudo-button when moved Left
|
||||
HidNpadButton_StickLUp = BITL(17), ///< Left Stick pseudo-button when moved Up
|
||||
HidNpadButton_StickLRight = BITL(18), ///< Left Stick pseudo-button when moved Right
|
||||
HidNpadButton_StickLDown = BITL(19), ///< Left Stick pseudo-button when moved Down
|
||||
HidNpadButton_StickRLeft = BITL(20), ///< Right Stick pseudo-button when moved Left
|
||||
HidNpadButton_StickRUp = BITL(21), ///< Right Stick pseudo-button when moved Up
|
||||
HidNpadButton_StickRRight = BITL(22), ///< Right Stick pseudo-button when moved Right
|
||||
HidNpadButton_StickRDown = BITL(23), ///< Right Stick pseudo-button when moved Left
|
||||
HidNpadButton_LeftSL = BITL(24), ///< SL button on Left Joy-Con
|
||||
HidNpadButton_LeftSR = BITL(25), ///< SR button on Left Joy-Con
|
||||
HidNpadButton_RightSL = BITL(26), ///< SL button on Right Joy-Con
|
||||
HidNpadButton_RightSR = BITL(27), ///< SR button on Right Joy-Con
|
||||
HidNpadButton_Palma = BITL(28), ///< Top button on Poké Ball Plus (Palma) controller
|
||||
HidNpadButton_Verification = BITL(29), ///< Verification
|
||||
HidNpadButton_HandheldLeftB = BITL(30), ///< B button on Left NES/HVC controller in Handheld mode
|
||||
HidNpadButton_LagonCLeft = BITL(31), ///< Left C button in N64 controller
|
||||
HidNpadButton_LagonCUp = BITL(32), ///< Up C button in N64 controller
|
||||
HidNpadButton_LagonCRight = BITL(33), ///< Right C button in N64 controller
|
||||
HidNpadButton_LagonCDown = BITL(34), ///< Down C button in N64 controller
|
||||
|
||||
HidNpadButton_AnyLeft = HidNpadButton_Left | HidNpadButton_StickLLeft | HidNpadButton_StickRLeft, ///< Bitmask containing all buttons that are considered Left (D-Pad, Sticks)
|
||||
HidNpadButton_AnyUp = HidNpadButton_Up | HidNpadButton_StickLUp | HidNpadButton_StickRUp, ///< Bitmask containing all buttons that are considered Up (D-Pad, Sticks)
|
||||
@ -398,17 +403,23 @@ typedef enum {
|
||||
/// DeviceType (system)
|
||||
typedef enum {
|
||||
HidDeviceTypeBits_FullKey = BIT(0), ///< Pro Controller and Gc controller.
|
||||
HidDeviceTypeBits_Unknown1 = BIT(1), ///< Unknown.
|
||||
HidDeviceTypeBits_DebugPad = BIT(1), ///< DebugPad
|
||||
HidDeviceTypeBits_HandheldLeft = BIT(2), ///< Joy-Con/Famicom/NES left controller in handheld mode.
|
||||
HidDeviceTypeBits_HandheldRight = BIT(3), ///< Joy-Con/Famicom/NES right controller in handheld mode.
|
||||
HidDeviceTypeBits_JoyLeft = BIT(4), ///< Joy-Con left controller.
|
||||
HidDeviceTypeBits_JoyRight = BIT(5), ///< Joy-Con right controller.
|
||||
HidDeviceTypeBits_Palma = BIT(6), ///< Poké Ball Plus controller.
|
||||
HidDeviceTypeBits_LarkLeftHVC = BIT(7), ///< Famicom left controller.
|
||||
HidDeviceTypeBits_LarkRightHVC = BIT(8), ///< Famicom right controller (with microphone).
|
||||
HidDeviceTypeBits_LarkLeftNES = BIT(9), ///< NES left controller.
|
||||
HidDeviceTypeBits_LarkRightNES = BIT(10), ///< NES right controller.
|
||||
HidDeviceTypeBits_SystemExt = BIT(15), ///< Generic external controller.
|
||||
HidDeviceTypeBits_LarkHvcLeft = BIT(7), ///< Famicom left controller.
|
||||
HidDeviceTypeBits_LarkHvcRight = BIT(8), ///< Famicom right controller (with microphone).
|
||||
HidDeviceTypeBits_LarkNesLeft = BIT(9), ///< NES left controller.
|
||||
HidDeviceTypeBits_LarkNesRight = BIT(10), ///< NES right controller.
|
||||
HidDeviceTypeBits_HandheldLarkHvcLeft = BIT(11), ///< Famicom left controller in handheld mode.
|
||||
HidDeviceTypeBits_HandheldLarkHvcRight = BIT(12), ///< Famicom right controller (with microphone) in handheld mode.
|
||||
HidDeviceTypeBits_HandheldLarkNesLeft = BIT(13), ///< NES left controller in handheld mode.
|
||||
HidDeviceTypeBits_HandheldLarkNesRight = BIT(14), ///< NES right controller in handheld mode.
|
||||
HidDeviceTypeBits_Lucia = BIT(15), ///< SNES controller
|
||||
HidDeviceTypeBits_Lagon = BIT(16), ///< N64 controller
|
||||
HidDeviceTypeBits_Lager = BIT(17), ///< Sega Genesis controller
|
||||
HidDeviceTypeBits_System = BIT(31), ///< Generic controller.
|
||||
} HidDeviceTypeBits;
|
||||
|
||||
@ -420,16 +431,20 @@ typedef enum {
|
||||
HidDeviceType_JoyLeft4 = 4, ///< ::HidDeviceTypeBits_JoyLeft
|
||||
HidDeviceType_JoyRight5 = 5, ///< ::HidDeviceTypeBits_JoyRight
|
||||
HidDeviceType_FullKey6 = 6, ///< ::HidDeviceTypeBits_FullKey
|
||||
HidDeviceType_LarkLeftHVC = 7, ///< ::HidDeviceTypeBits_LarkLeftHVC
|
||||
HidDeviceType_LarkRightHVC = 8, ///< ::HidDeviceTypeBits_LarkRightHVC
|
||||
HidDeviceType_LarkLeftNES = 9, ///< ::HidDeviceTypeBits_LarkLeftNES
|
||||
HidDeviceType_LarkRightNES = 10, ///< ::HidDeviceTypeBits_LarkRightNES
|
||||
HidDeviceType_LarkHvcLeft = 7, ///< ::HidDeviceTypeBits_LarkHvcLeft, ::HidDeviceTypeBits_HandheldLarkHvcLeft
|
||||
HidDeviceType_LarkHvcRight = 8, ///< ::HidDeviceTypeBits_LarkHvcRight, ::HidDeviceTypeBits_HandheldLarkHvcRight
|
||||
HidDeviceType_LarkNesLeft = 9, ///< ::HidDeviceTypeBits_LarkNesLeft, ::HidDeviceTypeBits_HandheldLarkNesLeft
|
||||
HidDeviceType_LarkNesRight = 10, ///< ::HidDeviceTypeBits_LarkNesRight, ::HidDeviceTypeBits_HandheldLarkNesRight
|
||||
HidDeviceType_Lucia = 11, ///< ::HidDeviceTypeBits_Lucia
|
||||
HidDeviceType_Palma = 12, ///< [9.0.0+] ::HidDeviceTypeBits_Palma
|
||||
HidDeviceType_FullKey13 = 13, ///< ::HidDeviceTypeBits_FullKey
|
||||
HidDeviceType_FullKey15 = 15, ///< ::HidDeviceTypeBits_FullKey
|
||||
HidDeviceType_DebugPad = 17, ///< ::HidDeviceTypeBits_DebugPad
|
||||
HidDeviceType_System19 = 19, ///< ::HidDeviceTypeBits_System with \ref HidNpadStyleTag |= ::HidNpadStyleTag_NpadFullKey.
|
||||
HidDeviceType_System20 = 20, ///< ::HidDeviceTypeBits_System with \ref HidNpadStyleTag |= ::HidNpadStyleTag_NpadJoyDual.
|
||||
HidDeviceType_System21 = 21, ///< ::HidDeviceTypeBits_System with \ref HidNpadStyleTag |= ::HidNpadStyleTag_NpadJoyDual.
|
||||
HidDeviceType_Lagon = 22, ///< ::HidDeviceTypeBits_Lagon
|
||||
HidDeviceType_Lager = 28, ///< ::HidDeviceTypeBits_Lager
|
||||
} HidDeviceType;
|
||||
|
||||
/// AppletFooterUiType (system)
|
||||
@ -455,6 +470,7 @@ typedef enum {
|
||||
HidAppletFooterUiType_LarkNesRight = 18, ///< LarkNesRight
|
||||
HidAppletFooterUiType_Lucia = 19, ///< Lucia
|
||||
HidAppletFooterUiType_Verification = 20, ///< Verification
|
||||
HidAppletFooterUiType_Lagon = 21, ///< [13.0.0+] Lagon
|
||||
} HidAppletFooterUiType;
|
||||
|
||||
/// NpadInterfaceType (system)
|
||||
@ -490,6 +506,14 @@ typedef enum {
|
||||
HidNpadLuciaType_U = 3, ///< U
|
||||
} HidNpadLuciaType;
|
||||
|
||||
/// NpadLagerType
|
||||
typedef enum {
|
||||
HidNpadLagerType_Invalid = 0, ///< Invalid
|
||||
HidNpadLagerType_J = 1, ///< J
|
||||
HidNpadLagerType_E = 2, ///< E
|
||||
HidNpadLagerType_U = 3, ///< U
|
||||
} HidNpadLagerType;
|
||||
|
||||
/// Type values for HidVibrationDeviceInfo::type.
|
||||
typedef enum {
|
||||
HidVibrationDeviceType_Unknown = 0, ///< Unknown
|
||||
@ -731,6 +755,297 @@ typedef struct HidKeyboardSharedMemoryFormat {
|
||||
|
||||
// End HidKeyboard
|
||||
|
||||
// Begin HidBasicXpad
|
||||
|
||||
/// HidBasicXpadState
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
u32 attributes;
|
||||
u32 buttons;
|
||||
u64 analog_stick_left;
|
||||
u64 analog_stick_right;
|
||||
} HidBasicXpadState;
|
||||
|
||||
/// HidBasicXpadStateAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidBasicXpadState state;
|
||||
} HidBasicXpadStateAtomicStorage;
|
||||
|
||||
/// HidBasicXpadLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidBasicXpadStateAtomicStorage storage[17];
|
||||
} HidBasicXpadLifo;
|
||||
|
||||
/// HidBasicXpadSharedMemoryEntry
|
||||
typedef struct {
|
||||
HidBasicXpadLifo lifo;
|
||||
u8 padding[0x138];
|
||||
} HidBasicXpadSharedMemoryEntry;
|
||||
|
||||
/// HidBasicXpadSharedMemoryFormat
|
||||
typedef struct {
|
||||
HidBasicXpadSharedMemoryEntry entries[4];
|
||||
} HidBasicXpadSharedMemoryFormat;
|
||||
|
||||
// End HidBasicXpad
|
||||
|
||||
// Begin HidDigitizer
|
||||
|
||||
/// HidDigitizerState
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
u32 unk_0x8;
|
||||
u32 unk_0xC;
|
||||
u32 attributes;
|
||||
u32 buttons;
|
||||
u32 unk_0x18;
|
||||
u32 unk_0x1C;
|
||||
u32 unk_0x20;
|
||||
u32 unk_0x24;
|
||||
u32 unk_0x28;
|
||||
u32 unk_0x2C;
|
||||
u32 unk_0x30;
|
||||
u32 unk_0x34;
|
||||
u32 unk_0x38;
|
||||
u32 unk_0x3C;
|
||||
u32 unk_0x40;
|
||||
u32 unk_0x44;
|
||||
u32 unk_0x48;
|
||||
u32 unk_0x4C;
|
||||
u32 unk_0x50;
|
||||
u32 unk_0x54;
|
||||
} HidDigitizerState;
|
||||
|
||||
/// HidDigitizerStateAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidDigitizerState state;
|
||||
} HidDigitizerStateAtomicStorage;
|
||||
|
||||
/// HidDigitizerLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidDigitizerStateAtomicStorage storage[17];
|
||||
} HidDigitizerLifo;
|
||||
|
||||
/// HidDigitizerSharedMemoryFormat
|
||||
typedef struct {
|
||||
HidDigitizerLifo lifo;
|
||||
u8 padding[0x980];
|
||||
} HidDigitizerSharedMemoryFormat;
|
||||
|
||||
// End HidDigitizer
|
||||
|
||||
// Begin HidHomeButton
|
||||
|
||||
/// HidHomeButtonState
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
u64 buttons;
|
||||
} HidHomeButtonState;
|
||||
|
||||
/// HidHomeButtonStateAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidHomeButtonState state;
|
||||
} HidHomeButtonStateAtomicStorage;
|
||||
|
||||
/// HidHomeButtonLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidHomeButtonStateAtomicStorage storage[17];
|
||||
} HidHomeButtonLifo;
|
||||
|
||||
/// HidHomeButtonSharedMemoryFormat
|
||||
typedef struct {
|
||||
HidHomeButtonLifo lifo;
|
||||
u8 padding[0x48];
|
||||
} HidHomeButtonSharedMemoryFormat;
|
||||
|
||||
// End HidHomeButton
|
||||
|
||||
// Begin HidSleepButton
|
||||
|
||||
/// HidSleepButtonState
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
u64 buttons;
|
||||
} HidSleepButtonState;
|
||||
|
||||
/// HidSleepButtonStateAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidSleepButtonState state;
|
||||
} HidSleepButtonStateAtomicStorage;
|
||||
|
||||
/// HidSleepButtonLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidSleepButtonStateAtomicStorage storage[17];
|
||||
} HidSleepButtonLifo;
|
||||
|
||||
/// HidSleepButtonSharedMemoryFormat
|
||||
typedef struct {
|
||||
HidSleepButtonLifo lifo;
|
||||
u8 padding[0x48];
|
||||
} HidSleepButtonSharedMemoryFormat;
|
||||
|
||||
// End HidSleepButton
|
||||
|
||||
// Begin HidCaptureButton
|
||||
|
||||
/// HidCaptureButtonState
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
u64 buttons;
|
||||
} HidCaptureButtonState;
|
||||
|
||||
/// HidCaptureButtonStateAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidCaptureButtonState state;
|
||||
} HidCaptureButtonStateAtomicStorage;
|
||||
|
||||
/// HidCaptureButtonLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidCaptureButtonStateAtomicStorage storage[17];
|
||||
} HidCaptureButtonLifo;
|
||||
|
||||
/// HidCaptureButtonSharedMemoryFormat
|
||||
typedef struct {
|
||||
HidCaptureButtonLifo lifo;
|
||||
u8 padding[0x48];
|
||||
} HidCaptureButtonSharedMemoryFormat;
|
||||
|
||||
// End HidCaptureButton
|
||||
|
||||
// Begin HidInputDetector
|
||||
|
||||
/// HidInputDetectorState
|
||||
typedef struct {
|
||||
u64 input_source_state;
|
||||
u64 sampling_number;
|
||||
} HidInputDetectorState;
|
||||
|
||||
/// HidInputDetectorStateAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidInputDetectorState state;
|
||||
} HidInputDetectorStateAtomicStorage;
|
||||
|
||||
/// HidInputDetectorLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidInputDetectorStateAtomicStorage storage[2];
|
||||
} HidInputDetectorLifo;
|
||||
|
||||
/// HidInputDetectorSharedMemoryEntry
|
||||
typedef struct {
|
||||
HidInputDetectorLifo lifo;
|
||||
u8 padding[0x30];
|
||||
} HidInputDetectorSharedMemoryEntry;
|
||||
|
||||
/// HidInputDetectorSharedMemoryFormat
|
||||
typedef struct {
|
||||
HidInputDetectorSharedMemoryEntry entries[16];
|
||||
} HidInputDetectorSharedMemoryFormat;
|
||||
|
||||
// End HidInputDetector
|
||||
|
||||
// Begin HidUniquePad
|
||||
|
||||
/// HidUniquePadConfigMutex
|
||||
typedef struct {
|
||||
u8 unk_0x0[0x20];
|
||||
} HidUniquePadConfigMutex;
|
||||
|
||||
/// HidSixAxisSensorUserCalibrationState
|
||||
typedef struct {
|
||||
u32 flags;
|
||||
u8 reserved[4];
|
||||
u64 stage;
|
||||
u64 sampling_number;
|
||||
} HidSixAxisSensorUserCalibrationState;
|
||||
|
||||
/// HidSixAxisSensorUserCalibrationStateAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidSixAxisSensorUserCalibrationState calib_state;
|
||||
} HidSixAxisSensorUserCalibrationStateAtomicStorage;
|
||||
|
||||
/// HidSixAxisSensorUserCalibrationStateLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidSixAxisSensorUserCalibrationStateAtomicStorage storage[2];
|
||||
} HidSixAxisSensorUserCalibrationStateLifo;
|
||||
|
||||
/// HidAnalogStickCalibrationStateImpl
|
||||
typedef struct {
|
||||
u64 state;
|
||||
u64 flags;
|
||||
u64 stage;
|
||||
u64 sampling_number;
|
||||
} HidAnalogStickCalibrationStateImpl;
|
||||
|
||||
/// HidAnalogStickCalibrationStateImplAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidAnalogStickCalibrationStateImpl calib_state;
|
||||
} HidAnalogStickCalibrationStateImplAtomicStorage;
|
||||
|
||||
/// HidAnalogStickCalibrationStateImplLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidAnalogStickCalibrationStateImplAtomicStorage storage[2];
|
||||
} HidAnalogStickCalibrationStateImplLifo;
|
||||
|
||||
/// HidUniquePadConfig
|
||||
typedef struct {
|
||||
u32 type;
|
||||
u32 interface;
|
||||
u8 serial_number[0x10];
|
||||
u32 controller_number;
|
||||
bool is_active;
|
||||
u8 reserved[3];
|
||||
u64 sampling_number;
|
||||
} HidUniquePadConfig;
|
||||
|
||||
/// HidUniquePadConfigAtomicStorage
|
||||
typedef struct {
|
||||
u64 sampling_number;
|
||||
HidUniquePadConfig config;
|
||||
} HidUniquePadConfigAtomicStorage;
|
||||
|
||||
/// HidUniquePadConfigLifo
|
||||
typedef struct {
|
||||
HidCommonLifoHeader header;
|
||||
HidUniquePadConfigAtomicStorage storage[2];
|
||||
} HidUniquePadConfigLifo;
|
||||
|
||||
/// HidUniquePadLifo
|
||||
typedef struct {
|
||||
HidUniquePadConfigLifo config_lifo;
|
||||
HidAnalogStickCalibrationStateImplLifo analog_stick_calib_lifo[2];
|
||||
HidSixAxisSensorUserCalibrationStateLifo sixaxis_calib_lifo;
|
||||
HidUniquePadConfigMutex mutex;
|
||||
} HidUniquePadLifo;
|
||||
|
||||
/// HidUniquePadSharedMemoryEntry
|
||||
typedef struct {
|
||||
HidUniquePadLifo lifo;
|
||||
u8 padding[0x220];
|
||||
} HidUniquePadSharedMemoryEntry;
|
||||
|
||||
/// HidUniquePadSharedMemoryFormat
|
||||
typedef struct {
|
||||
HidUniquePadSharedMemoryEntry entries[16];
|
||||
} HidUniquePadSharedMemoryFormat;
|
||||
|
||||
// End HidUniquePad
|
||||
|
||||
// Begin HidNpad
|
||||
|
||||
/// Npad colors.
|
||||
@ -815,6 +1130,8 @@ typedef struct HidNpadLuciaState {
|
||||
HidNpadLuciaType lucia_type; ///< \ref HidNpadLuciaType
|
||||
} HidNpadLuciaState;
|
||||
|
||||
typedef HidNpadCommonState HidNpadLagerState; ///< State for ::HidNpadStyleTag_NpadLager. Analog-sticks state are always zero.
|
||||
|
||||
typedef HidNpadCommonState HidNpadSystemExtState; ///< State for ::HidNpadStyleTag_NpadSystemExt.
|
||||
typedef HidNpadCommonState HidNpadSystemState; ///< State for ::HidNpadStyleTag_NpadSystem. Analog-sticks state are always zero. Only the following button bits are available: HidNpadButton_A, HidNpadButton_B, HidNpadButton_X, HidNpadButton_Y, HidNpadButton_Left, HidNpadButton_Up, HidNpadButton_Right, HidNpadButton_Down, HidNpadButton_L, HidNpadButton_R.
|
||||
|
||||
@ -975,7 +1292,7 @@ typedef struct HidNpadInternalState {
|
||||
u32 lark_type_l_and_main; ///< \ref HidNpadLarkType
|
||||
u32 lark_type_r; ///< \ref HidNpadLarkType
|
||||
u32 lucia_type; ///< \ref HidNpadLuciaType
|
||||
u32 unk_x43EC;
|
||||
u32 lager_type; ///< \ref HidNpadLagerType
|
||||
} HidNpadInternalState;
|
||||
|
||||
/// HidNpadSharedMemoryEntry
|
||||
@ -1054,12 +1371,15 @@ typedef struct HidSharedMemory {
|
||||
HidTouchScreenSharedMemoryFormat touchscreen;
|
||||
HidMouseSharedMemoryFormat mouse;
|
||||
HidKeyboardSharedMemoryFormat keyboard;
|
||||
u8 digitizer[0x1000]; ///< [10.0.0+] Digitizer [1.0.0-9.2.0] BasicXpad
|
||||
u8 home_button[0x200];
|
||||
u8 sleep_button[0x200];
|
||||
u8 capture_button[0x200];
|
||||
u8 input_detector[0x800];
|
||||
u8 unique_pad[0x4000]; ///< [1.0.0-4.1.0] UniquePad
|
||||
union {
|
||||
HidBasicXpadSharedMemoryFormat basic_xpad; ///< [1.0.0-9.2.0] BasicXpad
|
||||
HidDigitizerSharedMemoryFormat digitizer; ///< [10.0.0+] Digitizer
|
||||
};
|
||||
HidHomeButtonSharedMemoryFormat home_button;
|
||||
HidSleepButtonSharedMemoryFormat sleep_button;
|
||||
HidCaptureButtonSharedMemoryFormat capture_button;
|
||||
HidInputDetectorSharedMemoryFormat input_detector;
|
||||
HidUniquePadSharedMemoryFormat unique_pad; ///< [1.0.0-4.1.0] UniquePad
|
||||
HidNpadSharedMemoryFormat npad;
|
||||
HidGestureSharedMemoryFormat gesture;
|
||||
HidConsoleSixAxisSensor console_six_axis_sensor; ///< [5.0.0+] ConsoleSixAxisSensor
|
||||
@ -1219,6 +1539,48 @@ NX_CONSTEXPR bool hidKeyboardStateGetKey(const HidKeyboardState *state, HidKeybo
|
||||
|
||||
///@}
|
||||
|
||||
///@name HomeButton
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Gets \ref HidHomeButtonState.
|
||||
* @note Home button shmem must be activated with \ref hidsysActivateHomeButton
|
||||
* @param[out] states Output array of \ref HidHomeButtonState.
|
||||
* @param[in] count Size of the states array in entries.
|
||||
* @return Total output entries.
|
||||
*/
|
||||
size_t hidGetHomeButtonStates(HidHomeButtonState *states, size_t count);
|
||||
|
||||
///@}
|
||||
|
||||
///@name SleepButton
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Gets \ref HidSleepButtonState.
|
||||
* @note Sleep button shmem must be activated with \ref hidsysActivateSleepButton
|
||||
* @param[out] states Output array of \ref HidSleepButtonState.
|
||||
* @param[in] count Size of the states array in entries.
|
||||
* @return Total output entries.
|
||||
*/
|
||||
size_t hidGetSleepButtonStates(HidSleepButtonState *states, size_t count);
|
||||
|
||||
///@}
|
||||
|
||||
///@name CaptureButton
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Gets \ref HidCaptureButtonState.
|
||||
* @note Capture button shmem must be activated with \ref hidsysActivateCaptureButton
|
||||
* @param[out] states Output array of \ref HidCaptureButtonState.
|
||||
* @param[in] count Size of the states array in entries.
|
||||
* @return Total output entries.
|
||||
*/
|
||||
size_t hidGetCaptureButtonStates(HidCaptureButtonState *states, size_t count);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Npad
|
||||
///@{
|
||||
|
||||
@ -1306,6 +1668,13 @@ u32 hidGetAppletFooterUiAttributesSet(HidNpadIdType id);
|
||||
*/
|
||||
HidAppletFooterUiType hidGetAppletFooterUiTypes(HidNpadIdType id);
|
||||
|
||||
/**
|
||||
* @brief Gets \ref HidNpadLagerType for the specified Npad.
|
||||
* @param[in] id \ref HidNpadIdType
|
||||
* @return \ref HidNpadLagerType
|
||||
*/
|
||||
HidNpadLagerType hidGetNpadLagerType(HidNpadIdType id);
|
||||
|
||||
/**
|
||||
* @brief Gets \ref HidNpadFullKeyState.
|
||||
* @param[out] states Output array of \ref HidNpadFullKeyState.
|
||||
@ -1386,6 +1755,14 @@ size_t hidGetNpadStatesHandheldLark(HidNpadIdType id, HidNpadHandheldLarkState *
|
||||
*/
|
||||
size_t hidGetNpadStatesLucia(HidNpadIdType id, HidNpadLuciaState *states, size_t count);
|
||||
|
||||
/**
|
||||
* @brief Gets \ref HidNpadLagerState.
|
||||
* @param[out] states Output array of \ref HidNpadLagerState.
|
||||
* @param[in] count Size of the states array in entries.
|
||||
* @return Total output entries.
|
||||
*/
|
||||
size_t hidGetNpadStatesLager(HidNpadIdType id, HidNpadLagerState *states, size_t count);
|
||||
|
||||
/**
|
||||
* @brief Gets \ref HidNpadSystemExtState.
|
||||
* @param[out] states Output array of \ref HidNpadSystemExtState.
|
||||
|
@ -402,8 +402,10 @@ Result hiddbgUnsetAllAutoPilotVirtualPadState(void);
|
||||
* @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);
|
||||
Result hiddbgAttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Exit Hdls, must be called at some point prior to \ref hiddbgExit.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file hidsys.h
|
||||
* @brief hid:sys service IPC wrapper.
|
||||
* @author exelix, yellows8
|
||||
* @author exelix, yellows8, ndeadly
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
@ -44,6 +44,15 @@ typedef enum {
|
||||
HidcfgAnalogStickRotation_Anticlockwise90 = 2, ///< Anticlockwise90
|
||||
} HidcfgAnalogStickRotation;
|
||||
|
||||
/// UniquePadType
|
||||
typedef enum {
|
||||
HidsysUniquePadType_Embedded = 0, ///< Embedded
|
||||
HidsysUniquePadType_FullKeyController = 1, ///< FullKeyController
|
||||
HidsysUniquePadType_RightController = 2, ///< RightController
|
||||
HidsysUniquePadType_LeftController = 3, ///< LeftController
|
||||
HidsysUniquePadType_DebugPadController = 4, ///< DebugPadController
|
||||
} HidsysUniquePadType;
|
||||
|
||||
/// UniquePadId for a controller.
|
||||
typedef struct {
|
||||
u64 id; ///< UniquePadId
|
||||
@ -246,6 +255,17 @@ Result hidsysAcquireCaptureButtonEventHandle(Event* out_event, bool autoclear);
|
||||
**/
|
||||
Result hidsysActivateCaptureButton(void);
|
||||
|
||||
/**
|
||||
* @brief Applies npad system common policy.
|
||||
*/
|
||||
Result hidsysApplyNpadSystemCommonPolicy(void);
|
||||
|
||||
/**
|
||||
* @brief Gets the npad id type of the last controller that was active.
|
||||
* @param[out] out of \ref HidNpadIdType.
|
||||
*/
|
||||
Result hidsysGetLastActiveNpad(u32 *out);
|
||||
|
||||
/**
|
||||
* @brief Gets the SupportedNpadStyleSet for the CallerApplet. applet must be initialized in order to use this (uses \ref appletGetAppletResourceUserIdOfCallerApplet).
|
||||
* @note Only available on [6.0.0+].
|
||||
@ -303,6 +323,57 @@ Result hidsysGetUniquePadsFromNpad(HidNpadIdType id, HidsysUniquePadId *unique_p
|
||||
**/
|
||||
Result hidsysEnableAppletToGetInput(bool enable);
|
||||
|
||||
/**
|
||||
* @brief EnableHandheldHids
|
||||
**/
|
||||
Result hidsysEnableHandheldHids(void);
|
||||
|
||||
/**
|
||||
* @brief DisableHandheldHids
|
||||
**/
|
||||
Result hidsysDisableHandheldHids(void);
|
||||
|
||||
/**
|
||||
* @brief SetJoyConRailEnabled
|
||||
* @note Only available on [9.0.0+].
|
||||
* @param[in] enable Input flag.
|
||||
**/
|
||||
Result hidsysSetJoyConRailEnabled(bool enable);
|
||||
|
||||
/**
|
||||
* @brief IsJoyConRailEnabled
|
||||
* @note Only available on [9.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
**/
|
||||
Result hidsysIsJoyConRailEnabled(bool *out);
|
||||
|
||||
/**
|
||||
* @brief IsHandheldHidsEnabled
|
||||
* @note Only available on [10.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
**/
|
||||
Result hidsysIsHandheldHidsEnabled(bool *out);
|
||||
|
||||
/**
|
||||
* @brief IsJoyConAttachedOnAllRail
|
||||
* @note Only available on [11.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
**/
|
||||
Result hidsysIsJoyConAttachedOnAllRail(bool *out);
|
||||
|
||||
/**
|
||||
* @brief IsInvertedControllerConnectedOnRail
|
||||
* @note Only available on [19.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
**/
|
||||
Result hidsysIsInvertedControllerConnectedOnRail(bool *out);
|
||||
|
||||
/**
|
||||
* @brief AcquireUniquePadConnectionEventHandle
|
||||
* @param[out] out_event Output Event.
|
||||
*/
|
||||
Result hidsysAcquireUniquePadConnectionEventHandle(Event *out_event);
|
||||
|
||||
/**
|
||||
* @brief Gets a list of all UniquePadIds.
|
||||
* @param[out] unique_pad_ids Output array of \ref HidsysUniquePadId.
|
||||
@ -311,6 +382,44 @@ Result hidsysEnableAppletToGetInput(bool enable);
|
||||
*/
|
||||
Result hidsysGetUniquePadIds(HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireJoyDetachOnBluetoothOffEventHandle
|
||||
* @param[out] out_event Output Event.
|
||||
* @param[in] Event autoclear.
|
||||
*/
|
||||
Result hidsysAcquireJoyDetachOnBluetoothOffEventHandle(Event *out_event, bool autoclear);
|
||||
|
||||
/**
|
||||
* @brief GetUniquePadBluetoothAddress
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] address \ref BtdrvAddress
|
||||
*/
|
||||
Result hidsysGetUniquePadBluetoothAddress(HidsysUniquePadId unique_pad_id, BtdrvAddress *address);
|
||||
|
||||
/**
|
||||
* @brief DisconnectUniquePad
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
*/
|
||||
Result hidsysDisconnectUniquePad(HidsysUniquePadId unique_pad_id);
|
||||
|
||||
/**
|
||||
* @brief GetUniquePadType
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] pad_type \ref HidsysUniquePadType
|
||||
*/
|
||||
Result hidsysGetUniquePadType(HidsysUniquePadId unique_pad_id, HidsysUniquePadType *pad_type);
|
||||
|
||||
/**
|
||||
* @brief GetUniquePadInterface
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] interface \ref HidNpadInterfaceType
|
||||
*/
|
||||
Result hidsysGetUniquePadInterface(HidsysUniquePadId unique_pad_id, HidNpadInterfaceType *interface);
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref HidsysUniquePadSerialNumber.
|
||||
* @note Only available on [5.0.0+].
|
||||
@ -319,6 +428,14 @@ Result hidsysGetUniquePadIds(HidsysUniquePadId *unique_pad_ids, s32 count, s32 *
|
||||
*/
|
||||
Result hidsysGetUniquePadSerialNumber(HidsysUniquePadId unique_pad_id, HidsysUniquePadSerialNumber *serial);
|
||||
|
||||
/**
|
||||
* @brief GetUniquePadControllerNumber
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] number Controller number.
|
||||
*/
|
||||
Result hidsysGetUniquePadControllerNumber(HidsysUniquePadId unique_pad_id, u64 *number);
|
||||
|
||||
/**
|
||||
* @brief Sets the HOME-button notification LED pattern, for the specified controller.
|
||||
* @note Generally this should only be used if \ref hidsysSetNotificationLedPatternWithTimeout is not usable.
|
||||
@ -359,6 +476,13 @@ Result hidsysEnableUsbFullKeyController(bool flag);
|
||||
*/
|
||||
Result hidsysIsUsbConnected(HidsysUniquePadId unique_pad_id, bool *out);
|
||||
|
||||
/**
|
||||
* @brief GetTouchScreenDefaultConfiguration
|
||||
* @note Only available on [9.0.0+].
|
||||
* @param[out] touch_screen_configuration \ref HidTouchScreenConfigurationForNx.
|
||||
*/
|
||||
Result hidsysGetTouchScreenDefaultConfiguration(HidTouchScreenConfigurationForNx *touch_screen_configuration);
|
||||
|
||||
/**
|
||||
* @brief IsFirmwareUpdateNeededForNotification
|
||||
* @note Only available on [9.0.0+].
|
||||
@ -369,7 +493,7 @@ Result hidsysIsFirmwareUpdateNeededForNotification(HidsysUniquePadId unique_pad_
|
||||
|
||||
/**
|
||||
* @brief Legacy IsButtonConfigSupported.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysIsButtonConfigSupported instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysIsButtonConfigSupported instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] out Output bool flag.
|
||||
*/
|
||||
@ -377,7 +501,7 @@ Result hidsysLegacyIsButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool
|
||||
|
||||
/**
|
||||
* @brief IsButtonConfigSupported
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigSupported instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigSupported instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[out] out Output bool flag.
|
||||
*/
|
||||
@ -385,34 +509,34 @@ Result hidsysIsButtonConfigSupported(BtdrvAddress addr, bool *out);
|
||||
|
||||
/**
|
||||
* @brief IsButtonConfigEmbeddedSupported
|
||||
* @note Only available on [11.0.0+].
|
||||
* @note Only available on [11.0.0-17.0.1].
|
||||
* @param[out] out Output bool flag.
|
||||
*/
|
||||
Result hidsysIsButtonConfigEmbeddedSupported(bool *out);
|
||||
|
||||
/**
|
||||
* @brief Legacy DeleteButtonConfig.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysDeleteButtonConfig instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysDeleteButtonConfig instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
*/
|
||||
Result hidsysLegacyDeleteButtonConfig(HidsysUniquePadId unique_pad_id);
|
||||
|
||||
/**
|
||||
* @brief DeleteButtonConfig
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacyDeleteButtonConfig instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyDeleteButtonConfig instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result hidsysDeleteButtonConfig(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief DeleteButtonConfigEmbedded
|
||||
* @note Only available on [11.0.0+].
|
||||
* @note Only available on [11.0.0-17.0.1].
|
||||
*/
|
||||
Result hidsysDeleteButtonConfigEmbedded(void);
|
||||
|
||||
/**
|
||||
* @brief Legacy SetButtonConfigEnabled.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysSetButtonConfigEnabled instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigEnabled instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[in] flag Input flag.
|
||||
*/
|
||||
@ -420,7 +544,7 @@ Result hidsysLegacySetButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool
|
||||
|
||||
/**
|
||||
* @brief SetButtonConfigEnabled
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEnabled instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEnabled instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] flag Input flag.
|
||||
*/
|
||||
@ -428,14 +552,14 @@ Result hidsysSetButtonConfigEnabled(BtdrvAddress addr, bool flag);
|
||||
|
||||
/**
|
||||
* @brief SetButtonConfigEmbeddedEnabled
|
||||
* @note Only available on [11.0.0+].
|
||||
* @note Only available on [11.0.0-17.0.1].
|
||||
* @param[in] flag Input flag.
|
||||
*/
|
||||
Result hidsysSetButtonConfigEmbeddedEnabled(bool flag);
|
||||
|
||||
/**
|
||||
* @brief Legacy IsButtonConfigEnabled.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysIsButtonConfigEnabled instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysIsButtonConfigEnabled instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] out Output bool flag.
|
||||
*/
|
||||
@ -443,7 +567,7 @@ Result hidsysLegacyIsButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool *
|
||||
|
||||
/**
|
||||
* @brief IsButtonConfigEnabled
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigEnabled instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigEnabled instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] out Output bool flag.
|
||||
*/
|
||||
@ -451,14 +575,14 @@ Result hidsysIsButtonConfigEnabled(BtdrvAddress addr, bool *out);
|
||||
|
||||
/**
|
||||
* @brief IsButtonConfigEmbeddedEnabled
|
||||
* @note Only available on [11.0.0+].
|
||||
* @note Only available on [11.0.0-17.0.1].
|
||||
* @param[out] out Output bool flag.
|
||||
*/
|
||||
Result hidsysIsButtonConfigEmbeddedEnabled(bool *out);
|
||||
|
||||
/**
|
||||
* @brief Legacy SetButtonConfigEmbedded.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysSetButtonConfigEmbedded instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigEmbedded instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[in] config \ref HidsysButtonConfigEmbedded
|
||||
*/
|
||||
@ -466,14 +590,14 @@ Result hidsysLegacySetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, cons
|
||||
|
||||
/**
|
||||
* @brief SetButtonConfigEmbedded
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEmbedded instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEmbedded instead.
|
||||
* @param[in] config \ref HidsysButtonConfigEmbedded
|
||||
*/
|
||||
Result hidsysSetButtonConfigEmbedded(const HidsysButtonConfigEmbedded *config);
|
||||
|
||||
/**
|
||||
* @brief Legacy SetButtonConfigFull.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysSetButtonConfigFull instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigFull instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[in] config \ref HidsysButtonConfigFull
|
||||
*/
|
||||
@ -481,7 +605,7 @@ Result hidsysLegacySetButtonConfigFull(HidsysUniquePadId unique_pad_id, const Hi
|
||||
|
||||
/**
|
||||
* @brief SetButtonConfigFull
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigFull instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigFull instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] config \ref HidsysButtonConfigFull
|
||||
*/
|
||||
@ -489,7 +613,7 @@ Result hidsysSetButtonConfigFull(BtdrvAddress addr, const HidsysButtonConfigFull
|
||||
|
||||
/**
|
||||
* @brief Legacy SetButtonConfigLeft.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysSetButtonConfigLeft instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigLeft instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[in] config \ref HidsysButtonConfigLeft
|
||||
*/
|
||||
@ -497,7 +621,7 @@ Result hidsysLegacySetButtonConfigLeft(HidsysUniquePadId unique_pad_id, const Hi
|
||||
|
||||
/**
|
||||
* @brief SetButtonConfigLeft
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigLeft instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigLeft instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] config \ref HidsysButtonConfigLeft
|
||||
*/
|
||||
@ -505,7 +629,7 @@ Result hidsysSetButtonConfigLeft(BtdrvAddress addr, const HidsysButtonConfigLeft
|
||||
|
||||
/**
|
||||
* @brief Legacy SetButtonConfigRight.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysSetButtonConfigRight instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigRight instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[in] config \ref HidsysButtonConfigRight
|
||||
*/
|
||||
@ -513,7 +637,7 @@ Result hidsysLegacySetButtonConfigRight(HidsysUniquePadId unique_pad_id, const H
|
||||
|
||||
/**
|
||||
* @brief SetButtonConfigRight
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigRight instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigRight instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] config \ref HidsysButtonConfigRight
|
||||
*/
|
||||
@ -521,7 +645,7 @@ Result hidsysSetButtonConfigRight(BtdrvAddress addr, const HidsysButtonConfigRig
|
||||
|
||||
/**
|
||||
* @brief Legacy GetButtonConfigEmbedded.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysGetButtonConfigEmbedded instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigEmbedded instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] config \ref HidsysButtonConfigEmbedded
|
||||
*/
|
||||
@ -529,14 +653,14 @@ Result hidsysLegacyGetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, Hids
|
||||
|
||||
/**
|
||||
* @brief GetButtonConfigEmbedded
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigEmbedded instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigEmbedded instead.
|
||||
* @param[out] config \ref HidsysButtonConfigEmbedded
|
||||
*/
|
||||
Result hidsysGetButtonConfigEmbedded(HidsysButtonConfigEmbedded *config);
|
||||
|
||||
/**
|
||||
* @brief Legacy GetButtonConfigFull.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysGetButtonConfigFull instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigFull instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] config \ref HidsysButtonConfigFull
|
||||
*/
|
||||
@ -544,7 +668,7 @@ Result hidsysLegacyGetButtonConfigFull(HidsysUniquePadId unique_pad_id, HidsysBu
|
||||
|
||||
/**
|
||||
* @brief GetButtonConfigFull
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigFull instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigFull instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[out] config \ref HidsysButtonConfigFull
|
||||
*/
|
||||
@ -552,7 +676,7 @@ Result hidsysGetButtonConfigFull(BtdrvAddress addr, HidsysButtonConfigFull *conf
|
||||
|
||||
/**
|
||||
* @brief Legacy GetButtonConfigLeft.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysGetButtonConfigLeft instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigLeft instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] config \ref HidsysButtonConfigLeft
|
||||
*/
|
||||
@ -560,7 +684,7 @@ Result hidsysLegacyGetButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidsysBu
|
||||
|
||||
/**
|
||||
* @brief GetButtonConfigLeft
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigLeft instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigLeft instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[out] config \ref HidsysButtonConfigLeft
|
||||
*/
|
||||
@ -568,7 +692,7 @@ Result hidsysGetButtonConfigLeft(BtdrvAddress addr, HidsysButtonConfigLeft *conf
|
||||
|
||||
/**
|
||||
* @brief Legacy GetButtonConfigRight.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0+], use \ref hidsysGetButtonConfigRight instead.
|
||||
* @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigRight instead.
|
||||
* @param[in] unique_pad_id \ref HidsysUniquePadId
|
||||
* @param[out] config \ref HidsysButtonConfigRight
|
||||
*/
|
||||
@ -576,7 +700,7 @@ Result hidsysLegacyGetButtonConfigRight(HidsysUniquePadId unique_pad_id, HidsysB
|
||||
|
||||
/**
|
||||
* @brief GetButtonConfigRight
|
||||
* @note Only available on [11.0.0+]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigRight instead.
|
||||
* @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigRight instead.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[out] config \ref HidsysButtonConfigRight
|
||||
*/
|
||||
@ -910,4 +1034,3 @@ Result hidsysSetButtonConfigStorageLeft(s32 index, const HidcfgButtonConfigLeft
|
||||
* @param[in] name \ref HidcfgStorageName
|
||||
*/
|
||||
Result hidsysSetButtonConfigStorageRight(s32 index, const HidcfgButtonConfigRight *config, const HidcfgStorageName *name);
|
||||
|
||||
|
@ -67,6 +67,12 @@ typedef enum {
|
||||
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
|
||||
@ -331,6 +337,13 @@ Result ldnScanPrivate(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *
|
||||
*/
|
||||
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).
|
||||
* @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.
|
||||
|
@ -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,8 +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+]
|
||||
|
@ -113,6 +113,27 @@ typedef struct {
|
||||
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);
|
||||
|
||||
|
@ -20,7 +20,7 @@ typedef struct {
|
||||
MiiCreateId create_id; ///< Mii's create ID.
|
||||
u32 unk;
|
||||
u16 mii_name[10+1]; ///< utf-16be, null-terminated
|
||||
} PACKED MiiimgImageAttribute;
|
||||
} NX_PACKED MiiimgImageAttribute;
|
||||
|
||||
/// Initialize miiimg.
|
||||
Result miiimgInitialize(void);
|
||||
|
@ -50,6 +50,7 @@ Result ncmInactivateContentStorage(NcmStorageId storage_id); ///< [2.0.0+]
|
||||
Result ncmActivateContentMetaDatabase(NcmStorageId storage_id); ///< [2.0.0+]
|
||||
Result ncmInactivateContentMetaDatabase(NcmStorageId storage_id); ///< [2.0.0+]
|
||||
Result ncmInvalidateRightsIdCache(void); ///< [9.0.0+]
|
||||
Result ncmActivateFsContentStorage(FsContentStorageId fs_storage_id); ///< [16.0.0+]
|
||||
|
||||
void ncmContentStorageClose(NcmContentStorage* cs);
|
||||
Result ncmContentStorageGeneratePlaceHolderId(NcmContentStorage* cs, NcmPlaceHolderId* out_id);
|
||||
@ -71,17 +72,18 @@ Result ncmContentStorageDisableForcibly(NcmContentStorage* cs);
|
||||
Result ncmContentStorageRevertToPlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, const NcmContentId* old_content_id, const NcmContentId* new_content_id); ///< [2.0.0+]
|
||||
Result ncmContentStorageSetPlaceHolderSize(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, s64 size); ///< [2.0.0+]
|
||||
Result ncmContentStorageReadContentIdFile(NcmContentStorage* cs, void* out_data, size_t out_data_size, const NcmContentId* content_id, s64 offset); ///< [2.0.0+]
|
||||
Result ncmContentStorageGetRightsIdFromPlaceHolderId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id); ///< [2.0.0+]
|
||||
Result ncmContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmContentId* content_id); ///< [2.0.0+]
|
||||
Result ncmContentStorageGetRightsIdFromPlaceHolderId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, FsContentAttributes attr); ///< [2.0.0+]
|
||||
Result ncmContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmContentId* content_id, FsContentAttributes attr); ///< [2.0.0+]
|
||||
Result ncmContentStorageWriteContentForDebug(NcmContentStorage* cs, const NcmContentId* content_id, s64 offset, const void* data, size_t data_size); ///< [2.0.0+]
|
||||
Result ncmContentStorageGetFreeSpaceSize(NcmContentStorage* cs, s64* out_size); ///< [2.0.0+]
|
||||
Result ncmContentStorageGetTotalSpaceSize(NcmContentStorage* cs, s64* out_size); ///< [2.0.0+]
|
||||
Result ncmContentStorageFlushPlaceHolder(NcmContentStorage* cs); ///< [3.0.0+]
|
||||
Result ncmContentStorageGetSizeFromPlaceHolderId(NcmContentStorage* cs, s64* out_size, const NcmPlaceHolderId* placeholder_id); ///< [4.0.0+]
|
||||
Result ncmContentStorageRepairInvalidFileAttribute(NcmContentStorage* cs); ///< [4.0.0+]
|
||||
Result ncmContentStorageGetRightsIdFromPlaceHolderIdWithCache(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, const NcmContentId* cache_content_id); ///< [8.0.0+]
|
||||
Result ncmContentStorageGetRightsIdFromPlaceHolderIdWithCache(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, const NcmContentId* cache_content_id, FsContentAttributes attr); ///< [8.0.0+]
|
||||
Result ncmContentStorageRegisterPath(NcmContentStorage* cs, const NcmContentId* content_id, const char *path); ///< [13.0.0+]
|
||||
Result ncmContentStorageClearRegisteredPath(NcmContentStorage* cs); ///< [13.0.0+]
|
||||
Result ncmContentStorageGetProgramId(NcmContentStorage* cs, u64* out, const NcmContentId* content_id, FsContentAttributes attr); ///< [17.0.0+]
|
||||
|
||||
void ncmContentMetaDatabaseClose(NcmContentMetaDatabase* db);
|
||||
Result ncmContentMetaDatabaseSet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, const void* data, u64 data_size);
|
||||
@ -96,7 +98,7 @@ Result ncmContentMetaDatabaseHas(NcmContentMetaDatabase* db, bool* out, const Nc
|
||||
Result ncmContentMetaDatabaseHasAll(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* keys, s32 count);
|
||||
Result ncmContentMetaDatabaseGetSize(NcmContentMetaDatabase* db, u64* out_size, const NcmContentMetaKey* key);
|
||||
Result ncmContentMetaDatabaseGetRequiredSystemVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key);
|
||||
Result ncmContentMetaDatabaseGetPatchId(NcmContentMetaDatabase* db, u64* out_patch_id, const NcmContentMetaKey* key);
|
||||
Result ncmContentMetaDatabaseGetPatchContentMetaId(NcmContentMetaDatabase* db, u64* out_patch_id, const NcmContentMetaKey* key);
|
||||
Result ncmContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db);
|
||||
Result ncmContentMetaDatabaseLookupOrphanContent(NcmContentMetaDatabase* db, bool* out_orphaned, const NcmContentId* content_ids, s32 count);
|
||||
Result ncmContentMetaDatabaseCommit(NcmContentMetaDatabase* db);
|
||||
@ -105,3 +107,4 @@ Result ncmContentMetaDatabaseListContentMetaInfo(NcmContentMetaDatabase* db, s32
|
||||
Result ncmContentMetaDatabaseGetAttributes(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u8* out);
|
||||
Result ncmContentMetaDatabaseGetRequiredApplicationVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key); ///< [2.0.0+]
|
||||
Result ncmContentMetaDatabaseGetContentIdByTypeAndIdOffset(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type, u8 id_offset); ///< [5.0.0+]
|
||||
Result ncmContentMetaDatabaseGetPlatform(NcmContentMetaDatabase* db, u8* out, const NcmContentMetaKey* key); ///< [17.0.0+]
|
||||
|
@ -42,6 +42,7 @@ typedef enum {
|
||||
NcmContentMetaType_Patch = 0x81, ///< Patch
|
||||
NcmContentMetaType_AddOnContent = 0x82, ///< AddOnContent
|
||||
NcmContentMetaType_Delta = 0x83, ///< Delta
|
||||
NcmContentMetaType_DataPatch = 0x84, ///< DataPatch
|
||||
} NcmContentMetaType;
|
||||
|
||||
/// ContentMetaAttribute
|
||||
@ -49,6 +50,7 @@ typedef enum {
|
||||
NcmContentMetaAttribute_None = 0, ///< None
|
||||
NcmContentMetaAttribute_IncludesExFatDriver = BIT(0), ///< IncludesExFatDriver
|
||||
NcmContentMetaAttribute_Rebootless = BIT(1), ///< Rebootless
|
||||
NcmContentMetaAttribute_Compacted = BIT(2), ///< Compacted
|
||||
} NcmContentMetaAttribute;
|
||||
|
||||
/// ContentInstallType
|
||||
@ -58,14 +60,19 @@ typedef enum {
|
||||
NcmContentInstallType_Unknown = 7, ///< Unknown
|
||||
} NcmContentInstallType;
|
||||
|
||||
/// ContentMetaPlatform
|
||||
typedef enum {
|
||||
NcmContentMetaPlatform_Nx = 0, ///< Nx
|
||||
} NcmContentMetaPlatform;
|
||||
|
||||
/// ContentId
|
||||
typedef struct {
|
||||
alignas(4) u8 c[0x10]; ///< Id
|
||||
u8 c[0x10]; ///< Id
|
||||
} NcmContentId;
|
||||
|
||||
/// PlaceHolderId
|
||||
typedef struct {
|
||||
alignas(8) Uuid uuid; ///< UUID
|
||||
Uuid uuid; ///< UUID
|
||||
} NcmPlaceHolderId;
|
||||
|
||||
/// ContentMetaKey
|
||||
@ -86,7 +93,9 @@ typedef struct {
|
||||
/// ContentInfo
|
||||
typedef struct {
|
||||
NcmContentId content_id; ///< \ref NcmContentId
|
||||
u8 size[0x6]; ///< Content size.
|
||||
u32 size_low; ///< Content size (low).
|
||||
u8 size_high; ///< Content size (high).
|
||||
u8 attr; ///< Content attributes.
|
||||
u8 content_type; ///< \ref NcmContentType.
|
||||
u8 id_offset; ///< Offset of this content. Unused by most applications.
|
||||
} NcmContentInfo;
|
||||
@ -130,12 +139,30 @@ typedef struct {
|
||||
u8 reserved[0x8]; ///< Unused.
|
||||
} NcmPatchMetaExtendedHeader;
|
||||
|
||||
/// AddOnContentMetaExtendedHeader
|
||||
/// AddOnContentMetaExtendedHeader [15.0.0+]
|
||||
typedef struct {
|
||||
u64 application_id; ///< ApplicationId of this add-on-content's corresponding application.
|
||||
u32 required_application_version; ///< Version of the application required by this add-on-content.
|
||||
u8 content_accessibilities; ///< Content accessibilities.
|
||||
u8 padding[3]; ///< Padding.
|
||||
u64 data_patch_id; ///< DataPatchId of this add-on-content's corresponding data patch.
|
||||
} NcmAddOnContentMetaExtendedHeader;
|
||||
|
||||
/// LegacyAddOnContentMetaExtendedHeader [1.0.0-14.1.2]
|
||||
typedef struct {
|
||||
u64 application_id; ///< ApplicationId of this add-on-content's corresponding application.
|
||||
u32 required_application_version; ///< Version of the application required by this add-on-content.
|
||||
u32 padding; ///< Padding.
|
||||
} NcmAddOnContentMetaExtendedHeader;
|
||||
} NcmLegacyAddOnContentMetaExtendedHeader;
|
||||
|
||||
/// DataPatchMetaExtendedHeader
|
||||
typedef struct {
|
||||
u64 data_id; ///< DataId of this data patch's corresponding add-on-content.
|
||||
u64 application_id; ///< ApplicationId of this data patch's add-on-content's corresponding application.
|
||||
u32 required_application_version; ///< Version of the application required by this data patch.
|
||||
u32 extended_data_size; ///< Size of the extended data following the NcmContentInfos.
|
||||
u64 padding; ///< Padding.
|
||||
} NcmDataPatchMetaExtendedHeader;
|
||||
|
||||
/// SystemUpdateMetaExtendedHeader
|
||||
typedef struct {
|
||||
@ -148,3 +175,22 @@ typedef struct {
|
||||
u8 storageID; ///< \ref NcmStorageId
|
||||
u8 pad[7]; ///< Padding
|
||||
} NcmProgramLocation;
|
||||
|
||||
/**
|
||||
* @brief Retrieves the content size from a \ref NcmContentInfo struct.
|
||||
* @param[in] info Pointer to \ref NcmContentInfo struct.
|
||||
* @param[out] out Output size.
|
||||
*/
|
||||
NX_CONSTEXPR void ncmContentInfoSizeToU64(const NcmContentInfo *info, u64 *out) {
|
||||
*out = ((u64)info->size_high << 32) | info->size_low;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Updates the content size from a \ref NcmContentInfo struct.
|
||||
* @param[in] size Input size.
|
||||
* @param[out] out Pointer to \ref NcmContentInfo struct.
|
||||
*/
|
||||
NX_CONSTEXPR void ncmU64ToContentInfoSize(const u64 size, NcmContentInfo *info) {
|
||||
info->size_low = size & 0xFFFFFFFF;
|
||||
info->size_high = (u8)(size >> 32);
|
||||
}
|
||||
|
@ -24,9 +24,9 @@ typedef enum {
|
||||
} NfcServiceType;
|
||||
|
||||
typedef enum {
|
||||
NfpState_NonInitialized = 0,
|
||||
NfpState_Initialized = 1,
|
||||
} NfpState;
|
||||
NfcState_NonInitialized = 0,
|
||||
NfcState_Initialized = 1,
|
||||
} NfcState;
|
||||
|
||||
typedef enum {
|
||||
NfpDeviceState_Initialized = 0,
|
||||
@ -35,51 +35,218 @@ typedef enum {
|
||||
NfpDeviceState_TagRemoved = 3,
|
||||
NfpDeviceState_TagMounted = 4,
|
||||
NfpDeviceState_Unavailable = 5,
|
||||
NfpDeviceState_Finalized = 6,
|
||||
} NfpDeviceState;
|
||||
|
||||
typedef enum {
|
||||
NfcDeviceState_Initialized = 0,
|
||||
NfcDeviceState_SearchingForTag = 1,
|
||||
NfcDeviceState_TagFound = 2,
|
||||
NfcDeviceState_TagRemoved = 3,
|
||||
NfcDeviceState_TagMounted = 4,
|
||||
} NfcDeviceState;
|
||||
|
||||
typedef enum {
|
||||
NfcMifareDeviceState_Initialized = 0,
|
||||
NfcMifareDeviceState_SearchingForTag = 1,
|
||||
NfcMifareDeviceState_TagFound = 2,
|
||||
NfcMifareDeviceState_TagRemoved = 3,
|
||||
NfcMifareDeviceState_TagMounted = 4,
|
||||
NfcMifareDeviceState_Unavailable = 5,
|
||||
} NfcMifareDeviceState;
|
||||
|
||||
typedef enum {
|
||||
NfpApplicationAreaVersion_3DS = 0, ///< Application area created by a 3DS game.
|
||||
NfpApplicationAreaVersion_WiiU = 1, ///< Application area created by a Wii U game.
|
||||
NfpApplicationAreaVersion_3DSv2 = 2, ///< Application area created by a (new?) 3DS game.
|
||||
NfpApplicationAreaVersion_Switch = 3, ///< Application area created by a Switch game.
|
||||
NfpApplicationAreaVersion_Invalid = 0xFF, ///< Invalid value (application area not created).
|
||||
} NfpApplicationAreaVersion;
|
||||
|
||||
typedef enum {
|
||||
NfpDeviceType_Amiibo = 0,
|
||||
} NfpDeviceType;
|
||||
|
||||
typedef enum {
|
||||
NfpMountTarget_Rom = 1,
|
||||
NfpMountTarget_Ram = 2,
|
||||
NfpMountTarget_All = 3,
|
||||
NfpMountTarget_Rom = BIT(0),
|
||||
NfpMountTarget_Ram = BIT(1),
|
||||
NfpMountTarget_All = NfpMountTarget_Rom | NfpMountTarget_Ram,
|
||||
} NfpMountTarget;
|
||||
|
||||
typedef struct {
|
||||
u8 uuid[10];
|
||||
u8 uuid_length;
|
||||
u8 reserved1[0x15];
|
||||
u32 protocol;
|
||||
u32 tag_type;
|
||||
u8 reserved2[0x30];
|
||||
} PACKED NfpTagInfo;
|
||||
typedef enum {
|
||||
NfcProtocol_None = 0,
|
||||
NfcProtocol_TypeA = BIT(0), ///< ISO14443A
|
||||
NfcProtocol_TypeB = BIT(1), ///< ISO14443B
|
||||
NfcProtocol_TypeF = BIT(2), ///< Sony FeliCa
|
||||
NfcProtocol_All = 0xFFFFFFFF,
|
||||
} NfcProtocol;
|
||||
|
||||
typedef enum {
|
||||
NfcTagType_None = 0,
|
||||
NfcTagType_Type1 = BIT(0), ///< ISO14443A RW. Topaz
|
||||
NfcTagType_Type2 = BIT(1), ///< ISO14443A RW. Ultralight, NTAGX, ST25TN
|
||||
NfcTagType_Type3 = BIT(2), ///< ISO14443A RW/RO. Sony FeliCa
|
||||
NfcTagType_Type4A = BIT(3), ///< ISO14443A RW/RO. DESFire
|
||||
NfcTagType_Type4B = BIT(4), ///< ISO14443B RW/RO. DESFire
|
||||
NfcTagType_Type5 = BIT(5), ///< ISO15693 RW/RO. SLI, SLIX, ST25TV
|
||||
NfcTagType_Mifare = BIT(6), ///< Mifare clasic. Skylanders
|
||||
NfcTagType_All = 0xFFFFFFFF,
|
||||
} NfcTagType;
|
||||
|
||||
typedef enum {
|
||||
NfcMifareCommand_Read = 0x30,
|
||||
NfcMifareCommand_AuthA = 0x60,
|
||||
NfcMifareCommand_AuthB = 0x61,
|
||||
NfcMifareCommand_Write = 0xA0,
|
||||
NfcMifareCommand_Transfer = 0xB0,
|
||||
NfcMifareCommand_Decrement = 0xC0,
|
||||
NfcMifareCommand_Increment = 0xC1,
|
||||
NfcMifareCommand_Store = 0xC2,
|
||||
} NfcMifareCommand;
|
||||
|
||||
typedef enum {
|
||||
NfpAmiiboFlag_Valid = BIT(0), ///< Initialized in system settings.
|
||||
NfpAmiiboFlag_ApplicationAreaExists = BIT(1), ///< Application area exists.
|
||||
} NfpAmiiboFlag;
|
||||
|
||||
typedef enum {
|
||||
NfpBreakType_Flush = 0,
|
||||
NfpBreakType_Break1 = 1,
|
||||
NfpBreakType_Break2 = 2,
|
||||
} NfpBreakType;
|
||||
|
||||
typedef struct {
|
||||
u16 last_write_year;
|
||||
u8 last_write_month;
|
||||
u8 last_write_day;
|
||||
u16 year;
|
||||
u8 month;
|
||||
u8 day;
|
||||
} NfpDate;
|
||||
|
||||
typedef struct {
|
||||
u8 uid[10]; ///< UUID.
|
||||
u8 uid_length; ///< UUID length.
|
||||
u8 reserved[0x15];
|
||||
} NfcTagUid;
|
||||
|
||||
typedef struct {
|
||||
NfcTagUid uid; ///< UUID.
|
||||
u32 protocol; ///< \ref NfcProtocol
|
||||
u32 tag_type; ///< \ref NfcTagType
|
||||
u8 reserved[0x30];
|
||||
} NfpTagInfo;
|
||||
|
||||
typedef struct {
|
||||
NfcTagUid uid; ///< UUID.
|
||||
u32 protocol; ///< \ref NfcProtocol
|
||||
u32 tag_type; ///< \ref NfcTagType
|
||||
u8 reserved[0x30];
|
||||
} NfcTagInfo;
|
||||
|
||||
typedef struct {
|
||||
NfpDate last_write_date;
|
||||
u16 write_counter;
|
||||
u16 version;
|
||||
u32 application_area_size;
|
||||
u8 reserved[0x34];
|
||||
} PACKED NfpCommonInfo;
|
||||
} NfpCommonInfo;
|
||||
|
||||
typedef struct {
|
||||
u8 amiibo_id[0x8];
|
||||
u8 reserved[0x38];
|
||||
} PACKED NfpModelInfo;
|
||||
union {
|
||||
u8 character_id[3];
|
||||
struct {
|
||||
u16 game_character_id;
|
||||
u8 character_variant;
|
||||
} NX_PACKED;
|
||||
};
|
||||
u8 series_id; ///< Series.
|
||||
u16 numbering_id; ///< Model number.
|
||||
u8 nfp_type; ///< Figure type.
|
||||
u8 reserved[0x39];
|
||||
} NfpModelInfo;
|
||||
|
||||
typedef struct {
|
||||
MiiCharInfo mii;
|
||||
u16 first_write_year;
|
||||
u8 first_write_month;
|
||||
u8 first_write_day;
|
||||
char amiibo_name[10+1]; ///< utf-8, null-terminated
|
||||
u8 reserved[0x99];
|
||||
} PACKED NfpRegisterInfo;
|
||||
NfpDate first_write_date;
|
||||
char amiibo_name[(10*4)+1]; ///< Amiibo name (utf-8, null-terminated).
|
||||
u8 font_region;
|
||||
u8 reserved[0x7A];
|
||||
} NfpRegisterInfo;
|
||||
|
||||
typedef struct {
|
||||
MiiStoreData mii_store_data;
|
||||
NfpDate first_write_date;
|
||||
char amiibo_name[(10*4)+1]; ///< Amiibo name (utf-8, null-terminated).
|
||||
u8 font_region;
|
||||
u8 reserved[0x8E];
|
||||
} NfpRegisterInfoPrivate;
|
||||
|
||||
typedef struct {
|
||||
u64 application_id;
|
||||
u32 access_id;
|
||||
u16 crc32_change_counter;
|
||||
u8 flags;
|
||||
u8 tag_type;
|
||||
u8 application_area_version;
|
||||
u8 reserved[0x2F];
|
||||
} NfpAdminInfo;
|
||||
|
||||
typedef struct {
|
||||
u8 tag_magic; ///< Tag magic (always 0xA5: https://www.3dbrew.org/wiki/Amiibo#Page_layout).
|
||||
u8 reserved1[0x1];
|
||||
u16 tag_write_counter; ///< Incremented every tag write.
|
||||
u32 crc32_1; ///< CRC32 of some internal 8-byte data.
|
||||
u8 reserved2[0x38];
|
||||
NfpDate last_write_date; ///< Updated every write.
|
||||
u16 write_counter; ///< Incremented every write, until it maxes out at 0xFFFF.
|
||||
u16 version; ///< Version.
|
||||
u32 application_area_size; ///< Size of the application area.
|
||||
u8 reserved3[0x34];
|
||||
MiiVer3StoreData mii_v3; ///< Ver3StoreData (Mii format used in 3DS).
|
||||
u8 pad[0x2];
|
||||
u16 mii_v3_crc16; ///< CRC16 of Ver3StoreData.
|
||||
MiiNfpStoreDataExtension mii_store_data_extension; ///< StoreDataExtension
|
||||
NfpDate first_write_date; ///< Set when the amiibo is first written to.
|
||||
u16 amiibo_name[10+1]; ///< Amiibo name (utf-16, null-terminated).
|
||||
u8 font_region; ///< Font region.
|
||||
u8 unknown1; ///< Normally zero
|
||||
u32 crc32_2; ///< CRC32 of Ver3StoreData + application_id_byte + unknown1 + StoreDataExtension + unknown2 (0x7E bytes total)
|
||||
u32 unknown2[0x5]; ///< Normally zero
|
||||
u8 reserved4[0x64];
|
||||
u64 application_id; ///< Modified application ID (Application ID & 0xFFFFFFFF0FFFFFFF | 0x30000000)
|
||||
u32 access_id; ///< Application area access ID
|
||||
u16 settings_crc32_change_counter;
|
||||
u8 flags; ///< \ref NfpAmiiboFlag
|
||||
u8 tag_type; ///< \ref NfcTagType
|
||||
u8 application_area_version; ///< \ref NfpApplicationAreaVersion
|
||||
u8 application_id_byte; ///< Application ID byte ((Application ID >> 28) & 0xFF)
|
||||
u8 reserved5[0x2E];
|
||||
u8 application_area[0xD8]; ///< Application area.
|
||||
} NfpData;
|
||||
|
||||
typedef struct {
|
||||
u8 mifare_command;
|
||||
u8 unknown; ///< Usually 1
|
||||
u8 reserved1[0x6];
|
||||
u8 sector_key[0x6];
|
||||
u8 reserved2[0x2];
|
||||
} NX_PACKED NfcSectorKey;
|
||||
|
||||
typedef struct {
|
||||
u8 sector_number;
|
||||
u8 reserved[0x7];
|
||||
NfcSectorKey sector_key;
|
||||
} NX_PACKED NfcMifareReadBlockParameter;
|
||||
|
||||
typedef struct {
|
||||
u8 data[0x10];
|
||||
u8 sector_number;
|
||||
u8 reserved[0x7];
|
||||
} NX_PACKED NfcMifareReadBlockData;
|
||||
|
||||
typedef struct {
|
||||
u8 data[0x10];
|
||||
u8 sector_number;
|
||||
u8 reserved[0x7];
|
||||
NfcSectorKey sector_key;
|
||||
} NfcMifareWriteBlockParameter;
|
||||
|
||||
typedef struct {
|
||||
u64 version;
|
||||
@ -103,6 +270,12 @@ Result nfcInitialize(NfcServiceType service_type);
|
||||
/// Exit nfc:*.
|
||||
void nfcExit(void);
|
||||
|
||||
/// Initialize nfc:mf:u.
|
||||
Result nfcMfInitialize();
|
||||
|
||||
/// Exit nfc:mf:u.
|
||||
void nfcMfExit(void);
|
||||
|
||||
/// Gets the Service object for the actual nfp:* service session.
|
||||
Service* nfpGetServiceSession(void);
|
||||
|
||||
@ -115,43 +288,179 @@ Service* nfcGetServiceSession(void);
|
||||
/// Gets the Service object for the interface from nfc:*.
|
||||
Service* nfcGetServiceSession_Interface(void);
|
||||
|
||||
/// Gets the Service object for the actual nfc:mf:u service session.
|
||||
Service* nfcMfGetServiceSession(void);
|
||||
|
||||
/// Gets the Service object for the interface from nfc:mf:u.
|
||||
Service* nfcMfGetServiceSession_Interface(void);
|
||||
|
||||
Result nfpListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count);
|
||||
Result nfpStartDetection(const NfcDeviceHandle *handle);
|
||||
Result nfpStopDetection(const NfcDeviceHandle *handle);
|
||||
Result nfpMount(const NfcDeviceHandle *handle, NfpDeviceType device_type, NfpMountTarget mount_target);
|
||||
Result nfpUnmount(const NfcDeviceHandle *handle);
|
||||
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count);
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcStartDetection(const NfcDeviceHandle *handle, NfcProtocol protocol);
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcStopDetection(const NfcDeviceHandle *handle);
|
||||
|
||||
Result nfcMfListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count);
|
||||
Result nfcMfStartDetection(const NfcDeviceHandle *handle);
|
||||
Result nfcMfStopDetection(const NfcDeviceHandle *handle);
|
||||
|
||||
/// Not available with ::NfpServiceType_System.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpOpenApplicationArea(const NfcDeviceHandle *handle, u32 app_id);
|
||||
|
||||
/// Not available with ::NfpServiceType_System.
|
||||
Result nfpGetApplicationArea(const NfcDeviceHandle *handle, void* buf, size_t buf_size);
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened.
|
||||
Result nfpGetApplicationArea(const NfcDeviceHandle *handle, void* buf, size_t buf_size, u32 *out_size);
|
||||
|
||||
/// Not available with ::NfpServiceType_System.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened.
|
||||
Result nfpSetApplicationArea(const NfcDeviceHandle *handle, const void* buf, size_t buf_size);
|
||||
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpFlush(const NfcDeviceHandle *handle);
|
||||
|
||||
Result nfpRestore(const NfcDeviceHandle *handle);
|
||||
|
||||
/// Not available with ::NfpServiceType_System.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpCreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size);
|
||||
|
||||
/// Not available with ::NfpServiceType_System.
|
||||
/// Only available with [3.0.0+].
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened.
|
||||
Result nfpRecreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size);
|
||||
|
||||
/// Not available with ::NfpServiceType_System.
|
||||
Result nfpGetApplicationAreaSize(const NfcDeviceHandle *handle, u32 *out_app_area_size);
|
||||
|
||||
/// Not available with ::NfpServiceType_User.
|
||||
Result nfpDeleteApplicationArea(const NfcDeviceHandle *handle);
|
||||
|
||||
/// Not available with ::NfpServiceType_User.
|
||||
Result nfpExistsApplicationArea(const NfcDeviceHandle *handle, bool *out);
|
||||
|
||||
Result nfpGetTagInfo(const NfcDeviceHandle *handle, NfpTagInfo *out);
|
||||
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpGetRegisterInfo(const NfcDeviceHandle *handle, NfpRegisterInfo *out);
|
||||
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpGetCommonInfo(const NfcDeviceHandle *handle, NfpCommonInfo *out);
|
||||
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Rom.
|
||||
Result nfpGetModelInfo(const NfcDeviceHandle *handle, NfpModelInfo *out);
|
||||
|
||||
/// Not available with ::NfpServiceType_User.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpGetAdminInfo(const NfcDeviceHandle *handle, NfpAdminInfo *out);
|
||||
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcGetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out);
|
||||
|
||||
Result nfcMfGetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out);
|
||||
|
||||
/// Returned event will have autoclear off.
|
||||
Result nfpAttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event);
|
||||
/// Returned event will have autoclear off.
|
||||
Result nfpAttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event);
|
||||
|
||||
Result nfpGetState(NfpState *out);
|
||||
/// Returned event will have autoclear off.
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcAttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event);
|
||||
/// Returned event will have autoclear off.
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcAttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event);
|
||||
|
||||
/// Returned event will have autoclear off.
|
||||
Result nfcMfAttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event);
|
||||
/// Returned event will have autoclear off.
|
||||
Result nfcMfAttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event);
|
||||
|
||||
Result nfpGetState(NfcState *out);
|
||||
Result nfpGetDeviceState(const NfcDeviceHandle *handle, NfpDeviceState *out);
|
||||
Result nfpGetNpadId(const NfcDeviceHandle *handle, u32 *out);
|
||||
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcGetState(NfcState *out);
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcGetDeviceState(const NfcDeviceHandle *handle, NfcDeviceState *out);
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcGetNpadId(const NfcDeviceHandle *handle, u32 *out);
|
||||
|
||||
Result nfcMfGetState(NfcState *out);
|
||||
Result nfcMfGetDeviceState(const NfcDeviceHandle *handle, NfcMifareDeviceState *out);
|
||||
Result nfcMfGetNpadId(const NfcDeviceHandle *handle, u32 *out);
|
||||
|
||||
/// Returned event will have autoclear on.
|
||||
/// Only available with [3.0.0+].
|
||||
Result nfpAttachAvailabilityChangeEvent(Event *out_event);
|
||||
/// Returned event will have autoclear on.
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcAttachAvailabilityChangeEvent(Event *out_event);
|
||||
/// Returned event will have autoclear on.
|
||||
Result nfcMfAttachAvailabilityChangeEvent(Event *out_event);
|
||||
|
||||
/// Not available with ::NfpServiceType_User.
|
||||
Result nfpFormat(const NfcDeviceHandle *handle);
|
||||
|
||||
/// Not available with ::NfpServiceType_User.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpGetRegisterInfoPrivate(const NfcDeviceHandle *handle, NfpRegisterInfoPrivate *out);
|
||||
|
||||
/// Not available with ::NfpServiceType_User.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpSetRegisterInfoPrivate(const NfcDeviceHandle *handle, const NfpRegisterInfoPrivate *register_info_private);
|
||||
|
||||
/// Not available with ::NfpServiceType_User.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpDeleteRegisterInfo(const NfcDeviceHandle *handle);
|
||||
|
||||
/// Only available with ::NfpServiceType_Debug.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpGetAll(const NfcDeviceHandle *handle, NfpData *out);
|
||||
|
||||
/// Only available with ::NfpServiceType_Debug.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpSetAll(const NfcDeviceHandle *handle, const NfpData *nfp_data);
|
||||
|
||||
/// Only available with ::NfpServiceType_Debug.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpFlushDebug(const NfcDeviceHandle *handle);
|
||||
|
||||
/// Only available with ::NfpServiceType_Debug.
|
||||
/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram.
|
||||
Result nfpBreakTag(const NfcDeviceHandle *handle, NfpBreakType break_type);
|
||||
|
||||
/// Only available with ::NfpServiceType_Debug.
|
||||
Result nfpReadBackupData(const NfcDeviceHandle *handle, void* out_buf, size_t buf_size, u32 *out_size);
|
||||
|
||||
/// Only available with ::NfpServiceType_Debug.
|
||||
Result nfpWriteBackupData(const NfcDeviceHandle *handle, const void* buf, size_t buf_size);
|
||||
|
||||
/// Only available with ::NfpServiceType_Debug.
|
||||
Result nfpWriteNtf(const NfcDeviceHandle *handle, u32 write_type, const void* buf, size_t buf_size);
|
||||
|
||||
/// This uses nfc:*.
|
||||
Result nfcIsNfcEnabled(bool *out);
|
||||
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count);
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcWriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count);
|
||||
|
||||
Result nfcMfReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count);
|
||||
Result nfcMfWriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count);
|
||||
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcSendCommandByPassThrough(const NfcDeviceHandle *handle, u64 timeout, const void* cmd_buf, size_t cmd_buf_size, void* reply_buf, size_t reply_buf_size, u64 *out_size);
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcKeepPassThroughSession(const NfcDeviceHandle *handle);
|
||||
/// Only available with [4.0.0+].
|
||||
Result nfcReleasePassThroughSession(const NfcDeviceHandle *handle);
|
||||
|
@ -229,6 +229,14 @@ Result nifmIsAnyForegroundRequestAccepted(bool* out);
|
||||
Result nifmPutToSleep(void);
|
||||
Result nifmWakeUp(void);
|
||||
|
||||
/**
|
||||
* @brief SetWowlDelayedWakeTime
|
||||
* @note Only available with ::NifmServiceType_System or ::NifmServiceType_Admin.
|
||||
* @note Only available on [9.0.0+].
|
||||
* @param[in] val Input value.
|
||||
*/
|
||||
Result nifmSetWowlDelayedWakeTime(s32 val);
|
||||
|
||||
///@name IRequest
|
||||
///@{
|
||||
|
||||
@ -282,5 +290,32 @@ Result nifmRequestSubmitAndWait(NifmRequest* r);
|
||||
*/
|
||||
Result nifmRequestGetAppletInfo(NifmRequest* r, u32 theme_color, void* buffer, size_t size, u32 *applet_id, u32 *mode, u32 *out_size);
|
||||
|
||||
/**
|
||||
* @brief SetKeptInSleep
|
||||
* @note Only available on [3.0.0+].
|
||||
* @note ::NifmRequestState must be ::NifmRequestState_Unknown1.
|
||||
* @param r \ref NifmRequest
|
||||
* @param[in] flag Flag
|
||||
*/
|
||||
Result nifmRequestSetKeptInSleep(NifmRequest* r, bool flag);
|
||||
|
||||
/**
|
||||
* @brief RegisterSocketDescriptor. Only 1 socket can be registered at a time with a NifmRequest. Do not use directly, use \ref socketNifmRequestRegisterSocketDescriptor instead.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @note ::NifmRequestState must be ::NifmRequestState_Available.
|
||||
* @param r \ref NifmRequest
|
||||
* @param[in] sockfd Socket fd
|
||||
*/
|
||||
Result nifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd);
|
||||
|
||||
/**
|
||||
* @brief UnregisterSocketDescriptor. Do not use directly, use \ref socketNifmRequestUnregisterSocketDescriptor instead.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @note ::NifmRequestState must be ::NifmRequestState_Available.
|
||||
* @param r \ref NifmRequest
|
||||
* @param[in] sockfd Socket fd, must match the fd previously registered with \ref nifmRequestRegisterSocketDescriptor.
|
||||
*/
|
||||
Result nifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd);
|
||||
|
||||
///@}
|
||||
|
||||
|
@ -771,6 +771,18 @@ Result nsIsAnyApplicationEntityInstalled(u64 application_id, bool *out);
|
||||
*/
|
||||
Result nsCleanupUnavailableAddOnContents(u64 application_id, AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief EstimateSizeToMove
|
||||
* @note Only available on [10.0.0+].
|
||||
* @param[in] storage_ids Array of u8 \ref NcmStorageId.
|
||||
* @param[in] count Size of the storage_ids array in entries.
|
||||
* @param[in] storage_id storage_id \ref NcmStorageId
|
||||
* @param[in] flags Flags
|
||||
* @param[in] application_id ApplicationId.
|
||||
* @param[out] Out Output value.
|
||||
*/
|
||||
Result nsEstimateSizeToMove(u8 *storage_ids, s32 count, NcmStorageId storage_id, u32 flags, u64 application_id, s64 *out);
|
||||
|
||||
/**
|
||||
* @brief FormatSdCard
|
||||
* @note Only available on [2.0.0+].
|
||||
@ -1327,8 +1339,8 @@ Result nsdevGetShellEventInfo(NsShellEventInfo* out); ///< [1.0.0-9.2.0]
|
||||
Result nsdevTerminateApplication(void);
|
||||
Result nsdevPrepareLaunchProgramFromHost(NsLaunchProperties* out, const char* path, size_t path_len); ///< [1.0.0-9.2.0]
|
||||
Result nsdevLaunchApplicationForDevelop(u64* out_pid, u64 application_id, u32 flags); ///< [1.0.0-9.2.0]
|
||||
Result nsdevLaunchApplicationFromHost(u64* out_pid, const char* path, size_t path_len, u32 flags); ///< [10.0.0+]
|
||||
Result nsdevLaunchApplicationWithStorageIdForDevelop(u64* out_pid, u64 application_id, u32 flags, u8 app_storage_id, u8 patch_storage_id);
|
||||
Result nsdevLaunchApplicationFromHost(u64* out_pid, const char* path, size_t path_len, u32 flags); ///< [10.0.0-17.0.1]
|
||||
Result nsdevLaunchApplicationWithStorageIdForDevelop(u64* out_pid, u64 application_id, u32 flags, u8 app_storage_id, u8 patch_storage_id); ///< [1.0.0-17.0.1]
|
||||
Result nsdevIsSystemMemoryResourceLimitBoosted(bool* out); ///< [6.0.0-8.1.0]
|
||||
Result nsdevGetRunningApplicationProcessIdForDevelop(u64* out_pid); ///< [6.0.0+]
|
||||
Result nsdevSetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop(bool can_be_active); ///< [6.0.0+]
|
||||
|
@ -9,6 +9,15 @@
|
||||
#include "../sf/service.h"
|
||||
#include "../kernel/event.h"
|
||||
|
||||
/// NvServiceType, for __nx_nv_service_type.
|
||||
typedef enum {
|
||||
NvServiceType_Auto = -1, ///< This is the default. Automatically select the type using \ref appletGetAppletType.
|
||||
NvServiceType_Application = 0, ///< Initializes nvdrv.
|
||||
NvServiceType_Applet = 1, ///< Initializes nvdrv:a.
|
||||
NvServiceType_System = 2, ///< Initializes nvdrv:s.
|
||||
NvServiceType_Factory = 3, ///< Initializes nvdrv:t.
|
||||
} NvServiceType;
|
||||
|
||||
/// Initialize nvdrv*.
|
||||
Result nvInitialize(void);
|
||||
|
||||
@ -32,7 +41,8 @@ typedef enum {
|
||||
|
||||
Result nvOpen(u32 *fd, const char *devicepath);
|
||||
Result nvIoctl(u32 fd, u32 request, void* argp);
|
||||
Result nvIoctl2(u32 fd, u32 request, void* argp, const void* inbuf, size_t inbuf_size);
|
||||
Result nvIoctl2(u32 fd, u32 request, void* argp, const void* inbuf, size_t inbuf_size); ///< [3.0.0+]
|
||||
Result nvIoctl3(u32 fd, u32 request, void* argp, void* outbuf, size_t outbuf_size); ///< [3.0.0+]
|
||||
Result nvClose(u32 fd);
|
||||
Result nvQueryEvent(u32 fd, u32 event_id, Event *event_out);
|
||||
|
||||
|
@ -7,8 +7,15 @@
|
||||
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef struct {
|
||||
u8 rating_age;
|
||||
bool sns_post_restriction;
|
||||
bool free_communication_restriction;
|
||||
} PctlRestrictionSettings;
|
||||
|
||||
/// Initialize pctl.
|
||||
Result pctlInitialize(void);
|
||||
|
||||
@ -21,15 +28,41 @@ Service* pctlGetServiceSession(void);
|
||||
/// Gets the Service object for IParentalControlService.
|
||||
Service* pctlGetServiceSession_Service(void);
|
||||
|
||||
/// Gets whether Parental Controls restrictions are temporarily unlocked.
|
||||
Result pctlIsRestrictionTemporaryUnlocked(bool *flag);
|
||||
|
||||
/// Confirm whether VrMode is allowed. Only available with [4.0.0+].
|
||||
Result pctlConfirmStereoVisionPermission(void);
|
||||
|
||||
/// Gets whether Parental Controls are enabled.
|
||||
Result pctlIsRestrictionEnabled(bool *flag);
|
||||
|
||||
/// Gets whether Parental Controls are enabled.
|
||||
Result pctlGetSafetyLevel(u32 *safety_level);
|
||||
|
||||
/// Returns the current restrictions settings.
|
||||
Result pctlGetCurrentSettings(PctlRestrictionSettings *settings);
|
||||
|
||||
/// Gets the count of applications that have free communication.
|
||||
Result pctlGetFreeCommunicationApplicationListCount(u32 *count);
|
||||
|
||||
/// Reset the confirmation done by \ref pctlConfirmStereoVisionPermission. Only available with [5.0.0+].
|
||||
Result pctlResetConfirmedStereoVisionPermission(void);
|
||||
|
||||
/// Gets whether VrMode is allowed. Only available with [5.0.0+].
|
||||
Result pctlIsStereoVisionPermitted(bool *flag);
|
||||
|
||||
/// Confirm whether pairing is active.
|
||||
Result pctlIsPairingActive(bool *flag);
|
||||
|
||||
/// Returns the synchronization event.
|
||||
Result pctlGetSynchronizationEvent(Event* out_event);
|
||||
|
||||
/// Returns the supension event.
|
||||
Result pctlGetPlayTimerEventToRequestSuspension(Event* out_event);
|
||||
|
||||
/// Confirm whether play timer alarm is disabled. Only available with [4.0.0+].
|
||||
Result pctlIsPlayTimerAlarmDisabled(bool *flag);
|
||||
|
||||
/// Returns the unlinked event.
|
||||
Result pctlGetUnlinkedEvent(Event* out_event);
|
||||
|
@ -191,6 +191,13 @@ typedef enum {
|
||||
PcvModuleId_EXTPERIPH2 = 0x40000057,
|
||||
} PcvModuleId;
|
||||
|
||||
// Clock list type returned by GetPossibleClockRates
|
||||
typedef enum {
|
||||
PcvClockRatesListType_Invalid = 0,
|
||||
PcvClockRatesListType_Discrete = 1,
|
||||
PcvClockRatesListType_Range = 2,
|
||||
} PcvClockRatesListType;
|
||||
|
||||
/// Initialize pcv.
|
||||
Result pcvInitialize(void);
|
||||
|
||||
@ -210,3 +217,5 @@ Result pcvSetClockRate(PcvModule module, u32 hz);
|
||||
Result pcvSetVoltageEnabled(u32 power_domain, bool state);
|
||||
/// Only available on [1.0.0-7.0.1].
|
||||
Result pcvGetVoltageEnabled(bool *isEnabled, u32 power_domain);
|
||||
/// Only available on [1.0.0-7.0.1].
|
||||
Result pcvGetPossibleClockRates(PcvModule module, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count);
|
||||
|
@ -38,41 +38,71 @@ typedef enum {
|
||||
PdmPlayLogPolicy_Unknown3 = 3, ///< [10.0.0+] The cmds which require ::PdmPlayLogPolicy_All, now also allow value 3 if the cmd input flag is set.
|
||||
} PdmPlayLogPolicy;
|
||||
|
||||
/// AppletEvent.
|
||||
/// AppletEventV1. AppletEvent for [1.0.0-15.0.1], converted to \ref PdmAppletEvent when needed.
|
||||
/// Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00:00.
|
||||
/// See \ref pdmPlayTimestampToPosix.
|
||||
typedef struct {
|
||||
u64 program_id; ///< ProgramId.
|
||||
u32 entry_index; ///< Entry index.
|
||||
u32 timestampUser; ///< See PdmPlayEvent::timestampUser, with the above timestamp format.
|
||||
u32 timestampNetwork; ///< See PdmPlayEvent::timestampNetwork, with the above timestamp format.
|
||||
u8 eventType; ///< \ref PdmAppletEventType
|
||||
u32 timestamp_user; ///< See PdmPlayEvent::timestamp_user, with the above timestamp format.
|
||||
u32 timestamp_network; ///< See PdmPlayEvent::timestamp_network, with the above timestamp format.
|
||||
u8 event_type; ///< \ref PdmAppletEventType
|
||||
u8 pad[3]; ///< Padding.
|
||||
} PdmAppletEventV1;
|
||||
|
||||
/// AppletEvent. AppletEvent for [16.0.0+], converted from \ref PdmAppletEventV1 on [1.0.0-15.0.1].
|
||||
typedef struct {
|
||||
u64 program_id; ///< ProgramId.
|
||||
u32 entry_index; ///< Entry index.
|
||||
u32 pad; ///< Padding
|
||||
u64 timestamp_user; ///< See PdmPlayEvent::timestamp_user.
|
||||
u64 timestamp_network; ///< See PdmPlayEvent::timestamp_network.
|
||||
u8 event_type; ///< \ref PdmAppletEventType
|
||||
u8 pad2[7]; ///< Padding.
|
||||
} PdmAppletEvent;
|
||||
|
||||
/// PlayStatistics
|
||||
/// PlayStatisticsV1. PlayStatistics for [1.0.0-15.0.1], converted to \ref PdmPlayStatistics when needed.
|
||||
typedef struct {
|
||||
u64 application_id; ///< ApplicationId.
|
||||
u64 program_id; ///< ProgramId.
|
||||
|
||||
u32 first_entry_index; ///< Entry index for the first time the application was played.
|
||||
u32 first_timestampUser; ///< See PdmAppletEvent::timestampUser. This is for the first time the application was played.
|
||||
u32 first_timestampNetwork; ///< See PdmAppletEvent::timestampNetwork. This is for the first time the application was played.
|
||||
u32 first_entry_index; ///< Entry index for the first time the program was played.
|
||||
u32 first_timestamp_user; ///< See PdmAppletEventV1::timestamp_user. This is for the first time the program was played.
|
||||
u32 first_timestamp_network; ///< See PdmAppletEventV1::timestamp_network. This is for the first time the program was played.
|
||||
|
||||
u32 last_entry_index; ///< Entry index for the last time the application was played.
|
||||
u32 last_timestampUser; ///< See PdmAppletEvent::timestampUser. This is for the last time the application was played.
|
||||
u32 last_timestampNetwork; ///< See PdmAppletEvent::timestampNetwork. This is for the last time the application was played.
|
||||
u32 last_entry_index; ///< Entry index for the last time the program was played.
|
||||
u32 last_timestamp_user; ///< See PdmAppletEventV1::timestamp_user. This is for the last time the program was played.
|
||||
u32 last_timestamp_network; ///< See PdmAppletEventV1::timestamp_network. This is for the last time the program was played.
|
||||
|
||||
u32 playtimeMinutes; ///< Total play-time in minutes.
|
||||
u32 totalLaunches; ///< Total times the application was launched.
|
||||
u32 playtime_minutes; ///< Total play-time in minutes.
|
||||
u32 total_launches; ///< Total times the program was launched.
|
||||
} PdmPlayStatisticsV1;
|
||||
|
||||
/// PlayStatistics. PlayStatistics for [16.0.0+], converted from \ref PdmPlayStatisticsV1 on [1.0.0-15.0.1].
|
||||
typedef struct {
|
||||
u64 program_id; ///< ProgramId.
|
||||
|
||||
u32 first_entry_index; ///< Entry index for the first time the program was played.
|
||||
u32 pad; ///< Padding
|
||||
u64 first_timestamp_user; ///< See PdmAppletEvent::timestamp_user. This is for the first time the program was played, in PosixTime.
|
||||
u64 first_timestamp_network; ///< See PdmAppletEvent::timestamp_network. This is for the first time the program was played, in PosixTime.
|
||||
|
||||
u32 last_entry_index; ///< Entry index for the last time the program was played.
|
||||
u32 pad2; ///< Padding
|
||||
u64 last_timestamp_user; ///< See PdmAppletEvent::timestamp_user. This is for the last time the program was played, in PosixTime.
|
||||
u64 last_timestamp_network; ///< See PdmAppletEvent::timestamp_network. This is for the last time the program was played, in PosixTime.
|
||||
|
||||
u64 playtime; ///< Total play-time in nanoseconds.
|
||||
u32 total_launches; ///< Total times the program was launched.
|
||||
u32 pad3; ///< Padding
|
||||
} PdmPlayStatistics;
|
||||
|
||||
/// LastPlayTime.
|
||||
/// This contains data from the last time the application was played.
|
||||
typedef struct {
|
||||
u64 application_id; ///< ApplicationId.
|
||||
u32 timestampUser; ///< See PdmAppletEvent::timestampUser.
|
||||
u32 timestampNetwork; ///< See PdmAppletEvent::timestampNetwork.
|
||||
u32 lastPlayedMinutes; ///< Total minutes since the application was last played.
|
||||
u32 timestamp_user; ///< See PdmAppletEventV1::timestamp_user.
|
||||
u32 timestamp_network; ///< See PdmAppletEventV1::timestamp_network.
|
||||
u32 last_played_minutes; ///< Total minutes since the application was last played.
|
||||
u8 flag; ///< Flag indicating whether the above field is set.
|
||||
u8 pad[3]; ///< Padding.
|
||||
} PdmLastPlayTime;
|
||||
@ -98,10 +128,10 @@ typedef struct {
|
||||
u32 data;
|
||||
} unk_x8;
|
||||
|
||||
u8 appletId; ///< \ref AppletId
|
||||
u8 storageId; ///< \ref NcmStorageId
|
||||
u8 logPolicy; ///< \ref PdmPlayLogPolicy
|
||||
u8 eventType; ///< \ref PdmAppletEventType
|
||||
u8 applet_id; ///< \ref AppletId
|
||||
u8 storage_id; ///< \ref NcmStorageId
|
||||
u8 log_policy; ///< \ref PdmPlayLogPolicy
|
||||
u8 event_type; ///< \ref PdmAppletEventType
|
||||
u8 unused[0xc]; ///< Unused.
|
||||
} applet;
|
||||
|
||||
@ -114,34 +144,59 @@ typedef struct {
|
||||
struct {
|
||||
u8 value; ///< Input value from the pdm:ntfy command.
|
||||
u8 unused[0x1b]; ///< Unused.
|
||||
} powerStateChange;
|
||||
} power_state_change;
|
||||
|
||||
struct {
|
||||
u8 value; ///< Input value from the pdm:ntfy command.
|
||||
u8 unused[0x1b]; ///< Unused.
|
||||
} operationModeChange;
|
||||
} operation_mode_change;
|
||||
|
||||
u8 data[0x1c];
|
||||
} eventData; ///< ProgramId/ApplicationId/userId stored within here have the u32 low/high swapped in each u64.
|
||||
} event_data; ///< ProgramId/ApplicationId/userId stored within here have the u32 low/high swapped in each u64.
|
||||
|
||||
u8 playEventType; ///< \ref PdmPlayEventType. Controls which struct in the above eventData is used. ::PdmPlayEventType_Initialize doesn't use eventData.
|
||||
u8 play_event_type; ///< \ref PdmPlayEventType. Controls which struct in the above event_data is used. ::PdmPlayEventType_Initialize doesn't use event_data.
|
||||
u8 pad[3]; ///< Padding.
|
||||
|
||||
u64 timestampUser; ///< PosixTime timestamp from StandardUserSystemClock.
|
||||
u64 timestampNetwork; ///< PosixTime timestamp from StandardNetworkSystemClock.
|
||||
u64 timestampSteady; ///< Timestamp in seconds derived from StandardSteadyClock.
|
||||
u64 timestamp_user; ///< PosixTime timestamp from StandardUserSystemClock.
|
||||
u64 timestamp_network; ///< PosixTime timestamp from StandardNetworkSystemClock.
|
||||
u64 timestamp_steady; ///< Timestamp in seconds derived from StandardSteadyClock.
|
||||
} PdmPlayEvent;
|
||||
|
||||
/// AccountEvent
|
||||
/// AccountEventV3. AccountEvent for [3.0.0-9.2.0], converted to \ref PdmAccountEvent when needed.
|
||||
typedef struct {
|
||||
AccountUid uid; ///< \ref AccountUid
|
||||
u32 entry_index; ///< Entry index.
|
||||
u8 pad[4]; ///< Padding.
|
||||
u64 timestampUser; ///< See PdmPlayEvent::timestampUser.
|
||||
u64 timestampNetwork; ///< See PdmPlayEvent::timestampNetwork.
|
||||
u64 timestampSteady; ///< See PdmPlayEvent::timestampSteady.
|
||||
u8 type; ///< See PdmPlayEvent::eventData::account::type.
|
||||
u8 pad_x31[7]; ///< Padding.
|
||||
u64 timestamp_user; ///< See PdmPlayEvent::timestamp_user.
|
||||
u64 timestamp_network; ///< See PdmPlayEvent::timestamp_network.
|
||||
u64 timestamp_steady; ///< See PdmPlayEvent::timestamp_steady.
|
||||
u8 type; ///< See PdmPlayEvent::event_data::account::type.
|
||||
u8 pad2[7]; ///< Padding.
|
||||
} PdmAccountEventV3;
|
||||
|
||||
/// AccountEventV10. AccountEvent for [10.0.0-15.0.1], converted to \ref PdmAccountEvent when needed.
|
||||
typedef struct {
|
||||
AccountUid uid; ///< \ref AccountUid
|
||||
u64 program_id; ///< ProgramId
|
||||
u32 entry_index; ///< Entry index.
|
||||
u8 pad[4]; ///< Padding.
|
||||
u64 timestamp_user; ///< See PdmPlayEvent::timestamp_user.
|
||||
u64 timestamp_network; ///< See PdmPlayEvent::timestamp_network.
|
||||
u64 timestamp_steady; ///< See PdmPlayEvent::timestamp_steady.
|
||||
u8 type; ///< See PdmPlayEvent::event_data::account::type.
|
||||
u8 pad2[7]; ///< Padding.
|
||||
} PdmAccountEventV10;
|
||||
|
||||
/// AccountEvent. AccountEvent for [16.0.0+], converted from the older structs when needed.
|
||||
typedef struct {
|
||||
AccountUid uid; ///< \ref AccountUid
|
||||
u64 program_id; ///< [10.0.0+] ProgramId
|
||||
u32 entry_index; ///< Entry index.
|
||||
u8 pad[4]; ///< Padding.
|
||||
u64 timestamp_user; ///< See PdmPlayEvent::timestamp_user.
|
||||
u64 timestamp_network; ///< See PdmPlayEvent::timestamp_network.
|
||||
u8 type; ///< See PdmPlayEvent::event_data::account::type.
|
||||
u8 pad2[7]; ///< Padding.
|
||||
} PdmAccountEvent;
|
||||
|
||||
/// AccountPlayEvent.
|
||||
@ -157,8 +212,8 @@ typedef struct {
|
||||
/// ApplicationPlayStatistics
|
||||
typedef struct {
|
||||
u64 application_id; ///< ApplicationId.
|
||||
u64 totalPlayTime; ///< Total play-time in nanoseconds.
|
||||
u64 totalLaunches; ///< Total times the application was launched.
|
||||
u64 playtime; ///< Total play-time in nanoseconds.
|
||||
u64 total_launches; ///< Total times the application was launched.
|
||||
} PdmApplicationPlayStatistics;
|
||||
|
||||
/// Initialize pdm:qry.
|
||||
@ -226,6 +281,7 @@ Result pdmqryGetAvailablePlayEventRange(s32 *total_entries, s32 *start_entry_ind
|
||||
|
||||
/**
|
||||
* @brief Gets a list of \ref PdmAccountEvent.
|
||||
* @note Only available with [3.0.0+].
|
||||
* @param[in] entry_index Start entry index.
|
||||
* @param[out] events Output \ref PdmAccountEvent array.
|
||||
* @param[in] count Max entries in the output array.
|
||||
@ -255,7 +311,7 @@ Result pdmqryGetAvailableAccountPlayEventRange(AccountUid uid, s32 *total_entrie
|
||||
|
||||
/**
|
||||
* @brief Gets a list of applications played by the specified user.
|
||||
* @note Only available with [6.0.0+].
|
||||
* @note Only available with [6.0.0-14.1.2].
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3.
|
||||
* @param[out] application_ids Output ApplicationIds array.
|
||||
@ -265,8 +321,8 @@ Result pdmqryGetAvailableAccountPlayEventRange(AccountUid uid, s32 *total_entrie
|
||||
Result pdmqryQueryRecentlyPlayedApplication(AccountUid uid, bool flag, u64 *application_ids, s32 count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Gets an Event which is signaled when logging a new \ref PdmPlayEvent which would be available via \ref pdmqryQueryAccountEvent, where PdmPlayEvent::eventData::account::type is 0.
|
||||
* @note Only available with [6.0.0+].
|
||||
* @brief Gets an Event which is signaled when logging a new \ref PdmPlayEvent which would be available via \ref pdmqryQueryAccountEvent, where PdmPlayEvent::event_data::account::type is 0.
|
||||
* @note Only available with [6.0.0-14.1.2].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=false.
|
||||
*/
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
typedef enum {
|
||||
PlServiceType_User = 0, ///< Initializes pl:u.
|
||||
PlServiceType_System = 1, ///< Initializes pl:s.
|
||||
PlServiceType_System = 1, ///< Initializes pl:s. With [16.0.0+] SharedFont is no longer available with this, pl:u must be used for that.
|
||||
} PlServiceType;
|
||||
|
||||
/// SharedFontType
|
||||
|
@ -57,6 +57,15 @@ typedef enum {
|
||||
PmBootMode_SafeMode = 2, ///< SafeMode
|
||||
} PmBootMode;
|
||||
|
||||
/// ResourceLimitValues
|
||||
typedef struct {
|
||||
u64 physical_memory;
|
||||
u32 thread_count;
|
||||
u32 event_count;
|
||||
u32 transfer_memory_count;
|
||||
u32 session_count;
|
||||
} PmResourceLimitValues;
|
||||
|
||||
/// Initialize pm:dmnt.
|
||||
Result pmdmntInitialize(void);
|
||||
|
||||
@ -111,8 +120,11 @@ Result pmdmntHookToCreateProcess(Event* out, u64 program_id);
|
||||
Result pmdmntGetApplicationProcessId(u64* pid_out);
|
||||
Result pmdmntHookToCreateApplicationProcess(Event* out);
|
||||
Result pmdmntClearHook(u32 which);
|
||||
Result pmdmntGetProgramId(u64* program_id_out, u64 pid);
|
||||
|
||||
Result pminfoGetProgramId(u64* program_id_out, u64 pid);
|
||||
Result pminfoGetAppletCurrentResourceLimitValues(PmResourceLimitValues* out);
|
||||
Result pminfoGetAppletPeakResourceLimitValues(PmResourceLimitValues* out);
|
||||
|
||||
Result pmshellLaunchProgram(u32 launch_flags, const NcmProgramLocation *location, u64 *pid);
|
||||
Result pmshellTerminateProcess(u64 processID);
|
||||
@ -124,4 +136,5 @@ Result pmshellClearJitDebugOccured(u64 pid);
|
||||
Result pmshellNotifyBootFinished(void);
|
||||
Result pmshellGetApplicationProcessIdForShell(u64* pid_out);
|
||||
Result pmshellBoostSystemMemoryResourceLimit(u64 boost_size);
|
||||
Result pmshellEnableApplicationExtraThread(void);
|
||||
Result pmshellBoostApplicationThreadResourceLimit(void);
|
||||
Result pmshellBoostSystemThreadResourceLimit(void);
|
||||
|
@ -31,7 +31,7 @@ typedef enum {
|
||||
SetSysProductModel_Iowa = 3, ///< Mariko Model
|
||||
SetSysProductModel_Hoag = 4, ///< Mariko Lite Model
|
||||
SetSysProductModel_Calcio = 5, ///< Mariko "Simulation" Model
|
||||
SetSysProductModel_Aula = 6, ///< Mariko Pro Model(?)
|
||||
SetSysProductModel_Aula = 6, ///< Mariko OLED Model
|
||||
} SetSysProductModel;
|
||||
|
||||
/// IDs for Language.
|
||||
@ -312,7 +312,7 @@ typedef struct {
|
||||
/// BluetoothDevicesSettings
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
BtmBdName name; ///< BdName. Unused on 13.0.0+
|
||||
BtmBdName name; ///< [1.0.0-12.1.0] BdName. On 13.0.0+ name2 is used instead.
|
||||
BtmClassOfDevice class_of_device; ///< ClassOfDevice
|
||||
u8 link_key[0x10]; ///< LinkKey
|
||||
u8 link_key_present; ///< LinkKeyPresent
|
||||
@ -328,14 +328,11 @@ typedef struct {
|
||||
u8 device_type; ///< DeviceType
|
||||
u16 brr_size; ///< BrrSize
|
||||
u8 brr[0x9]; ///< Brr
|
||||
union {
|
||||
u8 reserved[0x12B]; ///< Reserved [1.0.0-12.1.0]
|
||||
|
||||
struct {
|
||||
u8 pad; ///< Padding
|
||||
char name2[0xF9]; ///< Name
|
||||
}; ///< [13.0.0+]
|
||||
};
|
||||
u8 audio_source_volume; ///< [13.0.0+] AudioSourceVolume
|
||||
char name2[0xF9]; ///< [13.0.0+] Name
|
||||
u8 audio_sink_volume; ///< [15.0.0+] AudioSinkVolume
|
||||
u32 audio_flags; ///< [14.0.0+] AudioFlags
|
||||
u8 reserved[0x2C]; ///< Reserved
|
||||
} SetSysBluetoothDevicesSettings;
|
||||
|
||||
/// Structure returned by \ref setsysGetFirmwareVersion.
|
||||
@ -440,8 +437,8 @@ typedef struct {
|
||||
u8 vertical_active_lines_msb : 4;
|
||||
u8 horizontal_sync_offset_pixels_lsb;
|
||||
u8 horizontal_sync_pulse_width_pixels_lsb;
|
||||
u8 horizontal_sync_pulse_width_lines_lsb : 4;
|
||||
u8 horizontal_sync_offset_lines_lsb : 4;
|
||||
u8 vertical_sync_pulse_width_lines_lsb : 4;
|
||||
u8 vertical_sync_offset_lines_lsb : 4;
|
||||
u8 vertical_sync_pulse_width_lines_msb : 2;
|
||||
u8 vertical_sync_offset_lines_msb : 2;
|
||||
u8 horizontal_sync_pulse_width_pixels_msb : 2;
|
||||
@ -468,7 +465,7 @@ typedef struct {
|
||||
u8 svd_index : 7;
|
||||
u8 native_flag : 1;
|
||||
} svd[0xC];
|
||||
} PACKED video;
|
||||
} NX_PACKED video;
|
||||
struct {
|
||||
u8 size : 5;
|
||||
SetSysBlockType block_type : 3;
|
||||
@ -477,7 +474,7 @@ typedef struct {
|
||||
u8 padding1 : 1;
|
||||
u8 sampling_rates_bitmap;
|
||||
u8 bitrate;
|
||||
} PACKED audio;
|
||||
} NX_PACKED audio;
|
||||
struct {
|
||||
u8 size : 5;
|
||||
SetSysBlockType block_type : 3;
|
||||
@ -486,7 +483,7 @@ typedef struct {
|
||||
u8 mode_bitmap;
|
||||
u8 max_tmds_frequency;
|
||||
u8 latency_bitmap;
|
||||
} PACKED vendor_specific;
|
||||
} NX_PACKED vendor_specific;
|
||||
u8 padding[2];
|
||||
} SetSysDataBlock;
|
||||
|
||||
@ -497,7 +494,7 @@ typedef struct {
|
||||
u16 product_code;
|
||||
u32 serial_number;
|
||||
u8 manufacture_week;
|
||||
u8 manufacture_year;
|
||||
u8 manufacture_year; ///< Real value is val - 10.
|
||||
u8 edid_version;
|
||||
u8 edid_revision;
|
||||
u8 video_input_parameters_bitmap;
|
||||
@ -560,6 +557,8 @@ typedef struct {
|
||||
SetSysModeLine extended_timing_descriptor[5];
|
||||
u8 padding[5];
|
||||
u8 extended_checksum; ///< Sum of 128 extended bytes should equal 0 mod 256.
|
||||
u8 data2[0x80]; ///< [13.0.0+]
|
||||
u8 data3[0x80]; ///< [13.0.0+]
|
||||
} SetSysEdid;
|
||||
|
||||
/// DataDeletionSettings
|
||||
@ -1690,7 +1689,7 @@ Result setsysSetHeadphoneVolumeUpdateFlag(bool flag);
|
||||
|
||||
/**
|
||||
* @brief NeedsToUpdateHeadphoneVolume
|
||||
* @note Only available on [3.0.0+].
|
||||
* @note Only available on [3.0.0-14.1.2].
|
||||
* @param[out] a0 Output arg.
|
||||
* @param[out] a1 Output arg.
|
||||
* @param[out] a2 Output arg.
|
||||
|
@ -7,6 +7,7 @@
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
#define SPL_RSA_BUFFER_SIZE (0x100)
|
||||
|
||||
|
@ -8,12 +8,19 @@
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Values for __nx_ssl_service_type, controls which ssl service to initialize.
|
||||
typedef enum {
|
||||
SslServiceType_Default = 0, ///< Initialize the ssl service.
|
||||
SslServiceType_System = 1, ///< [15.0.0+] Initialize the ssl:s service. On older versions this is the same as ::SslServiceType_Default.
|
||||
} SslServiceType;
|
||||
|
||||
/// CaCertificateId
|
||||
typedef enum {
|
||||
SslCaCertificateId_All = -1, ///< [3.0.0+] All
|
||||
|
||||
SslCaCertificateId_NintendoCAG3 = 1, ///< NintendoCAG3
|
||||
SslCaCertificateId_NintendoClass2CAG3 = 2, ///< NintendoClass2CAG3
|
||||
SslCaCertificateId_NintendoRootCAG4 = 3, ///< [16.0.0+] "Nintendo Root CA G4"
|
||||
|
||||
SslCaCertificateId_AmazonRootCA1 = 1000, ///< AmazonRootCA1
|
||||
SslCaCertificateId_StarfieldServicesRootCertificateAuthorityG2 = 1001, ///< StarfieldServicesRootCertificateAuthorityG2
|
||||
@ -49,6 +56,32 @@ typedef enum {
|
||||
SslCaCertificateId_VeriSignClass3PublicPrimaryCertificationAuthorityG5 = 1031, ///< VeriSignClass3PublicPrimaryCertificationAuthorityG5 ([8.0.0+] ::SslTrustedCertStatus is ::SslTrustedCertStatus_EnabledNotTrusted)
|
||||
SslCaCertificateId_VeriSignUniversalRootCertificationAuthority = 1032, ///< VeriSignUniversalRootCertificationAuthority ([8.0.0+] ::SslTrustedCertStatus is ::SslTrustedCertStatus_EnabledNotTrusted)
|
||||
SslCaCertificateId_DSTRootCAX3 = 1033, ///< [6.0.0+] DSTRootCAX3
|
||||
SslCaCertificateId_USERTrustRsaCertificationAuthority = 1034, ///< [10.0.3+] "USERTrust RSA Certification Authority"
|
||||
SslCaCertificateId_ISRGRootX10 = 1035, ///< [10.1.0+] "ISRG Root X10"
|
||||
SslCaCertificateId_USERTrustEccCertificationAuthority = 1036, ///< [10.1.0+] "USERTrust ECC Certification Authority"
|
||||
SslCaCertificateId_COMODORsaCertificationAuthority = 1037, ///< [10.1.0+] "COMODO RSA Certification Authority"
|
||||
SslCaCertificateId_COMODOEccCertificationAuthority = 1038, ///< [10.1.0+] "COMODO ECC Certification Authority"
|
||||
SslCaCertificateId_AmazonRootCA2 = 1039, ///< [11.0.0+] "Amazon Root CA 2"
|
||||
SslCaCertificateId_AmazonRootCA3 = 1040, ///< [11.0.0+] "Amazon Root CA 3"
|
||||
SslCaCertificateId_AmazonRootCA4 = 1041, ///< [11.0.0+] "Amazon Root CA 4"
|
||||
SslCaCertificateId_DigiCertAssuredIDRootG3 = 1042, ///< [11.0.0+] "DigiCert Assured ID Root G3"
|
||||
SslCaCertificateId_DigiCertGlobalRootG3 = 1043, ///< [11.0.0+] "DigiCert Global Root G3"
|
||||
SslCaCertificateId_DigiCertTrustedRootG4 = 1044, ///< [11.0.0+] "DigiCert Trusted Root G4"
|
||||
SslCaCertificateId_EntrustRootCertificationAuthorityEC1 = 1045, ///< [11.0.0+] "Entrust Root Certification Authority - EC1"
|
||||
SslCaCertificateId_EntrustRootCertificationAuthorityG4 = 1046, ///< [11.0.0+] "Entrust Root Certification Authority - G4"
|
||||
SslCaCertificateId_GlobalSignECCRootCAR4 = 1047, ///< [11.0.0+] "GlobalSign ECC Root CA - R4"
|
||||
SslCaCertificateId_GlobalSignECCRootCAR5 = 1048, ///< [11.0.0+] "GlobalSign ECC Root CA - R5"
|
||||
SslCaCertificateId_GlobalSignECCRootCAR6 = 1049, ///< [11.0.0+] "GlobalSign ECC Root CA - R6"
|
||||
SslCaCertificateId_GTSRootR1 = 1050, ///< [11.0.0+] "GTS Root R1"
|
||||
SslCaCertificateId_GTSRootR2 = 1051, ///< [11.0.0+] "GTS Root R2"
|
||||
SslCaCertificateId_GTSRootR3 = 1052, ///< [11.0.0+] "GTS Root R3"
|
||||
SslCaCertificateId_GTSRootR4 = 1053, ///< [11.0.0+] "GTS Root R4"
|
||||
SslCaCertificateId_SecurityCommunicationRootCA = 1054, ///< [12.0.0+] "Security Communication RootCA"
|
||||
SslCaCertificateId_GlobalSignRootE4 = 1055, ///< [15.0.0+] "GlobalSign Root E4"
|
||||
SslCaCertificateId_GlobalSignRootR4 = 1056, ///< [15.0.0+] "GlobalSign Root R4"
|
||||
SslCaCertificateId_TTeleSecGlobalRootClass2 = 1057, ///< [15.0.0+] "T-TeleSec GlobalRoot Class 2"
|
||||
SslCaCertificateId_DigiCertTLSECCP384RootG5 = 1058, ///< [16.0.0+] "DigiCert TLS ECC P384 Root G5"
|
||||
SslCaCertificateId_DigiCertTLSRSA4096RootG5 = 1059, ///< [16.0.0+] "DigiCert TLS RSA4096 Root G5"
|
||||
} SslCaCertificateId;
|
||||
|
||||
/// TrustedCertStatus
|
||||
@ -144,6 +177,12 @@ typedef enum {
|
||||
SslOptionType_EnableAlpn = 3, ///< [9.0.0+] EnableAlpn. Only available with \ref sslConnectionSetOption. \ref sslConnectionSetSocketDescriptor should have been used prior to this - this will optionally use state setup by that, without throwing an error if that cmd wasn't used.
|
||||
} SslOptionType;
|
||||
|
||||
/// PrivateOptionType
|
||||
typedef enum {
|
||||
SslPrivateOptionType_DtlsSession = 1, ///< \ref sslConnectionSetSessionCacheMode will throw an error if the input ::SslSessionCacheMode is non-zero and this option flag is set.
|
||||
SslPrivateOptionType_SetCipher = 2, ///< [17.0.0+] This exclusively enables the cipher suite specified in the input u32 value passed to \ref sslConnectionSetPrivateOption (all other ciphers disabled).
|
||||
} SslPrivateOptionType;
|
||||
|
||||
/// AlpnProtoState
|
||||
typedef enum {
|
||||
SslAlpnProtoState_NoSupport = 0, ///< NoSupport
|
||||
@ -190,6 +229,15 @@ typedef struct {
|
||||
char protocol_version[0x8]; ///< Protocol version string.
|
||||
} SslCipherInfo;
|
||||
|
||||
/// KeyAndCertParams
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Must be value 1.
|
||||
s32 key_size; ///< Key size in bits.
|
||||
u64 public_exponent; ///< Public exponent, must be non-zero. Only the low 4-bytes are used.
|
||||
char common_name[0x40]; ///< CN (Common Name) NUL-terminated string.
|
||||
u32 common_name_len; ///< Length of common_name excluding NUL-terminator. Must be 0x1-0x3F.
|
||||
} SslKeyAndCertParams;
|
||||
|
||||
/// Initialize ssl. A default value of 0x3 can be used for num_sessions. This must be 0x1-0x4.
|
||||
Result sslInitialize(u32 num_sessions);
|
||||
|
||||
@ -261,6 +309,26 @@ Result sslSetDebugOption(const void* buffer, size_t size, SslDebugOptionType typ
|
||||
*/
|
||||
Result sslGetDebugOption(void* buffer, size_t size, SslDebugOptionType type);
|
||||
|
||||
/**
|
||||
* @brief ClearTls12FallbackFlag
|
||||
* @note Only available on [14.0.0+].
|
||||
*/
|
||||
Result sslClearTls12FallbackFlag(void);
|
||||
|
||||
/**
|
||||
* @brief SetThreadCoreMask
|
||||
* @param[in] mask CoreMask
|
||||
* @note Only available on [15.0.0+] with ::SslServiceType_System.
|
||||
*/
|
||||
Result sslSetThreadCoreMask(u64 mask);
|
||||
|
||||
/**
|
||||
* @brief GetThreadCoreMask
|
||||
* @param[out] out Output CoreMask.
|
||||
* @note Only available on [15.0.0+] with ::SslServiceType_System.
|
||||
*/
|
||||
Result sslGetThreadCoreMask(u64 *out);
|
||||
|
||||
///@name ISslContext
|
||||
///@{
|
||||
|
||||
@ -360,6 +428,42 @@ Result sslContextAddPolicyOid(SslContext *c, const char *str, u32 str_bufsize);
|
||||
*/
|
||||
Result sslContextImportCrl(SslContext *c, const void* buffer, u32 size, u64 *id);
|
||||
|
||||
/**
|
||||
* @brief ImportClientCertKeyPki
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslContext
|
||||
* @param[in] cert Input cert buffer,
|
||||
* @param[in] cert_size Size of the cert buffer.
|
||||
* @param[in] key Input key buffer.
|
||||
* @param[in] key_size Size of the key buffer.
|
||||
* @param[in] format \ref SslCertificateFormat for the cert and key.
|
||||
* @param[out] id Output Id. Optional, can be NULL.
|
||||
*/
|
||||
Result sslContextImportClientCertKeyPki(SslContext *c, const void* cert, u32 cert_size, const void* key, u32 key_size, SslCertificateFormat format, u64 *id);
|
||||
|
||||
/**
|
||||
* @brief GeneratePrivateKeyAndCert
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslContext
|
||||
* @param[out] cert Output cert buffer,
|
||||
* @param[in] cert_size Size of the cert buffer.
|
||||
* @param[out] key Output key buffer.
|
||||
* @param[in] key_size Size of the key buffer.
|
||||
* @param[in] val Must be value 1.
|
||||
* @param[in] params \ref SslKeyAndCertParams
|
||||
* @param[out] out_certsize Actual size of the generated cert data.
|
||||
* @param[out] out_keysize Actual size of the generated key data.
|
||||
*/
|
||||
Result sslContextGeneratePrivateKeyAndCert(SslContext *c, void* cert, u32 cert_size, void* key, u32 key_size, u32 val, const SslKeyAndCertParams *params, u32 *out_certsize, u32 *out_keysize);
|
||||
|
||||
/**
|
||||
* @brief CreateConnectionForSystem
|
||||
* @note Only available on [15.0.0+] with ::SslServiceType_System.
|
||||
* @param c \ref SslContext
|
||||
* @param[out] conn Output \ref SslConnection.
|
||||
*/
|
||||
Result sslContextCreateConnectionForSystem(SslContext *c, SslConnection *conn);
|
||||
|
||||
///@}
|
||||
|
||||
///@name ISslConnection
|
||||
@ -619,5 +723,80 @@ Result sslConnectionSetNextAlpnProto(SslConnection *c, const u8 *buffer, u32 siz
|
||||
*/
|
||||
Result sslConnectionGetNextAlpnProto(SslConnection *c, SslAlpnProtoState *state, u32 *out, u8 *buffer, u32 size);
|
||||
|
||||
/**
|
||||
* @brief SetDtlsSocketDescriptor. Do not use directly, use \ref socketSslConnectionSetDtlsSocketDescriptor instead.
|
||||
* @note Only available on [16.0.0+].
|
||||
* @note An error is thrown if this was used previously.
|
||||
* @param c \ref SslConnection
|
||||
* @param[in] sockfd sockfd
|
||||
* @param[in] Input sockaddr.
|
||||
* @param[in] size Input sockaddr size.
|
||||
* @param[out] out_sockfd sockfd. Prior to using \ref sslConnectionClose, this must be closed if it's not negative (it will be -1 if ::SslOptionType_DoNotCloseSocket is set).
|
||||
*/
|
||||
Result sslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const void* buf, size_t size, int *out_sockfd);
|
||||
|
||||
/**
|
||||
* @brief GetDtlsHandshakeTimeout
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslConnection
|
||||
* @param[out] out Output nanoseconds value.
|
||||
*/
|
||||
Result sslConnectionGetDtlsHandshakeTimeout(SslConnection *c, u64 *out);
|
||||
|
||||
/**
|
||||
* @brief SetPrivateOption
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslConnection
|
||||
* @param[in] option \ref SslPrivateOptionType
|
||||
* @param[in] value Input value.
|
||||
*/
|
||||
Result sslConnectionSetPrivateOption(SslConnection *c, SslPrivateOptionType option, u32 value);
|
||||
|
||||
/**
|
||||
* @brief SetSrtpCiphers
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslConnection
|
||||
* @param[in] ciphers Input array of u16s. Each entry must be value 1-2, otherwise the entry is ignored.
|
||||
* @param[in] count Total entries in the ciphers array, the maximum is 4.
|
||||
*/
|
||||
Result sslConnectionSetSrtpCiphers(SslConnection *c, const u16 *ciphers, u32 count);
|
||||
|
||||
/**
|
||||
* @brief GetSrtpCipher
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslConnection
|
||||
* @param[out] out Output value.
|
||||
*/
|
||||
Result sslConnectionGetSrtpCipher(SslConnection *c, u16 *out);
|
||||
|
||||
/**
|
||||
* @brief ExportKeyingMaterial
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslConnection
|
||||
* @param[out] outbuf Output buffer.
|
||||
* @param[in] outbuf_size Output buffer size.
|
||||
* @param[in] label Input label string.
|
||||
* @param[in] label_size Size of the label buffer excluding NUL-terminator.
|
||||
* @param[in] context Optional input context buffer, can be NULL.
|
||||
* @param[in] context_size Size of context, if specified this must be <0xFFFF.
|
||||
*/
|
||||
Result sslConnectionExportKeyingMaterial(SslConnection *c, u8 *outbuf, u32 outbuf_size, const char *label, u32 label_size, const void* context, u32 context_size);
|
||||
|
||||
/**
|
||||
* @brief SetIoTimeout
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslConnection
|
||||
* @param[in] timeout Input timeout value.
|
||||
*/
|
||||
Result sslConnectionSetIoTimeout(SslConnection *c, u32 timeout);
|
||||
|
||||
/**
|
||||
* @brief GetIoTimeout
|
||||
* @note Only available on [16.0.0+].
|
||||
* @param c \ref SslConnection
|
||||
* @param[out] out Output timeout value.
|
||||
*/
|
||||
Result sslConnectionGetIoTimeout(SslConnection *c, u32 *out);
|
||||
|
||||
///@}
|
||||
|
||||
|
@ -14,6 +14,15 @@ typedef enum {
|
||||
TsLocation_External = 1, ///< TMP451 External: SoC
|
||||
} TsLocation;
|
||||
|
||||
typedef enum {
|
||||
TsDeviceCode_LocationInternal = 0x41000001u,
|
||||
TsDeviceCode_LocationExternal = 0x41000002u,
|
||||
} TsDeviceCode;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
} TsSession;
|
||||
|
||||
/// Initialize ts.
|
||||
Result tsInitialize(void);
|
||||
|
||||
@ -39,9 +48,13 @@ Result tsGetTemperatureRange(TsLocation location, s32 *min_temperature, s32 *max
|
||||
Result tsGetTemperature(TsLocation location, s32 *temperature);
|
||||
|
||||
/**
|
||||
* @brief Gets the temperature for the specified \ref TsLocation, in MilliC.
|
||||
* @brief Gets the temperature for the specified \ref TsLocation, in MilliC. [1.0.0-13.2.1]
|
||||
* @param[in] location \ref TsLocation
|
||||
* @param[out] temperature Output temperature in MilliC.
|
||||
*/
|
||||
Result tsGetTemperatureMilliC(TsLocation location, s32 *temperature);
|
||||
|
||||
Result tsOpenSession(TsSession *s, u32 device_code); ///< [8.0.0+]
|
||||
|
||||
Result tsSessionGetTemperature(TsSession *s, float *temperature); ///< [10.0.0+]
|
||||
void tsSessionClose(TsSession *s);
|
@ -54,6 +54,7 @@ Service* uartGetServiceSession(void);
|
||||
|
||||
/**
|
||||
* @brief HasPort
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPort
|
||||
* @param[out] out Output success flag.
|
||||
*/
|
||||
@ -61,6 +62,7 @@ Result uartHasPort(UartPort port, bool *out);
|
||||
|
||||
/**
|
||||
* @brief HasPortForDev
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPortForDev
|
||||
* @param[out] out Output success flag.
|
||||
*/
|
||||
@ -68,6 +70,7 @@ Result uartHasPortForDev(UartPortForDev port, bool *out);
|
||||
|
||||
/**
|
||||
* @brief IsSupportedBaudRate
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPort
|
||||
* @param[in] baud_rate BaudRate
|
||||
* @param[out] out Output success flag.
|
||||
@ -76,6 +79,7 @@ Result uartIsSupportedBaudRate(UartPort port, u32 baud_rate, bool *out);
|
||||
|
||||
/**
|
||||
* @brief IsSupportedBaudRateForDev
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPortForDev
|
||||
* @param[in] baud_rate BaudRate
|
||||
* @param[out] out Output success flag.
|
||||
@ -84,6 +88,7 @@ Result uartIsSupportedBaudRateForDev(UartPortForDev port, u32 baud_rate, bool *o
|
||||
|
||||
/**
|
||||
* @brief IsSupportedFlowControlMode
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPort
|
||||
* @param[in] flow_control_mode \ref UartFlowControlMode
|
||||
* @param[out] out Output success flag.
|
||||
@ -92,6 +97,7 @@ Result uartIsSupportedFlowControlMode(UartPort port, UartFlowControlMode flow_co
|
||||
|
||||
/**
|
||||
* @brief IsSupportedFlowControlModeForDev
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPortForDev
|
||||
* @param[in] flow_control_mode \ref UartFlowControlMode
|
||||
* @param[out] out Output success flag.
|
||||
@ -107,6 +113,7 @@ Result uartCreatePortSession(UartPortSession *s);
|
||||
|
||||
/**
|
||||
* @brief IsSupportedPortEvent
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPort
|
||||
* @param[in] port_event_type \ref UartPortEventType
|
||||
* @param[out] out Output success flag.
|
||||
@ -115,6 +122,7 @@ Result uartIsSupportedPortEvent(UartPort port, UartPortEventType port_event_type
|
||||
|
||||
/**
|
||||
* @brief IsSupportedPortEventForDev
|
||||
* @note Only available on [1.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPortForDev
|
||||
* @param[in] port_event_type \ref UartPortEventType
|
||||
* @param[out] out Output success flag.
|
||||
@ -123,7 +131,7 @@ Result uartIsSupportedPortEventForDev(UartPortForDev port, UartPortEventType por
|
||||
|
||||
/**
|
||||
* @brief IsSupportedDeviceVariation
|
||||
* @note Only available on [7.0.0+].
|
||||
* @note Only available on [7.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPort
|
||||
* @param[in] device_variation DeviceVariation
|
||||
* @param[out] out Output success flag.
|
||||
@ -132,7 +140,7 @@ Result uartIsSupportedDeviceVariation(UartPort port, u32 device_variation, bool
|
||||
|
||||
/**
|
||||
* @brief IsSupportedDeviceVariationForDev
|
||||
* @note Only available on [7.0.0+].
|
||||
* @note Only available on [7.0.0-16.1.0].
|
||||
* @param[in] port \ref UartPortForDev
|
||||
* @param[in] device_variation DeviceVariation
|
||||
* @param[out] out Output success flag.
|
||||
|
@ -29,7 +29,7 @@ struct usb_endpoint_descriptor {
|
||||
uint8_t bmAttributes;
|
||||
uint16_t wMaxPacketSize;
|
||||
uint8_t bInterval;
|
||||
} PACKED;
|
||||
} NX_PACKED;
|
||||
|
||||
/// Imported from libusb, with some adjustments.
|
||||
struct usb_interface_descriptor {
|
||||
@ -72,7 +72,7 @@ struct usb_config_descriptor {
|
||||
uint8_t iConfiguration;
|
||||
uint8_t bmAttributes;
|
||||
uint8_t MaxPower;
|
||||
} PACKED;
|
||||
} NX_PACKED;
|
||||
|
||||
/// Imported from libusb, with some adjustments.
|
||||
struct usb_ss_endpoint_companion_descriptor {
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "../sf/service.h"
|
||||
#include "../services/usb.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../kernel/tmem.h"
|
||||
|
||||
typedef enum {
|
||||
///< These use \ref usb_device_descriptor. Bit2..6 require [6.0.0+], these are ignored on eariler versions.
|
||||
@ -59,7 +60,7 @@ typedef struct {
|
||||
u8 pad_x155[0x6];
|
||||
struct usb_ss_endpoint_companion_descriptor output_ss_endpoint_companion_descs[15]; ///< ?
|
||||
u8 pad_x1b5[0x3];
|
||||
} PACKED UsbHsInterfaceInfo;
|
||||
} NX_PACKED UsbHsInterfaceInfo;
|
||||
|
||||
/// Interface struct. Note that devices have a seperate \ref UsbHsInterface for each interface.
|
||||
typedef struct {
|
||||
@ -74,16 +75,21 @@ typedef struct {
|
||||
u8 pad_x21b[0x5];
|
||||
|
||||
u64 timestamp; ///< Unknown u64 timestamp for when the device was inserted?
|
||||
} PACKED UsbHsInterface;
|
||||
} NX_PACKED UsbHsInterface;
|
||||
|
||||
typedef struct {
|
||||
u32 xferId;
|
||||
Result res;
|
||||
u32 requestedSize;
|
||||
u32 transferredSize;
|
||||
u64 unk_x10;
|
||||
u64 id; ///< id from \ref usbHsEpPostBufferAsync.
|
||||
} UsbHsXferReport;
|
||||
|
||||
typedef struct {
|
||||
vu64 write_index;
|
||||
vu64 read_index;
|
||||
} UsbHsRingHeader;
|
||||
|
||||
/// The interface service object. These Events have autoclear=false.
|
||||
typedef struct {
|
||||
Service s;
|
||||
@ -97,6 +103,9 @@ typedef struct {
|
||||
typedef struct {
|
||||
Service s;
|
||||
Event eventXfer; ///< [2.0.0+] Signaled when PostBufferAsync finishes.
|
||||
u32 maxUrbCount;
|
||||
u64 max_reports;
|
||||
void* ringbuf;
|
||||
|
||||
struct usb_endpoint_descriptor desc;
|
||||
} UsbHsClientEpSession;
|
||||
@ -226,6 +235,79 @@ Result usbHsIfResetDevice(UsbHsClientIfSession* s);
|
||||
/// Closes the specified endpoint session.
|
||||
void usbHsEpClose(UsbHsClientEpSession* s);
|
||||
|
||||
/// Uses a data transfer with the specified endpoint, this will block until the transfer finishes. The buffer address and size should be aligned to 0x1000-bytes, where the input size is the original size.
|
||||
/// Gets the Xfer Event which is signaled when PostBufferAsync finishes. This is only valid for [2.0.0+]. If using \ref eventWait with this, then \ref eventClear should be used if the event was signaled (since the autoclear is false).
|
||||
NX_CONSTEXPR Event* usbHsEpGetXferEvent(UsbHsClientEpSession* s) {
|
||||
return &s->eventXfer;
|
||||
}
|
||||
|
||||
/// Gets the buffer size to use with \ref usbHsEpShareReportRing.
|
||||
NX_CONSTEXPR u32 usbHsEpGetReportRingSize(UsbHsClientEpSession* s) {
|
||||
u64 max_reports = s->maxUrbCount * 0x21;
|
||||
u32 size = sizeof(UsbHsRingHeader) + max_reports*sizeof(UsbHsXferReport);
|
||||
size = (size+0xFFF) & ~0xFFF;
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Starts an async data transfer with the specified endpoint. The Event from \ref usbHsEpGetXferEvent can be used to determine when the transfer finished. If you don't need async, \ref usbHsEpPostBuffer can be used instead.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[in] s The endpoint object.
|
||||
* @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes.
|
||||
* @param[in] size The actual data size.
|
||||
* @param[in] id This is an arbitrary value which will be later returned in \ref UsbHsXferReport. For example a value starting at 0 can be used, then if sending multiple requests at once this value can be incremented each time (with 0 for the first request in this set of requests).
|
||||
* @param[out] xferId Output xferId.
|
||||
*/
|
||||
Result usbHsEpPostBufferAsync(UsbHsClientEpSession* s, void* buffer, u32 size, u64 id, u32* xferId);
|
||||
|
||||
/**
|
||||
* @brief Gets an array of \ref UsbHsXferReport for the specified endpoint. This should be used after waiting on the Event from \ref usbHsEpGetXferEvent.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[in] s The endpoint object.
|
||||
* @param[out] reports Output array of \ref UsbHsXferReport.
|
||||
* @param[in] max_reports Size of the reports array in entries.
|
||||
* @param[out] count Number of entries written to the array.
|
||||
*/
|
||||
Result usbHsEpGetXferReport(UsbHsClientEpSession* s, UsbHsXferReport* reports, u32 max_reports, u32* count);
|
||||
|
||||
/**
|
||||
* @brief Uses a data transfer with the specified endpoint, this will block until the transfer finishes. This wraps \ref usbHsEpPostBufferAsync and \ref usbHsEpGetXferReport, and also handles the Event (on pre-2.0.0 this handles using the relevant cmds instead). If async is needed, use \ref usbHsEpPostBufferAsync instead.
|
||||
* @param[in] s The endpoint object.
|
||||
* @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes.
|
||||
* @param[in] size The actual data size.
|
||||
* @param[out] transferredSize Output transferred size.
|
||||
*/
|
||||
Result usbHsEpPostBuffer(UsbHsClientEpSession* s, void* buffer, u32 size, u32* transferredSize);
|
||||
|
||||
/**
|
||||
* @brief This uses the same functionality internally as \ref usbHsEpPostBufferAsync except the urbs array and unk1/unk2 are specified by the user instead.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[in] s The endpoint object.
|
||||
* @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes.
|
||||
* @param[in] urbs Input array of u32s for the size of each urb.
|
||||
* @param[in] urbCount Total entries in the urbs array.
|
||||
* @param[in] id Same as \ref usbHsEpPostBufferAsync.
|
||||
* @param[in] unk1 \ref usbHsEpPostBufferAsync would internally pass value 0 here.
|
||||
* @param[in] unk2 \ref usbHsEpPostBufferAsync would internally pass value 0 here.
|
||||
* @param[out] xferId Output xferId.
|
||||
*/
|
||||
Result usbHsEpBatchBufferAsync(UsbHsClientEpSession* s, void* buffer, u32* urbs, u32 urbCount, u64 id, u32 unk1, u32 unk2, u32* xferId);
|
||||
|
||||
/**
|
||||
* @brief This can be used to map the specified buffer as devicemem, which can then be used with \ref usbHsEpPostBufferAsync / \ref usbHsEpPostBuffer / \ref usbHsEpBatchBufferAsync. If the buffer address passed to those funcs is within this SmmuSpace, the specified buffer must be within the bounds of the SmmuSpace buffer.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @note A buffer from usbHsEpCreateSmmuSpace can't be reused by another endpoint with the aforementioned funcs.
|
||||
* @note This can only be used once per UsbHsClientEpSession object.
|
||||
* @param[in] s The endpoint object.
|
||||
* @param buffer Buffer address, this must be aligned to 0x1000-bytes.
|
||||
* @param[in] size Buffer size, this must be aligned to 0x1000-bytes.
|
||||
*/
|
||||
Result usbHsEpCreateSmmuSpace(UsbHsClientEpSession* s, void* buffer, u32 size);
|
||||
|
||||
/**
|
||||
* @brief This creates TransferMemory which is used to read \ref UsbHsXferReport when \ref usbHsEpGetXferReport is used, instead of using the service cmd.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param buffer Buffer, must be 0x1000-byte aligned.
|
||||
* @param[in] size Buffer size, \ref usbHsEpGetReportRingSize can be used to calculate this.
|
||||
*/
|
||||
Result usbHsEpShareReportRing(UsbHsClientEpSession* s, void* buffer, size_t size);
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../sf/service.h"
|
||||
#include "pl.h"
|
||||
|
||||
typedef struct {
|
||||
char data[0x40];
|
||||
@ -68,6 +69,10 @@ typedef enum {
|
||||
ViLayerStack_Null = 10, ///< Layer stack for the empty display.
|
||||
} ViLayerStack;
|
||||
|
||||
/// Used as argument for certain drawing commands.
|
||||
typedef u16 ViColorRgba4444;
|
||||
typedef u32 ViColorRgba8888;
|
||||
|
||||
Result viInitialize(ViServiceType service_type);
|
||||
void viExit(void);
|
||||
|
||||
@ -116,3 +121,9 @@ Result viSetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode);
|
||||
|
||||
Result viGetIndirectLayerImageMap(void* buffer, size_t size, s32 width, s32 height, u64 IndirectLayerConsumerHandle, u64 *out_size, u64 *out_stride);
|
||||
Result viGetIndirectLayerImageRequiredMemoryInfo(s32 width, s32 height, u64 *out_size, u64 *out_alignment);
|
||||
|
||||
// Manager functions
|
||||
Result viManagerPrepareFatal(void); ///< [16.0.0+]
|
||||
Result viManagerShowFatal(void); ///< [16.0.0+]
|
||||
Result viManagerDrawFatalRectangle(s32 x, s32 y, s32 end_x, s32 end_y, ViColorRgba4444 color); ///< [16.0.0+]
|
||||
Result viManagerDrawFatalText32(s32 *out_advance, s32 x, s32 y, const u32 *utf32_codepoints, size_t num_codepoints, float scale_x, float scale_y, PlSharedFontType font_type, ViColorRgba8888 bg_color, ViColorRgba8888 fg_color, s32 initial_advance); ///< [16.0.0+]
|
||||
|
@ -16,7 +16,7 @@ typedef enum {
|
||||
WlanInfState_Connected, ///< WLAN is connected.
|
||||
} WlanInfState;
|
||||
|
||||
/// Initialize wlan:inf.
|
||||
/// [1.0.0-14.1.2] Initialize wlan:inf.
|
||||
Result wlaninfInitialize(void);
|
||||
|
||||
/// Exit wlan:inf.
|
||||
|
@ -91,13 +91,13 @@ typedef struct CmifResponse {
|
||||
Handle* move_handles;
|
||||
} CmifResponse;
|
||||
|
||||
NX_CONSTEXPR void* cmifGetAlignedDataStart(u32* data_words, void* base)
|
||||
NX_INLINE void* cmifGetAlignedDataStart(u32* data_words, void* base)
|
||||
{
|
||||
intptr_t data_start = ((u8*)data_words - (u8*)base + 15) &~ 15;
|
||||
return (u8*)base + data_start;
|
||||
}
|
||||
|
||||
NX_CONSTEXPR CmifRequest cmifMakeRequest(void* base, CmifRequestFormat fmt)
|
||||
NX_INLINE CmifRequest cmifMakeRequest(void* base, CmifRequestFormat fmt)
|
||||
{
|
||||
// First of all, we need to figure out what size we need.
|
||||
u32 actual_size = 16;
|
||||
@ -156,7 +156,7 @@ NX_CONSTEXPR CmifRequest cmifMakeRequest(void* base, CmifRequestFormat fmt)
|
||||
return req;
|
||||
}
|
||||
|
||||
NX_CONSTEXPR void* cmifMakeControlRequest(void* base, u32 request_id, u32 size)
|
||||
NX_INLINE void* cmifMakeControlRequest(void* base, u32 request_id, u32 size)
|
||||
{
|
||||
u32 actual_size = 16 + sizeof(CmifInHeader) + size;
|
||||
HipcRequest hipc = hipcMakeRequestInline(base,
|
||||
@ -173,7 +173,7 @@ NX_CONSTEXPR void* cmifMakeControlRequest(void* base, u32 request_id, u32 size)
|
||||
return hdr+1;
|
||||
}
|
||||
|
||||
NX_CONSTEXPR void cmifMakeCloseRequest(void* base, u32 object_id)
|
||||
NX_INLINE void cmifMakeCloseRequest(void* base, u32 object_id)
|
||||
{
|
||||
if (object_id) {
|
||||
HipcRequest hipc = hipcMakeRequestInline(base,
|
||||
@ -257,7 +257,7 @@ NX_CONSTEXPR void cmifRequestHandle(CmifRequest* req, Handle handle)
|
||||
*req->hipc.copy_handles++ = handle;
|
||||
}
|
||||
|
||||
NX_CONSTEXPR Result cmifParseResponse(CmifResponse* res, void* base, bool is_domain, u32 size)
|
||||
NX_INLINE Result cmifParseResponse(CmifResponse* res, void* base, bool is_domain, u32 size)
|
||||
{
|
||||
HipcResponse hipc = hipcParseResponse(base);
|
||||
void* start = cmifGetAlignedDataStart(hipc.data_words, base);
|
||||
|
@ -6,6 +6,7 @@
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include <assert.h>
|
||||
#include "hipc.h"
|
||||
#include "cmif.h"
|
||||
|
||||
@ -473,14 +474,45 @@ NX_INLINE Result serviceDispatchImpl(
|
||||
return rc;
|
||||
}
|
||||
|
||||
#ifndef __cplusplus
|
||||
|
||||
#define serviceMacroDetectIsSameType(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
||||
#define serviceMacroDetectIsPointerOrArray(p) (__builtin_classify_type(p) == 5)
|
||||
#define serviceMacroDecay(p) (&*__builtin_choose_expr(serviceMacroDetectIsPointerOrArray(p), p, NULL))
|
||||
#define serviceMacroDetectIsPointer(p) serviceMacroDetectIsSameType(p, serviceMacroDecay(p))
|
||||
|
||||
#else
|
||||
|
||||
extern "C++" {
|
||||
|
||||
namespace libnx::impl {
|
||||
|
||||
template<typename T> struct is_pointer { static constexpr bool value = false; };
|
||||
template<typename T> struct is_pointer<T*> { static constexpr bool value = true; };
|
||||
template<typename T> struct is_pointer<T* const> { static constexpr bool value = true; };
|
||||
template<typename T> struct is_pointer<T* volatile> { static constexpr bool value = true; };
|
||||
template<typename T> struct is_pointer<T* const volatile> { static constexpr bool value = true; };
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#define serviceMacroDetectIsPointer(p) (::libnx::impl::is_pointer<decltype(p)>::value)
|
||||
|
||||
#endif
|
||||
|
||||
#define serviceDispatch(_s,_rid,...) \
|
||||
serviceDispatchImpl((_s),(_rid),NULL,0,NULL,0,(SfDispatchParams){ __VA_ARGS__ })
|
||||
|
||||
#define serviceDispatchIn(_s,_rid,_in,...) \
|
||||
serviceDispatchImpl((_s),(_rid),&(_in),sizeof(_in),NULL,0,(SfDispatchParams){ __VA_ARGS__ })
|
||||
({ static_assert(!(serviceMacroDetectIsPointer(_in))); \
|
||||
serviceDispatchImpl((_s),(_rid),&(_in),sizeof(_in),NULL,0,(SfDispatchParams){ __VA_ARGS__ }); })
|
||||
|
||||
#define serviceDispatchOut(_s,_rid,_out,...) \
|
||||
serviceDispatchImpl((_s),(_rid),NULL,0,&(_out),sizeof(_out),(SfDispatchParams){ __VA_ARGS__ })
|
||||
({ static_assert(!(serviceMacroDetectIsPointer(_out))); \
|
||||
serviceDispatchImpl((_s),(_rid),NULL,0,&(_out),sizeof(_out),(SfDispatchParams){ __VA_ARGS__ }); })
|
||||
|
||||
#define serviceDispatchInOut(_s,_rid,_in,_out,...) \
|
||||
serviceDispatchImpl((_s),(_rid),&(_in),sizeof(_in),&(_out),sizeof(_out),(SfDispatchParams){ __VA_ARGS__ })
|
||||
({ static_assert(!(serviceMacroDetectIsPointer(_in))); \
|
||||
static_assert(!(serviceMacroDetectIsPointer(_out))); \
|
||||
serviceDispatchImpl((_s),(_rid),&(_in),sizeof(_in),&(_out),sizeof(_out),(SfDispatchParams){ __VA_ARGS__ }); })
|
||||
|
@ -54,27 +54,31 @@ typedef struct { float value[3]; } UtilFloat3; ///< 3 floats.
|
||||
#define BIT(n) (1U<<(n))
|
||||
#endif
|
||||
|
||||
#ifndef BITL
|
||||
#define BITL(n) (1UL<<(n))
|
||||
#endif
|
||||
|
||||
/// Packs a struct so that it won't include padding bytes.
|
||||
#ifndef PACKED
|
||||
#define PACKED __attribute__((packed))
|
||||
#ifndef NX_PACKED
|
||||
#define NX_PACKED __attribute__((packed))
|
||||
#endif
|
||||
|
||||
/// Marks a function as not returning, for the purposes of compiler optimization.
|
||||
#ifndef NORETURN
|
||||
#define NORETURN __attribute__((noreturn))
|
||||
#ifndef NX_NORETURN
|
||||
#define NX_NORETURN __attribute__((noreturn))
|
||||
#endif
|
||||
|
||||
/// Performs a dummy operation on the specified argument in order to silence compiler warnings about unused arguments.
|
||||
#ifndef IGNORE_ARG
|
||||
#define IGNORE_ARG(x) (void)(x)
|
||||
#ifndef NX_IGNORE_ARG
|
||||
#define NX_IGNORE_ARG(x) (void)(x)
|
||||
#endif
|
||||
|
||||
/// Flags a function as deprecated.
|
||||
#ifndef DEPRECATED
|
||||
#ifndef NX_DEPRECATED
|
||||
#ifndef LIBNX_NO_DEPRECATION
|
||||
#define DEPRECATED __attribute__ ((deprecated))
|
||||
#define NX_DEPRECATED __attribute__ ((deprecated))
|
||||
#else
|
||||
#define DEPRECATED
|
||||
#define NX_DEPRECATED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -553,7 +553,7 @@ Result swkbdInlineGetImage(SwkbdInline* s, void* buffer, u64 size, bool *data_av
|
||||
if (!buffer || !size) return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||
|
||||
if (_swkbdInlineHandleFinished(s)) {
|
||||
data_available = false;
|
||||
*data_available = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -604,7 +604,7 @@ s32 swkbdInlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *
|
||||
|
||||
if (!s->calcArg.footerScalable) {
|
||||
footer_max_height-= 72.0f;
|
||||
if (s->calcArg.keytopAsFloating) footer_max_height+= 1.4f;
|
||||
if (s->calcArg.keytopAsFloating) footer_max_height+= 14.0f;
|
||||
}
|
||||
|
||||
if (keytop) {
|
||||
@ -612,7 +612,7 @@ s32 swkbdInlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *
|
||||
float width = s->calcArg.keytopScaleX*image_width;
|
||||
float scale_y = s->calcArg.keytopScaleY;
|
||||
float tmp_y = (keytop_max_height - 360.0f)*scale_y;
|
||||
keytop->x = lroundf(((width*-5.0f)+640.0f) + (s->calcArg.keytopTranslateX*image_width)); // This results in a negative value with the default keytopTranslateX. sdknso uses 5.0f, but 0.5f was likely (?) intended - we do the same as sdknso anyway though.
|
||||
keytop->x = lroundf(((width*-0.5f)+640.0f) + (s->calcArg.keytopTranslateX*image_width));
|
||||
keytop->y = lroundf((360.0f - tmp_y) - (s->calcArg.keytopTranslateY * 720.0f));
|
||||
keytop->width = lroundf(width);
|
||||
keytop->height = lroundf(footer_max_height*scale_y);
|
||||
|
@ -582,7 +582,7 @@ Result webConfigSetWebAudio(WebCommonConfig* config, bool flag) {
|
||||
return _webConfigSetFlag(config, WebArgType_WebAudio, flag);
|
||||
}
|
||||
|
||||
Result webConfigSetFooterFixedKind(WebCommonConfig* config, u32 kind) {
|
||||
Result webConfigSetFooterFixedKind(WebCommonConfig* config, WebFooterFixedKind kind) {
|
||||
WebShimKind shim = _webGetShimKind(config);
|
||||
if (shim != WebShimKind_Offline && shim != WebShimKind_Web) return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||
if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
|
||||
|
@ -22,6 +22,10 @@ CODE_BEGIN armDCacheFlush
|
||||
bic x8, x0, x10
|
||||
mov x10, x1
|
||||
|
||||
mov w1, #1
|
||||
mrs x0, tpidrro_el0
|
||||
strb w1, [x0, #0x104]
|
||||
|
||||
armDCacheFlush_L0:
|
||||
dc civac, x8
|
||||
add x8, x8, x9
|
||||
@ -29,6 +33,9 @@ armDCacheFlush_L0:
|
||||
bcc armDCacheFlush_L0
|
||||
|
||||
dsb sy
|
||||
|
||||
strb wzr, [x0, #0x104]
|
||||
|
||||
ret
|
||||
CODE_END
|
||||
|
||||
@ -43,6 +50,10 @@ CODE_BEGIN armDCacheClean
|
||||
bic x8, x0, x10
|
||||
mov x10, x1
|
||||
|
||||
mov w1, #1
|
||||
mrs x0, tpidrro_el0
|
||||
strb w1, [x0, #0x104]
|
||||
|
||||
armDCacheClean_L0:
|
||||
dc cvac, x8
|
||||
add x8, x8, x9
|
||||
@ -50,6 +61,9 @@ armDCacheClean_L0:
|
||||
bcc armDCacheClean_L0
|
||||
|
||||
dsb sy
|
||||
|
||||
strb wzr, [x0, #0x104]
|
||||
|
||||
ret
|
||||
CODE_END
|
||||
|
||||
@ -63,6 +77,10 @@ CODE_BEGIN armICacheInvalidate
|
||||
bic x8, x0, x10
|
||||
mov x10, x1
|
||||
|
||||
mov w1, #1
|
||||
mrs x0, tpidrro_el0
|
||||
strb w1, [x0, #0x104]
|
||||
|
||||
armICacheInvalidate_L0:
|
||||
ic ivau, x8
|
||||
add x8, x8, x9
|
||||
@ -70,6 +88,10 @@ armICacheInvalidate_L0:
|
||||
bcc armICacheInvalidate_L0
|
||||
|
||||
dsb sy
|
||||
isb
|
||||
|
||||
strb wzr, [x0, #0x104]
|
||||
|
||||
ret
|
||||
CODE_END
|
||||
|
||||
@ -84,6 +106,10 @@ CODE_BEGIN armDCacheZero
|
||||
bic x8, x0, x10
|
||||
mov x10, x1
|
||||
|
||||
mov w1, #1
|
||||
mrs x0, tpidrro_el0
|
||||
strb w1, [x0, #0x104]
|
||||
|
||||
armDCacheZero_L0:
|
||||
dc zva, x8
|
||||
add x8, x8, x9
|
||||
@ -91,5 +117,8 @@ armDCacheZero_L0:
|
||||
bcc armDCacheZero_L0
|
||||
|
||||
dsb sy
|
||||
|
||||
strb wzr, [x0, #0x104]
|
||||
|
||||
ret
|
||||
CODE_END
|
||||
|
@ -261,8 +261,9 @@ static inline void _aes128CbcDecryptBlocks(Aes128CbcContext *ctx, u8 *dst_u8, co
|
||||
AES_ENC_DEC_INPUT_ROUND_KEY(10)
|
||||
);
|
||||
|
||||
/* Update IV. */
|
||||
cur_iv = tmp0;
|
||||
/* Do XOR for CBC. */
|
||||
tmp0 = veorq_u8(tmp0, cur_iv);
|
||||
cur_iv = block0;
|
||||
|
||||
/* Store to output. */
|
||||
vst1q_u8(dst_u8, tmp0);
|
||||
@ -478,8 +479,9 @@ static inline void _aes192CbcDecryptBlocks(Aes192CbcContext *ctx, u8 *dst_u8, co
|
||||
AES_ENC_DEC_INPUT_ROUND_KEY(12)
|
||||
);
|
||||
|
||||
/* Update IV. */
|
||||
cur_iv = tmp0;
|
||||
/* Do XOR for CBC. */
|
||||
tmp0 = veorq_u8(tmp0, cur_iv);
|
||||
cur_iv = block0;
|
||||
|
||||
/* Store to output. */
|
||||
vst1q_u8(dst_u8, tmp0);
|
||||
@ -711,8 +713,9 @@ static inline void _aes256CbcDecryptBlocks(Aes256CbcContext *ctx, u8 *dst_u8, co
|
||||
AES_ENC_DEC_INPUT_ROUND_KEY(14)
|
||||
);
|
||||
|
||||
/* Update IV. */
|
||||
cur_iv = tmp0;
|
||||
/* Do XOR for CBC. */
|
||||
tmp0 = veorq_u8(tmp0, cur_iv);
|
||||
cur_iv = block0;
|
||||
|
||||
/* Store to output. */
|
||||
vst1q_u8(dst_u8, tmp0);
|
||||
|
@ -163,7 +163,7 @@ static void _sha256ProcessBlocks(Sha256Context *ctx, const u8 *src_u8, size_t nu
|
||||
[cur_hash0]"+w"(cur_hash0), [cur_hash1]"+w"(cur_hash1),
|
||||
[prev_hash0]"+w"(prev_hash0), [prev_hash1]"+w"(prev_hash1),
|
||||
[tmp_hash]"=w"(tmp_hash), [src_u8]"+r"(src_u8)
|
||||
: [round_constants]"r"(s_roundConstants)
|
||||
: "m"(*(const u8 (*)[num_blocks*SHA256_BLOCK_SIZE])src_u8), [round_constants]"r"(s_roundConstants)
|
||||
:
|
||||
);
|
||||
|
||||
|
@ -27,6 +27,19 @@ static Result _nwindowConnect(NWindow* nw)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static Result _nwindowCancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence)
|
||||
{
|
||||
static const NvMultiFence s_emptyFence = {0};
|
||||
if (!fence)
|
||||
fence = &s_emptyFence;
|
||||
|
||||
Result rc = bqCancelBuffer(&nw->bq, slot, fence);
|
||||
if (R_SUCCEEDED(rc))
|
||||
nw->cur_slot = -1;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static Result _nwindowDisconnect(NWindow* nw)
|
||||
{
|
||||
Result rc = bqDisconnect(&nw->bq, NATIVE_WINDOW_API_CPU);
|
||||
@ -267,13 +280,7 @@ Result nwindowCancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence)
|
||||
return MAKERESULT(Module_Libnx, LibnxError_BadGfxQueueBuffer);
|
||||
}
|
||||
|
||||
static const NvMultiFence s_emptyFence = {0};
|
||||
if (!fence)
|
||||
fence = &s_emptyFence;
|
||||
|
||||
Result rc = bqCancelBuffer(&nw->bq, slot, fence);
|
||||
if (R_SUCCEEDED(rc))
|
||||
nw->cur_slot = -1;
|
||||
Result rc = _nwindowCancelBuffer(nw, slot, fence);
|
||||
|
||||
mutexUnlock(&nw->mutex);
|
||||
return rc;
|
||||
@ -323,8 +330,9 @@ Result nwindowReleaseBuffers(NWindow* nw)
|
||||
mutexLock(&nw->mutex);
|
||||
|
||||
if (nw->cur_slot >= 0)
|
||||
rc = MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||
else if (nw->is_connected && nw->slots_configured)
|
||||
rc = _nwindowCancelBuffer(nw, nw->cur_slot, NULL);
|
||||
|
||||
if (R_SUCCEEDED(rc) && nw->is_connected && nw->slots_configured)
|
||||
rc = _nwindowDisconnect(nw);
|
||||
|
||||
mutexUnlock(&nw->mutex);
|
||||
|
@ -38,7 +38,6 @@ Result parcelTransact(Binder *session, u32 code, Parcel *in_parcel, Parcel *out_
|
||||
in_hdr->objects_size = in_parcel->objects_size;
|
||||
in_hdr->objects_off = sizeof(ParcelHeader) + in_parcel->payload_size;
|
||||
|
||||
if (in_parcel->payload != NULL)
|
||||
memcpy(&in[in_hdr->payload_off], in_parcel->payload, in_parcel->payload_size);
|
||||
|
||||
if (in_parcel->objects != NULL)
|
||||
|
@ -23,6 +23,21 @@ typedef struct {
|
||||
void* tls_tp; // !! Offset needs to be TLS+0x1F8 for __aarch64_read_tp !!
|
||||
} ThreadVars;
|
||||
|
||||
extern const u8 __tdata_lma[];
|
||||
extern const u8 __tdata_lma_end[];
|
||||
extern u8 __tls_start[];
|
||||
extern u8 __tls_end[];
|
||||
extern size_t __tls_align;
|
||||
|
||||
static inline ThreadVars* getThreadVars(void) {
|
||||
return (ThreadVars*)((u8*)armGetTls() + 0x200 - sizeof(ThreadVars));
|
||||
}
|
||||
|
||||
NX_INLINE size_t getTlsStartOffset(void)
|
||||
{
|
||||
// TLS region begins with the Thread Control Block (TCB), which is intended
|
||||
// to contain two pointers. The actual tdata/tbss segment follows the TCB,
|
||||
// however if it requires special alignment the offset is rounded up.
|
||||
size_t tcb_sz = 2*sizeof(void*);
|
||||
return __tls_align > tcb_sz ? __tls_align : tcb_sz;
|
||||
}
|
||||
|
@ -18,10 +18,17 @@
|
||||
#define ROTL32(x, n) (((x) << (n)) | ((x) >> (32-(n))))
|
||||
|
||||
#define U32TO8_LITTLE(p, v) \
|
||||
(*(u32*)(p) = (v))
|
||||
({ \
|
||||
u32 __temp = (v); \
|
||||
__builtin_memcpy((void*)(p), &__temp, 4); \
|
||||
})
|
||||
|
||||
#define U8TO32_LITTLE(p) \
|
||||
(*(const u32*)(p))
|
||||
({ \
|
||||
u32 __temp; \
|
||||
__builtin_memcpy(&__temp, (const void*)(p), 4); \
|
||||
__temp; \
|
||||
})
|
||||
|
||||
#define ROTATE(v,c) (ROTL32(v,c))
|
||||
#define XOR(v,w) ((v) ^ (w))
|
||||
|
@ -424,12 +424,12 @@ SVC_BEGIN svcCreateEvent
|
||||
SVC_END
|
||||
|
||||
SVC_BEGIN svcMapIoRegion
|
||||
svc 0x48
|
||||
svc 0x46
|
||||
ret
|
||||
SVC_END
|
||||
|
||||
SVC_BEGIN svcUnmapIoRegion
|
||||
svc 0x49
|
||||
svc 0x47
|
||||
ret
|
||||
SVC_END
|
||||
|
||||
@ -514,7 +514,7 @@ SVC_BEGIN svcQueryPhysicalAddress
|
||||
ret
|
||||
SVC_END
|
||||
|
||||
SVC_BEGIN svcQueryIoMapping
|
||||
SVC_BEGIN svcQueryMemoryMapping
|
||||
stp x0, x1, [sp, #-16]!
|
||||
svc 0x55
|
||||
ldp x3, x4, [sp], #16
|
||||
@ -798,3 +798,13 @@ SVC_BEGIN svcCallSecureMonitor
|
||||
stp x6, x7, [x8, #0x30]
|
||||
ret
|
||||
SVC_END
|
||||
|
||||
SVC_BEGIN svcMapInsecurePhysicalMemory
|
||||
svc 0x90
|
||||
ret
|
||||
SVC_END
|
||||
|
||||
SVC_BEGIN svcUnmapInsecurePhysicalMemory
|
||||
svc 0x91
|
||||
ret
|
||||
SVC_END
|
||||
|
@ -16,11 +16,6 @@
|
||||
#define USER_TLS_END (0x200 - sizeof(ThreadVars))
|
||||
#define NUM_TLS_SLOTS ((USER_TLS_END - USER_TLS_BEGIN) / sizeof(void*))
|
||||
|
||||
extern const u8 __tdata_lma[];
|
||||
extern const u8 __tdata_lma_end[];
|
||||
extern u8 __tls_start[];
|
||||
extern u8 __tls_end[];
|
||||
|
||||
static Mutex g_threadMutex;
|
||||
static Thread* g_threadList;
|
||||
|
||||
@ -45,7 +40,7 @@ static void _EntryWrap(ThreadEntryArgs* args) {
|
||||
tv->magic = THREADVARS_MAGIC;
|
||||
tv->thread_ptr = args->t;
|
||||
tv->reent = args->reent;
|
||||
tv->tls_tp = (u8*)args->tls-2*sizeof(void*); // subtract size of Thread Control Block (TCB)
|
||||
tv->tls_tp = (u8*)args->tls-getTlsStartOffset();
|
||||
tv->handle = args->t->handle;
|
||||
|
||||
// Initialize thread info
|
||||
@ -94,28 +89,35 @@ Result threadCreate(
|
||||
Thread* t, ThreadFunc entry, void* arg, void* stack_mem, size_t stack_sz,
|
||||
int prio, int cpuid)
|
||||
{
|
||||
|
||||
const size_t tls_sz = (__tls_end-__tls_start+0xF) &~ 0xF;
|
||||
const size_t reent_sz = (sizeof(struct _reent)+0xF) &~ 0xF;
|
||||
const size_t tls_sz = (__tls_end-__tls_start+0xF) &~ 0xF;
|
||||
|
||||
// Verify stack size alignment
|
||||
if (stack_sz & 0xFFF) {
|
||||
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||
}
|
||||
|
||||
bool owns_stack_mem;
|
||||
if (stack_mem == NULL) {
|
||||
// Allocate new memory, stack then reent then tls.
|
||||
stack_mem = __libnx_aligned_alloc(0x1000, stack_sz + reent_sz + tls_sz);
|
||||
// Allocate new memory for the stack, tls and reent.
|
||||
stack_mem = __libnx_aligned_alloc(0x1000, stack_sz + tls_sz + reent_sz);
|
||||
|
||||
owns_stack_mem = true;
|
||||
} else {
|
||||
// Use provided memory for stack, reent, and tls.
|
||||
if (((uintptr_t)stack_mem & 0xFFF) || (stack_sz & 0xFFF)) {
|
||||
// Verify alignment of provided memory.
|
||||
if ((uintptr_t)stack_mem & 0xFFF) {
|
||||
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||
}
|
||||
|
||||
// Ensure we don't go out of bounds.
|
||||
if (stack_sz <= tls_sz + reent_sz) {
|
||||
size_t align_mask = getTlsStartOffset()-1;
|
||||
size_t needed_sz = (tls_sz + reent_sz + align_mask) &~ align_mask;
|
||||
if (stack_sz <= needed_sz + sizeof(ThreadEntryArgs)) {
|
||||
return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory);
|
||||
}
|
||||
|
||||
stack_sz -= tls_sz + reent_sz;
|
||||
// Use provided memory for the stack, tls and reent.
|
||||
stack_sz -= needed_sz;
|
||||
owns_stack_mem = false;
|
||||
}
|
||||
|
||||
@ -123,7 +125,7 @@ Result threadCreate(
|
||||
return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory);
|
||||
}
|
||||
|
||||
// Stack size may be unaligned in either case.
|
||||
// Total allocation size may be unaligned in either case.
|
||||
virtmemLock();
|
||||
const size_t aligned_stack_sz = (stack_sz + tls_sz + reent_sz + 0xFFF) & ~0xFFF;
|
||||
void* stack_mirror = virtmemFindStack(aligned_stack_sz, 0x4000);
|
||||
@ -134,8 +136,9 @@ Result threadCreate(
|
||||
{
|
||||
uintptr_t stack_top = (uintptr_t)stack_mirror + stack_sz - sizeof(ThreadEntryArgs);
|
||||
ThreadEntryArgs* args = (ThreadEntryArgs*) stack_top;
|
||||
void *reent = (void*)((uintptr_t)stack_mirror + stack_sz);
|
||||
void *tls = (void*)((uintptr_t)reent + reent_sz);
|
||||
void *tls = (void*)((uintptr_t)stack_mirror + stack_sz);
|
||||
void *reent = (void*)((uintptr_t)tls + tls_sz);
|
||||
|
||||
Handle handle;
|
||||
|
||||
t->handle = INVALID_HANDLE;
|
||||
|
@ -100,6 +100,45 @@ Result tmemUnmap(TransferMemory* t)
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result tmemCloseHandle(TransferMemory* t)
|
||||
{
|
||||
Result rc = 0;
|
||||
|
||||
if (t->handle != INVALID_HANDLE) {
|
||||
rc = svcCloseHandle(t->handle);
|
||||
t->handle = INVALID_HANDLE;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result tmemWaitForPermission(TransferMemory* t, Permission perm)
|
||||
{
|
||||
Result rc = 0;
|
||||
|
||||
if ((t->perm & perm) != perm) {
|
||||
MemoryInfo m = {0};
|
||||
u32 p = 0;
|
||||
rc = svcQueryMemory(&m, &p, (u64)(t->src_addr));
|
||||
|
||||
if (R_FAILED(rc)) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while ((m.perm & perm) != perm) {
|
||||
rc = svcQueryMemory(&m, &p, (u64)(t->src_addr));
|
||||
|
||||
if (R_FAILED(rc)) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
svcSleepThread(100000);
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result tmemClose(TransferMemory* t)
|
||||
{
|
||||
Result rc = 0;
|
||||
@ -109,16 +148,13 @@ Result tmemClose(TransferMemory* t)
|
||||
}
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
if (t->handle != INVALID_HANDLE) {
|
||||
rc = svcCloseHandle(t->handle);
|
||||
}
|
||||
rc = tmemCloseHandle(t);
|
||||
|
||||
if (t->src_addr != NULL) {
|
||||
__libnx_free(t->src_addr);
|
||||
}
|
||||
|
||||
t->src_addr = NULL;
|
||||
t->handle = INVALID_HANDLE;
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
@ -160,6 +160,13 @@ void virtmemSetup(void) {
|
||||
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_WeirdKernel));
|
||||
}
|
||||
|
||||
// Account for the alias region extra size.
|
||||
u64 alias_extra_size;
|
||||
rc = svcGetInfo(&alias_extra_size, InfoType_AliasRegionExtraSize, CUR_PROCESS_HANDLE, 0);
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
g_AliasRegion.end -= alias_extra_size;
|
||||
}
|
||||
|
||||
// Retrieve memory region information for the reserved heap region.
|
||||
rc = _memregionInitWithInfo(&g_HeapRegion, InfoType_HeapRegionAddress, InfoType_HeapRegionSize);
|
||||
if (R_FAILED(rc)) {
|
||||
|
@ -82,6 +82,11 @@ void _nvFenceCleanup(void)
|
||||
}
|
||||
}
|
||||
|
||||
u32 nvFenceGetFd(void)
|
||||
{
|
||||
return g_ctrl_fd;
|
||||
}
|
||||
|
||||
static Result _nvFenceEventWaitCommon(Event* event, u32 event_id, s32 timeout_us)
|
||||
{
|
||||
u64 timeout_ns = UINT64_MAX;
|
||||
|
@ -90,3 +90,11 @@ Result nvGpuZbcAddDepth(float depth)
|
||||
memcpy(&depth_int, &depth, sizeof(float));
|
||||
return nvioctlNvhostCtrlGpu_ZbcSetTable(g_ctrlgpu_fd, NULL, NULL, depth_int, 1, NVGPU_ZBC_TYPE_DEPTH);
|
||||
}
|
||||
|
||||
Result nvGpuGetTimestamp(u64 *ts) {
|
||||
nvioctl_gpu_time data;
|
||||
Result rc = nvioctlNvhostCtrlGpu_GetGpuTime(g_ctrlgpu_fd, &data);
|
||||
if (R_SUCCEEDED(rc) && ts)
|
||||
*ts = data.timestamp;
|
||||
return rc;
|
||||
}
|
||||
|
@ -212,8 +212,7 @@ Result nvioctlChannel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdb
|
||||
__nv_in nvioctl_reloc relocs [num_relocs];
|
||||
__nv_in nvioctl_reloc_shift reloc_shifts[num_relocs];
|
||||
__nv_in nvioctl_syncpt_incr syncpt_incrs[num_syncpt_incrs];
|
||||
__nv_in nvioctl_syncpt_incr wait_checks [num_syncpt_incrs];
|
||||
__nv_out nvioctl_fence fences [num_fences];
|
||||
__nv_inout u32 thresholds [num_fences];
|
||||
} data;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
@ -229,9 +228,12 @@ Result nvioctlChannel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdb
|
||||
Result rc = nvIoctl(fd, _NV_IOWR(0, 0x01, data), &data);
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
memcpy(fences, data.fences, num_fences * sizeof(nvioctl_fence));
|
||||
for (int i = 0; i < num_fences; ++i)
|
||||
fences[i].id = data.syncpt_incrs[i].syncpt_id;
|
||||
for (int i = 0; i < num_fences; ++i) {
|
||||
fences[i] = (nvioctl_fence){
|
||||
.id = syncpt_incrs[i].syncpt_id,
|
||||
.value = data.thresholds[i],
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
@ -254,15 +256,12 @@ Result nvioctlChannel_GetSyncpt(u32 fd, u32 id, u32 *syncpt) {
|
||||
}
|
||||
|
||||
Result nvioctlChannel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq) {
|
||||
struct {
|
||||
__nv_out u32 rate;
|
||||
__nv_in u32 module;
|
||||
} data = {
|
||||
.module = module_id,
|
||||
nvioctl_clk_rate data = {
|
||||
.moduleid = module_id,
|
||||
};
|
||||
|
||||
u32 ioctl = _NV_IOWR(0, hosversionAtLeast(8,0,0) ? 0x14 : 0x23, data);
|
||||
Result rc = nvIoctl(fd, ioctl, &data);
|
||||
u32 nr = _NV_IOWR(0, hosversionBefore(8,0,0) ? 0x14 : 0x23, data);
|
||||
Result rc = nvIoctl(fd, nr, &data);
|
||||
|
||||
if (R_SUCCEEDED(rc) && freq)
|
||||
*freq = data.rate;
|
||||
@ -270,6 +269,25 @@ Result nvioctlChannel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result nvioctlChannel_SetModuleClockRate(u32 fd, u32 module_id, u32 freq) {
|
||||
nvioctl_clk_rate data = {
|
||||
.rate = freq,
|
||||
.moduleid = module_id,
|
||||
};
|
||||
|
||||
return nvIoctl(fd, _NV_IOW(0, 0x08, data), &data);
|
||||
}
|
||||
|
||||
Result nvioctlChannel_SetSubmitTimeout(u32 fd, u32 timeout) {
|
||||
struct {
|
||||
__nv_in u32 timeout;
|
||||
} data = {
|
||||
.timeout = timeout,
|
||||
};
|
||||
|
||||
return nvIoctl(fd, _NV_IOW(0, 0x07, data), &data);
|
||||
}
|
||||
|
||||
Result nvioctlChannel_MapCommandBuffer(u32 fd, nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed) {
|
||||
if (num_maps > 0x200)
|
||||
return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory);
|
||||
|
@ -144,3 +144,21 @@ Result nvioctlNvhostCtrlGpu_ZbcGetActiveSlotMask(u32 fd, nvioctl_zbc_slot_mask *
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result nvioctlNvhostCtrlGpu_GetGpuTime(u32 fd, nvioctl_gpu_time *out) {
|
||||
Result rc = 0;
|
||||
|
||||
struct {
|
||||
__nv_out nvioctl_gpu_time out;
|
||||
} data;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
|
||||
rc = nvIoctl(fd, _NV_IOWR(0x47, 0x1C, data), &data);
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
memcpy(out, &data.out, sizeof(data.out));
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -2,9 +2,20 @@
|
||||
#include <string.h>
|
||||
#include <sys/iosupport.h>
|
||||
#include "runtime/devices/console.h"
|
||||
#include "display/framebuffer.h"
|
||||
|
||||
#include "default_font_bin.h"
|
||||
|
||||
static const u8 colorCube[] = {
|
||||
0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff,
|
||||
};
|
||||
|
||||
static const u8 grayScale[] = {
|
||||
0x08, 0x12, 0x1c, 0x26, 0x30, 0x3a, 0x44, 0x4e,
|
||||
0x58, 0x62, 0x6c, 0x76, 0x80, 0x8a, 0x94, 0x9e,
|
||||
0xa8, 0xb2, 0xbc, 0xc6, 0xd0, 0xda, 0xe4, 0xee,
|
||||
};
|
||||
|
||||
//The below width/height is for 720p.
|
||||
static PrintConsole defaultConsole =
|
||||
{
|
||||
@ -32,6 +43,65 @@ static PrintConsole defaultConsole =
|
||||
false //console initialized
|
||||
};
|
||||
|
||||
static bool parseColor (char **esc, int *escLen, u16 *color, bool *custom)
|
||||
{
|
||||
unsigned int p;
|
||||
unsigned int n;
|
||||
unsigned int r;
|
||||
unsigned int g;
|
||||
unsigned int b;
|
||||
int consumed;
|
||||
|
||||
if (sscanf (*esc, "%d;%n", &p, &consumed) != 1)
|
||||
return false;
|
||||
|
||||
*esc += consumed;
|
||||
*escLen -= consumed;
|
||||
|
||||
if (p == 5) {
|
||||
if (sscanf (*esc, "%u%n", &n, &consumed) != 1)
|
||||
return false;
|
||||
|
||||
*esc += consumed;
|
||||
*escLen -= consumed;
|
||||
|
||||
if (n <= 15) {
|
||||
*color = n;
|
||||
*custom = false;
|
||||
} else if (n <= 231) {
|
||||
n -= 16;
|
||||
r = n / 36;
|
||||
g = (n - r * 36) / 6;
|
||||
b = n - r * 36 - g * 6;
|
||||
|
||||
*color = RGB565_FROM_RGB8 (colorCube[r], colorCube[g], colorCube[b]);
|
||||
*custom = true;
|
||||
} else if (n <= 255) {
|
||||
n -= 232;
|
||||
|
||||
*color = RGB565_FROM_RGB8 (grayScale[n], grayScale[n], grayScale[n]);
|
||||
*custom = true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} else if (p == 2) {
|
||||
if (sscanf (*esc, "%u;%u;%u%n", &r, &g, &b, &consumed) != 3)
|
||||
return false;
|
||||
|
||||
*esc += consumed;
|
||||
*escLen -= consumed;
|
||||
|
||||
*color = RGB565_FROM_RGB8 (r, g, b);
|
||||
*custom = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static PrintConsole currentCopy;
|
||||
|
||||
static PrintConsole* currentConsole = ¤tCopy;
|
||||
@ -189,7 +259,7 @@ static ssize_t con_write(struct _reent *r,void *fd,const char *ptr, size_t len)
|
||||
chr = *(tmp++);
|
||||
i++; count++;
|
||||
|
||||
if ( chr == 0x1b && *tmp == '[' ) {
|
||||
if ( chr == 0x1b && len > 1 && *tmp == '[' ) {
|
||||
bool escaping = true;
|
||||
char *escapeseq = tmp++;
|
||||
int escapelen = 1;
|
||||
@ -323,6 +393,7 @@ static ssize_t con_write(struct _reent *r,void *fd,const char *ptr, size_t len)
|
||||
escapelen--;
|
||||
|
||||
do {
|
||||
bool custom;
|
||||
parameter = 0;
|
||||
if (escapelen == 1) {
|
||||
consumed = 1;
|
||||
@ -413,19 +484,63 @@ static ssize_t con_write(struct _reent *r,void *fd,const char *ptr, size_t len)
|
||||
break;
|
||||
|
||||
case 30 ... 37: // writing color
|
||||
currentConsole->flags &= ~CONSOLE_FG_CUSTOM;
|
||||
currentConsole->fg = parameter - 30;
|
||||
break;
|
||||
|
||||
case 38: // custom foreground color
|
||||
if (parseColor (&escapeseq, &escapelen, ¤tConsole->fg, &custom)) {
|
||||
if (custom)
|
||||
currentConsole->flags |= CONSOLE_FG_CUSTOM;
|
||||
else
|
||||
currentConsole->flags &= ~CONSOLE_FG_CUSTOM;
|
||||
|
||||
if (!custom && currentConsole->fg < 16) {
|
||||
currentConsole->flags &= ~CONSOLE_COLOR_FAINT;
|
||||
if (currentConsole->fg < 8)
|
||||
currentConsole->flags &= ~CONSOLE_COLOR_BOLD;
|
||||
else
|
||||
currentConsole->flags |= CONSOLE_COLOR_BOLD;
|
||||
}
|
||||
|
||||
// consume next ; or m
|
||||
++escapeseq;
|
||||
--escapelen;
|
||||
} else {
|
||||
// stop processing
|
||||
escapelen = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 39: // reset foreground color
|
||||
currentConsole->flags &= ~CONSOLE_FG_CUSTOM;
|
||||
currentConsole->fg = 7;
|
||||
break;
|
||||
|
||||
case 40 ... 47: // screen color
|
||||
currentConsole->flags &= ~CONSOLE_BG_CUSTOM;
|
||||
currentConsole->bg = parameter - 40;
|
||||
break;
|
||||
|
||||
case 48: // custom background color
|
||||
if (parseColor (&escapeseq, &escapelen, ¤tConsole->bg, &custom)) {
|
||||
if (custom)
|
||||
currentConsole->flags |= CONSOLE_BG_CUSTOM;
|
||||
else
|
||||
currentConsole->flags &= ~CONSOLE_BG_CUSTOM;
|
||||
|
||||
// consume next ; or m
|
||||
++escapeseq;
|
||||
--escapelen;
|
||||
} else {
|
||||
// stop processing
|
||||
escapelen = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 49: // reset background color
|
||||
currentConsole->fg = 0;
|
||||
currentConsole->flags &= ~CONSOLE_BG_CUSTOM;
|
||||
currentConsole->bg = 0;
|
||||
break;
|
||||
}
|
||||
} while (escapelen > 0);
|
||||
@ -611,7 +726,7 @@ void consolePrintChar(int c) {
|
||||
//---------------------------------------------------------------------------------
|
||||
void consoleClear(void) {
|
||||
//---------------------------------------------------------------------------------
|
||||
printf("\x1b[2J");
|
||||
consoleCls ('2');
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
|
@ -109,24 +109,29 @@ static void ConsoleSwRenderer_drawChar(PrintConsole* con, int x, int y, int c)
|
||||
u16* frameBuffer = _getFrameBuffer(sw, &stride);
|
||||
const u16 *fontdata = (const u16*)con->font.gfx + (16 * c);
|
||||
|
||||
int writingColor = con->fg;
|
||||
int screenColor = con->bg;
|
||||
u16 fg = con->fg;
|
||||
u16 bg = con->bg;
|
||||
|
||||
if (!(con->flags & CONSOLE_FG_CUSTOM)) {
|
||||
if (con->flags & CONSOLE_COLOR_BOLD) {
|
||||
writingColor += 8;
|
||||
fg = colorTable[fg + 8];
|
||||
} else if (con->flags & CONSOLE_COLOR_FAINT) {
|
||||
writingColor += 16;
|
||||
fg = colorTable[fg + 16];
|
||||
} else {
|
||||
fg = colorTable[fg];
|
||||
}
|
||||
}
|
||||
|
||||
if (!(con->flags & CONSOLE_BG_CUSTOM)) {
|
||||
bg = colorTable[bg];
|
||||
}
|
||||
|
||||
if (con->flags & CONSOLE_COLOR_REVERSE) {
|
||||
int tmp = writingColor;
|
||||
writingColor = screenColor;
|
||||
screenColor = tmp;
|
||||
u16 tmp = fg;
|
||||
fg = bg;
|
||||
bg = tmp;
|
||||
}
|
||||
|
||||
u16 bg = colorTable[screenColor];
|
||||
u16 fg = colorTable[writingColor];
|
||||
|
||||
u128 *tmp = (u128*)fontdata;
|
||||
|
||||
u128 bvaltop = tmp[0];
|
||||
|
@ -213,8 +213,9 @@ fsdev_fixpath(struct _reent *r,
|
||||
{
|
||||
const char* cwd = dev->cwd ? dev->cwd : "/";
|
||||
strncpy(__nx_dev_path_buf, cwd, PATH_MAX);
|
||||
__nx_dev_path_buf[PATH_MAX] = '\0';
|
||||
strncat(__nx_dev_path_buf, path, PATH_MAX - strlen(cwd));
|
||||
size_t cwdlen = strlen(__nx_dev_path_buf);
|
||||
strncat(__nx_dev_path_buf, "/", PATH_MAX - cwdlen);
|
||||
strncat(__nx_dev_path_buf, path, PATH_MAX - cwdlen -1);
|
||||
}
|
||||
|
||||
if(__nx_dev_path_buf[PATH_MAX] != 0)
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "result.h"
|
||||
#include "services/bsd.h"
|
||||
#include "services/ssl.h"
|
||||
#include "services/nifm.h"
|
||||
#include "runtime/devices/socket.h"
|
||||
#include "runtime/hosversion.h"
|
||||
#include "../alloc.h"
|
||||
@ -61,8 +62,6 @@ static const devoptab_t g_socketDevoptab = {
|
||||
};
|
||||
|
||||
static const SocketInitConfig g_defaultSocketInitConfig = {
|
||||
.bsdsockets_version = 1,
|
||||
|
||||
.tcp_tx_buf_size = 0x8000,
|
||||
.tcp_rx_buf_size = 0x10000,
|
||||
.tcp_tx_buf_max_size = 0x40000,
|
||||
@ -81,13 +80,35 @@ const SocketInitConfig *socketGetDefaultInitConfig(void) {
|
||||
return &g_defaultSocketInitConfig;
|
||||
}
|
||||
|
||||
static u32 socketSelectVersion(void) {
|
||||
if (hosversionBefore(3,0,0)) {
|
||||
return 1;
|
||||
} else if (hosversionBefore(4,0,0)) {
|
||||
return 2;
|
||||
} else if (hosversionBefore(5,0,0)) {
|
||||
return 3;
|
||||
} else if (hosversionBefore(6,0,0)) {
|
||||
return 4;
|
||||
} else if (hosversionBefore(8,0,0)) {
|
||||
return 5;
|
||||
} else if (hosversionBefore(9,0,0)) {
|
||||
return 6;
|
||||
} else if (hosversionBefore(13,0,0)) {
|
||||
return 7;
|
||||
} else if (hosversionBefore(16,0,0)) {
|
||||
return 8;
|
||||
} else /* latest known version */ {
|
||||
return 9;
|
||||
}
|
||||
}
|
||||
|
||||
Result socketInitialize(const SocketInitConfig *config) {
|
||||
Result ret = 0;
|
||||
if (!config)
|
||||
config = &g_defaultSocketInitConfig;
|
||||
|
||||
BsdInitConfig bcfg = {
|
||||
.version = config->bsdsockets_version,
|
||||
.version = socketSelectVersion(),
|
||||
|
||||
.tcp_tx_buf_size = config->tcp_tx_buf_size,
|
||||
.tcp_rx_buf_size = config->tcp_rx_buf_size,
|
||||
@ -198,6 +219,71 @@ int socketSslConnectionGetSocketDescriptor(SslConnection *c) {
|
||||
return fd;
|
||||
}
|
||||
|
||||
int socketSslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
|
||||
int dev;
|
||||
int fd = _socketGetFd(sockfd);
|
||||
|
||||
if (fd==-1)
|
||||
return -1;
|
||||
|
||||
int tmpfd=0;
|
||||
Result rc = sslConnectionSetDtlsSocketDescriptor(c, fd, addr, addrlen, &tmpfd);
|
||||
if (R_FAILED(rc)) {
|
||||
g_bsdResult = rc;
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (tmpfd==-1) { // The cmd didn't return a sockfd. This error must be ignored.
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
dev = FindDevice("soc:");
|
||||
if(dev == -1)
|
||||
return -1;
|
||||
|
||||
fd = __alloc_handle(dev);
|
||||
if(fd == -1)
|
||||
return -1;
|
||||
|
||||
*(int *)__get_handle(fd)->fileStruct = tmpfd;
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
int socketNifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd) {
|
||||
int fd = _socketGetFd(sockfd);
|
||||
|
||||
if (fd==-1)
|
||||
return -1;
|
||||
|
||||
Result rc = nifmRequestRegisterSocketDescriptor(r, fd);
|
||||
if (R_FAILED(rc)) {
|
||||
g_bsdResult = rc;
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int socketNifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd) {
|
||||
int fd = _socketGetFd(sockfd);
|
||||
|
||||
if (fd==-1)
|
||||
return -1;
|
||||
|
||||
Result rc = nifmRequestUnregisterSocketDescriptor(r, fd);
|
||||
if (R_FAILED(rc)) {
|
||||
g_bsdResult = rc;
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************/
|
||||
|
||||
static int _socketGetFd(int fd) {
|
||||
|
@ -42,7 +42,7 @@ static void _usbCommsUpdateInterfaceDescriptor(struct usb_interface_descriptor *
|
||||
}
|
||||
}
|
||||
|
||||
Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos)
|
||||
Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos, u16 idVendor, u16 idProduct)
|
||||
{
|
||||
Result rc = 0;
|
||||
rwlockWriteLock(&g_usbCommsLock);
|
||||
@ -76,8 +76,8 @@ Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *inf
|
||||
.bDeviceSubClass = 0x00,
|
||||
.bDeviceProtocol = 0x00,
|
||||
.bMaxPacketSize0 = 0x40,
|
||||
.idVendor = 0x057e,
|
||||
.idProduct = 0x3000,
|
||||
.idVendor = idVendor,
|
||||
.idProduct = idProduct,
|
||||
.bcdDevice = 0x0100,
|
||||
.iManufacturer = iManufacturer,
|
||||
.iProduct = iProduct,
|
||||
@ -157,7 +157,7 @@ Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *inf
|
||||
|
||||
Result usbCommsInitialize(void)
|
||||
{
|
||||
return usbCommsInitializeEx(1, NULL);
|
||||
return usbCommsInitializeEx(1, NULL, 0x057e, 0x3000);
|
||||
}
|
||||
|
||||
static void _usbCommsInterfaceFree(usbCommsInterface *interface)
|
||||
@ -462,6 +462,28 @@ static Result _usbCommsRead(usbCommsInterface *interface, void* buffer, size_t s
|
||||
return rc;
|
||||
}
|
||||
|
||||
static Result _usbCommsReadAsync(usbCommsInterface *interface, void *buffer, size_t size, u32 *urbId)
|
||||
{
|
||||
if (((uintptr_t)buffer) & 0xfff)
|
||||
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||
|
||||
// Start a host->device transfer.
|
||||
return usbDsEndpoint_PostBufferAsync(interface->endpoint_out, buffer, size, urbId);
|
||||
}
|
||||
|
||||
static Result _usbCommsGetReadResult(usbCommsInterface *interface, u32 urbId, u32 *transferredSize)
|
||||
{
|
||||
Result rc=0;
|
||||
UsbDsReportData reportdata;
|
||||
|
||||
eventClear(&interface->endpoint_out->CompletionEvent);
|
||||
|
||||
rc = usbDsEndpoint_GetReportData(interface->endpoint_out, &reportdata);
|
||||
if (R_FAILED(rc)) return rc;
|
||||
|
||||
return usbDsParseReportData(&reportdata, urbId, NULL, transferredSize);
|
||||
}
|
||||
|
||||
static Result _usbCommsWrite(usbCommsInterface *interface, const void* buffer, size_t size, size_t *transferredSize)
|
||||
{
|
||||
Result rc=0;
|
||||
@ -525,6 +547,28 @@ static Result _usbCommsWrite(usbCommsInterface *interface, const void* buffer, s
|
||||
return rc;
|
||||
}
|
||||
|
||||
static Result _usbCommsWriteAsync(usbCommsInterface *interface, void *buffer, size_t size, u32 *urbId)
|
||||
{
|
||||
if (((uintptr_t)buffer) & 0xfff)
|
||||
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||
|
||||
// Start a device->host transfer.
|
||||
return usbDsEndpoint_PostBufferAsync(interface->endpoint_in, buffer, size, urbId);
|
||||
}
|
||||
|
||||
static Result _usbCommsGetWriteResult(usbCommsInterface *interface, u32 urbId, u32 *transferredSize)
|
||||
{
|
||||
Result rc=0;
|
||||
UsbDsReportData reportdata;
|
||||
|
||||
eventClear(&interface->endpoint_in->CompletionEvent);
|
||||
|
||||
rc = usbDsEndpoint_GetReportData(interface->endpoint_in, &reportdata);
|
||||
if (R_FAILED(rc)) return rc;
|
||||
|
||||
return usbDsParseReportData(&reportdata, urbId, NULL, transferredSize);
|
||||
}
|
||||
|
||||
size_t usbCommsReadEx(void* buffer, size_t size, u32 interface)
|
||||
{
|
||||
size_t transferredSize=0;
|
||||
@ -562,6 +606,63 @@ size_t usbCommsRead(void* buffer, size_t size)
|
||||
return usbCommsReadEx(buffer, size, 0);
|
||||
}
|
||||
|
||||
Event *usbCommsGetReadCompletionEvent(u32 interface)
|
||||
{
|
||||
usbCommsInterface *inter = &g_usbCommsInterfaces[interface];
|
||||
bool initialized;
|
||||
|
||||
if (interface >= TOTAL_INTERFACES) return NULL;
|
||||
|
||||
rwlockReadLock(&inter->lock);
|
||||
initialized = inter->initialized;
|
||||
rwlockReadUnlock(&inter->lock);
|
||||
|
||||
if (!initialized) return NULL;
|
||||
return &inter->endpoint_out->CompletionEvent;
|
||||
}
|
||||
|
||||
Result usbCommsReadAsync(void *buffer, size_t size, u32 *urbId, u32 interface)
|
||||
{
|
||||
Result rc;
|
||||
usbCommsInterface *inter = &g_usbCommsInterfaces[interface];
|
||||
bool initialized;
|
||||
|
||||
if (interface >= TOTAL_INTERFACES) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsRead);
|
||||
|
||||
rwlockReadLock(&inter->lock);
|
||||
initialized = inter->initialized;
|
||||
rwlockReadUnlock(&inter->lock);
|
||||
|
||||
if (!initialized) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsRead);
|
||||
|
||||
rwlockWriteLock(&inter->lock_out);
|
||||
rc = _usbCommsReadAsync(inter, buffer, size, urbId);
|
||||
rwlockWriteUnlock(&inter->lock_out);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result usbCommsGetReadResult(u32 urbId, u32 *transferredSize, u32 interface)
|
||||
{
|
||||
Result rc;
|
||||
usbCommsInterface *inter = &g_usbCommsInterfaces[interface];
|
||||
bool initialized;
|
||||
|
||||
if (interface >= TOTAL_INTERFACES) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsRead);
|
||||
|
||||
rwlockReadLock(&inter->lock);
|
||||
initialized = inter->initialized;
|
||||
rwlockReadUnlock(&inter->lock);
|
||||
|
||||
if (!initialized) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsRead);
|
||||
|
||||
rwlockWriteLock(&inter->lock_out);
|
||||
rc = _usbCommsGetReadResult(inter, urbId, transferredSize);
|
||||
rwlockWriteUnlock(&inter->lock_out);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
size_t usbCommsWriteEx(const void* buffer, size_t size, u32 interface)
|
||||
{
|
||||
size_t transferredSize=0;
|
||||
@ -599,3 +700,59 @@ size_t usbCommsWrite(const void* buffer, size_t size)
|
||||
return usbCommsWriteEx(buffer, size, 0);
|
||||
}
|
||||
|
||||
Event *usbCommsGetWriteCompletionEvent(u32 interface)
|
||||
{
|
||||
usbCommsInterface *inter = &g_usbCommsInterfaces[interface];
|
||||
bool initialized;
|
||||
|
||||
if (interface >= TOTAL_INTERFACES) return NULL;
|
||||
|
||||
rwlockWriteLock(&inter->lock);
|
||||
initialized = inter->initialized;
|
||||
rwlockWriteUnlock(&inter->lock);
|
||||
|
||||
if (!initialized) return NULL;
|
||||
return &inter->endpoint_in->CompletionEvent;
|
||||
}
|
||||
|
||||
Result usbCommsWriteAsync(void *buffer, size_t size, u32 *urbId, u32 interface)
|
||||
{
|
||||
Result rc;
|
||||
usbCommsInterface *inter = &g_usbCommsInterfaces[interface];
|
||||
bool initialized;
|
||||
|
||||
if (interface >= TOTAL_INTERFACES) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsWrite);
|
||||
|
||||
rwlockWriteLock(&inter->lock);
|
||||
initialized = inter->initialized;
|
||||
rwlockWriteUnlock(&inter->lock);
|
||||
|
||||
if (!initialized) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsWrite);
|
||||
|
||||
rwlockWriteLock(&inter->lock_in);
|
||||
rc = _usbCommsWriteAsync(inter, buffer, size, urbId);
|
||||
rwlockWriteUnlock(&inter->lock_in);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result usbCommsGetWriteResult(u32 urbId, u32 *transferredSize, u32 interface)
|
||||
{
|
||||
Result rc;
|
||||
usbCommsInterface *inter = &g_usbCommsInterfaces[interface];
|
||||
bool initialized;
|
||||
|
||||
if (interface >= TOTAL_INTERFACES) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsWrite);
|
||||
|
||||
rwlockWriteLock(&inter->lock);
|
||||
initialized = inter->initialized;
|
||||
rwlockWriteUnlock(&inter->lock);
|
||||
|
||||
if (!initialized) return MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsWrite);
|
||||
|
||||
rwlockWriteLock(&inter->lock_in);
|
||||
rc = _usbCommsGetWriteResult(inter, urbId, transferredSize);
|
||||
rwlockWriteUnlock(&inter->lock_in);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -1,34 +1,46 @@
|
||||
#include "result.h"
|
||||
#include "kernel/svc.h"
|
||||
#include "runtime/diag.h"
|
||||
#include <elf.h>
|
||||
#include <string.h>
|
||||
|
||||
void __nx_dynamic(uintptr_t base, const Elf64_Dyn* dyn)
|
||||
{
|
||||
const Elf64_Rela* rela = NULL;
|
||||
u64 relasz = 0;
|
||||
typedef struct Mod0Header {
|
||||
u32 magic_mod0;
|
||||
s32 dyn_offset;
|
||||
s32 bss_start_offset;
|
||||
s32 bss_end_offset;
|
||||
s32 eh_frame_hdr_start_offset;
|
||||
s32 eh_frame_hdr_end_offset;
|
||||
s32 unused;
|
||||
|
||||
for (; dyn->d_tag != DT_NULL; dyn++)
|
||||
u32 magic_lny0;
|
||||
s32 got_start_offset;
|
||||
s32 got_end_offset;
|
||||
|
||||
u32 magic_lny1;
|
||||
s32 relro_start_offset;
|
||||
s32 relro_end_offset;
|
||||
} Mod0Header;
|
||||
|
||||
NX_INLINE void* _dynResolveOffset(const Mod0Header* mod0, s32 offset)
|
||||
{
|
||||
switch (dyn->d_tag)
|
||||
{
|
||||
case DT_RELA:
|
||||
rela = (const Elf64_Rela*)(base + dyn->d_un.d_ptr);
|
||||
break;
|
||||
case DT_RELASZ:
|
||||
relasz = dyn->d_un.d_val / sizeof(Elf64_Rela);
|
||||
break;
|
||||
}
|
||||
return (void*)((uintptr_t)mod0 + offset);
|
||||
}
|
||||
|
||||
if (rela == NULL)
|
||||
static void _dynProcessRela(uintptr_t base, const Elf64_Rela* rela, size_t relasz)
|
||||
{
|
||||
for (; relasz--; rela++) {
|
||||
switch (ELF64_R_TYPE(rela->r_info)) {
|
||||
default: {
|
||||
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_BadReloc));
|
||||
break;
|
||||
}
|
||||
|
||||
for (; relasz--; rela++)
|
||||
{
|
||||
switch (ELF64_R_TYPE(rela->r_info))
|
||||
{
|
||||
case R_AARCH64_RELATIVE:
|
||||
{
|
||||
case R_AARCH64_NONE: {
|
||||
break;
|
||||
}
|
||||
|
||||
case R_AARCH64_RELATIVE: {
|
||||
u64* ptr = (u64*)(base + rela->r_offset);
|
||||
*ptr = base + rela->r_addend;
|
||||
break;
|
||||
@ -36,3 +48,91 @@ void __nx_dynamic(uintptr_t base, const Elf64_Dyn* dyn)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void _dynProcessRelr(uintptr_t base, const Elf64_Relr* relr, size_t relrsz)
|
||||
{
|
||||
u64* ptr = NULL;
|
||||
for (; relrsz--; relr++) {
|
||||
if ((*relr & 1) == 0) {
|
||||
ptr = (u64*)(base + *relr);
|
||||
*ptr++ += base;
|
||||
} else {
|
||||
u64 bitmap = *relr >> 1;
|
||||
while (bitmap) {
|
||||
unsigned id = __builtin_ffsl(bitmap)-1;
|
||||
bitmap &= ~(1UL << id);
|
||||
ptr[id] += base;
|
||||
}
|
||||
ptr += 63;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __nx_dynamic(uintptr_t base, const Mod0Header* mod0)
|
||||
{
|
||||
// Return early if MOD0 header has been invalidated
|
||||
if (mod0->magic_mod0 != 0x30444f4d) { // MOD0
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear the BSS area
|
||||
u8* bss_start = _dynResolveOffset(mod0, mod0->bss_start_offset);
|
||||
u8* bss_end = _dynResolveOffset(mod0, mod0->bss_end_offset);
|
||||
if (bss_start != bss_end) {
|
||||
memset(bss_start, 0, bss_end - bss_start);
|
||||
}
|
||||
|
||||
// Retrieve pointer to the ELF dynamic section
|
||||
const Elf64_Dyn* dyn = _dynResolveOffset(mod0, mod0->dyn_offset);
|
||||
|
||||
// Extract relevant information from the ELF dynamic section
|
||||
const Elf64_Rela* rela = NULL;
|
||||
size_t relasz = 0;
|
||||
const Elf64_Relr* relr = NULL;
|
||||
size_t relrsz = 0;
|
||||
for (; dyn->d_tag != DT_NULL; dyn++) {
|
||||
switch (dyn->d_tag) {
|
||||
case DT_RELA:
|
||||
rela = (const Elf64_Rela*)(base + dyn->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_RELASZ:
|
||||
relasz = dyn->d_un.d_val / sizeof(Elf64_Rela);
|
||||
break;
|
||||
|
||||
case DT_RELR:
|
||||
relr = (const Elf64_Relr*)(base + dyn->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_RELRSZ:
|
||||
relrsz = dyn->d_un.d_val / sizeof(Elf64_Relr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply RELA relocations if present
|
||||
if (rela && relasz) {
|
||||
_dynProcessRela(base, rela, relasz);
|
||||
}
|
||||
|
||||
// Apply RELR relocations if present
|
||||
if (relr && relrsz) {
|
||||
_dynProcessRelr(base, relr, relrsz);
|
||||
}
|
||||
|
||||
// Return early if LNY0/LNY1 extensions are not present
|
||||
if (mod0->magic_lny0 != 0x30594e4c || mod0->magic_lny1 != 0x31594e4c) { // LNY0, LNY1
|
||||
return;
|
||||
}
|
||||
|
||||
// Reprotect relro segment as read-only now that we're done processing relocations
|
||||
u8* relro_start = _dynResolveOffset(mod0, mod0->relro_start_offset);
|
||||
size_t relro_sz = (u8*)_dynResolveOffset(mod0, mod0->relro_end_offset) - relro_start;
|
||||
Result rc = svcSetMemoryPermission(relro_start, relro_sz, Perm_R);
|
||||
if (R_FAILED(rc)) {
|
||||
diagAbortWithResult(rc);
|
||||
}
|
||||
|
||||
// Lock the relro segment's permissions
|
||||
svcSetMemoryAttribute(relro_start, relro_sz, MemAttr_IsPermissionLocked, MemAttr_IsPermissionLocked);
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
#include "services/acc.h"
|
||||
#include "runtime/diag.h"
|
||||
|
||||
void NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr);
|
||||
void NX_NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr);
|
||||
|
||||
static bool g_isNso = false;
|
||||
static const char* g_loaderInfo = NULL;
|
||||
@ -17,7 +17,7 @@ static LoaderReturnFn g_loaderRetAddr = NULL;
|
||||
static void* g_overrideHeapAddr = NULL;
|
||||
static u64 g_overrideHeapSize = 0;
|
||||
static void* g_overrideArgv = NULL;
|
||||
static u64 g_syscallHints[2];
|
||||
static u64 g_syscallHints[3];
|
||||
static Handle g_processHandle = INVALID_HANDLE;
|
||||
static char* g_nextLoadPath = NULL;
|
||||
static char* g_nextLoadArgv = NULL;
|
||||
@ -37,7 +37,7 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
|
||||
g_isNso = true;
|
||||
g_mainThreadHandle = main_thread;
|
||||
g_loaderRetAddr = (LoaderReturnFn) &svcExitProcess;
|
||||
g_syscallHints[0] = g_syscallHints[1] = UINT64_MAX;
|
||||
g_syscallHints[0] = g_syscallHints[1] = g_syscallHints[2] = UINT64_MAX;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -110,6 +110,10 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
|
||||
break;
|
||||
}
|
||||
|
||||
case EntryType_SyscallAvailableHint2:
|
||||
g_syscallHints[2] = ent->Value[0];
|
||||
break;
|
||||
|
||||
default:
|
||||
if (ent->Flags & EntryFlag_IsMandatory)
|
||||
{
|
||||
@ -170,7 +174,8 @@ void* envGetArgv(void) {
|
||||
return g_overrideArgv;
|
||||
}
|
||||
|
||||
bool envIsSyscallHinted(u8 svc) {
|
||||
bool envIsSyscallHinted(unsigned svc) {
|
||||
if (svc >= 0xC0) return false;
|
||||
return !!(g_syscallHints[svc/64] & (1ull << (svc%64)));
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "runtime/diag.h"
|
||||
#include "runtime/devices/fs_dev.h"
|
||||
|
||||
void NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr);
|
||||
void NX_NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr);
|
||||
|
||||
void virtmemSetup(void);
|
||||
void newlibSetup(void);
|
||||
@ -187,12 +187,8 @@ void __attribute__((weak)) __libnx_init(void* ctx, Handle main_thread, void* sav
|
||||
__libc_init_array();
|
||||
}
|
||||
|
||||
void __attribute__((weak)) NORETURN __libnx_exit(int rc)
|
||||
void __attribute__((weak)) NX_NORETURN __libnx_exit(int rc)
|
||||
{
|
||||
// Call destructors.
|
||||
void __libc_fini_array(void);
|
||||
__libc_fini_array();
|
||||
|
||||
// Clean up services.
|
||||
__appExit();
|
||||
|
||||
|
@ -28,11 +28,7 @@ struct __pthread_t
|
||||
void *rc;
|
||||
};
|
||||
|
||||
void __attribute__((weak)) NORETURN __libnx_exit(int rc);
|
||||
|
||||
extern const u8 __tdata_lma[];
|
||||
extern const u8 __tdata_lma_end[];
|
||||
extern u8 __tls_start[];
|
||||
void __attribute__((weak)) NX_NORETURN __libnx_exit(int rc);
|
||||
|
||||
/// TimeType passed to timeGetCurrentTime() during time initialization. If that fails and __nx_time_type isn't TimeType_Default, timeGetCurrentTime() will be called again with TimeType_Default.
|
||||
__attribute__((weak)) TimeType __nx_time_type = TimeType_Default;
|
||||
@ -320,10 +316,13 @@ void __libnx_init_time(void)
|
||||
hour = tmp_offset % 24;
|
||||
|
||||
memset(envstr, 0, sizeof(envstr));
|
||||
|
||||
strptr = envstr;
|
||||
// Some tznames have numeric characters and '-'/'+', so quote tzname with <>.
|
||||
*strptr++ = '<';
|
||||
//Avoid using *printf.
|
||||
strncpy(envstr, /*info.timezoneName*/"NX", sizeof(envstr)-1); // Some tznames have numeric characters and '-'/'+', so the actual tzname can't be used.
|
||||
strncpy(strptr, info.timezoneName, sizeof(envstr)-1);
|
||||
strptr = &envstr[strlen(envstr)];
|
||||
*strptr++ = '>';
|
||||
*strptr++ = is_west ? '+' : '-';
|
||||
|
||||
*strptr++ = '0' + (hour / 10);
|
||||
@ -433,7 +432,10 @@ void newlibSetup(void)
|
||||
tv->magic = THREADVARS_MAGIC;
|
||||
tv->thread_ptr = NULL;
|
||||
tv->reent = _impure_ptr;
|
||||
tv->tls_tp = __tls_start-2*sizeof(void*); // subtract size of Thread Control Block (TCB)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Warray-bounds"
|
||||
tv->tls_tp = __tls_start-getTlsStartOffset();
|
||||
#pragma GCC diagnostic pop
|
||||
tv->handle = envGetMainThreadHandle();
|
||||
|
||||
u32 tls_size = __tdata_lma_end - __tdata_lma;
|
||||
|
@ -1,22 +1,41 @@
|
||||
#include "runtime/nxlink.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/errno.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static int sock = -1;
|
||||
|
||||
int nxlinkConnectToHost(bool redirStdout, bool redirStderr)
|
||||
{
|
||||
int ret = -1;
|
||||
if (!__nxlink_host.s_addr) {
|
||||
errno = ENETUNREACH;
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct sockaddr_in srv_addr;
|
||||
|
||||
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (!sock) {
|
||||
return ret;
|
||||
if (sock < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// set to non-blocking
|
||||
int flags = fcntl(sock, F_GETFL, 0);
|
||||
if (flags == -1) {
|
||||
close(sock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) != 0) {
|
||||
close(sock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bzero(&srv_addr, sizeof srv_addr);
|
||||
@ -24,8 +43,36 @@ int nxlinkConnectToHost(bool redirStdout, bool redirStderr)
|
||||
srv_addr.sin_addr = __nxlink_host;
|
||||
srv_addr.sin_port = htons(NXLINK_CLIENT_PORT);
|
||||
|
||||
ret = connect(sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr));
|
||||
if (ret != 0) {
|
||||
int ret = connect(sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr));
|
||||
if (ret != 0 && errno != EINPROGRESS) {
|
||||
int err = errno;
|
||||
close(sock);
|
||||
close(err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ret != 0) { // EINPROGRESS
|
||||
struct pollfd pfd;
|
||||
|
||||
pfd.fd = sock;
|
||||
pfd.events = POLLOUT;
|
||||
pfd.revents = 0;
|
||||
|
||||
int n = poll(&pfd, 1, 1000); // only wait up to 1s to connect
|
||||
if (n < 0) {
|
||||
close(sock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (n == 0 || !(pfd.revents & POLLOUT)) {
|
||||
close(sock);
|
||||
errno = ETIMEDOUT;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// reset back to blocking
|
||||
if (fcntl(sock, F_SETFL, flags & ~O_NONBLOCK) != 0) {
|
||||
close(sock);
|
||||
return -1;
|
||||
}
|
||||
|
@ -240,12 +240,12 @@ Result ringconReadId(RingCon *c, u64 *id_l, u64 *id_h) {
|
||||
struct {
|
||||
u32 data_x0;
|
||||
u16 data_x4;
|
||||
} PACKED id_l;
|
||||
} NX_PACKED id_l;
|
||||
|
||||
struct {
|
||||
u32 data_x0;
|
||||
u16 data_x4;
|
||||
} PACKED id_h;
|
||||
} NX_PACKED id_h;
|
||||
} id;
|
||||
} reply;
|
||||
|
||||
|
@ -23,36 +23,20 @@ _start:
|
||||
b __libnx_exception_entry
|
||||
|
||||
.Lcrt0_main_entry:
|
||||
// Get pointer to MOD0 struct (contains offsets to important places)
|
||||
adr x28, __nx_mod0
|
||||
|
||||
// Calculate BSS address/size
|
||||
ldp w8, w9, [x28, #8] // load BSS start/end offset from MOD0
|
||||
sub w9, w9, w8 // calculate BSS size
|
||||
add w9, w9, #7 // round up to 8
|
||||
bic w9, w9, #7 // ^
|
||||
add x8, x28, x8 // fixup the start pointer
|
||||
|
||||
// Clear the BSS in 8-byte units
|
||||
1: subs w9, w9, #8
|
||||
str xzr, [x8], #8
|
||||
bne 1b
|
||||
|
||||
// Preserve registers across function calls
|
||||
mov x25, x0 // entrypoint argument 0
|
||||
mov x26, x1 // entrypoint argument 1
|
||||
mov x27, x30 // loader return address
|
||||
mov x28, sp // initial stack pointer
|
||||
|
||||
// Perform runtime linking on ourselves (including relocations)
|
||||
adr x0, _start // get aslr base
|
||||
adr x1, __nx_mod0 // get pointer to MOD0 struct
|
||||
bl __nx_dynamic
|
||||
|
||||
// Save initial stack pointer
|
||||
mov x8, sp
|
||||
adrp x9, __stack_top
|
||||
str x8, [x9, #:lo12:__stack_top]
|
||||
|
||||
// Parse ELF .dynamic section (which applies relocations to our module)
|
||||
adr x0, _start // get aslr base
|
||||
ldr w1, [x28, #4] // pointer to .dynamic section
|
||||
add x1, x28, x1
|
||||
bl __nx_dynamic
|
||||
str x28, [x9, #:lo12:__stack_top]
|
||||
|
||||
// Perform system initialization
|
||||
mov x0, x25
|
||||
@ -65,8 +49,8 @@ _start:
|
||||
ldr w0, [x0, #:lo12:__system_argc]
|
||||
adrp x1, __system_argv // argv
|
||||
ldr x1, [x1, #:lo12:__system_argv]
|
||||
adrp x30, exit
|
||||
add x30, x30, #:lo12:exit
|
||||
adrp x30, :got:exit
|
||||
ldr x30, [x30, #:got_lo12:exit]
|
||||
b main
|
||||
|
||||
.global __nx_exit
|
||||
@ -95,6 +79,10 @@ __nx_mod0:
|
||||
.word __got_start__ - __nx_mod0
|
||||
.word __got_end__ - __nx_mod0
|
||||
|
||||
.ascii "LNY1"
|
||||
.word __relro_start - __nx_mod0
|
||||
.word __data_start - __nx_mod0
|
||||
|
||||
.section .bss.__stack_top, "aw", %nobits
|
||||
.global __stack_top
|
||||
.align 3
|
||||
|
@ -160,10 +160,7 @@ static int inet_pton4(const char *src, void *dst) {
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static const char *
|
||||
inet_ntop6(src, dst, size)
|
||||
const u_char *src;
|
||||
char *dst;
|
||||
size_t size;
|
||||
inet_ntop6(const u_char *src, char *dst, size_t size)
|
||||
{
|
||||
/*
|
||||
* Note that int32_t and int16_t need only be "at least" large enough
|
||||
@ -276,9 +273,7 @@ inet_ntop6(src, dst, size)
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static int
|
||||
inet_pton6(src, dst)
|
||||
const char *src;
|
||||
u_char *dst;
|
||||
inet_pton6(const char *src, u_char *dst)
|
||||
{
|
||||
static const char xdigits_l[] = "0123456789abcdef",
|
||||
xdigits_u[] = "0123456789ABCDEF";
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user