mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
Compare commits
899 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 | ||
|
748cf5ab98 | ||
|
c6dcbdfffb | ||
|
b5714296d6 | ||
|
8db41edc43 | ||
|
bf2e48e22a | ||
|
b35d42faaa | ||
|
0cc2da720c | ||
|
8daccdf35a | ||
|
49507b86a8 | ||
|
369bb31311 | ||
|
0a64ff5af0 | ||
|
4ac0a9ffdc | ||
|
8e93933157 | ||
|
4ac3b0cec5 | ||
|
960599c4b5 | ||
|
ade5038282 | ||
|
fc2aaefb0f | ||
|
d90afaacde | ||
|
bee27ba607 | ||
|
0aba35b3ed | ||
|
3c9a623b24 | ||
|
982aef9ea5 | ||
|
b17873d071 | ||
|
cfdd847f11 | ||
|
84b92d9e64 | ||
|
373b13b7c0 | ||
|
58885db2cd | ||
|
8c8bd9debf | ||
|
4a850437f2 | ||
|
5421d1d716 | ||
|
5d95e17f9b | ||
|
4b2d111859 | ||
|
f893c043f7 | ||
|
6ce881b013 | ||
|
a1ddefd3ca | ||
|
f486127615 | ||
|
5d448a1048 | ||
|
f47e1d26ec | ||
|
e604350e9c | ||
|
4bd7863364 | ||
|
08e2b2d945 | ||
|
e2c3ae8e44 | ||
|
95fca6753d | ||
|
137f6d1ddc | ||
|
00d1a696b9 | ||
|
d6c6431a22 | ||
|
f7df9d578c | ||
|
5509f8f14b | ||
|
d54c9f9cc8 | ||
|
5d644b6e82 | ||
|
2e2cf43cf5 | ||
|
0d32a2c0d5 | ||
|
d6a1ef0af4 | ||
|
eb8ee97f1c | ||
|
7416b23ef9 | ||
|
ebb54a1224 | ||
|
de97b82bce | ||
|
ca9d007bd4 | ||
|
c5a9a909a9 | ||
|
7e29719263 | ||
|
f365c9b2b5 | ||
|
05744823ac | ||
|
3374db38a2 | ||
|
3bb44d77b7 | ||
|
0716ed6ffd | ||
|
ae6f69d339 | ||
|
c8f8145195 | ||
|
38ee48032f | ||
|
d4542ec9b0 | ||
|
ae3271ba4c | ||
|
0f4f0ed039 | ||
|
3fce0d49e2 | ||
|
c71cd80bcf | ||
|
15a5d1c44f | ||
|
531f9d7921 | ||
|
7751df9356 | ||
|
e48f1c339f | ||
|
076657fd31 | ||
|
d813bef54b | ||
|
5057a1912e | ||
|
d53150f855 | ||
|
109bd683df | ||
|
649f308d4b | ||
|
637dd12b2d | ||
|
c8fdae9189 | ||
|
9e52e55177 | ||
|
a1a69ebe09 | ||
|
43202cc829 | ||
|
110c2f0622 | ||
|
348b21def2 | ||
|
2f6fcf7fb2 | ||
|
e9ee0b2421 | ||
|
a35321b360 | ||
|
73feb933ce | ||
|
8cbd1cf03c | ||
|
3c9e4e2ebc | ||
|
d4014bde62 | ||
|
0d5dcde5b9 | ||
|
c51918a605 | ||
|
06d38571b4 | ||
|
55179074cc | ||
|
41fc8bb17c | ||
|
ccec5bd36c | ||
|
d406db725d | ||
|
13716b5e7b | ||
|
c365c1ae68 | ||
|
16fb73cc96 | ||
|
3d003aef39 | ||
|
9ede39d15d | ||
|
767a7a295c | ||
|
af837185d0 | ||
|
c3aeb885e7 | ||
|
d91a2e22e7 | ||
|
de5e158545 | ||
|
c3b63e8723 | ||
|
1e9fe9b199 | ||
|
f82d97f88a | ||
|
21b0613fa4 | ||
|
e8a4f22063 | ||
|
49d7fe81b8 | ||
|
0f38ec8a3d | ||
|
1291966976 | ||
|
0fbbea2c77 | ||
|
2d470ee2af | ||
|
83dc9203dc | ||
|
ab71d6033a | ||
|
676f254be1 | ||
|
e904bb05d4 | ||
|
d290697bfd | ||
|
5551d42b29 | ||
|
09bcd32fbc | ||
|
a45b951db2 | ||
|
3a11e1d309 | ||
|
5aa8986505 | ||
|
49183c9953 | ||
|
4010c70b1e | ||
|
b7e1ec852c | ||
|
527b813bcf | ||
|
baa9dab747 | ||
|
9bc156a42e | ||
|
27b43dc53b | ||
|
089f9f18ac | ||
|
004d2f4f63 | ||
|
d4ccf6ab03 | ||
|
eaeabad315 | ||
|
639ba8ef78 | ||
|
73768fffa7 | ||
|
d4b3b1e90f | ||
|
141f1b6e5d | ||
|
01457fb3b1 | ||
|
5c7118a003 | ||
|
88cae40620 | ||
|
8e0c514044 | ||
|
1aa4ec82fb | ||
|
a5799c87ed | ||
|
7a8d397d81 | ||
|
f784c9a3f3 | ||
|
ff2846e481 | ||
|
9b808793fb | ||
|
2b7c3fee90 | ||
|
215d62966e | ||
|
012e84d7bd | ||
|
f9f23bef8f | ||
|
aa77de9f71 | ||
|
3c13d353b0 | ||
|
9a2fab817d | ||
|
7c64b5b70b | ||
|
912713bda0 | ||
|
5e03104d1d | ||
|
dab3750c50 | ||
|
4149481608 | ||
|
d3838b8e08 | ||
|
324a835b0c | ||
|
d28776e4d9 | ||
|
902af6cce0 | ||
|
967a5054a3 | ||
|
e4c701dc19 | ||
|
d4c1d069f1 | ||
|
52bf73e047 | ||
|
dc0bc2ab7b | ||
|
1c82758c03 | ||
|
2c26092608 | ||
|
e32acbeb9f | ||
|
16ff35faea | ||
|
c0ef14fcaa | ||
|
0640c9da76 | ||
|
40e5b08f70 | ||
|
3f4f6dba44 | ||
|
82bc8bf648 | ||
|
a924fac0ab | ||
|
5aaf6905dd | ||
|
9f13045546 | ||
|
7340772267 | ||
|
21647a76c8 | ||
|
ce20e14034 | ||
|
46377bc180 | ||
|
db39de34c5 | ||
|
1e3145f81d | ||
|
54a296bc69 | ||
|
c3a6d29cf4 | ||
|
991a262e19 | ||
|
e74c605a91 | ||
|
ddc9538b69 | ||
|
74b295827f | ||
|
8ce231e7c9 | ||
|
e5ae43f4c2 | ||
|
c95b46c053 | ||
|
2fdae0db52 | ||
|
091f88915d | ||
|
22a3efcbe1 | ||
|
8310f438ca | ||
|
490d96e6eb | ||
|
eecf2a9d32 | ||
|
970d982e57 | ||
|
a05a44fca8 | ||
|
e655b48c41 | ||
|
7c6d7849f5 | ||
|
8d51f7de1c | ||
|
d0d64ce1ce | ||
|
4c6abe1e41 | ||
|
e0c1dfe2ce | ||
|
dee3a7a241 | ||
|
0ff42ee69e | ||
|
8718c145f6 | ||
|
8a31abeea7 | ||
|
022887ac2d | ||
|
4afec4016d | ||
|
f01fb21da5 | ||
|
ab59dfb5bb | ||
|
625616bd44 | ||
|
9febf780b1 | ||
|
cc2be8375a | ||
|
cccef0c525 | ||
|
ac8ac4919e | ||
|
797cdffb14 | ||
|
5820178f56 | ||
|
89358ba98c | ||
|
c669589a35 | ||
|
8718ea3659 | ||
|
4fae8554f7 | ||
|
4db3c621e8 | ||
|
3b670bc652 | ||
|
ab9ce7c330 | ||
|
8789077bb8 | ||
|
070e959609 | ||
|
abf3600724 | ||
|
5551fcfab6 | ||
|
1442280447 | ||
|
e7fbdf9eb1 | ||
|
6ad9bd15d5 | ||
|
4e0fcb105d | ||
|
94464baf38 | ||
|
9439243649 | ||
|
a771f06a0e | ||
|
354e7d84fd | ||
|
bc16eb227b | ||
|
045f6477d9 | ||
|
e0ee2ffc86 | ||
|
0075672b93 | ||
|
b15a583b80 | ||
|
b18912980e | ||
|
2878b97f3a | ||
|
7e06e0e657 | ||
|
a5e8572019 | ||
|
bcc0f86aa3 | ||
|
9a1e3aeb47 | ||
|
1b95c09a27 | ||
|
ed16b7f948 | ||
|
b8a095ac2f | ||
|
e36c7a760f | ||
|
e2db987144 | ||
|
6620dfaa6f | ||
|
a0ce273019 | ||
|
d0a7c6a2a5 | ||
|
044eac2f3d | ||
|
3d4f61735a | ||
|
42568d6af8 | ||
|
857e2f5c4d | ||
|
29dd63e5db | ||
|
05badbdc29 | ||
|
7940d8e9e1 | ||
|
9dc185ba3c | ||
|
ac468913e4 | ||
|
eb9d377320 | ||
|
bce0ea871d | ||
|
db795f42ad | ||
|
573e2f772c | ||
|
17ebe4104a | ||
|
ff931da962 | ||
|
6e92692043 | ||
|
07ba98b702 | ||
|
2f25c57d0e | ||
|
55c0205de0 | ||
|
7bf43fefea | ||
|
02ed902558 | ||
|
3d726ed78c | ||
|
3c08ce6936 | ||
|
d1f4b11f9a | ||
|
4f401256b0 | ||
|
3971f3e053 | ||
|
de27e7b171 | ||
|
c7130a785a | ||
|
5b879cbb0e | ||
|
2e41795194 | ||
|
bcdbd89292 | ||
|
8fcd1b2afa | ||
|
ea77c1d4cb | ||
|
3f5362a7bb | ||
|
b0494c1acb | ||
|
dbc4b759e2 | ||
|
3b2b3ebad4 | ||
|
41e90ef8b5 | ||
|
41aefdc5ee | ||
|
613fa855da | ||
|
60e4ee04b0 | ||
|
8e245a0ba8 | ||
|
8cbac97466 | ||
|
20fd5bb9a2 | ||
|
cc7fb493e1 | ||
|
06bebed819 | ||
|
6fae441714 | ||
|
a1af4494bf | ||
|
f5e4615a40 | ||
|
dc20bf67e9 | ||
|
0de0dfdd8d | ||
|
1925e32c6d | ||
|
e79c8a2467 | ||
|
b1b80f5493 | ||
|
4b7921a221 | ||
|
4c9b2ac048 | ||
|
763b1694ec | ||
|
0b93435a44 | ||
|
d4c278cf00 | ||
|
f86dc2ceba | ||
|
db14e06fb2 | ||
|
ab715a9a49 | ||
|
3a22332630 | ||
|
a272fa75b9 | ||
|
7e581f6110 | ||
|
e09ce419ac | ||
|
cb7c1f87a8 | ||
|
02e4aad9dc | ||
|
27b34533ac | ||
|
af051c8301 | ||
|
fa0234efff | ||
|
ca6a48d2b6 | ||
|
966edb1f0f | ||
|
0a9f8261cb | ||
|
f4c3b288fd | ||
|
fbd97a1fc3 | ||
|
39629f5a67 | ||
|
b0d96342e8 | ||
|
b4db31e536 | ||
|
b18ae1c884 | ||
|
2edfb7cc56 | ||
|
bf5331d178 | ||
|
5e95507cbc | ||
|
4746827513 | ||
|
7dbb90ee66 | ||
|
77022a6d11 | ||
|
d9c3593183 | ||
|
0723df74dd | ||
|
c82c8b8760 | ||
|
fa52f9b046 | ||
|
918fe2b4d6 | ||
|
014b02db97 | ||
|
33425de627 | ||
|
75c3d2eca4 | ||
|
5d57c70a3e | ||
|
43549f4596 | ||
|
b50ac5b322 | ||
|
3dbafe6183 | ||
|
f0f21507db | ||
|
31f871a74f | ||
|
6535d6f871 | ||
|
cacf8615a8 | ||
|
2c19f13f74 | ||
|
91b4efb6f5 | ||
|
83f406b5cb | ||
|
d7e6207708 | ||
|
8421863c78 | ||
|
7ce58f84e0 | ||
|
ccb79ff4b6 | ||
|
bf8f6ae5f5 | ||
|
afbf2c6f71 | ||
|
c3b0b63471 | ||
|
1b1620f7bb | ||
|
44ec13169d | ||
|
c85dd5fe2f | ||
|
f589c95214 | ||
|
af2b4ab7c3 | ||
|
763b32060a | ||
|
7822accc22 | ||
|
fdb6aa1f15 | ||
|
7e07d1edf0 | ||
|
abc3522724 | ||
|
23852ad932 | ||
|
3ff12e7337 | ||
|
424cd0fefe | ||
|
8ae9b5e1a9 | ||
|
4a493775b4 | ||
|
524e910268 | ||
|
129b3a95b8 | ||
|
d8a50a46cf | ||
|
86a5aa4466 | ||
|
0db4f8a953 | ||
|
73047b09fd | ||
|
c570cd0a2f | ||
|
d8d931fe25 | ||
|
9bf745524d | ||
|
c4ebdb4cd8 | ||
|
68d6260d72 | ||
|
52a892ca31 | ||
|
2486175f55 | ||
|
c28d736ff0 | ||
|
6c706d910f | ||
|
b83ddf8157 | ||
|
04214ea441 | ||
|
5a751ea0c3 | ||
|
e5c501e5b6 | ||
|
446aaf2a55 | ||
|
7e6ff7e486 | ||
|
9c4ab7f09d | ||
|
c8b8c7b0f0 | ||
|
583d6bb92d | ||
|
cbe9fae600 | ||
|
f040706743 | ||
|
f34de8fb54 | ||
|
1719eda9fb | ||
|
1bb1aef2f7 | ||
|
f043307e7f | ||
|
fb01dd8196 | ||
|
ce394330a8 | ||
|
0881fb9e0b | ||
|
d25bcc486a | ||
|
2f7d9bf026 | ||
|
d1e5a5d6c8 | ||
|
15490b15f6 | ||
|
26876cec38 | ||
|
6d75ce4f93 | ||
|
6900a0241c | ||
|
c4bc7b24a0 | ||
|
afe030f08b | ||
|
4626b50341 | ||
|
bbcabee29f | ||
|
bd04667eda | ||
|
42aa0800f7 | ||
|
4078de1eff | ||
|
5182b57a1d | ||
|
dea3f140f1 | ||
|
f00898c4d8 | ||
|
9f28d0002a | ||
|
c9f6100e1c | ||
|
8fe48e8eac | ||
|
3925e92828 | ||
|
d94be49cb3 | ||
|
9029e9f38d | ||
|
1c883145a8 | ||
|
324a3624ac | ||
|
cd9f29fc8e | ||
|
bcac85852a | ||
|
170942a781 | ||
|
2b6197a51a | ||
|
167bd9e110 | ||
|
70ddae58ff | ||
|
d4c0c2dfeb | ||
|
fcd7e36a9d | ||
|
f181807215 | ||
|
8216043ea1 | ||
|
1e58385bd5 | ||
|
83649c9768 | ||
|
dda6194d0b | ||
|
c0115edca1 | ||
|
d24f1ca611 | ||
|
297e9d97a0 | ||
|
d88f67fe30 | ||
|
8fc57a4795 | ||
|
689430e578 | ||
|
c40f8ecac6 | ||
|
67eacc8034 | ||
|
9ca626fd82 | ||
|
9888df18da | ||
|
ce570a70f1 | ||
|
cc64ec7236 | ||
|
24f77642c9 | ||
|
d4c5fbdf0f | ||
|
5a7f14409e | ||
|
09423066b0 | ||
|
6c7ad3095c | ||
|
454244602c | ||
|
8ee7afca99 | ||
|
e5dd8a741d | ||
|
ddafdbd2ac | ||
|
e6d687990c | ||
|
df4bbcf2d7 | ||
|
e2b9b09b61 | ||
|
fa27331045 | ||
|
1f792cd92f | ||
|
4981ea02c0 | ||
|
4ab50e3752 | ||
|
4f72bc5342 | ||
|
28e06a94ec | ||
|
ccea53c837 | ||
|
f062c6ecab | ||
|
af4a025e9b | ||
|
0378d553e0 | ||
|
1e0bcfbf87 | ||
|
a2c35fb2e7 | ||
|
26f620dc0e | ||
|
989893721f | ||
|
8394986e19 | ||
|
07ad046acf | ||
|
4ecc597d0d | ||
|
9d7f968773 | ||
|
622c0509a5 | ||
|
01133f7f6d | ||
|
1592b2892f | ||
|
b6af00d908 | ||
|
b0980e4c9f | ||
|
5340c7d7dc | ||
|
bc13692938 | ||
|
051ad2dc60 | ||
|
b4a003e176 | ||
|
e833257b65 | ||
|
04179b286d | ||
|
5700b8f347 | ||
|
58e1e7e5b6 | ||
|
e5c1e35ede | ||
|
4ab2384449 | ||
|
a808c53efc | ||
|
0d5e51757d | ||
|
e81b63ac00 | ||
|
ea5dcfddfa | ||
|
e4657c15ce | ||
|
42b6af8e07 | ||
|
d025041e3d | ||
|
7103b08740 | ||
|
e9e392bbe2 | ||
|
145ad1ba87 | ||
|
9e83f82a62 | ||
|
47b0403333 | ||
|
13fbde91b0 | ||
|
54f6fa5420 | ||
|
c77b88d868 | ||
|
0403c988ba | ||
|
26a0ee4af3 | ||
|
a774fb81cc | ||
|
2e2d227ac7 | ||
|
23950cc10e | ||
|
9e2df3ad53 | ||
|
a3e7b1affb | ||
|
71b44cfb02 | ||
|
61fabbe1bc | ||
|
861e9d7c3d | ||
|
7292ddfcd8 | ||
|
77563f027a | ||
|
040767ce57 | ||
|
960f99e7a2 | ||
|
16fde00323 | ||
|
48905d70d2 | ||
|
edcd25bdae | ||
|
ecd6cd73ca | ||
|
9b44261767 | ||
|
415adf5b93 | ||
|
69a63bbee8 | ||
|
5f5d4c9785 | ||
|
3c610fb2cb | ||
|
d1c045f745 | ||
|
e82819d8a4 | ||
|
45bf08bf8d | ||
|
d40cc55833 | ||
|
6fb5806d51 | ||
|
80cc0bb86a | ||
|
dcafcd0d94 | ||
|
39a67c6c31 | ||
|
1526e8e98e | ||
|
f4ce807b1b | ||
|
98968b45f3 | ||
|
a14cd3a70c | ||
|
a489a123c2 | ||
|
67ccc66f15 | ||
|
1a0b5569ab | ||
|
16e4e9e2b3 | ||
|
58346564f7 | ||
|
5b51efe4a8 | ||
|
55f769e0b8 | ||
|
d3376aa816 | ||
|
d25144afbd | ||
|
44c45555cd | ||
|
1b610070f5 | ||
|
39288a832e | ||
|
21e35ede7c | ||
|
2940833a1b | ||
|
3a1459cf4c | ||
|
3e5c129431 | ||
|
929990b7c8 | ||
|
95f91c431c | ||
|
040b33c457 | ||
|
ae582d8cb4 | ||
|
71e249e6a4 | ||
|
ed2d72b9ff | ||
|
e320f3cdf1 | ||
|
f58c7fe786 | ||
|
75795933a7 | ||
|
be2cb63722 | ||
|
1c334bafb9 | ||
|
c8550c378b | ||
|
62192cac0a | ||
|
c4b1a68269 | ||
|
9eb4bfca20 | ||
|
0395a4190e | ||
|
9916fe93a0 | ||
|
f17773c64f | ||
|
127408a1f7 | ||
|
2e56959916 | ||
|
08272ed12e | ||
|
33d8c83ddc | ||
|
e02f3a82b8 | ||
|
80880728e5 | ||
|
fe836e2145 | ||
|
e0c72684c5 | ||
|
ab1903e382 | ||
|
ae9bd198a7 | ||
|
e483dc87a0 | ||
|
653a1a6b9a | ||
|
075a743cfb | ||
|
0749dfd67f | ||
|
8330f23d20 | ||
|
f9eb0c88ee | ||
|
c93fab39c8 | ||
|
66a4db694b | ||
|
b30b567228 | ||
|
c3f0210cf6 | ||
|
ecbc77840e | ||
|
77888f8b1f | ||
|
21d15b5a8e | ||
|
62d795a3c6 | ||
|
8a0aef8824 | ||
|
76daefae78 | ||
|
f5f768ea5c | ||
|
aafbc310c2 | ||
|
f465206082 | ||
|
10d07f3a8a | ||
|
d7564ce80d | ||
|
96fc7dd8cd | ||
|
5ab1219f40 | ||
|
c3b920d210 | ||
|
4eda677b93 | ||
|
2224be3f88 | ||
|
dedd29b431 | ||
|
43ad77e8d2 | ||
|
20b26296af | ||
|
99c325ed5b | ||
|
51db782e7a | ||
|
6ad0042147 | ||
|
0a3592d4dd | ||
|
02b5d3b474 | ||
|
f4fe3376bd | ||
|
87332e2685 | ||
|
ceab0a693c | ||
|
b1317d3ff8 | ||
|
fa25df27d0 | ||
|
3d682b6748 | ||
|
4ce9c0b038 | ||
|
042c756d72 | ||
|
c10e70df3a | ||
|
c55383c973 | ||
|
9d632b856d | ||
|
326619c271 | ||
|
81781f0782 | ||
|
1a676a68f5 | ||
|
b06a6ff29f | ||
|
b89191c435 | ||
|
76e86a9a80 | ||
|
297f84c912 | ||
|
b7311b6ab1 | ||
|
7d71d4f3a1 | ||
|
fdb1605fc5 | ||
|
4f74aa1ad1 | ||
|
7d08c7cc7c | ||
|
eeabd3bed0 | ||
|
5dc2fc0b7e | ||
|
7515bb4466 | ||
|
6d7d96a751 | ||
|
b269f58f8f | ||
|
318f2b33b6 | ||
|
e7209bbcf5 | ||
|
c790aa0fab | ||
|
3999ec147e | ||
|
4177031ebe | ||
|
6246f56305 | ||
|
0569ca7588 | ||
|
bde3ae5a77 | ||
|
5e535bc2eb | ||
|
c8b9120ba4 | ||
|
86ab999ee2 | ||
|
7c18df6d4c | ||
|
c7cab0351c | ||
|
79e6db16be | ||
|
c3b32581c9 | ||
|
8135d6cbc5 | ||
|
487aed9a59 | ||
|
e069da4320 | ||
|
0f8e18573d | ||
|
447ca35c29 | ||
|
579a5203b6 | ||
|
7bcea54a65 | ||
|
ecd9127bed | ||
|
c34bea8d4c | ||
|
ac75527491 | ||
|
f1dfb2c23b | ||
|
758db03ca4 | ||
|
e7a09f7be7 | ||
|
19741cb103 | ||
|
2f3fa0030e | ||
|
7cc9295684 | ||
|
fc09340a42 | ||
|
b20147eeb7 | ||
|
287bb00981 | ||
|
10e2e71ea2 | ||
|
112da06f37 | ||
|
eeaa63aa28 | ||
|
8db92d48a5 | ||
|
77961c6ede | ||
|
067492ee17 | ||
|
5090c54654 | ||
|
a17c73e783 | ||
|
b09b2deb2d | ||
|
6017cba043 | ||
|
c516388ba0 | ||
|
0137f582da | ||
|
37fdcb5726 |
34
.doozer.json
34
.doozer.json
@ -1,34 +0,0 @@
|
||||
{
|
||||
"targets": {
|
||||
"lib": {
|
||||
|
||||
"buildenv": "docker:devkitpro/devkita64",
|
||||
|
||||
"buildcmd": [
|
||||
"sudo -E make -j${PARALLEL} -C nx install"
|
||||
]
|
||||
},
|
||||
|
||||
"docs": {
|
||||
// This target build and upload docs and will be trigged from doozer's CD script
|
||||
"auto": false,
|
||||
|
||||
"buildenv": "xenial-amd64",
|
||||
"builddeps": [
|
||||
"doxygen"
|
||||
],
|
||||
|
||||
"buildcmd": [
|
||||
"cd nx", "doxygen"
|
||||
],
|
||||
|
||||
"artifacts": [{
|
||||
"source": "nx/docs/html",
|
||||
"destination": {
|
||||
"type": "git",
|
||||
"branch": "gh-pages"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
22
.github/workflows/build.yaml
vendored
Normal file
22
.github/workflows/build.yaml
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
name: Build libnx
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Test build
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: 'devkitpro/devkita64'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: build
|
||||
run: make -C nx -j$(nproc)
|
39
.github/workflows/doxygen.yaml
vendored
Normal file
39
.github/workflows/doxygen.yaml
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
name: Build documentation
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: [ v* ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build documentation
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Get current tag
|
||||
id: vars
|
||||
run: echo ::set-output name=tag::${GITHUB_REF/refs\/tags\//}
|
||||
|
||||
- name: Set up Doxygen
|
||||
run: sudo apt-get install -y doxygen
|
||||
|
||||
- name: Display Doxygen version
|
||||
run: echo "Doxygen version $(doxygen -v)"
|
||||
|
||||
- name: Build documentation
|
||||
run: |
|
||||
cd nx
|
||||
LIBNX_VERSION=${{ steps.vars.outputs.tag }} doxygen Doxyfile
|
||||
|
||||
- name: Deploy 🚀
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: gh-pages
|
||||
FOLDER: nx/docs/html
|
||||
CLEAN: true
|
||||
SINGLE_COMMIT: true
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -8,7 +8,10 @@
|
||||
*.pfs0
|
||||
Thumbs.db
|
||||
.*/
|
||||
!.github/
|
||||
debug/
|
||||
release/
|
||||
lib/
|
||||
docs/
|
||||
compile_commands.json
|
||||
.clangd
|
||||
|
839
Changelog.md
839
Changelog.md
@ -1,5 +1,844 @@
|
||||
# Changelog
|
||||
|
||||
## Version 4.7.0
|
||||
|
||||
#### system
|
||||
* Basic support for 18.0.0
|
||||
|
||||
#### services
|
||||
* fs: add GetFileSystemAttribute cmd
|
||||
* fs: Implement "ChallengeCardExistence" and "GetGameCardDeviceCertificate"
|
||||
|
||||
#### graphics
|
||||
* nvchannel: Fix SET_CLK_RATE, implement GET_CLK_RATE and SET_SUBMIT_TIMEOUT
|
||||
|
||||
#### miscellaneous
|
||||
* Update SetSysProductModel_Aula comment
|
||||
|
||||
## Version 4.6.0
|
||||
|
||||
#### system
|
||||
* svc: fix query/insecure names
|
||||
|
||||
#### miscellaneous
|
||||
* add fsDeviceOperatorGetGameCardUpdatePartitionInfo
|
||||
* Add NX_ prefix to PACKED, NORETURN, IGNORE_ARG and DEPRECATED macros
|
||||
* Fix: avoid segfault at static destructors
|
||||
|
||||
## Version 4.5.0
|
||||
|
||||
#### services
|
||||
* btdrv: Missing definitions for ble were added
|
||||
* capsdc: Updated for [17.0.0+]
|
||||
* hidsys: Support was added for many commands
|
||||
* fs:
|
||||
* Updated for [17.0.0+]
|
||||
* Support was added for many fsDeviceOperator commands
|
||||
* ncm: Updated for [17.0.0+]
|
||||
* nfc: Support was added for all remaining commands
|
||||
* ns: Added nsEstimateSizeToMove
|
||||
* pctl: Support was added for many commands
|
||||
* ssl: Updated sslConnectionSetPrivateOption for [17.0.0+]
|
||||
* ts: Updated for [17.0.0+]
|
||||
|
||||
#### devices
|
||||
* socket: Updated wrapper to automatically select latest available bsd service version (fixes multicast support)
|
||||
|
||||
#### miscellaneous
|
||||
* The linker script/crt0 were updated to support relro
|
||||
* A bug was fixed in aes-cbc block decryption
|
||||
* A number of problems were corrected involving incorrect ipc serialization with pointer arguments
|
||||
|
||||
**Several issues were fixed, and usability and stability were improved.**
|
||||
|
||||
## Version 4.4.2
|
||||
|
||||
#### system
|
||||
* ensure correct addresses for bss
|
||||
|
||||
#### miscellaneous
|
||||
* fix timezone to allow +/- and alphanumrics
|
||||
* end compile_commmands generation when elf linked
|
||||
|
||||
## Version 4.4.1
|
||||
|
||||
#### miscellaneous
|
||||
* add missing separator to local path
|
||||
|
||||
**Several issues were fixed, and usability and stability were improved.**
|
||||
|
||||
## Version 4.4.0
|
||||
|
||||
#### services
|
||||
* applet: add appletGetMessageEvent
|
||||
* usbcomms: add async API
|
||||
* usbcomms: expose VID:PID configuration
|
||||
|
||||
#### miscellaneous
|
||||
* correct problems revealed by gcc 13
|
||||
* mitigate race condition bug in nvservices
|
||||
|
||||
**Several issues were fixed, and usability and stability were improved.**
|
||||
|
||||
## Version 4.3.0
|
||||
|
||||
#### services
|
||||
* applet: Updated for [15.0.0+]. Added `__nx_applet_init_timeout`
|
||||
* audctl:
|
||||
* Added audctlGetActiveOutputTarget.
|
||||
* Fixed TargetVolume functions.
|
||||
* auddev: Added auddevGetActiveAudioDeviceName.
|
||||
* bpc: Fixed GetSleepButtonState/GetPowerButton.
|
||||
* fs: Updated for [16.0.0+]
|
||||
* hiddbg: Changed hiddbgAttachHdlsWorkBuffer to accept a user-supplied buffer and size.
|
||||
* ncm: Updated for [15.0.0+] and [16.0.0+].
|
||||
* pdm:
|
||||
* Updated for [16.0.0+].
|
||||
* Fixed pdmqryQueryAccountEvent on older sysvers.
|
||||
* Updated structs.
|
||||
* pl: Added [16.0.0+] sysver checks.
|
||||
* ssl:
|
||||
* Added support for new [16.0.0+] functionality.
|
||||
* Added ssl:s support [15.0.0+].
|
||||
* Added sslClearTls12FallbackFlag [14.0.0+].
|
||||
* Updated SslCaCertificateId enum.
|
||||
* usbhs: Added the remaining cmds and expose more functionality.
|
||||
* vi: Added [16.0.0+] Manager commands.
|
||||
* wlaninf: Added sysver check to account for its removal in \[15.0.0+\].
|
||||
|
||||
#### devices
|
||||
* nxlinkConnectToHost: Added timeout to avoid long hang when -s isn't specified for nxlink.
|
||||
|
||||
#### miscellaneous
|
||||
* Added CMSG macros to BSD headers.
|
||||
|
||||
**Several issues were fixed, and usability and stability were improved.**
|
||||
|
||||
## Version 4.2.2
|
||||
|
||||
#### system
|
||||
* svc: Added svcMapInsecureMemory, svcUnmapInsecureMemory [15.0.0+].
|
||||
* svc: Renamed perm parameter of svcMapDeviceAddressSpaceByForce and svcMapDeviceAddressSpaceAligned to option [15.0.0+].
|
||||
* svc: Corrected svcMapIoRegion, svcUnmapIoRegion.
|
||||
* env: Added HBABI support for hinting SVCs in the extended range 0x80..0xBF.
|
||||
* cache: Added instruction barrier to armICacheInvalidate.
|
||||
|
||||
#### graphics
|
||||
* Added nvGpuGetTimestamp, nvioctlNvhostCtrlGpu_GetGpuTime.
|
||||
|
||||
#### applets
|
||||
* swkbd: Corrected several typos and incorrect floating point values.
|
||||
|
||||
#### network
|
||||
* socket: Added socketNifmRequestRegisterSocketDescriptor, socketNifmRequestUnregisterSocketDescriptor.
|
||||
* nifm: nifmRequestSetKeptInSleep, nifmRequestRegisterSocketDescriptor, nifmRequestUnregisterSocketDescriptor, nifmSetWowlDelayedWakeTime.
|
||||
|
||||
#### other services
|
||||
* set:sys: setsysNeedsToUpdateHeadphoneVolume removed in [15.0.0].
|
||||
* pdm:qry: pdmqryQueryRecentlyPlayedApplication, pdmqryGetRecentlyPlayedApplicationUpdateEvent removed in [15.0.0].
|
||||
|
||||
Several issues were fixed, and usability and stability were improved.
|
||||
|
||||
## Version 4.2.1
|
||||
|
||||
#### system
|
||||
* cache: Adjusted cache maintenance ABI for [14.0.0+].
|
||||
* svc: Added InfoType_IsSvcPermitted [14.0.0+].
|
||||
* svc: Removed svcCallSecureMonitor's non-existent return type.
|
||||
* svc: Fixed definition of MemoryInfo struct.
|
||||
* ldscript: Generated ELFs now start with the `.text` section (required by GDB).
|
||||
|
||||
#### filesystem
|
||||
* Added fsOpenSaveDataInfoReaderWithFilter.
|
||||
* Added fsCreate_TemporaryStorage.
|
||||
* Fixed bug in fsOpen_TemporaryStorage.
|
||||
|
||||
#### graphics
|
||||
* Added nvIoctl3.
|
||||
* Adjusted hos version requirements in nvIoctl2 [3.0.0+].
|
||||
* Adjusted list of IOCTLs that use the cloned NV service session.
|
||||
* console: Added support for SGR 38/48 escape sequences.
|
||||
* console: Bold/Faint attributes no longer applied to the background.
|
||||
|
||||
#### input
|
||||
* hid: Added hidGetNpadLagerType, hidGetNpadStatesLager.
|
||||
* hid: Added HidNpadLagerType enum.
|
||||
* hid: Added HidNpadLagerState struct.
|
||||
* hid: Updated HidNpadStyleTag, HidNpadButton, HidDeviceTypeBits, HidDeviceType, HidAppletFooterUiType enums.
|
||||
* hid: Updated HidNpadInternalState struct.
|
||||
* hidsys: Added hidsysAcquireUniquePadConnectionEventHandle, hidsysGetUniquePadBluetoothAddress, hidsysDisconnectUniquePad, hidsysGetUniquePadType, hidsysGetUniquePadInterface, hidsysGetUniquePadControllerNumber.
|
||||
* hidsys: Added HidsysUniquePadType enum.
|
||||
|
||||
#### other
|
||||
* Added `BITL()` macro (unsigned long, i.e. 64-bit unsigned integer).
|
||||
* bpc: Adjusted for removed commands in [14.0.0+].
|
||||
* bpc: Added bpcGetPowerButton [6.0.0+].
|
||||
* btdrv: Adjusted for removed commands in [14.0.0+].
|
||||
* btm: Corrected inverted hos version check affecting several commands.
|
||||
* nfc: Added nfcSendCommandByPassThrough, nfcKeepPassThroughSession, nfcReleasePassThroughSession.
|
||||
* pm: Added support for [14.0.0+].
|
||||
* ts: Adjusted for removed commands in [14.0.0+].
|
||||
|
||||
Several issues were fixed, and usability and stability were improved.
|
||||
|
||||
## Version 4.2.0
|
||||
|
||||
#### system
|
||||
* Added new SVCs introduced in [13.0.0+].
|
||||
* Thread structures are now pre-populated with information prior to creation.
|
||||
|
||||
#### input
|
||||
* hidsys: Added support for [13.0.0+].
|
||||
* hiddbg: Added support for [13.0.0+].
|
||||
|
||||
#### graphics
|
||||
* Fixed crashes caused by arbitrary sizes in linear framebuffers.
|
||||
|
||||
#### other
|
||||
* ncm: Added support for [13.0.0+].
|
||||
* setsys: Added support for [13.0.0+].
|
||||
* Filled in SetSysNxControllerSettings structure definition (which was previously unpopulated).
|
||||
* btm: Added support for [13.0.0+].
|
||||
* btdrv: Added support for [13.0.0+].
|
||||
* Fixed btdrvRespondToSspRequest for [12.0.0+].
|
||||
* psel: Added support for [13.0.0+] (pselShowUserQualificationPromoter).
|
||||
* Corrected ldr:ro/ro:1 initialization.
|
||||
|
||||
Several issues were fixed, and usability and stability were improved.
|
||||
|
||||
## Version 4.1.3
|
||||
|
||||
#### input
|
||||
* **Removed old deprecated HID API**.
|
||||
|
||||
#### network
|
||||
* Fixed inet_pton implementation.
|
||||
|
||||
Several issues were fixed, and usability and stability were improved.
|
||||
|
||||
## Version 4.1.2
|
||||
|
||||
Several issues were fixed, and usability and stability were improved.
|
||||
|
||||
## Version 4.1.1
|
||||
|
||||
#### system
|
||||
* Fixed deadlock issue when multi-threaded services (e.g. filesystem, sockets) are starved of free sessions.
|
||||
|
||||
Several issues were fixed, and usability and stability were improved.
|
||||
|
||||
## Version 4.1.0
|
||||
|
||||
#### system
|
||||
* **Removed old virtmem API**.
|
||||
* Added mechanism for overriding libnx's dynamic memory allocation behavior.
|
||||
* This also added specific mechanisms for NV and BSD transfer memory handling.
|
||||
* Added hosversionIsAtmosphere, together with support for receiving this information through HBABI.
|
||||
* Added tipc (Tiny IPC) serialization support, introduced in [12.0.0+].
|
||||
* Updated sm, sm:m and pgl wrappers for tipc support.
|
||||
* Fixed certain serialization bug in cmif handling code.
|
||||
* argv setup code can now be overriden.
|
||||
* virtmem RNG algorithm can now be overriden.
|
||||
* Added support for incremental CRC calculations.
|
||||
|
||||
#### fs
|
||||
* Added fsOpenHostFileSystem(WithOption).
|
||||
|
||||
#### input
|
||||
* Added HidKeyboardKey enum.
|
||||
* Added hidKeyboardStateGetKey helper function.
|
||||
* Added support for SleepButton AutoPilot in hiddbg.
|
||||
* Updated hdls service wrapper for [12.0.0+].
|
||||
* Corrected HidGestureAttribute, HidGestureState.
|
||||
* Corrected several swkbd enums and structs.
|
||||
* Minor Palma documentation improvements.
|
||||
|
||||
#### other services
|
||||
* **Updated btdrv service wrapper for [12.0.0+]**, along with fixes and improved support.
|
||||
* Added audctl service wrapper.
|
||||
* Added audrec service wrapper.
|
||||
* Added avm service wrapper.
|
||||
* Added friends service wrapper (minimal functionality needed for retrieving the user's friend code).
|
||||
* Added htcs service wrapper.
|
||||
* Added mm:u service wrapper.
|
||||
* Added new nvioctlChannel_\* wrappers: Submit, GetSyncpt, GetModuleClockRate, MapCommandBuffer, UnmapCommandBuffer.
|
||||
* Added SetSysProductModel enum, now used by setsysGetProductModel.
|
||||
* Added audrvVoiceIsPaused.
|
||||
* Updated BtmDeviceCondition struct, including compatibility with all system versions.
|
||||
* Corrected pscmGetPmModule prototype.
|
||||
* Renamed ChargerType to PsmChargerType, corrected enum names.
|
||||
* Fixed bug in time offset handling.
|
||||
* Fixed bug in BSD (sockets) initialization.
|
||||
|
||||
**Several issues were fixed, and usability and stability were improved.**
|
||||
|
||||
## Version 4.0.0
|
||||
|
||||
#### system
|
||||
* **Added support for the light event synchronization primitive** (needs [4.0.0+] or mesosphère).
|
||||
* **The virtmem API was completely redesigned** to support ASLR and increase thread safety.
|
||||
* **Added diagAbortWithResult**, an overridable user panic function which is intended to replace fatalThrow in order to stop homebrew from treating application errors as fatal system errors that bring the entire OS down.
|
||||
* The default implementation uses svcBreak.
|
||||
* Replaced calls to fatalThrow with diagAbortWithResult throughout libnx.
|
||||
* Added detectMesosphere.
|
||||
* Added svcGetResourceLimitPeakValue [11.0.0+].
|
||||
* Added InfoType_FreeThreadCount [11.0.0+].
|
||||
* Corrected svcBreak definition and added BreakReason enum.
|
||||
* Removed obsolete kernel version detection code.
|
||||
* fatal service wrapper now checks hosversion.
|
||||
* Jit object wrapper now checks syscall hinting provided by the homebrew environment (requires nx-hbloader 2.4.0+).
|
||||
* Miscellaneous crt0/linkscript fixes and optimizations.
|
||||
|
||||
#### input
|
||||
* **Major refactor of the HID service**, including a redesigned API that follows official usage more accurately, allowing more flexibility and improved future maintainability. Summary of changes:
|
||||
* Introduced HidNpadIdType, HidNpadStyleTag, HidNpadButton enums and others.
|
||||
* Enums and structs were updated to more accurately reflect official names; this also affects all other hid related services.
|
||||
* Everything which formerly took HidControllerID parameters now takes HidNpadIdType instead; this also affects all other hid related services.
|
||||
* Handle types (such as vibration and sixaxis sensor handles) are now structs instead of bare integer values; this also affects all other hid related services.
|
||||
* Introduced explicit initialization functions for Npad, TouchScreen, Mouse, Keyboard.
|
||||
* Introduced (or renamed) functions for configuring or retrieving Npad input style and other associated behavior.
|
||||
* Introduced the hidGetNpadStates{X} family of functions, which read the current state of a Npad in the given style.
|
||||
* Likewise introduced hidGetTouchScreenStates, hidGetMouseStates, hidGetKeyboardStates, hidGetSixAxisSensorStates.
|
||||
* Added support for most other miscellaneous hid service commands.
|
||||
* Deprecated the entirety of the old API, including but not limited to: hidScanInput, hidGetKeysDown/Held/Up, hidTouchCount, hidTouchRead, etc.
|
||||
* Removed hidSetControllerLayout/hidGetControllerLayout together with HidControllerLayoutType.
|
||||
* Introduced a new wrapper Pad API that replaces the old API for application usage.
|
||||
* Introduced PadRepeater API.
|
||||
* **Added full support for GameCube, Palma (Poké Ball Plus), Lark (NES) and Lucia (SNES) controllers.**
|
||||
* **Added support for gestures.**
|
||||
* **Improved support for SevenSixAxisSensor.**
|
||||
* Added hiddbg AutoPilot support for DebugPad, TouchScreen, Mouse, Keyboard.
|
||||
* Added hiddbgDeactivateHomeButton.
|
||||
* Added HiddbgNpadButton enum with Home/Capture buttons (exclusive to hiddbg pad state).
|
||||
* Updated hidsys service wrapper for [11.0.0+], including new functionality.
|
||||
* Added hidsysSendKeyboardLockKeyEvent, hidsysGetNpadInterfaceType, hidsysGetNpadLeftRightInterfaceType, hidsysHasBattery, hidsysHasLeftRightBattery, hidsysIsUsbFullKeyControllerEnabled, hidsysEnableUsbFullKeyController, hidsysIsUsbConnected, hidsysIsFirmwareUpdateNeededForNotification.
|
||||
* Improved support for hidsys' Home/Sleep/Capture button commands.
|
||||
* Added HidsysUniquePadSerialNumber struct.
|
||||
* Fixed bug in hidbus/Ring-Con code that could cause a crash following cleanup.
|
||||
|
||||
#### applets
|
||||
* Updated applet service wrapper for [11.0.0+], including new functionality.
|
||||
* Renamed several members in the following enums to more accurately reflect official names: AppletOperationMode, AppletHookType, AppletMessage, AppletFocusState, AppletFocusHandlingMode, AppletId, AppletWirelessPriorityMode, AppletWindowOriginMode.
|
||||
* Added appletHolderGetExitEvent, appletHolderGetPopInteractiveOutDataEvent.
|
||||
* Added libappletRequestToLaunchApplication, libappletRequestJumpToStory [11.0.0+].
|
||||
* Added webConfigSetTransferMemory.
|
||||
* Added swkbdInlineGetMaxHeight, swkbdInlineGetTouchRectangles, swkbdInlineIsUsedTouchPointByKeyboard, swkbdInlineGetMiniaturizedHeight.
|
||||
* Added nfpLa wrapper (amiibo).
|
||||
* Added miiLa wrapper (Mii editor).
|
||||
* Added nifmLa wrapper.
|
||||
* Updated swkbd for [10.0.0+].
|
||||
* Updated web for [10.0.0+].
|
||||
* Updated hidLa for [11.0.0] + misc fixes.
|
||||
* Implemented support for WebSession in web.
|
||||
* Implemented support for UserDisplay mode in swkbd.
|
||||
|
||||
#### filesystem
|
||||
* Added fsCreateSaveDataFileSystem, fsDeleteSaveDataFileSystem, fsDeleteSaveDataFileSystemBySaveDataAttribute.
|
||||
* Added fsOpenDataFileSystemByCurrentProcess, fsOpenDataFileSystemByProgramId, fsOpenDataStorageByProgramId, fsOpenPatchDataStorageByCurrentProcess.
|
||||
* Added fsOutputAccessLogToSdCard, fsGetProgramIndexForAccessLog.
|
||||
* Added romfsMountDataStorageFromProgram.
|
||||
* Fixed stat on romfs devices to report failure properly for non-existent files/directories.
|
||||
|
||||
#### other services
|
||||
* Added Bluetooth (bt, btdrv, btm, btm:u, btm:sys) service wrappers.
|
||||
* Added btdev wrapper API.
|
||||
* Added ins:r and ins:s service wrappers.
|
||||
* Added uart service wrapper.
|
||||
* Added news service wrapper.
|
||||
* Added lp2p service wrapper.
|
||||
* Added ectx:r service wrapper [11.0.0+].
|
||||
* Added capmtp service wrapper [11.0.0+].
|
||||
* Added smDetachClient [11.0.0+].
|
||||
* Added ErrorContextType enum.
|
||||
* Updated gpio service wrapper to add most missing functionality.
|
||||
* Updated psm service wrapper to add more battery functions.
|
||||
* Updated loader service wrapper for [11.0.0+].
|
||||
* Updated usb:ds service wrapper for [11.0.0+].
|
||||
* Updated set service wrapper for [10.1.0+], including new functionality.
|
||||
* Updated ns service wrapper to consider ns:ro if available [11.0.0+].
|
||||
* Updated ssl service enum SslVersion for [11.0.0+].
|
||||
* Renamed several members in the following enums to more accurately reflect official names: ApmPerformanceMode, ApmCpuBoostMode.
|
||||
* Fixed bug in splCryptoGetSecurityEngineEvent service wrapper.
|
||||
* Fixed audoutOpenAudioOut to properly pass aruid, making the service usable once again (and restoring compatibility with [1.0.0]).
|
||||
* Reliability and usability fixes in usb:ds:
|
||||
* Added UsbState enum (now returned by usbDsGetState).
|
||||
* Fixed usbDsWaitReady to properly respect the given timeout.
|
||||
|
||||
**Several issues were fixed, and usability and stability were improved.**
|
||||
|
||||
## Version 3.3.0
|
||||
|
||||
#### system
|
||||
* Mutex implementation has been rewritten/optimized to more closely match official software.
|
||||
|
||||
#### filesystem
|
||||
* Added lstat support to both fsdev and romfsdev (does the same thing as regular stat, as symlinks don't exist on HOS).
|
||||
* Fixed stat for romfs directories.
|
||||
|
||||
#### other services
|
||||
* **ldn: Added service wrappers.**
|
||||
* nifm: Added IRequest support.
|
||||
|
||||
## Version 3.2.0
|
||||
|
||||
#### system
|
||||
* Added threadGetSelf.
|
||||
* Added a Thread struct for the main thread.
|
||||
* Corrected error code in shmemMap.
|
||||
* Updated svcQueryIoMapping to match new 10.0.0+ ABI change. Old version still available as svcLegacyQueryIoMapping.
|
||||
* Minor fixes in jit wrapper object.
|
||||
|
||||
#### network
|
||||
* **Added support for the ssl service**.
|
||||
* Added socketSslConnectionSetSocketDescriptor and socketSslConnectionGetSocketDescriptor (for usage with SSL).
|
||||
* Added support for recvmsg/sendmsg and sendmmsg/recvmmsg [7.0.0+].
|
||||
* Added nifmGetCurrentNetworkProfile, nifmGetNetworkProfile, nifmSetNetworkProfile, nifmGetCurrentIpConfigInfo.
|
||||
* Added structs: NifmIpV4Address, NifmIpAddressSetting, NifmDnsSetting, NifmProxySetting, NifmIpSettingData, NifmWirelessSettingData, NifmSfWirelessSettingData, NifmSfNetworkProfileData, NifmNetworkProfileData.
|
||||
|
||||
#### devices
|
||||
* Changed libnx console to only hook stdout. If stderr is necessary, use `consoleDebugInit(debugDevice_CONSOLE)` explicitly.
|
||||
* Added nxlinkConnectToHost with separate flags for redirecting stdout/err.
|
||||
* Added nxlinkStdioForDebug, which only redirects stderr and not stdout.
|
||||
|
||||
#### graphics
|
||||
* Added priority parameter to nvGpuChannelCreate.
|
||||
* Fixed cleanup logic in nvChannelClose.
|
||||
* Added nvGpuChannelGetErrorInfo.
|
||||
* Renamed NvError struct & NvErrorType enum to NvNotification/NvNotificationType.
|
||||
|
||||
#### other services
|
||||
* applet: Support changes for 10.0.0+, including new command support.
|
||||
* swkbd: appletHolderPresetLibraryAppletGpuTimeSliceZero is now called on 10.0.0+.
|
||||
* audout: Added all remaining IAudioOut commands.
|
||||
* bpc: Added hosversion check to bpcGetSleepButtonState.
|
||||
* caps: Correct CapsScreenShotDecodeOption.
|
||||
* capssc:
|
||||
* Added capsscCaptureJpegScreenShot, capsscOpenRawScreenShotReadStream, capsscCloseRawScreenShotReadStream, capsscReadRawScreenShotReadStream.
|
||||
* Changed capsscCaptureRawImageWithTimeout to use ViLayerStack enum.
|
||||
* fsldr: Support changes for 10.0.0+, including new command support.
|
||||
* fsp-pr + ldr: Support changes for 10.0.0+ (SetEnabledProgramVerification changed places).
|
||||
* hidsys: Support changes for 10.0.0+, including new command support.
|
||||
* irs: Corrected bug on initialization caused by invalid system version logic.
|
||||
* lr: Added lrLrEraseProgramRedirection [5.0.0+].
|
||||
* mii: Added service wrappers.
|
||||
* miiimg: Added service wrappers.
|
||||
* nfp: Corrected definition of nfpOpenApplicationArea.
|
||||
* ns: Support changes for 10.0.0+, including new command support (also some other misc fixes).
|
||||
* pdm: Support changes for 10.0.0+, including new command support.
|
||||
* pgl: Added service wrappers [10.0.0+].
|
||||
* pl: Added support for changing the service type (PlServiceType).
|
||||
* pmshell: Renamed pmshellBoostSystemThreadResourceLimit to pmshellEnableApplicationExtraThread.
|
||||
* psc: Corrected hosversion check in pscPmModuleAcknowledge.
|
||||
* set:
|
||||
* Added new 10.0.0+ commands.
|
||||
* Corrected definition of SetRegion to match actual usage.
|
||||
* Corrected setsysGetSerialNumber.
|
||||
* Corrected setcalGetGyroscopeOffset to use the right struct.
|
||||
* time:
|
||||
* Added support for time shared memory [6.0.0+].
|
||||
* Added timeGetStandardSteadyClockTimePoint.
|
||||
* Added timeGetStandardSteadyClockInternalOffset [3.0.0+].
|
||||
* Added TimeStandardSteadyClockTimePointType struct.
|
||||
* Changed timeGetCurrentTime to use shared memory on 6.0.0+.
|
||||
* vi: Added ViLayerStack enum.
|
||||
|
||||
#### miscellaneous
|
||||
* Corrected and updated nacp structs.
|
||||
* Further improvements to overall system stability and other minor adjustments have been made to enhance the user experience.
|
||||
|
||||
## Version 3.1.0
|
||||
|
||||
#### system
|
||||
* **Deleted the old and deprecated IPC system**.
|
||||
* **Added wrappers for all missing system calls**.
|
||||
* Corrected signatures of many system calls.
|
||||
* Removed `arm/atomics.h` (use C `<stdatomic.h>` or C++ `<atomic>` instead).
|
||||
* Removed `U64_MAX` define (use `UINT64_MAX` instead).
|
||||
* Added UtilFloat3 struct.
|
||||
|
||||
#### applet
|
||||
* Fixed `__nx_applet_exit_mode` handling.
|
||||
* `apm` is now only used/initialized for `AppletType_Application`.
|
||||
* Simplified `appletGetAppletResourceUserId` to return the aruid directly, or 0 on "failure" (which is not really a failure condition).
|
||||
* Changed `appletSetFocusHandlingMode` to return error if the applet type is not `AppletType_Application`.
|
||||
* Added more fields to `SwkbdType` enum.
|
||||
|
||||
#### filesystem
|
||||
* RomFS code now properly supports reading to uncached buffers.
|
||||
* Added fsdev commands: fsdevMountDeviceSaveData, fsdevMountBcatSaveData, fsdevMountSystemBcatSaveData, fsdevMountTemporaryStorage, fsdevMountCacheStorage, fsdevMountSaveDataReadOnly.
|
||||
* Added commands: fsOpenImageDirectoryFileSystem, fsOpenReadOnlySaveDataFileSystem, fsIsSignedSystemPartitionOnSdCardValid, fsOpen_DeviceSaveData, fsOpen_BcatSaveData, fsOpen_SystemBcatSaveData, fsOpen_TemporaryStorage, fsOpen_CacheStorage, fsOpen_SaveDataReadOnly.
|
||||
* Added enum: FsImageDirectoryId.
|
||||
* Removed path stack copy logic from fsFsQueryEntry.
|
||||
|
||||
#### graphics
|
||||
* Removed bqDetachBuffer calls from nwindowReleaseBuffers as it does nothing in the place it's called.
|
||||
* Fixed nvFence/nvGpu/nvMap to use service guard instead of unsafe reference counting.
|
||||
|
||||
#### hid
|
||||
* **Fixed vibration handling**.
|
||||
* **Added Ring-Con™ support**.
|
||||
* Added hidbus service wrappers.
|
||||
* Added commands: hidSetSixAxisSensorFusionParameters, hidGetSixAxisSensorFusionParameters, hidResetSixAxisSensorFusionParameters, hidSetGyroscopeZeroDriftMode, hidGetGyroscopeZeroDriftMode, hidResetGyroscopeZeroDriftMode.
|
||||
* Majorly overhauled irs service support (infrared camera), with support for features introduced in later system versions.
|
||||
* Added enum: HidGyroscopeZeroDriftMode.
|
||||
* Corrected internal console six-axis sensor initialization function to actually use the right command.
|
||||
* Corrected values of `JOYSTICK_MIN` and `JOYSTICK_MAX`.
|
||||
|
||||
#### other services
|
||||
* Added apm command: apmGetPerformanceMode.
|
||||
* Added caps:a service wrappers.
|
||||
* Added caps:c service wrappers.
|
||||
* Added caps:dc service wrappers.
|
||||
* Added fan service wrappers.
|
||||
* Added many missing lbl commands.
|
||||
* Added nifm commands: nifmGetClientId (with corresponding NifmClientId struct), nifmIsAnyInternetRequestAccepted.
|
||||
* Added nim service wrappers (only nimListSystemUpdateTask/nimDestroySystemUpdateTask for now).
|
||||
* Majorly overhauled ns service support, with countless commands and structures.
|
||||
* Added set:cal service wrappers.
|
||||
* Completed and corrected all set:sys commands.
|
||||
* Added tc service wrappers.
|
||||
* Actually expose ldrShellFlushArguments, ldrDmntFlushArguments, spl\*GetServiceSession.
|
||||
* Corrected minimum sysver for setsysGetHomeMenuScheme.
|
||||
* Corrected minimum sysver for nsListApplicationContentMetaStatus.
|
||||
* Fixed splSslLoadSecureExpModKey/splEsLoadSecureExpModKey/splRsaDecryptPrivateKey/splSslLoadSecureExpModKey/splEsLoadRsaOaepKey/splEsLoadSecureExpModKey/splFsLoadSecureExpModKey on 5.0+.
|
||||
* Fixed plInitialize failure handling.
|
||||
* Removed non-existent fsldrSetCurrentProcess.
|
||||
|
||||
#### miscellaneous
|
||||
* Changed timezone support code to always report `NX` as the timezone name, fixing certain issues.
|
||||
* Further improvements to overall system stability and other minor adjustments have been made to enhance the user experience.
|
||||
|
||||
## Version 3.0.0
|
||||
|
||||
#### system
|
||||
* **The IPC system has been redesigned with a brand new interface and implementation**.
|
||||
* Changed serviceClone to actually use the non-Ex cmif control command.
|
||||
* Added serviceCloneEx.
|
||||
* Added NX_INLINE and NX_CONSTEXPR helper macros.
|
||||
* Added ServiceMgr object, used for multiplexed multithreaded services.
|
||||
* Native threading API now supports using user-provided memory as stack.
|
||||
* pthread explicit stack ptr/size attributes are now supported.
|
||||
* Fixed incorrect bounds check in virtmem code (solves long-standing JIT bug).
|
||||
* Added InfoType_IsApplication.
|
||||
* Added LibnxError_ShouldNotHappen.
|
||||
* Read-write lock object (rwlock) was completely rewritten to closely match the official implementation.
|
||||
|
||||
#### services in general
|
||||
* **All service wrappers have been converted to use the new IPC interface**.
|
||||
* Fixed thread safety during service init/exit.
|
||||
* Numerous commands that had IPC bugs were fixed.
|
||||
* Improved documentation for many services (list too long to fit here).
|
||||
* Corrected and documented system version checks for many different commands.
|
||||
* Corrected many structs to avoid using types with incorrect alignment or size.
|
||||
* Changed many names of fields in several structs to be more consistent and less random.
|
||||
* Corrected many parameter types and names to be more consistent with official software (as well as using enums when possible).
|
||||
* Phased out non-existent "Title ID" concept in favor of "Program ID" or other applicable official ID names.
|
||||
* Many parameter and enum names were renamed as a result.
|
||||
* Added AccountUid struct, which replaces u128 user ids throughout libnx and reduces the need for packed structs. "userID" replaced by "uid" throughout libnx.
|
||||
* Added accountUidIsValid.
|
||||
* Added Uuid struct, which replaces u128 uuids where applicable and reduces the need for packed structs.
|
||||
* Added NacpSendReceiveConfiguration struct.
|
||||
* Updated NacpStruct with many fixes and additions.
|
||||
* Fixed locking issue in usbComms which caused a hang in usbCommsInitialize(Ex) on failure.
|
||||
|
||||
#### sm
|
||||
* Introduced SmServiceName structure:
|
||||
* Added constexpr helper functions: smServiceNameToU64, smServiceNameFromU64, smServiceNamesAreEqual, smEncodeName.
|
||||
* All SM functions now take in SmServiceName instead of a string, except for smGetService.
|
||||
* Added smGetServiceWrapper (which takes SmServiceName and looks inside the override list).
|
||||
* smGetService is now an inline wrapper for smEncodeName+smGetServiceWrapper.
|
||||
* Removed smHasInitialized.
|
||||
|
||||
#### filesystem
|
||||
* **Added transparent multithreaded filesystem support.**
|
||||
* Default maximum number of concurrent filesystem operations is 3, this can be changed through the `__nx_fs_num_sessions` weak var.
|
||||
* Added fsSetPriority, fsFsIsValidSignedSystemPartitionOnSdCard.
|
||||
* Thoroughly fixed the names of commands, enums, flags to match official software and be more consistent with the libnx code style (list too long to fit here).
|
||||
* Removed FS_SAVEDATA_USERID_COMMONSAVE.
|
||||
* Renamed FsStorageId to NcmStorageId (and renamed enum value names too).
|
||||
* Added FsSaveDataSpaceId_ProperSystem, FsFileSystemType_RegisteredUpdate, FsSaveDataSpaceId_SdUser, FsSaveDataSpaceId_SafeMode.
|
||||
* Added FsSaveDataType_SystemBcat.
|
||||
* Added FsGameCardPartition_Logo. (also, a typo was fixed in the name of this enum)
|
||||
* Added FsSaveDataFlags_NeedsSecureDelete.
|
||||
* Added FsSaveDataRank enum.
|
||||
* Added FsFileSystemQueryId_IsValidSignedSystemPartitionOnSdCard.
|
||||
* Added FsGameCardAttribute_DifferentRegionCupToTerraDeviceFlag, FsGameCardAttribute_DifferentRegionCupToGlobalDeviceFlag.
|
||||
* Renamed FsBisStorageId to FsBisPartitionId.
|
||||
* Added FsBisPartitionId_SignedSystemPartitionOnSafeMode.
|
||||
* Removed spurious inval param from fsDirRead.
|
||||
* fspr:
|
||||
* Now using domains.
|
||||
* fsdev:
|
||||
* Timestamps are now converted into proper POSIX UTC format instead of local time.
|
||||
* Directory iterator memory footprint can now be configured with `__nx_fsdev_direntry_cache_size`.
|
||||
* Reduced TLS footprint for rarely used codepaths.
|
||||
* Reduced TLS footprint by sharing the path buffer with romfsdev.
|
||||
* Removed fsdevGetDefaultFileSystem and default-fs handling.
|
||||
* Refactored CWD support to have (dynamically allocated) per-device CWDs (CWD support as a whole can be turned off with `__nx_fsdev_support_cwd`).
|
||||
* Many internal optimizations that reduce unnecessary lookups and buffer copies.
|
||||
* Fixed string comparison logic in fsdevFindDevice.
|
||||
* Mounting a filesystem now automatically sets the default device if there wasn't any previous default device (or if it's stdnull).
|
||||
* fsdevMountSdmc no longer sets cwd to the folder containing the executable; this logic was moved to a new internal function called on startup by default (and it is now disabled for NSOs).
|
||||
* Added fsdevMountSaveData/SystemSaveData wrappers.
|
||||
* Added fsdevIsValidSignedSystemPartitionOnSdCard.
|
||||
* Enhanced fsOpen_SystemSaveData/fsdevMountSystemSaveData with new parameters.
|
||||
* romfsdev:
|
||||
* Reduced TLS footprint by sharing the path buffer with fsdev.
|
||||
* Cleaned up romfsMount\* functions and removed unused/unnecessary logic.
|
||||
* Changed romfsMount\* functions to return real result codes.
|
||||
* Renamed romfsMount to romfsMountSelf.
|
||||
* Removed romfsInitFromFile and romfsInitFromStorage (use Mount instead).
|
||||
* Added bounds-checking safety measures.
|
||||
* Fixed errno to use ENOENT instead of EEXIST where required.
|
||||
|
||||
#### network
|
||||
* **Added transparent multithreaded socket support.**
|
||||
* Default maximum number of concurrent socket operations is 3, this can be changed through `SocketInitConfig::num_bsd_sessions`.
|
||||
* **DNS resolver support was rewritten** and spun off from the socket device wrapper.
|
||||
* No initialization is required to use resolver functions.
|
||||
* Removed phantom sfdnsres commands.
|
||||
* Redesigned sfdnsres IPC wrappers.
|
||||
* "timeout" was actually the cancel handle.
|
||||
* Fixed bug in addrinfo deserialization.
|
||||
* Fixed bug in getaddrinfo when hints is NULL.
|
||||
* Added commands to configure behavior: resolverGetCancelHandle, resolverGetEnableServiceDiscovery, resolverSetEnableServiceDiscovery, resolverCancel.
|
||||
* Placeholders for not-yet-implemented 5.0+ config keys: resolverGetEnableDnsCache, resolverSetEnableDnsCache, resolverRemoveHostnameFromCache, resolverRemoveIpAddressFromCache.
|
||||
* Added service session getters: nifmGetServiceSession_StaticService, nifmGetServiceSession_GeneralService.
|
||||
* Introduced BsdServiceType enum, which is now used for revised service type handling (bsd:u is now the default service).
|
||||
* SocketInitConfig was changed:
|
||||
* Added num_bsd_sessions and bsd_service_type fields.
|
||||
* Removed fields related to sfdnsres.
|
||||
* socketInitialize no longer initializes nifm. As a result, gethostid now calls nifmInitialize/nifmExit as needed.
|
||||
* Renamed socketGetLastBsdResult to socketGetLastResult.
|
||||
* Renamed socketGetLastSfdnsresResult to resolverGetLastResult.
|
||||
|
||||
#### applet
|
||||
* Many internal improvements and fixes stemming from new IPC refactoring.
|
||||
* appletGetOperationMode now returns AppletOperationMode instead of u8.
|
||||
* appletGetPerformanceMode now returns ApmPerformanceMode instead of u8.
|
||||
* Added 9.0+ support for using appletSetTerminateResult via IAppletCommonFunctions.
|
||||
* Added 9.0+ support for using appletGetLaunchStorageInfoForDebug, appletGetGpuErrorDetectedSystemEvent with AppletType_LibraryApplet.
|
||||
* Added 9.1+ support for using appletSetHandlingHomeButtonShortPressedEnabled with non-AppletType_OverlayApplet.
|
||||
* Added appletPushToAppletBoundChannel, appletTryPopFromAppletBoundChannel, appletGetSettingsPlatformRegion, appletSetHdcpAuthenticationActivated, appletSetInputDetectionPolicy, appletSetHealthWarningShowingState, appletGetHealthWarningDisappearedSystemEvent, appletIsForceTerminateApplicationDisabledForDebug, appletGetFriendInvitationStorageChannelEvent, appletTryPopFromFriendInvitationStorageChannel, appletGetNotificationStorageChannelEvent, appletTryPopFromNotificationStorageChannel, appletApplicationPushToFriendInvitationStorageChannel, appletApplicationPushToNotificationStorageChannel, appletPushToAppletBoundChannelForDebug, appletTryPopFromAppletBoundChannelForDebug, appletAlarmSettingNotificationEnableAppEventReserve, appletAlarmSettingNotificationDisableAppEventReserve, appletAlarmSettingNotificationPushAppEventNotify, appletFriendInvitationSetApplicationParameter, appletFriendInvitationClearApplicationParameter, appletFriendInvitationPushApplicationParameter.
|
||||
* Added enum: AppletInputDetectionPolicy.
|
||||
|
||||
#### libapplets
|
||||
* Added support for the friendsLa libapplet.
|
||||
* Added support for the psel (player select) libapplet.
|
||||
* Added support for the hidLa (controller configuration) libapplet.
|
||||
* Renamed webConfigSetUserID to webConfigSetUid.
|
||||
* Renamed WebArgType_UserID to WebArgType_Uid.
|
||||
|
||||
#### ns
|
||||
* Corrected names of nsdevLaunchApplicationForDevelop, nsdevLaunchApplicationWithStorageIdForDevelop, nsdevGetRunningApplicationProcessIdForDevelop, nsdevSetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop.
|
||||
* Corrected parameters of nsListApplicationRecord, nsListApplicationContentMetaStatus, nsvmGetSafeSystemVersion.
|
||||
* Added support for ns:su.
|
||||
* Added enum: NsApplicationControlSource.
|
||||
* Added service session getters: nsGetServiceSession_GetterInterface, nsGetServiceSession_ApplicationManagerInterface, nsdevGetServiceSession, nssuGetServiceSession.
|
||||
* Added structs: NsApplicationDeliveryInfo, NsReceiveApplicationProgress, NsSendApplicationProgress, NsSystemDeliveryInfo, NsSystemUpdateProgress.
|
||||
* Added nsGetSystemDeliveryInfo, nsGetApplicationDeliveryInfo, nsSelectLatestSystemDeliveryInfo, nsVerifyDeliveryProtocolVersion, nsHasAllContentsToDeliver, nsCompareApplicationDeliveryInfo, nsCanDeliverApplication, nsListContentMetaKeyToDeliverApplication, nsNeedsSystemUpdateToDeliverApplication, nsEstimateRequiredSize, nsRequestReceiveApplication, nsCommitReceiveApplication, nsGetReceiveApplicationProgress, nsRequestSendApplication, nsGetSendApplicationProgress, nsCompareSystemDeliveryInfo, nsListNotCommittedContentMeta, nsGetApplicationDeliveryInfoHash.
|
||||
|
||||
#### other services
|
||||
* account:
|
||||
* Added AccountServiceType, and changed accountInitialize to accept it.
|
||||
* Renamed AccountProfileBase::username to nickname.
|
||||
* Removed output bool from accountGetLastOpenedUser.
|
||||
* Added AccountNetworkServiceAccountId struct.
|
||||
* Added accountIsUserRegistrationRequestPermitted, accountTrySelectUserWithoutInteraction.
|
||||
* apm:
|
||||
* Added enum: ApmPerformanceMode.
|
||||
* Added service session getter: apmGetServiceSession_Session.
|
||||
* async: Added support for the IAsyncValue/IAsyncResult interfaces.
|
||||
* audin:
|
||||
* Added missing count param to audinListAudioIns.
|
||||
* Changed wrapper to use 3.x+ Auto commands if available.
|
||||
* Added service session getters: audinGetServiceSession, audinGetServiceSession_AudioIn.
|
||||
* audout:
|
||||
* Added missing count param to audoutListAudioOuts.
|
||||
* Changed wrapper to use 3.x+ Auto commands if available.
|
||||
* Added service session getters: audoutGetServiceSession, audoutGetServiceSession_AudioOut.
|
||||
* audren:
|
||||
* Changed wrapper to use 3.x+ Auto commands if available.
|
||||
* Renamed audrenGetServiceSession to audrenGetServiceSession_AudioRenderer.
|
||||
* fatal:
|
||||
* Corrected names of commands and types to match official names more closely.
|
||||
* **fatalSimple was renamed to fatalThrow**.
|
||||
* friends:
|
||||
* Added structs: FriendsInAppScreenName, FriendsFriendInvitationGameModeDescription, FriendsFriendInvitationId, FriendsFriendInvitationGroupId.
|
||||
* Added friendsGetFriendInvitationNotificationEvent, friendsTryPopFriendInvitationNotificationInfo.
|
||||
* grc:
|
||||
* Renamed grcdRead to grcdTransfer.
|
||||
* hid:
|
||||
* Added hidIsVibrationDeviceMounted, hidGetNpadJoyHoldType.
|
||||
* Added internal 5.0+ support for using ActivateNpadWithRevision with the sysver-specific revision value.
|
||||
* Changed hidInitializeSevenSixAxisSensor to use ActivateConsoleSixAxisSensor earlier on instead of ActivateSevenSixAxisSensor.
|
||||
* hiddbg:
|
||||
* Added hiddbgAcquireOperationEventHandle, hiddbgGetOperationResult, hiddbgWriteSerialFlash, hiddbgIsHdlsVirtualDeviceAttached.
|
||||
* Fixed bug in hiddbgReadSerialFlash.
|
||||
* hidsys:
|
||||
* Added hidsysSetNotificationLedPatternWithTimeout.
|
||||
* Added hidsysAcquireCaptureButtonEventHandle, hidsysAcquireSleepButtonEventHandle to header.
|
||||
* Corrected bug that affected internal GetMaskedSupportedNpadStyleSet logic.
|
||||
* loader (ldrShell/ldrDmnt/ldrPm):
|
||||
* Updated names to match official software.
|
||||
* ncm:
|
||||
* Added new ncm_types.h header, which is used by several other services that need NCM types.
|
||||
* Updated structs: NcmContentMetaKey, NcmContentInfo, NcmContentMetaHeader, NcmApplicationMetaExtendedHeader.
|
||||
* Renamed NcmNcaId to NcmContentId.
|
||||
* Added NcmRightsId struct, which is now used by the RightsId funcs.
|
||||
* Added NcmProgramLocation, which is now used by pmshellLaunchProgram.
|
||||
* Changed several commands to accept array element count instead of byte size.
|
||||
* Fixed handling for ncmContentStorageGetPath/ncmContentStorageGetPlaceHolderPath.
|
||||
* Corrected NcmContentId struct alignment.
|
||||
* Added NcmPlaceHolderId struct, which is used instead of NcmContentId where needed.
|
||||
* Renamed FsStorageId to NcmStorageId (and renamed enum value names too).
|
||||
* Added structs: NcmPackagedContentInfo, NcmContentMetaInfo.
|
||||
* nfc/nfp:
|
||||
* Renamed from nfcu/nfpu to nfc/nfp.
|
||||
* Separated nfc service init/exit into nfcInitialize/nfcExit.
|
||||
* Renamed nfpuIsNfcEnabled to nfcIsNfcEnabled.
|
||||
* Renamed NfpuInitConfig to NfcRequiredMcuVersionData, removed it from nfpInitialize input, and changed it to be handled properly as an array.
|
||||
* Added NfcDeviceHandle struct, which is now used instead of HidControllerID.
|
||||
* Added NfpServiceType/NfcServiceType, and changed nfpInitialize/nfpInitialize to accept them.
|
||||
* Added service session getters: nfpuGetServiceSession, nfcuGetServiceSession, nfcuGetServiceSession_Interface, nfpuGetServiceSession_Interface (previously known as nfpuGetInterface).
|
||||
* nifm:
|
||||
* Replaced nifmSetServiceType with service type parameter in nifmInitialize.
|
||||
* notif: Added support.
|
||||
* nv:
|
||||
* Added service session getter: nvGetServiceSession.
|
||||
* pctl:
|
||||
* Added service session getters: pctlGetServiceSession, pctlGetServiceSession_Service.
|
||||
* pdm:
|
||||
* Renamed PdmApplicationEvent to PdmAppletEvent.
|
||||
* Renamed pdmqryQueryApplicationEvent to pdmqryQueryAppletEvent.
|
||||
* pdmqry:
|
||||
* Renamed pdmqryGetUserPlayedApplications to pdmqryQueryRecentlyPlayedApplication.
|
||||
* Renamed pdmqryGetUserAccountEvent to pdmqryGetRecentlyPlayedApplicationUpdateEvent.
|
||||
* pm:
|
||||
* Corrected names of commands to match official software.
|
||||
* roDmnt:
|
||||
* Renamed roDmntGetModuleInfos to roDmntGetProcessModuleInfo.
|
||||
* set:
|
||||
* Added SetLanguage_ZHHANS, SetLanguage_ZHHANT.
|
||||
* Added SetRegion_CHN, SetRegion_KOR, SetRegion_TWN.
|
||||
* Added size_out parameter to setsysGetSettingsItemValue, which was previously missing.
|
||||
* Replaced SetSysFlag/setsysGetFlag/setsysSetFlag with dedicated funcs for each flag.
|
||||
* Use SetLanguage instead of s32 in setMakeLanguage(Code).
|
||||
* Added setsysGetPlatformRegion, setsysSetPlatformRegion, setsysGetHomeMenuScheme, setsysGetHomeMenuSchemeModel, setsysGetMemoryUsageRateFlag, setsysGetTouchScreenMode, setsysSetTouchScreenMode, setsysGetPctlReadyFlag, setsysSetPctlReadyFlag, setsysIsUserSystemClockAutomaticCorrectionEnabled, setsysSetUserSystemClockAutomaticCorrectionEnabled, setsysSetLanguageCode, setsysGetAccountSettings, setsysSetAccountSettings, setsysGetEulaVersions, setsysSetEulaVersions, setsysGetNotificationSettings, setsysSetNotificationSettings, setsysGetAccountNotificationSettings, setsysSetAccountNotificationSettings, setsysGetTvSettings, setsysSetTvSettings, setsysGetDataDeletionSettings, setsysSetDataDeletionSettings, setsysGetWirelessCertificationFileSize, setsysGetWirelessCertificationFile, setsysSetRegionCode, setsysGetPrimaryAlbumStorage, setsysSetPrimaryAlbumStorage, setsysGetBatteryLot, setsysGetSleepSettings, setsysSetSleepSettings, setsysGetInitialLaunchSettings, setsysSetInitialLaunchSettings, setsysGetProductModel, setsysGetMiiAuthorId, setsysGetErrorReportSharePermission, setsysSetErrorReportSharePermission, setsysGetAppletLaunchFlags, setsysSetAppletLaunchFlags, setsysGetKeyboardLayout, setsysSetKeyboardLayout, setsysGetRebootlessSystemUpdateVersion, setsysGetChineseTraditionalInputMethod, setsysSetChineseTraditionalInputMethod.
|
||||
* Added enums: SetSysPlatformRegion, SetSysHomeMenuScheme, SetSysTouchScreenMode, SetSysUserSelectorFlag, SetSysEulaVersionClockType, SetSysNotificationVolume, SetSysFriendPresenceOverlayPermission, SetSysPrimaryAlbumStorage, SetSysHandheldSleepPlan, SetSysConsoleSleepPlan, SetSysErrorReportSharePermission, SetKeyboardLayout, SetChineseTraditionalInputMethod.
|
||||
* Added structs: SetBatteryLot, SetSysUserSelectorSettings, SetSysAccountSettings, SetSysEulaVersion, SetSysNotificationTime, SetSysNotificationSettings, SetSysAccountNotificationSettings, SetSysTvSettings, SetSysDataDeletionSettings, SetSysSleepSettings, SetSysInitialLaunchSettings, SetSysRebootlessSystemUpdateVersion.
|
||||
* time:
|
||||
* Changed service type handling to use new TimeServiceType enum (and `__nx_time_service_type` weak var), time:u is now the default service.
|
||||
* Changed timeToPosixTime/timeToPosixTimeWithMyRule to accept array element count instead of byte size.
|
||||
* Changed timeLoadLocationNameList to accept array element count instead of byte size.
|
||||
* Added service session getters: timeGetServiceSession_SystemClock, timeGetServiceSession_TimeZoneService.
|
||||
* Added TimeSteadyClockTimePoint struct (which is now used elsewhere in libnx).
|
||||
* ts: Added support.
|
||||
* usbhs:
|
||||
* 8.0+ support fixed; UsbHsInterfaceInfo input/output endpoints were swapped.
|
||||
* Fixed bug in usbHsEpClose.
|
||||
* vi:
|
||||
* Renamed viGetDisplayMinimumZ to viGetZOrderCountMin.
|
||||
* Renamed viGetDisplayMaximumZ to viGetZOrderCountMax.
|
||||
|
||||
#### miscellaneous
|
||||
* Further improvements to overall system stability and other minor adjustments have been made to enhance the user experience.
|
||||
|
||||
## Version 2.5.0
|
||||
|
||||
#### system
|
||||
* Corrected type of id0 in svcGetInfo.
|
||||
|
||||
#### filesystem
|
||||
* Added fsExtendSaveDataFileSystem, fsOpenCustomStorageFileSystem, fsSetGlobalAccessLogMode, fsGetGlobalAccessLogMode.
|
||||
* Added FsCustomStorageId enum.
|
||||
* Fixed by-name RomFS mount lookups to actually compare the entire name.
|
||||
|
||||
#### graphics
|
||||
* Added binder session argument to nwindowCreate (nwindowCreateFromLayer not affected).
|
||||
* Binder code now supports domain objects.
|
||||
* Fixed bug in nvAddressSpaceCreate.
|
||||
|
||||
#### input
|
||||
* **Explicitly announce support for System/SystemExt layouts, which in turn fixes input on 9.0.0+. It is of utmost importance that all homebrew be recompiled as soon as possible in order to work properly on 9.0.0+.**
|
||||
* **Fixed Hdls to work on 9.0.0+.**
|
||||
* Several Hdls structs were redefined in 9.0.0+ and libnx was updated to reflect the new struct definitions (this is a breaking change). The old structs are still available but they now have a `V7` suffix, and libnx transparently handles conversion to/from the new 9.x structs at runtime on older system versions; so the new structs are *always* used regardless of system version. List of structs affected:
|
||||
* HiddbgHdlsDeviceInfo(V7)
|
||||
* HiddbgHdlsState(V7)
|
||||
* HiddbgHdlsStateListEntry(V7)
|
||||
* HiddbgHdlsStateList(V7)
|
||||
* Added hiddbgGetUniquePadDeviceTypeSetInternal.
|
||||
* Added hidGetNpadInterfaceType.
|
||||
* Added HidNpadInterfaceType, HidDeviceTypeBits, HidDeviceType enums.
|
||||
* Prevent AbstractedPad/VirtualPad commands from being used on 9.0.0+ since they were removed.
|
||||
* Corrected several commands by internally calling hidControllerIDToOfficial.
|
||||
|
||||
#### applet
|
||||
* Added AppletAttribute, AppletProcessLaunchReason, AppletInfo, AppletApplicationLaunchProperty, AppletApplicationLaunchRequestInfo, AppletResourceUsageInfo structs.
|
||||
* Added AppletApplicationExitReason, AppletSystemButtonType, AppletProgramSpecifyKind enums.
|
||||
* Renamed AppletNotificationMessage to AppletMessage.
|
||||
* Renamed AppletLaunchParameterKind_Application to AppletLaunchParameterKind_UserChannel.
|
||||
* Added appletGetServiceSession_* funcs.
|
||||
* Added appletGetAppletInfo.
|
||||
* Changed appletRequestToShutdown/appletRequestToReboot and appletStartShutdownSequenceForOverlay/appletStartRebootSequenceForOverlay on success to enter an infinite sleep loop.
|
||||
* This is also used with `_appletExitProcess` when the exit commands were successful, which is used during `__nx_applet_exit_mode` handling.
|
||||
* Use OpenLibraryAppletProxy command on 3.0.0+ when running appletInitialize for AppletType_LibraryApplet.
|
||||
* Added libappletArgsPop and libappletSetJumpFlag.
|
||||
|
||||
* **ILibraryAppletSelfAccessor**:
|
||||
* Added appletPopInData, appletPushOutData, appletPopInteractiveInData, appletPushInteractiveOutData, appletGetPopInDataEvent, appletGetPopInteractiveInDataEvent.
|
||||
* Added appletCanUseApplicationCore, appletGetMainAppletApplicationControlProperty, appletGetMainAppletStorageId, appletGetDesirableKeyboardLayout.
|
||||
* Added appletPopExtraStorage, appletGetPopExtraStorageEvent, appletUnpopInData, appletUnpopExtraStorage.
|
||||
* Added appletGetIndirectLayerProducerHandle, appletGetMainAppletApplicationDesiredLanguage, appletGetCurrentApplicationId.
|
||||
* Added appletCreateGameMovieTrimmer, appletReserveResourceForMovieOperation, appletUnreserveResourceForMovieOperation.
|
||||
* Added appletGetMainAppletAvailableUsers.
|
||||
* **IProcessWindingController**:
|
||||
* Added appletPushContext, appletPopContext.
|
||||
* **IDebugFunctions**:
|
||||
* Added appletOpenMainApplication, appletPerformSystemButtonPressing, appletInvalidateTransitionLayer, appletRequestLaunchApplicationWithUserAndArgumentForDebug, appletGetAppletResourceUsageInfo.
|
||||
* **ILibraryAppletAccessor**:
|
||||
* Added appletHolderTerminate, appletHolderRequestExitOrTerminate.
|
||||
* **IProcessWindingController**:
|
||||
* Added appletHolderJump.
|
||||
* **IOverlayFunctions**:
|
||||
* Added appletBeginToObserveHidInputForDevelop.
|
||||
* **IHomeMenuFunctions**:
|
||||
* Added appletPopRequestLaunchApplicationForDebug, appletLaunchDevMenu.
|
||||
* **IApplicationCreator**:
|
||||
* Added support for AppletApplication.
|
||||
* Added appletCreateApplication, appletPopLaunchRequestedApplication, appletCreateSystemApplication, appletPopFloatingApplicationForDevelopment.
|
||||
* **ILibraryAppletCreator**:
|
||||
* Added appletTerminateAllLibraryApplets, appletAreAnyLibraryAppletsLeft.
|
||||
* **IApplicationFunctions**:
|
||||
* Added appletGetLaunchStorageInfoForDebug, appletRequestFlushGamePlayingMovieForDebug, appletExitAndRequestToShowThanksMessage.
|
||||
* Added appletExecuteProgram, appletJumpToSubApplicationProgramForDevelopment, appletRestartProgram, and appletGetPreviousProgramIndex.
|
||||
* Added appletCreateMovieMaker and appletPrepareForJit.
|
||||
|
||||
#### libapplets
|
||||
* Added support for launching the Album applet via albumLa.
|
||||
|
||||
#### other services
|
||||
* **Added GRC service support** (video recording, streaming and trimming).
|
||||
* Changes to caps (capture service) wrappers:
|
||||
* Added support for the caps:u service.
|
||||
* Added CapsAlbumFileDateTime, CapsAlbumEntryId, CapsApplicationData, CapsUserIdList, CapsScreenShotAttributeForApplication, CapsScreenShotDecodeOption, CapsApplicationAlbumFileEntry, CapsLoadAlbumScreenShotImageOutputForApplication structs.
|
||||
* Added AlbumReportOption, CapsContentType enums.
|
||||
* Added capsGetShimLibraryVersion (not an actual IPC wrapper).
|
||||
* Added capsGetDefaultStartDateTime, capsGetDefaultEndDateTime, capsConvertApplicationAlbumFileEntryToApplicationAlbumEntry, capsConvertApplicationAlbumEntryToApplicationAlbumFileEntry helper functions.
|
||||
* Added capssuSaveScreenShotWithUserData, capssuSaveScreenShotWithUserIds, capssuSaveScreenShotEx1, capssuSaveScreenShotEx2.
|
||||
* Improved definition of capssuSaveScreenShot and capssuSaveScreenShotEx0.
|
||||
* Improved definition of CapsScreenShotAttribute, CapsApplicationAlbumEntry structs.
|
||||
* Changed caps:su wrapper to call SetShimLibraryVersion on 7.0.0+.
|
||||
* Renamed capsscCaptureScreenshot with capsscCaptureRawImageWithTimeout.
|
||||
* Fixed lr RedirectApplication commands on 9.0.0+.
|
||||
* Renamed lrLrResolveLegalInformationPath to lrLrResolveApplicationLegalInformationPath.
|
||||
* Renamed lrLrRedirectLegalInformationPath to lrLrRedirectApplicationLegalInformationPath.
|
||||
* Added missing fields to NacpStruct and other miscellaneous corrections.
|
||||
* Fixed definition of setsysGetServiceSession.
|
||||
|
||||
#### miscellaneous
|
||||
* Further improvements to overall system stability and other minor adjustments have been made to enhance the user experience.
|
||||
|
||||
## Version 2.4.0
|
||||
|
||||
#### system
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Nintendo Switch AArch64-only userland library.
|
||||
Based on libctru.
|
||||
|
||||
[](https://doozer.io/switchbrew/libnx)
|
||||

|
||||
|
||||
# Install instructions
|
||||
See [Switchbrew](https://switchbrew.org/wiki/Setting_up_Development_Environment).
|
||||
|
@ -38,7 +38,7 @@ PROJECT_NAME = "libnx"
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = "$(TRAVIS_TAG)"
|
||||
PROJECT_NUMBER = "$(LIBNX_VERSION)"
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
|
26
nx/Makefile
26
nx/Makefile
@ -8,13 +8,6 @@ endif
|
||||
|
||||
include $(DEVKITPRO)/devkitA64/base_rules
|
||||
|
||||
export LIBNX_MAJOR := 2
|
||||
export LIBNX_MINOR := 4
|
||||
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
|
||||
@ -24,7 +17,7 @@ VERSION := $(LIBNX_MAJOR).$(LIBNX_MINOR).$(LIBNX_PATCH)
|
||||
#---------------------------------------------------------------------------------
|
||||
TARGET := nx
|
||||
#BUILD := build
|
||||
SOURCES := source/arm source/kernel source/services source/crypto source/nvidia source/nvidia/ioctl source/display source/audio source/applets source/runtime source/runtime/devices source/runtime/util/utf
|
||||
SOURCES := source/arm source/kernel source/sf source/services source/crypto source/nvidia source/nvidia/ioctl source/display source/audio source/applets source/runtime source/runtime/devices source/runtime/util source/runtime/util/utf
|
||||
DATA := data
|
||||
INCLUDES := include external/bsd/include
|
||||
|
||||
@ -39,7 +32,7 @@ CFLAGS := -g -Wall -Werror \
|
||||
$(ARCH) \
|
||||
$(BUILD_CFLAGS)
|
||||
|
||||
CFLAGS += $(INCLUDE) -DSWITCH
|
||||
CFLAGS += $(INCLUDE) -D__SWITCH__ -DLIBNX_NO_DEPRECATION
|
||||
|
||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
||||
|
||||
@ -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) */
|
||||
|
@ -17,7 +17,6 @@ extern "C" {
|
||||
|
||||
#include "switch/arm/tls.h"
|
||||
#include "switch/arm/cache.h"
|
||||
#include "switch/arm/atomics.h"
|
||||
#include "switch/arm/counter.h"
|
||||
|
||||
#include "switch/kernel/svc.h"
|
||||
@ -26,6 +25,7 @@ extern "C" {
|
||||
#include "switch/kernel/shmem.h"
|
||||
#include "switch/kernel/mutex.h"
|
||||
#include "switch/kernel/event.h"
|
||||
#include "switch/kernel/levent.h"
|
||||
#include "switch/kernel/uevent.h"
|
||||
#include "switch/kernel/utimer.h"
|
||||
#include "switch/kernel/rwlock.h"
|
||||
@ -36,9 +36,14 @@ extern "C" {
|
||||
#include "switch/kernel/detect.h"
|
||||
#include "switch/kernel/random.h"
|
||||
#include "switch/kernel/jit.h"
|
||||
#include "switch/kernel/ipc.h"
|
||||
#include "switch/kernel/barrier.h"
|
||||
|
||||
#include "switch/sf/hipc.h"
|
||||
#include "switch/sf/cmif.h"
|
||||
#include "switch/sf/service.h"
|
||||
#include "switch/sf/sessionmgr.h"
|
||||
#include "switch/sf/tipc.h"
|
||||
|
||||
#include "switch/services/sm.h"
|
||||
#include "switch/services/smm.h"
|
||||
#include "switch/services/fs.h"
|
||||
@ -47,8 +52,11 @@ extern "C" {
|
||||
#include "switch/services/acc.h"
|
||||
#include "switch/services/apm.h"
|
||||
#include "switch/services/applet.h"
|
||||
#include "switch/services/async.h"
|
||||
#include "switch/services/audctl.h"
|
||||
#include "switch/services/audin.h"
|
||||
#include "switch/services/audout.h"
|
||||
#include "switch/services/audrec.h"
|
||||
#include "switch/services/audren.h"
|
||||
#include "switch/services/auddev.h"
|
||||
#include "switch/services/hwopus.h"
|
||||
@ -56,18 +64,24 @@ extern "C" {
|
||||
#include "switch/services/lbl.h"
|
||||
#include "switch/services/i2c.h"
|
||||
#include "switch/services/gpio.h"
|
||||
#include "switch/services/uart.h"
|
||||
#include "switch/services/bpc.h"
|
||||
#include "switch/services/pcv.h"
|
||||
#include "switch/services/clkrst.h"
|
||||
#include "switch/services/fan.h"
|
||||
#include "switch/services/pgl.h"
|
||||
#include "switch/services/psm.h"
|
||||
#include "switch/services/spsm.h"
|
||||
//#include "switch/services/bsd.h" Use switch/runtime/devices/socket.h instead
|
||||
//#include "switch/services/bsd.h" Use <sys/socket.h> instead
|
||||
//#include "switch/services/sfdnsres.h" Use <netdb.h> instead
|
||||
//#include "switch/services/htcs.h"
|
||||
#include "switch/services/fatal.h"
|
||||
#include "switch/services/time.h"
|
||||
#include "switch/services/usb.h"
|
||||
#include "switch/services/usbds.h"
|
||||
#include "switch/services/usbhs.h"
|
||||
#include "switch/services/hid.h"
|
||||
#include "switch/services/hidbus.h"
|
||||
#include "switch/services/hiddbg.h"
|
||||
#include "switch/services/hidsys.h"
|
||||
#include "switch/services/irs.h"
|
||||
@ -75,22 +89,48 @@ extern "C" {
|
||||
#include "switch/services/vi.h"
|
||||
#include "switch/services/nv.h"
|
||||
#include "switch/services/nifm.h"
|
||||
#include "switch/services/nim.h"
|
||||
#include "switch/services/ns.h"
|
||||
#include "switch/services/ldr.h"
|
||||
#include "switch/services/ro.h"
|
||||
#include "switch/services/tc.h"
|
||||
#include "switch/services/ts.h"
|
||||
#include "switch/services/pm.h"
|
||||
#include "switch/services/set.h"
|
||||
#include "switch/services/ssl.h"
|
||||
#include "switch/services/lr.h"
|
||||
#include "switch/services/bt.h"
|
||||
#include "switch/services/btdrv.h"
|
||||
#include "switch/services/btm.h"
|
||||
#include "switch/services/btmu.h"
|
||||
#include "switch/services/btmsys.h"
|
||||
#include "switch/services/spl.h"
|
||||
#include "switch/services/ncm.h"
|
||||
#include "switch/services/psc.h"
|
||||
#include "switch/services/caps.h"
|
||||
#include "switch/services/capsa.h"
|
||||
#include "switch/services/capsc.h"
|
||||
#include "switch/services/capsdc.h"
|
||||
#include "switch/services/capsu.h"
|
||||
#include "switch/services/capssc.h"
|
||||
#include "switch/services/capssu.h"
|
||||
#include "switch/services/capmtp.h"
|
||||
#include "switch/services/nfc.h"
|
||||
#include "switch/services/wlaninf.h"
|
||||
#include "switch/services/pctl.h"
|
||||
#include "switch/services/pdm.h"
|
||||
#include "switch/services/grc.h"
|
||||
#include "switch/services/friends.h"
|
||||
#include "switch/services/notif.h"
|
||||
#include "switch/services/mii.h"
|
||||
#include "switch/services/miiimg.h"
|
||||
#include "switch/services/ldn.h"
|
||||
#include "switch/services/lp2p.h"
|
||||
#include "switch/services/news.h"
|
||||
#include "switch/services/ins.h"
|
||||
#include "switch/services/ectx.h"
|
||||
#include "switch/services/avm.h"
|
||||
#include "switch/services/mm.h"
|
||||
|
||||
#include "switch/display/binder.h"
|
||||
#include "switch/display/parcel.h"
|
||||
@ -110,14 +150,26 @@ extern "C" {
|
||||
#include "switch/audio/driver.h"
|
||||
|
||||
#include "switch/applets/libapplet.h"
|
||||
#include "switch/applets/album_la.h"
|
||||
#include "switch/applets/friends_la.h"
|
||||
#include "switch/applets/hid_la.h"
|
||||
#include "switch/applets/mii_la.h"
|
||||
#include "switch/applets/nfp_la.h"
|
||||
#include "switch/applets/nifm_la.h"
|
||||
#include "switch/applets/pctlauth.h"
|
||||
#include "switch/applets/psel.h"
|
||||
#include "switch/applets/error.h"
|
||||
#include "switch/applets/swkbd.h"
|
||||
#include "switch/applets/web.h"
|
||||
|
||||
#include "switch/runtime/env.h"
|
||||
#include "switch/runtime/hosversion.h"
|
||||
#include "switch/runtime/diag.h"
|
||||
#include "switch/runtime/nxlink.h"
|
||||
#include "switch/runtime/resolver.h"
|
||||
#include "switch/runtime/pad.h"
|
||||
#include "switch/runtime/ringcon.h"
|
||||
#include "switch/runtime/btdev.h"
|
||||
|
||||
#include "switch/runtime/util/utf.h"
|
||||
|
||||
|
31
nx/include/switch/applets/album_la.h
Normal file
31
nx/include/switch/applets/album_la.h
Normal file
@ -0,0 +1,31 @@
|
||||
/**
|
||||
* @file album_la.h
|
||||
* @brief Wrapper for using the Album LibraryApplet.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
|
||||
/// Arg type values pushed for the applet input storage, stored as an u8.
|
||||
typedef enum {
|
||||
AlbumLaArg_ShowAlbumFiles = 0, ///< ShowAlbumFiles. Only displays AlbumFiles associated with the application which launched the Album applet, with the filter button disabled.
|
||||
AlbumLaArg_ShowAllAlbumFiles = 1, ///< ShowAllAlbumFiles. Displays all AlbumFiles, with filtering allowed.
|
||||
AlbumLaArg_ShowAllAlbumFilesForHomeMenu = 2, ///< ShowAllAlbumFilesForHomeMenu. Similar to ::AlbumLaArg_ShowAllAlbumFiles.
|
||||
} AlbumLaArg;
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::AlbumLaArg_ShowAlbumFiles and playStartupSound=false.
|
||||
*/
|
||||
Result albumLaShowAlbumFiles(void);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::AlbumLaArg_ShowAllAlbumFiles and playStartupSound=false.
|
||||
*/
|
||||
Result albumLaShowAllAlbumFiles(void);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::AlbumLaArg_ShowAllAlbumFilesForHomeMenu and playStartupSound=true.
|
||||
*/
|
||||
Result albumLaShowAllAlbumFilesForHomeMenu(void);
|
||||
|
@ -6,7 +6,6 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/applet.h"
|
||||
#include "../services/set.h"
|
||||
|
||||
/// Error type for ErrorCommonHeader.type.
|
||||
@ -26,9 +25,18 @@ typedef struct {
|
||||
u32 desc; ///< The error description.
|
||||
} ErrorCode;
|
||||
|
||||
/// Error type for ErrorContext.type
|
||||
typedef enum {
|
||||
ErrorContextType_None = 0, ///< None
|
||||
ErrorContextType_Http = 1, ///< Http
|
||||
ErrorContextType_FileSystem = 2, ///< FileSystem
|
||||
ErrorContextType_WebMediaPlayer = 3, ///< WebMediaPlayer
|
||||
ErrorContextType_LocalContentShare = 4, ///< LocalContentShare
|
||||
} ErrorContextType;
|
||||
|
||||
/// Error context.
|
||||
typedef struct {
|
||||
u8 type; ///< Type
|
||||
u8 type; ///< Type, see \ref ErrorContextType.
|
||||
u8 pad[7]; ///< Padding
|
||||
u8 data[0x1f4]; ///< Data
|
||||
Result res; ///< Result
|
||||
@ -103,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 {
|
||||
@ -275,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);
|
||||
|
172
nx/include/switch/applets/friends_la.h
Normal file
172
nx/include/switch/applets/friends_la.h
Normal file
@ -0,0 +1,172 @@
|
||||
/**
|
||||
* @file friends_la.h
|
||||
* @brief Wrapper for using the MyPage (friends) LibraryApplet.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/acc.h"
|
||||
#include "../services/friends.h"
|
||||
|
||||
/// Arg type values used with \ref FriendsLaArg.
|
||||
typedef enum {
|
||||
FriendsLaArgType_ShowFriendList = 0, ///< ShowFriendList. Launches the applet with the "Friend List" menu initially selected.
|
||||
FriendsLaArgType_ShowUserDetailInfo = 1, ///< ShowUserDetailInfo
|
||||
FriendsLaArgType_StartSendingFriendRequest = 2, ///< StartSendingFriendRequest
|
||||
FriendsLaArgType_ShowMethodsOfSendingFriendRequest = 3, ///< ShowMethodsOfSendingFriendRequest. Launches the applet with the "Add Friend" menu initially selected.
|
||||
FriendsLaArgType_StartFacedFriendRequest = 4, ///< StartFacedFriendRequest. Launches the applet where the "Search for Local Users" menu is initially shown. Returning from this menu will exit the applet.
|
||||
FriendsLaArgType_ShowReceivedFriendRequestList = 5, ///< ShowReceivedFriendRequestList. Launches the applet where the "Received Friend Requests" menu is initially shown. Returning from this menu will exit the applet.
|
||||
FriendsLaArgType_ShowBlockedUserList = 6, ///< ShowBlockedUserList. Launches the applet where the "Blocked-User List" menu is initially shown. Returning from this menu will exit the applet.
|
||||
FriendsLaArgType_ShowMyProfile = 7, ///< ShowMyProfile. Launches the applet with the "Profile" menu initially selected. ShowMyProfileForHomeMenu is identical to this except for playStartupSound=true.
|
||||
FriendsLaArgType_StartFriendInvitation = 8, ///< [9.0.0+] StartFriendInvitation. Launches the applet for sending online-play invites to friends, where the friends are selected via the UI.
|
||||
FriendsLaArgType_StartSendingFriendInvitation = 9, ///< [9.0.0+] StartSendingFriendInvitation.
|
||||
FriendsLaArgType_ShowReceivedInvitationDetail = 10, ///< [9.0.0+] ShowReceivedInvitationDetail.
|
||||
} FriendsLaArgType;
|
||||
|
||||
/// Header for the arg struct.
|
||||
typedef struct {
|
||||
u32 type; ///< \ref FriendsLaArgType
|
||||
u32 pad; ///< Padding.
|
||||
AccountUid uid; ///< \ref AccountUid
|
||||
} FriendsLaArgHeader;
|
||||
|
||||
/// Common data for the arg struct, for the pre-9.0.0 types.
|
||||
/// This is only set for ::FriendsLaArgType_ShowUserDetailInfo/::FriendsLaArgType_StartSendingFriendRequest, for everything else this is cleared.
|
||||
typedef struct {
|
||||
AccountNetworkServiceAccountId id; ///< \ref AccountNetworkServiceAccountId for the other account.
|
||||
FriendsInAppScreenName first_inAppScreenName; ///< First InAppScreenName.
|
||||
FriendsInAppScreenName second_inAppScreenName; ///< Second InAppScreenName.
|
||||
} FriendsLaArgCommonData;
|
||||
|
||||
/// Arg struct pushed for the applet input storage, for pre-9.0.0.
|
||||
typedef struct {
|
||||
FriendsLaArgHeader hdr; ///< \ref FriendsLaArgHeader
|
||||
FriendsLaArgCommonData data; ///< \ref FriendsLaArgCommonData
|
||||
} FriendsLaArgV1;
|
||||
|
||||
/// Arg struct pushed for the applet input storage, for [9.0.0+].
|
||||
typedef struct {
|
||||
FriendsLaArgHeader hdr; ///< \ref FriendsLaArgHeader
|
||||
|
||||
union {
|
||||
u8 raw[0x1090]; ///< Raw data.
|
||||
|
||||
FriendsLaArgCommonData common; ///< \ref FriendsLaArgCommonData
|
||||
|
||||
struct {
|
||||
s32 id_count; ///< \ref AccountNetworkServiceAccountId count, must be 1-15.
|
||||
u32 pad; ///< Padding.
|
||||
u64 userdata_size; ///< User-data size, must be <=0x400.
|
||||
u8 userdata[0x400]; ///< Arbitrary user-data, see above size.
|
||||
FriendsFriendInvitationGameModeDescription desc; ///< \ref FriendsFriendInvitationGameModeDescription
|
||||
} start_friend_invitation; ///< Data for ::FriendsLaArgType_StartFriendInvitation.
|
||||
|
||||
struct {
|
||||
s32 id_count; ///< \ref AccountNetworkServiceAccountId count, must be 1-15.
|
||||
u32 pad; ///< Padding.
|
||||
AccountNetworkServiceAccountId id_list[16]; ///< \ref AccountNetworkServiceAccountId list, see above count.
|
||||
u64 userdata_size; ///< User-data size, must be <=0x400.
|
||||
u8 userdata[0x400]; ///< Arbitrary user-data, see above size.
|
||||
FriendsFriendInvitationGameModeDescription desc; ///< \ref FriendsFriendInvitationGameModeDescription
|
||||
} start_sending_friend_invitation; ///< Data for ::FriendsLaArgType_StartSendingFriendInvitation.
|
||||
|
||||
struct {
|
||||
FriendsFriendInvitationId invitation_id; ///< \ref FriendsFriendInvitationId
|
||||
FriendsFriendInvitationGroupId invitation_group_id; ///< \ref FriendsFriendInvitationGroupId
|
||||
} show_received_invitation_detail; ///< Data for ::FriendsLaArgType_ShowReceivedInvitationDetail.
|
||||
} data; ///< Data for each \ref FriendsLaArgType.
|
||||
} FriendsLaArg;
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_ShowFriendList, the specified input, and playStartupSound=false.
|
||||
* @param[in] uid \ref AccountUid
|
||||
*/
|
||||
Result friendsLaShowFriendList(AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_ShowUserDetailInfo, the specified input, and playStartupSound=false.
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] id \ref AccountNetworkServiceAccountId for the user to show UserDetailInfo for.
|
||||
* @param[in] first_inAppScreenName First \ref FriendsInAppScreenName.
|
||||
* @param[in] second_inAppScreenName Second \ref FriendsInAppScreenName.
|
||||
*/
|
||||
Result friendsLaShowUserDetailInfo(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_StartSendingFriendRequest, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage.
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] id \ref AccountNetworkServiceAccountId to send the friend request to.
|
||||
* @param[in] first_inAppScreenName First \ref FriendsInAppScreenName.
|
||||
* @param[in] second_inAppScreenName Second \ref FriendsInAppScreenName.
|
||||
*/
|
||||
Result friendsLaStartSendingFriendRequest(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_ShowMethodsOfSendingFriendRequest, the specified input, and playStartupSound=false.
|
||||
* @param[in] uid \ref AccountUid
|
||||
*/
|
||||
Result friendsLaShowMethodsOfSendingFriendRequest(AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_StartFacedFriendRequest, the specified input, and playStartupSound=false.
|
||||
* @param[in] uid \ref AccountUid
|
||||
*/
|
||||
Result friendsLaStartFacedFriendRequest(AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_ShowReceivedFriendRequestList, the specified input, and playStartupSound=false.
|
||||
* @param[in] uid \ref AccountUid
|
||||
*/
|
||||
Result friendsLaShowReceivedFriendRequestList(AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_ShowBlockedUserList, the specified input, and playStartupSound=false.
|
||||
* @param[in] uid \ref AccountUid
|
||||
*/
|
||||
Result friendsLaShowBlockedUserList(AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_ShowMyProfile, the specified input, and playStartupSound=false.
|
||||
* @param[in] uid \ref AccountUid
|
||||
*/
|
||||
Result friendsLaShowMyProfile(AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref friendsLaShowMyProfile except with playStartupSound=true.
|
||||
* @param[in] uid \ref AccountUid
|
||||
*/
|
||||
Result friendsLaShowMyProfileForHomeMenu(AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_StartFriendInvitation, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage.
|
||||
* @note Only available on [9.0.0+].
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] id_count \ref AccountNetworkServiceAccountId count, must be 1-15. Number of friends to invite.
|
||||
* @param[in] desc \ref FriendsFriendInvitationGameModeDescription
|
||||
* @param[in] userdata Arbitrary user-data. Can be NULL.
|
||||
* @param[in] userdata_size User-data size, must be <=0x400. Can be 0 if userdata is NULL.
|
||||
*/
|
||||
Result friendsLaStartFriendInvitation(AccountUid uid, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_StartSendingFriendInvitation, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage.
|
||||
* @note Only available on [9.0.0+].
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] id_list \ref AccountNetworkServiceAccountId list.
|
||||
* @param[in] id_count Size of the id_list array in entries, must be 1-15. Number of friends to invite.
|
||||
* @param[in] desc \ref FriendsFriendInvitationGameModeDescription
|
||||
* @param[in] userdata Arbitrary user-data. Can be NULL.
|
||||
* @param[in] userdata_size User-data size, must be <=0x400. Can be 0 if userdata is NULL.
|
||||
*/
|
||||
Result friendsLaStartSendingFriendInvitation(AccountUid uid, const AccountNetworkServiceAccountId *id_list, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet with ::FriendsLaArgType_ShowReceivedInvitationDetail, the specified input, and playStartupSound=false.
|
||||
* @note Only available on [9.0.0+].
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] invitation_id \ref FriendsFriendInvitationId
|
||||
* @param[in] invitation_group_id \ref FriendsFriendInvitationGroupId
|
||||
*/
|
||||
Result friendsLaShowReceivedInvitationDetail(AccountUid uid, FriendsFriendInvitationId invitation_id, FriendsFriendInvitationGroupId invitation_group_id);
|
||||
|
175
nx/include/switch/applets/hid_la.h
Normal file
175
nx/include/switch/applets/hid_la.h
Normal file
@ -0,0 +1,175 @@
|
||||
/**
|
||||
* @file hid_la.h
|
||||
* @brief Wrapper for using the controller LibraryApplet.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/hid.h"
|
||||
|
||||
/// Mode values for HidLaControllerSupportArgPrivate::mode.
|
||||
typedef enum {
|
||||
HidLaControllerSupportMode_ShowControllerSupport = 0, ///< ShowControllerSupport
|
||||
HidLaControllerSupportMode_ShowControllerStrapGuide = 1, ///< [3.0.0+] ShowControllerStrapGuide
|
||||
HidLaControllerSupportMode_ShowControllerFirmwareUpdate = 2, ///< [3.0.0+] ShowControllerFirmwareUpdate
|
||||
HidLaControllerSupportMode_ShowControllerKeyRemappingForSystem = 4, ///< [11.0.0+] ShowControllerKeyRemappingForSystem
|
||||
} HidLaControllerSupportMode;
|
||||
|
||||
/// ControllerSupportCaller
|
||||
typedef enum {
|
||||
HidLaControllerSupportCaller_Application = 0, ///< Application, this is the default.
|
||||
HidLaControllerSupportCaller_System = 1, ///< System. Skips the firmware-update confirmation dialog. This has the same affect as using the controller-update option from qlaunch System Settings.
|
||||
} HidLaControllerSupportCaller;
|
||||
|
||||
/// ControllerSupportArgPrivate
|
||||
typedef struct {
|
||||
u32 private_size; ///< Size of this ControllerSupportArgPrivate struct.
|
||||
u32 arg_size; ///< Size of the storage following this one (\ref HidLaControllerSupportArg or \ref HidLaControllerFirmwareUpdateArg).
|
||||
u8 flag0; ///< Flag0
|
||||
u8 flag1; ///< Flag1
|
||||
u8 mode; ///< \ref HidLaControllerSupportMode
|
||||
u8 controller_support_caller; ///< \ref HidLaControllerSupportCaller. Always zero except with \ref hidLaShowControllerFirmwareUpdateForSystem, which sets this to the input param.
|
||||
u32 npad_style_set; ///< Output from \ref hidGetSupportedNpadStyleSet. With ShowControllerSupportForSystem on pre-3.0.0 this is value 0.
|
||||
u32 npad_joy_hold_type; ///< Output from \ref hidGetNpadJoyHoldType. With ShowControllerSupportForSystem on pre-3.0.0 this is value 1.
|
||||
} HidLaControllerSupportArgPrivate;
|
||||
|
||||
/// Common header used by HidLaControllerSupportArg*.
|
||||
/// max_supported_players is 4 on pre-8.0.0, 8 on [8.0.0+]. player_count_min and player_count_max are overriden with value 4 when larger than value 4, during conversion handling for \ref HidLaControllerSupportArg on pre-8.0.0.
|
||||
typedef struct {
|
||||
s8 player_count_min; ///< playerCountMin. Must be >=0 and <=max_supported_players.
|
||||
s8 player_count_max; ///< playerCountMax. Must be >=1 and <=max_supported_players.
|
||||
u8 enable_take_over_connection; ///< enableTakeOverConnection, non-zero to enable. Disconnects the controllers when not enabled.
|
||||
u8 enable_left_justify; ///< enableLeftJustify, non-zero to enable.
|
||||
u8 enable_permit_joy_dual; ///< enablePermitJoyDual, non-zero to enable.
|
||||
u8 enable_single_mode; ///< enableSingleMode, non-zero to enable. Enables using a single player in handheld-mode, dual-mode, or single-mode (player_count_* are overridden). Using handheld-mode is not allowed if this is not enabled.
|
||||
u8 enable_identification_color; ///< When non-zero enables using identification_color.
|
||||
} HidLaControllerSupportArgHeader;
|
||||
|
||||
/// Identification color used by HidLaControllerSupportArg*. When HidLaControllerSupportArgHeader::enable_identification_color is set this controls the color of the UI player box outline.
|
||||
typedef struct {
|
||||
u8 r; ///< Red color component.
|
||||
u8 g; ///< Green color component.
|
||||
u8 b; ///< Blue color component.
|
||||
u8 a; ///< Alpha color component.
|
||||
} HidLaControllerSupportArgColor;
|
||||
|
||||
/// ControllerSupportArg for [1.0.0+].
|
||||
typedef struct {
|
||||
HidLaControllerSupportArgHeader hdr; ///< \ref HidLaControllerSupportArgHeader
|
||||
HidLaControllerSupportArgColor identification_color[4]; ///< \ref HidLaControllerSupportArgColor for each player, see HidLaControllerSupportArgHeader::enable_identification_color.
|
||||
u8 enable_explain_text; ///< Enables using the ExplainText data when non-zero.
|
||||
char explain_text[4][0x81]; ///< ExplainText for each player, NUL-terminated UTF-8 strings.
|
||||
} HidLaControllerSupportArgV3;
|
||||
|
||||
/// ControllerSupportArg for [8.0.0+], converted to \ref HidLaControllerSupportArgV3 on pre-8.0.0.
|
||||
typedef struct {
|
||||
HidLaControllerSupportArgHeader hdr; ///< \ref HidLaControllerSupportArgHeader
|
||||
HidLaControllerSupportArgColor identification_color[8]; ///< \ref HidLaControllerSupportArgColor for each player, see HidLaControllerSupportArgHeader::enable_identification_color.
|
||||
u8 enable_explain_text; ///< Enables using the ExplainText data when non-zero.
|
||||
char explain_text[8][0x81]; ///< ExplainText for each player, NUL-terminated UTF-8 strings.
|
||||
} HidLaControllerSupportArg;
|
||||
|
||||
/// ControllerFirmwareUpdateArg
|
||||
typedef struct {
|
||||
u8 enable_force_update; ///< enableForceUpdate, non-zero to enable. Default is 0. Forces a firmware update when enabled, without an UI option to skip it.
|
||||
u8 pad[3]; ///< Padding.
|
||||
} HidLaControllerFirmwareUpdateArg;
|
||||
|
||||
/// ControllerKeyRemappingArg
|
||||
typedef struct {
|
||||
u64 unk_x0; ///< Unknown
|
||||
u32 unk_x8; ///< Unknown
|
||||
u8 pad[0x4]; ///< Padding
|
||||
} HidLaControllerKeyRemappingArg;
|
||||
|
||||
/// ControllerSupportResultInfo. First 8-bytes from the applet output storage.
|
||||
typedef struct {
|
||||
s8 player_count; ///< playerCount.
|
||||
u8 pad[3]; ///< Padding.
|
||||
u32 selected_id; ///< \ref HidNpadIdType, selectedId.
|
||||
} HidLaControllerSupportResultInfo;
|
||||
|
||||
/// Struct for the applet output storage.
|
||||
typedef struct {
|
||||
HidLaControllerSupportResultInfo info; ///< \ref HidLaControllerSupportResultInfo
|
||||
u32 res; ///< Output res value.
|
||||
} HidLaControllerSupportResultInfoInternal;
|
||||
|
||||
/**
|
||||
* @brief Initializes a \ref HidLaControllerSupportArg with the defaults.
|
||||
* @note This clears the arg, then does: HidLaControllerSupportArgHeader::player_count_min = 0, HidLaControllerSupportArgHeader::player_count_max = 4, HidLaControllerSupportArgHeader::enable_take_over_connection = 1, HidLaControllerSupportArgHeader::enable_left_justify = 1, and HidLaControllerSupportArgHeader::enable_permit_joy_dual = 1.
|
||||
* @note If preferred, you can also memset \ref HidLaControllerSupportArg manually and initialize it yourself.
|
||||
* @param[out] arg \ref HidLaControllerSupportArg
|
||||
*/
|
||||
void hidLaCreateControllerSupportArg(HidLaControllerSupportArg *arg);
|
||||
|
||||
/**
|
||||
* @brief Initializes a \ref HidLaControllerFirmwareUpdateArg with the defaults.
|
||||
* @note This just uses memset() with the arg.
|
||||
* @param[out] arg \ref HidLaControllerFirmwareUpdateArg
|
||||
*/
|
||||
void hidLaCreateControllerFirmwareUpdateArg(HidLaControllerFirmwareUpdateArg *arg);
|
||||
|
||||
/**
|
||||
* @brief Initializes a \ref HidLaControllerKeyRemappingArg with the defaults.
|
||||
* @note This just uses memset() with the arg.
|
||||
* @param[out] arg \ref HidLaControllerKeyRemappingArg
|
||||
*/
|
||||
void hidLaCreateControllerKeyRemappingArg(HidLaControllerKeyRemappingArg *arg);
|
||||
|
||||
/**
|
||||
* @brief Sets the ExplainText for the specified player and \ref HidLaControllerSupportArg.
|
||||
* @note This string is displayed in the UI box for the player.
|
||||
* @note HidLaControllerSupportArg::enable_explain_text must be set, otherwise this ExplainText is ignored.
|
||||
* @param arg \ref HidLaControllerSupportArg
|
||||
* @param[in] str Input ExplainText UTF-8 string, max length is 0x80 excluding NUL-terminator.
|
||||
+ @oaram[in] id Player controller, must be <8.
|
||||
*/
|
||||
Result hidLaSetExplainText(HidLaControllerSupportArg *arg, const char *str, HidNpadIdType id);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for ControllerSupport.
|
||||
* @note This seems to only display the applet UI when doing so is actually needed? This doesn't apply to \ref hidLaShowControllerSupportForSystem.
|
||||
* @param[out] result_info \ref HidLaControllerSupportResultInfo. Optional, can be NULL.
|
||||
* @param[in] arg \ref HidLaControllerSupportArg
|
||||
*/
|
||||
Result hidLaShowControllerSupport(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for ControllerStrapGuide.
|
||||
* @note Only available on [3.0.0+].
|
||||
*/
|
||||
Result hidLaShowControllerStrapGuide(void);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for ControllerFirmwareUpdate.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[in] arg \ref HidLaControllerFirmwareUpdateArg
|
||||
*/
|
||||
Result hidLaShowControllerFirmwareUpdate(const HidLaControllerFirmwareUpdateArg *arg);
|
||||
|
||||
/**
|
||||
* @brief This is the system version of \ref hidLaShowControllerSupport.
|
||||
* @param[out] result_info \ref HidLaControllerSupportResultInfo. Optional, can be NULL.
|
||||
* @param[in] arg \ref HidLaControllerSupportArg
|
||||
* @param[in] flag Input flag. When true, the applet displays the menu as if launched by qlaunch.
|
||||
*/
|
||||
Result hidLaShowControllerSupportForSystem(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg, bool flag);
|
||||
|
||||
/**
|
||||
* @brief This is the system version of \ref hidLaShowControllerFirmwareUpdate.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[in] arg \ref HidLaControllerFirmwareUpdateArg
|
||||
* @param[in] caller \ref HidLaControllerSupportCaller
|
||||
*/
|
||||
Result hidLaShowControllerFirmwareUpdateForSystem(const HidLaControllerFirmwareUpdateArg *arg, HidLaControllerSupportCaller caller);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for ControllerKeyRemappingForSystem.
|
||||
* @note Only available on [11.0.0+].
|
||||
* @param[in] arg \ref HidLaControllerKeyRemappingArg
|
||||
* @param[in] caller \ref HidLaControllerSupportCaller
|
||||
*/
|
||||
Result hidLaShowControllerKeyRemappingForSystem(const HidLaControllerKeyRemappingArg *arg, HidLaControllerSupportCaller caller);
|
||||
|
@ -7,17 +7,18 @@
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/applet.h"
|
||||
#include "../services/acc.h"
|
||||
|
||||
/// CommonArguments
|
||||
typedef struct {
|
||||
u32 CommonArgs_version;
|
||||
u32 CommonArgs_size;
|
||||
u32 CommonArgs_version; ///< \ref libappletArgsCreate sets this to 1, and \ref libappletArgsPop requires value 1. v0 is not supported.
|
||||
u32 CommonArgs_size; ///< Size of this struct.
|
||||
|
||||
u32 LaVersion; ///< LibraryApplet API version
|
||||
u32 LaVersion; ///< LibraryApplet API version.
|
||||
s32 ExpectedThemeColor; ///< Set to the output from \ref appletGetThemeColorType by \ref libappletArgsCreate.
|
||||
u8 PlayStartupSound; ///< bool flag, default is false.
|
||||
u8 pad[7];
|
||||
u64 tick;
|
||||
u8 pad[7]; ///< Padding.
|
||||
u64 tick; ///< System tick. Set to the output from \ref armGetSystemTick during \ref libappletArgsPush.
|
||||
} LibAppletArgs;
|
||||
|
||||
/**
|
||||
@ -58,6 +59,12 @@ Result libappletReadStorage(AppletStorage* s, void* buffer, size_t size, size_t
|
||||
*/
|
||||
Result libappletArgsPush(LibAppletArgs* a, AppletHolder *h);
|
||||
|
||||
/**
|
||||
* @brief Uses \ref appletPopInData and reads it to the specified LibAppletArgs. The LibAppletArgs is validated, an error is thrown when invalid.
|
||||
* @param[out] a LibAppletArgs struct.
|
||||
*/
|
||||
Result libappletArgsPop(LibAppletArgs* a);
|
||||
|
||||
/**
|
||||
* @brief Creates a storage using the input buffer which is pushed to the AppletHolder via \ref appletHolderPushInData.
|
||||
* @param h AppletHolder object.
|
||||
@ -76,7 +83,13 @@ Result libappletPushInData(AppletHolder *h, const void* buffer, size_t size);
|
||||
Result libappletPopOutData(AppletHolder *h, void* buffer, size_t size, size_t *transfer_size);
|
||||
|
||||
/**
|
||||
* @brief Starts the applet and waits for it to finish, then checks the \ref LibAppletExitReason.
|
||||
* @brief Sets whether \ref libappletStart uses \ref appletHolderJump.
|
||||
* @param flag Flag. Value true should not be used unless running as AppletType_LibraryApplet.
|
||||
*/
|
||||
void libappletSetJumpFlag(bool flag);
|
||||
|
||||
/**
|
||||
* @brief If the flag from \ref libappletSetJumpFlag is set, this just uses \ref appletHolderJump. Otherwise, starts the applet and waits for it to finish, then checks the \ref LibAppletExitReason.
|
||||
* @note Uses \ref appletHolderStart and \ref appletHolderJoin.
|
||||
* @param h AppletHolder object.
|
||||
*/
|
||||
@ -102,3 +115,22 @@ Result libappletRequestHomeMenu(void);
|
||||
/// Equivalent to entering "System Update" under System Settings. When leaving this, it returns to the main Home Menu.
|
||||
Result libappletRequestJumpToSystemUpdate(void);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this.
|
||||
* @note Only available on [11.0.0+].
|
||||
* @param[in] application_id ApplicationId
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] buffer Input buffer.
|
||||
* @param[in] size Input buffer size.
|
||||
* @param[in] sender LaunchApplicationRequestSender
|
||||
*/
|
||||
Result libappletRequestToLaunchApplication(u64 application_id, AccountUid uid, const void* buffer, size_t size, u32 sender);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this.
|
||||
* @note Only available on [11.0.0+].
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[in] application_id Optional ApplicationId, can be 0.
|
||||
*/
|
||||
Result libappletRequestJumpToStory(AccountUid uid, u64 application_id);
|
||||
|
||||
|
101
nx/include/switch/applets/mii_la.h
Normal file
101
nx/include/switch/applets/mii_la.h
Normal file
@ -0,0 +1,101 @@
|
||||
/**
|
||||
* @file mii_la.h
|
||||
* @brief Wrapper for using the MiiEdit LibraryApplet.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/mii.h"
|
||||
|
||||
/// AppletMode
|
||||
typedef enum {
|
||||
MiiLaAppletMode_ShowMiiEdit = 0, ///< ShowMiiEdit
|
||||
MiiLaAppletMode_AppendMii = 1, ///< AppendMii
|
||||
MiiLaAppletMode_AppendMiiImage = 2, ///< AppendMiiImage
|
||||
MiiLaAppletMode_UpdateMiiImage = 3, ///< UpdateMiiImage
|
||||
MiiLaAppletMode_CreateMii = 4, ///< [10.2.0+] CreateMii
|
||||
MiiLaAppletMode_EditMii = 5, ///< [10.2.0+] EditMii
|
||||
} MiiLaAppletMode;
|
||||
|
||||
/// AppletInput
|
||||
typedef struct {
|
||||
s32 version; ///< Version
|
||||
u32 mode; ///< \ref MiiLaAppletMode
|
||||
s32 special_key_code; ///< \ref MiiSpecialKeyCode
|
||||
union {
|
||||
Uuid valid_uuid_array[8]; ///< ValidUuidArray. Only used with \ref MiiLaAppletMode ::NfpLaMiiLaAppletMode_AppendMiiImage / ::NfpLaMiiLaAppletMode_UpdateMiiImage.
|
||||
struct {
|
||||
MiiCharInfo char_info; ///< \ref MiiCharInfo
|
||||
u8 unused_x64[0x28]; ///< Unused
|
||||
} char_info;
|
||||
};
|
||||
Uuid used_uuid; ///< UsedUuid. Only used with \ref MiiLaAppletMode ::NfpLaMiiLaAppletMode_UpdateMiiImage.
|
||||
u8 unk_x9C[0x64]; ///< Unused
|
||||
} MiiLaAppletInput;
|
||||
|
||||
/// AppletOutput
|
||||
typedef struct {
|
||||
u32 res; ///< Result: 0 = Success, 1 = Cancel.
|
||||
s32 index; ///< Index. Only set when Result is Success, where \ref MiiLaAppletMode isn't ::NfpLaMiiLaAppletMode_ShowMiiEdit.
|
||||
u8 unk_x8[0x18]; ///< Unused
|
||||
} MiiLaAppletOutput;
|
||||
|
||||
/// AppletOutputForCharInfoEditing
|
||||
typedef struct {
|
||||
u32 res; ///< MiiLaAppletOutput::res
|
||||
MiiCharInfo char_info; ///< \ref MiiCharInfo
|
||||
u8 unused[0x24]; ///< Unused
|
||||
} MiiLaAppletOutputForCharInfoEditing;
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for ShowMiiEdit.
|
||||
* @param[in] special_key_code \ref MiiSpecialKeyCode
|
||||
*/
|
||||
Result miiLaShowMiiEdit(MiiSpecialKeyCode special_key_code);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for AppendMii.
|
||||
* @param[in] special_key_code \ref MiiSpecialKeyCode
|
||||
* @param[out] index Output Index.
|
||||
*/
|
||||
Result miiLaAppendMii(MiiSpecialKeyCode special_key_code, s32 *index);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for AppendMiiImage.
|
||||
* @param[in] special_key_code \ref MiiSpecialKeyCode
|
||||
* @param[in] valid_uuid_array Input array of Uuid.
|
||||
* @param[in] count Total entries for the valid_uuid_array. Must be 0-8.
|
||||
* @param[out] index Output Index.
|
||||
*/
|
||||
Result miiLaAppendMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, s32 *index);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for UpdateMiiImage.
|
||||
* @param[in] special_key_code \ref MiiSpecialKeyCode
|
||||
* @param[in] valid_uuid_array Input array of Uuid.
|
||||
* @param[in] count Total entries for the valid_uuid_array. Must be 0-8.
|
||||
* @param[in] used_uuid UsedUuid
|
||||
* @param[out] index Output Index.
|
||||
*/
|
||||
Result miiLaUpdateMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, Uuid used_uuid, s32 *index);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for CreateMii.
|
||||
* @note This creates a Mii and returns it, without saving it in the database.
|
||||
* @note Only available on [10.2.0+].
|
||||
* @param[in] special_key_code \ref MiiSpecialKeyCode
|
||||
* @param[out] out_char \ref MiiCharInfo
|
||||
*/
|
||||
Result miiLaCreateMii(MiiSpecialKeyCode special_key_code, MiiCharInfo *out_char);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for EditMii.
|
||||
* @note This edits the specified Mii and returns it, without saving it in the database.
|
||||
* @note Only available on [10.2.0+].
|
||||
* @param[in] special_key_code \ref MiiSpecialKeyCode
|
||||
* @param[in] in_char \ref MiiCharInfo
|
||||
* @param[out] out_char \ref MiiCharInfo
|
||||
*/
|
||||
Result miiLaEditMii(MiiSpecialKeyCode special_key_code, const MiiCharInfo *in_char, MiiCharInfo *out_char);
|
||||
|
89
nx/include/switch/applets/nfp_la.h
Normal file
89
nx/include/switch/applets/nfp_la.h
Normal file
@ -0,0 +1,89 @@
|
||||
/**
|
||||
* @file nfp_la.h
|
||||
* @brief Wrapper for using the cabinet (amiibo) LibraryApplet.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/nfc.h"
|
||||
|
||||
/// Values for NfpLaStartParamForAmiiboSettings::type.
|
||||
typedef enum {
|
||||
NfpLaStartParamTypeForAmiiboSettings_NicknameAndOwnerSettings = 0, ///< NicknameAndOwnerSettings
|
||||
NfpLaStartParamTypeForAmiiboSettings_GameDataEraser = 1, ///< GameDataEraser
|
||||
NfpLaStartParamTypeForAmiiboSettings_Restorer = 2, ///< Restorer
|
||||
NfpLaStartParamTypeForAmiiboSettings_Formatter = 3, ///< Formatter
|
||||
} NfpLaStartParamTypeForAmiiboSettings;
|
||||
|
||||
/// AmiiboSettingsStartParam
|
||||
typedef struct {
|
||||
u8 unk_x0[0x8]; ///< Unknown
|
||||
u8 unk_x8[0x20]; ///< Unknown
|
||||
u8 unk_x28; ///< Unknown
|
||||
} NfpLaAmiiboSettingsStartParam;
|
||||
|
||||
/// StartParamForAmiiboSettings
|
||||
typedef struct {
|
||||
u8 unk_x0; ///< Unknown
|
||||
u8 type; ///< \ref NfpLaStartParamTypeForAmiiboSettings
|
||||
u8 flags; ///< Flags
|
||||
u8 unk_x3; ///< NfpLaAmiiboSettingsStartParam::unk_x28
|
||||
u8 unk_x4[0x8]; ///< NfpLaAmiiboSettingsStartParam::unk_x0
|
||||
NfpTagInfo tag_info; ///< \ref NfpTagInfo, only enabled when flags bit1 is set.
|
||||
NfpRegisterInfo register_info; ///< \ref NfpRegisterInfo, only enabled when flags bit2 is set.
|
||||
u8 unk_x164[0x20]; ///< NfpLaAmiiboSettingsStartParam::unk_x8
|
||||
u8 unk_x184[0x24]; ///< Unknown
|
||||
} NfpLaStartParamForAmiiboSettings;
|
||||
|
||||
/// ReturnValueForAmiiboSettings
|
||||
typedef struct {
|
||||
u8 flags; ///< 0 = error, non-zero = success.
|
||||
u8 pad[3]; ///< Padding
|
||||
NfcDeviceHandle handle; ///< \ref NfcDeviceHandle
|
||||
NfpTagInfo tag_info; ///< \ref NfpTagInfo
|
||||
NfpRegisterInfo register_info; ///< \ref NfpRegisterInfo, only available when flags bit2 is set.
|
||||
u8 unk_x164[0x24]; ///< Unknown
|
||||
} NfpLaReturnValueForAmiiboSettings;
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for NicknameAndOwnerSettings.
|
||||
* @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time.
|
||||
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
|
||||
* @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo.
|
||||
* @param[in] in_reg_info \ref NfpRegisterInfo. Optional, can be NULL. If specified, this sets the \ref NfpRegisterInfo which will be used for writing, with an option for the user to change it.
|
||||
* @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL.
|
||||
* @param[out] handle \ref NfcDeviceHandle
|
||||
* @param[out] reg_info_flag Flag indicating whether the data for out_reg_info is set. Optional, can be NULL.
|
||||
* @param[out] out_reg_info \ref NfpRegisterInfo, see reg_info_flag. Optional, can be NULL.
|
||||
*/
|
||||
Result nfpLaStartNicknameAndOwnerSettings(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, const NfpRegisterInfo *in_reg_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle, bool *reg_info_flag, NfpRegisterInfo *out_reg_info);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for GameDataEraser.
|
||||
* @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time.
|
||||
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
|
||||
* @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo.
|
||||
* @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL.
|
||||
* @param[out] handle \ref NfcDeviceHandle
|
||||
*/
|
||||
Result nfpLaStartGameDataEraser(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for Restorer.
|
||||
* @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time.
|
||||
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
|
||||
* @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo.
|
||||
* @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL.
|
||||
* @param[out] handle \ref NfcDeviceHandle
|
||||
*/
|
||||
Result nfpLaStartRestorer(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for Formatter.
|
||||
* @param[in] in_param \ref NfpLaAmiiboSettingsStartParam
|
||||
* @param[out] out_tag_info \ref NfpTagInfo
|
||||
* @param[out] handle \ref NfcDeviceHandle
|
||||
*/
|
||||
Result nfpLaStartFormatter(const NfpLaAmiiboSettingsStartParam *in_param, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle);
|
||||
|
16
nx/include/switch/applets/nifm_la.h
Normal file
16
nx/include/switch/applets/nifm_la.h
Normal file
@ -0,0 +1,16 @@
|
||||
/**
|
||||
* @file nifm_la.h
|
||||
* @brief Wrapper for using the nifm LibraryApplet (the launched applet varies).
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/nifm.h"
|
||||
|
||||
/**
|
||||
* @brief Uses \ref nifmGetResult, then on failure launches the applet.
|
||||
* @param r \ref NifmRequest
|
||||
*/
|
||||
Result nifmLaHandleNetworkRequestResult(NifmRequest* r);
|
||||
|
210
nx/include/switch/applets/psel.h
Normal file
210
nx/include/switch/applets/psel.h
Normal file
@ -0,0 +1,210 @@
|
||||
/**
|
||||
* @file psel.h
|
||||
* @brief Wrapper for using the playerSelect (user selection) LibraryApplet.
|
||||
* @author XorTroll, yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/acc.h"
|
||||
|
||||
/// playerSelect UI modes.
|
||||
typedef enum {
|
||||
PselUiMode_UserSelector = 0, ///< UserSelector
|
||||
PselUiMode_UserCreator = 1, ///< UserCreator
|
||||
PselUiMode_EnsureNetworkServiceAccountAvailable = 2, ///< EnsureNetworkServiceAccountAvailable
|
||||
PselUiMode_UserIconEditor = 3, ///< UserIconEditor
|
||||
PselUiMode_UserNicknameEditor = 4, ///< UserNicknameEditor
|
||||
PselUiMode_UserCreatorForStarter = 5, ///< UserCreatorForStarter
|
||||
PselUiMode_NintendoAccountAuthorizationRequestContext = 6, ///< NintendoAccountAuthorizationRequestContext
|
||||
PselUiMode_IntroduceExternalNetworkServiceAccount = 7, ///< IntroduceExternalNetworkServiceAccount
|
||||
PselUiMode_IntroduceExternalNetworkServiceAccountForRegistration = 8, ///< [6.0.0+] IntroduceExternalNetworkServiceAccountForRegistration
|
||||
PselUiMode_NintendoAccountNnidLinker = 9, ///< [6.0.0+] NintendoAccountNnidLinker
|
||||
PselUiMode_LicenseRequirementsForNetworkService = 10, ///< [6.0.0+] LicenseRequirementsForNetworkService
|
||||
PselUiMode_LicenseRequirementsForNetworkServiceWithUserContextImpl = 11, ///< [7.0.0+] LicenseRequirementsForNetworkServiceWithUserContextImpl
|
||||
PselUiMode_UserCreatorForImmediateNaLoginTest = 12, ///< [7.0.0+] UserCreatorForImmediateNaLoginTest
|
||||
PselUiMode_UserQualificationPromoter = 13, ///< [13.0.0+] UserQualificationPromoter
|
||||
} PselUiMode;
|
||||
|
||||
/// UI message text to display with ::PselUiMode_UserSelector. Invalid values are handled as ::PselUserSelectionPurpose_General.
|
||||
typedef enum {
|
||||
PselUserSelectionPurpose_General = 0, ///< "Select a user."
|
||||
PselUserSelectionPurpose_GameCardRegistration = 1, ///< [2.0.0+] "Who will receive the points?"
|
||||
PselUserSelectionPurpose_EShopLaunch = 2, ///< [2.0.0+] "Who is using Nintendo eShop?"
|
||||
PselUserSelectionPurpose_EShopItemShow = 3, ///< [2.0.0+] "Who is making this purchase?"
|
||||
PselUserSelectionPurpose_PicturePost = 4, ///< [2.0.0+] "Who is posting?"
|
||||
PselUserSelectionPurpose_NintendoAccountLinkage = 5, ///< [2.0.0+] "Select a user to link to a Nintendo Account."
|
||||
PselUserSelectionPurpose_SettingsUpdate = 6, ///< [2.0.0+] "Change settings for which user?"
|
||||
PselUserSelectionPurpose_SaveDataDeletion = 7, ///< [2.0.0+] "Format data for which user?"
|
||||
PselUserSelectionPurpose_UserMigration = 8, ///< [4.0.0+] "Which user will be transferred to another console?"
|
||||
PselUserSelectionPurpose_SaveDataTransfer = 9, ///< [8.0.0+] "Send save data for which user?"
|
||||
} PselUserSelectionPurpose;
|
||||
|
||||
/// NintendoAccountStartupDialogType
|
||||
typedef enum {
|
||||
PselNintendoAccountStartupDialogType_LoginAndCreate = 0, ///< LoginAndCreate
|
||||
PselNintendoAccountStartupDialogType_Login = 1, ///< Login
|
||||
PselNintendoAccountStartupDialogType_Create = 2, ///< Create
|
||||
} PselNintendoAccountStartupDialogType;
|
||||
|
||||
/// Base UI settings for playerSelect.
|
||||
typedef struct {
|
||||
u32 mode; ///< \ref PselUiMode
|
||||
u32 pad; ///< Padding.
|
||||
AccountUid invalid_uid_list[ACC_USER_LIST_SIZE]; ///< List of \ref AccountUid. TODO: This is only correct for ::PselUiMode_UserSelector, for other modes this is a single uid, followed by mode-specific data (if any).
|
||||
u64 application_id; ///< ApplicationId with \ref pselShowUserSelectorForLauncher.
|
||||
u8 is_network_service_account_required; ///< PselUserSelectionSettings::is_network_service_account_required.
|
||||
u8 is_skip_enabled; ///< PselUserSelectionSettings::is_skip_enabled
|
||||
u8 unk_x92; ///< Set to value 1 by \ref pselShowUserSelectorForSystem / \ref pselShowUserSelectorForLauncher.
|
||||
u8 is_permitted; ///< isPermitted. With ::PselUiMode_UserSelector: enables the option to create a new user. Set to the output from \ref accountIsUserRegistrationRequestPermitted with pselShowUserSelector*. When not set, a dialog will be displayed when the user attempts to create an user.
|
||||
u8 show_skip_button; ///< PselUserSelectionSettings::show_skip_button
|
||||
u8 additional_select; ///< PselUserSelectionSettings::additional_select
|
||||
u8 unk_x96; ///< [2.0.0+] Set to PselUserSelectionSettingsForSystemService::enable_user_creation_button. \ref pselShowUserSelectorForLauncher / \ref pselShowUserSelector sets this to value 1.
|
||||
u8 unk_x97; ///< [6.0.0+] Set to PselUserSelectionSettings::is_unqualified_user_selectable ^ 1.
|
||||
} PselUiSettingsV1;
|
||||
|
||||
/// UI settings for versions starting with 0x10000.
|
||||
typedef struct {
|
||||
PselUiSettingsV1 settings; ///< \ref PselUiSettingsV1
|
||||
u32 unk_x98; ///< [2.0.0+] Set to PselUserSelectionSettingsForSystemService::purpose.
|
||||
u8 unk_x9c[0x4]; ///< Unknown.
|
||||
} PselUiSettings;
|
||||
|
||||
/// UserSelectionSettings
|
||||
typedef struct {
|
||||
AccountUid invalid_uid_list[ACC_USER_LIST_SIZE]; ///< invalidUidList.
|
||||
u8 is_skip_enabled; ///< isSkipEnabled. When set, the first user in invalid_uid_list must not be set, and additional_select must be 0. When enabled \ref accountTrySelectUserWithoutInteraction will be used to select the user, in this case the applet will only be launched if \ref accountTrySelectUserWithoutInteraction doesn't return an user.
|
||||
u8 is_network_service_account_required; ///< isNetworkServiceAccountRequired. Whether the user needs to be linked to a Nintendo account.
|
||||
u8 show_skip_button; ///< showSkipButton. Enables the option to skip user selection with a button.
|
||||
u8 additional_select; ///< additionalSelect.
|
||||
u8 is_unqualified_user_selectable; ///< [6.0.0+] isUnqualifiedUserSelectable
|
||||
} PselUserSelectionSettings;
|
||||
|
||||
/// [2.0.0+] UserSelectionSettingsForSystemService
|
||||
typedef struct {
|
||||
u32 purpose; ///< \ref PselUserSelectionPurpose
|
||||
u8 enable_user_creation_button; ///< Enables the user-creation button when set. Whether user-creation when pressing the button is actually allowed is controlled by PselUiSettingsV1::is_permitted.
|
||||
u8 pad[0x3]; ///< Padding.
|
||||
} PselUserSelectionSettingsForSystemService;
|
||||
|
||||
/// Return data sent after execution.
|
||||
typedef struct {
|
||||
Result res; ///< Result.
|
||||
AccountUid user_id; ///< Selected \ref AccountUid.
|
||||
} PselUiReturnArg;
|
||||
|
||||
/**
|
||||
* @brief Creates a new UI config for the playerSelect applet with the specified mode.
|
||||
* @param ui PseluiSettings struct.
|
||||
* @param mode playerSelect UI mode.
|
||||
*/
|
||||
Result pselUiCreate(PselUiSettings *ui, PselUiMode mode);
|
||||
|
||||
/**
|
||||
* @brief Adds an user to the user list of the applet.
|
||||
* @param ui PselUiSettings struct.
|
||||
* @param[in] user_id user ID.
|
||||
* @note The users will be treated as invalid users for user selection mode, and as the input user for other modes.
|
||||
*/
|
||||
void pselUiAddUser(PselUiSettings *ui, AccountUid user_id);
|
||||
|
||||
/**
|
||||
* @brief Sets whether users can be created in the applet.
|
||||
* @param ui PselUiSettings struct.
|
||||
* @param flag Flag value.
|
||||
* @note Only used for ::PselUiMode_SelectUser.
|
||||
*/
|
||||
NX_CONSTEXPR void pselUiSetAllowUserCreation(PselUiSettings *ui, bool flag) {
|
||||
if(ui->settings.mode == PselUiMode_UserSelector) {
|
||||
ui->settings.is_permitted = flag!=0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets whether users need to be linked to a Nintendo account.
|
||||
* @param ui PselUiSettings struct.
|
||||
* @param flag Flag value.
|
||||
*/
|
||||
NX_CONSTEXPR void pselUiSetNetworkServiceRequired(PselUiSettings *ui, bool flag) {
|
||||
ui->settings.is_network_service_account_required = flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets whether selection can be skipped with a button.
|
||||
* @param ui PselUiSettings struct.
|
||||
* @param flag Flag value.
|
||||
*/
|
||||
NX_CONSTEXPR void pselUiSetSkipButtonEnabled(PselUiSettings *ui, bool flag) {
|
||||
ui->settings.show_skip_button = flag!=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Shows the applet with the specified UI settings.
|
||||
* @param ui PselUiSettings struct.
|
||||
* @param out_user Selected user ID.
|
||||
* @note If user skips (see \ref pselUiSetSkipEnabled) this will return successfully but the output ID will be 0.
|
||||
*/
|
||||
Result pselUiShow(PselUiSettings *ui, AccountUid *out_user);
|
||||
|
||||
/**
|
||||
* @brief This is the System version of \ref pselShowUserSelector.
|
||||
* @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled.
|
||||
* @param[out] out_user Returned selected user ID.
|
||||
* @param[in] settings \ref PselUserSelectionSettings
|
||||
* @param[in] settings_system [2.0.0+] \ref PselUserSelectionSettingsForSystemService, ignored on prior versions.
|
||||
*/
|
||||
Result pselShowUserSelectorForSystem(AccountUid *out_user, const PselUserSelectionSettings *settings, const PselUserSelectionSettingsForSystemService *settings_system);
|
||||
|
||||
/**
|
||||
* @brief This is the Launcher version of \ref pselShowUserSelector.
|
||||
* @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled.
|
||||
* @param[out] out_user Returned selected user ID.
|
||||
* @param[in] settings \ref PselUserSelectionSettings
|
||||
* @param[in] application_id ApplicationId
|
||||
*/
|
||||
Result pselShowUserSelectorForLauncher(AccountUid *out_user, const PselUserSelectionSettings *settings, u64 application_id);
|
||||
|
||||
/**
|
||||
* @brief Shows the applet to select a user.
|
||||
* @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled.
|
||||
* @param[out] out_user Returned selected user ID.
|
||||
* @param[in] settings \ref PselUserSelectionSettings
|
||||
*/
|
||||
Result pselShowUserSelector(AccountUid *out_user, const PselUserSelectionSettings *settings);
|
||||
|
||||
/**
|
||||
* @brief Shows the applet to create a user.
|
||||
* @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. If the output flag is 0, an error will be thrown.
|
||||
*/
|
||||
Result pselShowUserCreator(void);
|
||||
|
||||
/**
|
||||
* @brief Shows the applet to change a user's icon.
|
||||
* @param[in] user Input user ID.
|
||||
*/
|
||||
Result pselShowUserIconEditor(AccountUid user);
|
||||
|
||||
/**
|
||||
* @brief Shows the applet to change a user's nickname.
|
||||
* @param[in] user Input user ID.
|
||||
*/
|
||||
Result pselShowUserNicknameEditor(AccountUid user);
|
||||
|
||||
/**
|
||||
* @brief Shows the applet to create a user. Used by the starter applet during system setup.
|
||||
*/
|
||||
Result pselShowUserCreatorForStarter(void);
|
||||
|
||||
/**
|
||||
* @brief Shows the applet for Nintendo Account Nnid linking.
|
||||
* @note Only available on [6.0.0+].
|
||||
* @param[in] user Input user ID.
|
||||
*/
|
||||
Result pselShowNintendoAccountNnidLinker(AccountUid user);
|
||||
|
||||
/**
|
||||
* @brief Shows the applet for UserQualificationPromoter.
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[in] user Input user ID.
|
||||
*/
|
||||
Result pselShowUserQualificationPromoter(AccountUid user);
|
@ -18,9 +18,16 @@ typedef enum {
|
||||
|
||||
/// Type of keyboard.
|
||||
typedef enum {
|
||||
SwkbdType_Normal = 0, ///< Normal keyboard.
|
||||
SwkbdType_NumPad = 1, ///< Number pad. The buttons at the bottom left/right are only available when they're set by \ref swkbdConfigSetLeftOptionalSymbolKey / \ref swkbdConfigSetRightOptionalSymbolKey.
|
||||
SwkbdType_QWERTY = 2, ///< QWERTY (and variants) keyboard only.
|
||||
SwkbdType_Normal = 0, ///< Normal keyboard.
|
||||
SwkbdType_NumPad = 1, ///< Number pad. The buttons at the bottom left/right are only available when they're set by \ref swkbdConfigSetLeftOptionalSymbolKey / \ref swkbdConfigSetRightOptionalSymbolKey.
|
||||
SwkbdType_QWERTY = 2, ///< QWERTY (and variants) keyboard only.
|
||||
SwkbdType_Unknown3 = 3, ///< The same as SwkbdType_Normal keyboard.
|
||||
SwkbdType_Latin = 4, ///< All Latin like languages keyboard only (without CJK keyboard).
|
||||
SwkbdType_ZhHans = 5, ///< Chinese Simplified keyboard only.
|
||||
SwkbdType_ZhHant = 6, ///< Chinese Traditional keyboard only.
|
||||
SwkbdType_Korean = 7, ///< Korean keyboard only.
|
||||
SwkbdType_All = 8, ///< All language keyboards.
|
||||
SwkbdType_Unknown9 = 9, ///< Unknown
|
||||
} SwkbdType;
|
||||
|
||||
/// Bitmask for SwkbdArgCommon::keySetDisableBitmask. This disables keys on the keyboard when the corresponding bit(s) are set.
|
||||
@ -39,7 +46,7 @@ enum {
|
||||
typedef enum {
|
||||
SwkbdTextDrawType_Line = 0, ///< The text will be displayed on a line. Also enables displaying the Header and Sub text.
|
||||
SwkbdTextDrawType_Box = 1, ///< The text will be displayed in a box.
|
||||
SwkbdTextDrawType_DownloadCode = 2, ///< Used by \ref swkbdConfigMakePresetDownloadCode on 5.0.0+. Enables using \ref SwkbdArgV7 unk_x3e0.
|
||||
SwkbdTextDrawType_DownloadCode = 2, ///< Used by \ref swkbdConfigMakePresetDownloadCode on [5.0.0+]. Enables using \ref SwkbdArgV7 unk_x3e0.
|
||||
} SwkbdTextDrawType;
|
||||
|
||||
/// SwkbdInline Interactive input storage request ID.
|
||||
@ -77,16 +84,17 @@ typedef enum {
|
||||
/// SwkbdInline State
|
||||
typedef enum {
|
||||
SwkbdState_Inactive = 0x0, ///< Default state from \ref swkbdInlineCreate, before a state is set by \ref swkbdInlineUpdate when a reply is received. Also indicates that the applet is no longer running.
|
||||
SwkbdState_Initialized = 0x1, ///< Applet is initialized.
|
||||
SwkbdState_Unknown2 = 0x2,
|
||||
SwkbdState_TextAvailable = 0x3, ///< Text is available since a ChangedString* reply was received.
|
||||
SwkbdState_Submitted = 0x4, ///< The user pressed the ok-button, submitting the text and closing the applet.
|
||||
SwkbdState_Initialized = 0x1, ///< Applet is initialized but hidden.
|
||||
SwkbdState_Appearing = 0x2, ///< Applet is appearing.
|
||||
SwkbdState_Shown = 0x3, ///< Applet is fully shown and ready to accept text input.
|
||||
SwkbdState_Disappearing = 0x4, ///< The user pressed the ok or cancel button, causing the applet to disappear.
|
||||
SwkbdState_Unknown5 = 0x5,
|
||||
SwkbdState_Unknown6 = 0x6,
|
||||
} SwkbdState;
|
||||
|
||||
/// Value for \ref SwkbdInitializeArg mode. Controls the LibAppletMode when launching the applet.
|
||||
typedef enum {
|
||||
SwkbdInlineMode_UserDisplay = 0, ///< LibAppletMode_Unknown3. This is the default. The user-process must handle displaying the swkbd gfx on the screen. Attempting to get the swkbd gfx data for this currently throws an error (unknown why), SwkbdInlineMode_AppletDisplay should be used instead.
|
||||
SwkbdInlineMode_UserDisplay = 0, ///< LibAppletMode_BackgroundIndirect. This is the default. The user-process must handle displaying the swkbd gfx on the screen, by loading the image with \ref swkbdInlineGetImage.
|
||||
SwkbdInlineMode_AppletDisplay = 1, ///< LibAppletMode_Background. The applet will handle displaying gfx on the screen.
|
||||
} SwkbdInlineMode;
|
||||
|
||||
@ -108,7 +116,7 @@ typedef struct {
|
||||
u32 buffer_size; ///< 0x1000-byte aligned buffer size.
|
||||
u64 entries[0x18];
|
||||
u16 total_entries;
|
||||
} PACKED SwkbdCustomizedDictionarySet;
|
||||
} NX_PACKED SwkbdCustomizedDictionarySet;
|
||||
|
||||
/// Base swkbd arg struct.
|
||||
typedef struct {
|
||||
@ -125,7 +133,7 @@ typedef struct {
|
||||
u16 guideText[514/2];
|
||||
u16 pad_x3aa;
|
||||
u32 stringLenMax; ///< When non-zero, specifies the max string length. When the input is too long, swkbd will stop accepting more input until text is deleted via the B button (Backspace). See also \ref SwkbdTextDrawType.
|
||||
u32 stringLenMaxExt; ///< When non-zero, specifies the max string length. When the input is too long, swkbd will display an icon and disable the ok-button.
|
||||
u32 stringLenMin; ///< When non-zero, specifies the min string length. When the input is too short, swkbd will display an icon and disable the ok-button.
|
||||
u32 passwordFlag; ///< Use password: 0 = disable, 1 = enable.
|
||||
SwkbdTextDrawType textDrawType; ///< See \ref SwkbdTextDrawType.
|
||||
u16 returnButtonFlag; ///< Controls whether the Return button is enabled, for newlines input. 0 = disabled, non-zero = enabled.
|
||||
@ -178,11 +186,19 @@ typedef struct {
|
||||
u32 version;
|
||||
} SwkbdConfig;
|
||||
|
||||
/// Rect
|
||||
typedef struct {
|
||||
s16 x; ///< X
|
||||
s16 y; ///< Y
|
||||
s16 width; ///< Width
|
||||
s16 height; ///< Height
|
||||
} SwkbdRect;
|
||||
|
||||
/// InitializeArg for SwkbdInline.
|
||||
typedef struct {
|
||||
u32 unk_x0;
|
||||
u8 mode; ///< See \ref SwkbdInlineMode. (u8 bool)
|
||||
u8 unk_x5; ///< Only set on 5.0.0+.
|
||||
u8 unk_x5; ///< Only set on [5.0.0+].
|
||||
u8 pad[2];
|
||||
} SwkbdInitializeArg;
|
||||
|
||||
@ -194,15 +210,16 @@ typedef struct {
|
||||
u8 dicFlag; ///< Enables dictionary usage when non-zero (including the system dictionary).
|
||||
u8 unk_x1b;
|
||||
u32 keySetDisableBitmask; ///< See SwkbdKeyDisableBitmask_*.
|
||||
s32 unk_x20;
|
||||
s32 unk_x24;
|
||||
s32 stringLenMax; ///< When non-negative and non-zero, specifies the max string length. When the input is too long, swkbd will stop accepting more input until text is deleted via the B button (Backspace).
|
||||
s32 stringLenMin; ///< When non-negative and non-zero, specifies the min string length. When the input is too short, swkbd will display an icon and disable the ok-button.
|
||||
u8 returnButtonFlag; ///< Controls whether the Return button is enabled, for newlines input. 0 = disabled, non-zero = enabled.
|
||||
u16 unk_x29;
|
||||
u8 unk_x29; ///< [10.0.0+] When value 1-2, \ref swkbdInlineAppear / \ref swkbdInlineAppearEx will set keytopAsFloating=0 and footerScalable=1.
|
||||
u8 unk_x2a;
|
||||
u8 unk_x2b;
|
||||
u32 flags; ///< Bitmask 0x4: unknown.
|
||||
u8 unk_x30;
|
||||
u8 unk_x31[0x17];
|
||||
} PACKED SwkbdAppearArg;
|
||||
} SwkbdAppearArg;
|
||||
|
||||
typedef struct {
|
||||
u32 unk_x0;
|
||||
@ -217,16 +234,17 @@ typedef struct {
|
||||
u16 inputText[0x3f4/2]; ///< Flags bitmask 0x8.
|
||||
u8 utf8Mode; ///< Flags bitmask 0x20.
|
||||
u8 unk_x45d;
|
||||
u8 enableBackspace; ///< Flags bitmask 0x8000. Only available with 5.0.0+.
|
||||
u8 enableBackspace; ///< Flags bitmask 0x8000. Only available with [5.0.0+].
|
||||
u8 unk_x45f[3];
|
||||
u8 keytopAsFloating; ///< Flags bitmask 0x200.
|
||||
u8 footerScalable; ///< Flags bitmask 0x100.
|
||||
u8 alphaEnabledInInputMode; ///< Flags bitmask 0x100.
|
||||
u8 inputModeFadeType; ///< Flags bitmask 0x100.
|
||||
u8 disableTouch; ///< Flags bitmask 0x200.
|
||||
u8 disableUSBKeyboard; ///< Flags bitmask 0x800.
|
||||
u8 disableHardwareKeyboard; ///< Flags bitmask 0x800.
|
||||
u8 unk_x468[5];
|
||||
u16 unk_x46d;
|
||||
u8 unk_x46d;
|
||||
u8 unk_x46e;
|
||||
u8 unk_x46f;
|
||||
float keytopScaleX; ///< Flags bitmask 0x200.
|
||||
float keytopScaleY; ///< Flags bitmask 0x200.
|
||||
@ -237,11 +255,11 @@ typedef struct {
|
||||
float balloonScale; ///< Flags bitmask 0x200.
|
||||
float unk_x48c;
|
||||
u8 unk_x490[0xc];
|
||||
u8 seGroup; ///< Flags bitmask: enable=0x2000, disable=0x4000. Only available with 5.0.0+.
|
||||
u8 seGroup; ///< Flags bitmask: enable=0x2000, disable=0x4000. Only available with [5.0.0+].
|
||||
u8 triggerFlag; ///< [6.0.0+] Enables using the trigger field when set.
|
||||
u8 trigger; ///< [6.0.0+] Trigger
|
||||
u8 pad_x49f;
|
||||
} PACKED SwkbdInlineCalcArg;
|
||||
} SwkbdInlineCalcArg;
|
||||
|
||||
/// Struct data for SwkbdInline Interactive reply storage ChangedString*, at the end following the string.
|
||||
typedef struct {
|
||||
@ -363,7 +381,7 @@ void swkbdConfigMakePresetUserName(SwkbdConfig* c);
|
||||
/**
|
||||
* @brief Clears the args in the SwkbdConfig struct and initializes it with the DownloadCode Preset.
|
||||
* @note Do not use this before \ref swkbdCreate.
|
||||
* @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal (\ref SwkbdType_QWERTY on 5.0.0+), swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_DownloadCode, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. 5.0.0+: swkbdConfigSetStringLenMax() with value 16, swkbdConfigSetStringLenMaxExt() with value 1, and swkbdConfigSetTextDrawType() with SwkbdTextDrawType_DownloadCode. Uses swkbdConfigSetTextGrouping() for [0-2] with: 0x3, 0x7, and 0xb.
|
||||
* @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal (\ref SwkbdType_QWERTY on [5.0.0+]), swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_DownloadCode, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. [5.0.0+]: swkbdConfigSetStringLenMax() with value 16, swkbdConfigSetStringLenMin() with value 1, and swkbdConfigSetTextDrawType() with SwkbdTextDrawType_DownloadCode. Uses swkbdConfigSetTextGrouping() for [0-2] with: 0x3, 0x7, and 0xb.
|
||||
* @param c SwkbdConfig struct.
|
||||
*/
|
||||
void swkbdConfigMakePresetDownloadCode(SwkbdConfig* c);
|
||||
@ -489,12 +507,12 @@ static inline void swkbdConfigSetStringLenMax(SwkbdConfig* c, u32 stringLenMax)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets SwkbdArgCommon::stringLenMaxExt.
|
||||
* @brief Sets SwkbdArgCommon::stringLenMin.
|
||||
* @param c SwkbdConfig struct.
|
||||
* @param stringLenMaxExt stringLenMaxExt
|
||||
* @param stringLenMin stringLenMin
|
||||
*/
|
||||
static inline void swkbdConfigSetStringLenMaxExt(SwkbdConfig* c, u32 stringLenMaxExt) {
|
||||
c->arg.arg.arg.stringLenMaxExt = stringLenMaxExt;
|
||||
static inline void swkbdConfigSetStringLenMin(SwkbdConfig* c, u32 stringLenMin) {
|
||||
c->arg.arg.arg.stringLenMin = stringLenMin;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -597,6 +615,63 @@ Result swkbdInlineLaunch(SwkbdInline* s);
|
||||
*/
|
||||
Result swkbdInlineLaunchForLibraryApplet(SwkbdInline* s, u8 mode, u8 unk_x5);
|
||||
|
||||
/**
|
||||
* @brief GetWindowSize
|
||||
* @param[out] width Output width.
|
||||
* @param[out] height Output height.
|
||||
*/
|
||||
NX_CONSTEXPR void swkbdInlineGetWindowSize(s32 *width, s32 *height) {
|
||||
*width = 1280;
|
||||
*height = 720;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief GetImageMemoryRequirement
|
||||
* @note Wrapper for \ref viGetIndirectLayerImageRequiredMemoryInfo.
|
||||
* @param[out] out_size Output size.
|
||||
* @param[out] out_alignment Output alignment.
|
||||
*/
|
||||
Result swkbdInlineGetImageMemoryRequirement(u64 *out_size, u64 *out_alignment);
|
||||
|
||||
/**
|
||||
* @brief GetImage
|
||||
* @note Only available with ::SwkbdInlineMode_UserDisplay.
|
||||
* @note For width/height, see \ref swkbdInlineGetWindowSize.
|
||||
* @param s SwkbdInline object.
|
||||
* @param[out] buffer Output RGBA8 image buffer, this must use the alignment from \ref swkbdInlineGetImageMemoryRequirement.
|
||||
* @param[in] size Output buffer size, this must match the size from \ref swkbdInlineGetImageMemoryRequirement.
|
||||
* @param[out] data_available Whether data is available.
|
||||
*/
|
||||
Result swkbdInlineGetImage(SwkbdInline* s, void* buffer, u64 size, bool *data_available);
|
||||
|
||||
/**
|
||||
* @brief Gets the image max height, relative to the bottom of the screen.
|
||||
* @param s SwkbdInline object.
|
||||
*/
|
||||
s32 swkbdInlineGetMaxHeight(SwkbdInline* s);
|
||||
|
||||
/**
|
||||
* @brief Gets the MiniaturizedHeight, relative to the bottom of the screen.
|
||||
* @param s SwkbdInline object.
|
||||
*/
|
||||
s32 swkbdInlineGetMiniaturizedHeight(SwkbdInline* s);
|
||||
|
||||
/**
|
||||
* @brief GetTouchRectangles. Returns number of valid Rects: 1 for only keytop, 2 for keytop/footer.
|
||||
* @param s SwkbdInline object.
|
||||
* @param[out] keytop \ref SwkbdRect for keytop. Optional, can be NULL.
|
||||
* @param[out] footer \ref SwkbdRect for footer. Optional, can be NULL.
|
||||
*/
|
||||
s32 swkbdInlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *footer);
|
||||
|
||||
/**
|
||||
* @brief Gets whether the input x/y are within the output from \ref swkbdInlineGetTouchRectangles.
|
||||
* @param s SwkbdInline object.
|
||||
* @param[out] x X
|
||||
* @param[out] y Y
|
||||
*/
|
||||
bool swkbdInlineIsUsedTouchPointByKeyboard(SwkbdInline* s, s32 x, s32 y);
|
||||
|
||||
/**
|
||||
* @brief Handles updating SwkbdInline state, this should be called periodically.
|
||||
* @note Handles applet exit if needed, and also sends the \ref SwkbdInlineCalcArg to the applet if needed. Hence, this should be called at some point after writing to \ref SwkbdInlineCalcArg.
|
||||
@ -730,6 +805,24 @@ void swkbdInlineAppearArgSetLeftButtonText(SwkbdAppearArg* arg, const char* str)
|
||||
*/
|
||||
void swkbdInlineAppearArgSetRightButtonText(SwkbdAppearArg* arg, const char* str);
|
||||
|
||||
/**
|
||||
* @brief Sets the stringLenMax for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg.
|
||||
* @param arg \ref SwkbdAppearArg
|
||||
* @param stringLenMax Max string length
|
||||
*/
|
||||
static inline void swkbdInlineAppearArgSetStringLenMax(SwkbdAppearArg* arg, s32 stringLenMax) {
|
||||
arg->stringLenMax = stringLenMax;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the stringLenMin for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg.
|
||||
* @param arg \ref SwkbdAppearArg
|
||||
* @param stringLenMin Min string length
|
||||
*/
|
||||
static inline void swkbdInlineAppearArgSetStringLenMin(SwkbdAppearArg* arg, s32 stringLenMin) {
|
||||
arg->stringLenMin = stringLenMin;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the audio volume.
|
||||
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
|
||||
@ -757,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.
|
||||
@ -770,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);
|
||||
@ -786,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.
|
||||
@ -798,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.
|
||||
@ -815,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.
|
||||
*/
|
||||
@ -856,6 +949,7 @@ void swkbdInlineSetFooterBgAlpha(SwkbdInline* s, float alpha);
|
||||
/**
|
||||
* @brief Sets gfx scaling. Configures KeytopScale* and BalloonScale based on the input value.
|
||||
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
|
||||
* @note The BalloonScale is not updated when \ref SwkbdState is above ::SwkbdState_Initialized.
|
||||
* @param s SwkbdInline object.
|
||||
* @param scale Scale
|
||||
*/
|
||||
@ -873,6 +967,7 @@ void swkbdInlineSetKeytopTranslate(SwkbdInline* s, float x, float y);
|
||||
/**
|
||||
* @brief Sets KeytopAsFloating.
|
||||
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
|
||||
* @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized.
|
||||
* @param s SwkbdInline object.
|
||||
* @param flag Flag
|
||||
*/
|
||||
@ -895,12 +990,12 @@ void swkbdInlineSetFooterScalable(SwkbdInline* s, bool flag);
|
||||
void swkbdInlineSetTouchFlag(SwkbdInline* s, bool flag);
|
||||
|
||||
/**
|
||||
* @brief Sets whether USB-keyboard is enabled. The default is enabled.
|
||||
* @brief Sets whether Hardware-keyboard is enabled. The default is enabled.
|
||||
* @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect.
|
||||
* @param s SwkbdInline object.
|
||||
* @param flag Flag
|
||||
*/
|
||||
void swkbdInlineSetUSBKeyboardFlag(SwkbdInline* s, bool flag);
|
||||
void swkbdInlineSetHardwareKeyboardFlag(SwkbdInline* s, bool flag);
|
||||
|
||||
/**
|
||||
* @brief Sets whether DirectionalButtonAssign is enabled. The default is disabled.
|
||||
|
@ -8,6 +8,8 @@
|
||||
#include "../types.h"
|
||||
#include "../services/applet.h"
|
||||
#include "../services/caps.h"
|
||||
#include "../services/acc.h"
|
||||
#include "../kernel/mutex.h"
|
||||
|
||||
/// This indicates the type of web-applet.
|
||||
typedef enum {
|
||||
@ -27,6 +29,7 @@ typedef enum {
|
||||
WebExitReason_Requested = 0x2, ///< The applet exited since \ref webConfigRequestExit was used.
|
||||
WebExitReason_LastUrl = 0x3, ///< The applet exited due to LastUrl handling, see \ref webReplyGetLastUrl.
|
||||
WebExitReason_ErrorDialog = 0x7, ///< The applet exited after displaying an error dialog.
|
||||
WebExitReason_UnknownE = 0xE, ///< Unknown
|
||||
} WebExitReason;
|
||||
|
||||
/// Button values for \ref webConfigSetBootFooterButtonVisible.
|
||||
@ -41,20 +44,40 @@ typedef enum {
|
||||
WebFooterButtonId_Max, ///< Values starting with this are invalid.
|
||||
} WebFooterButtonId;
|
||||
|
||||
/// WebSessionBootMode
|
||||
typedef enum {
|
||||
WebSessionBootMode_AllForeground = 0, ///< AllForeground. This is the default.
|
||||
WebSessionBootMode_AllForegroundInitiallyHidden = 1, ///< AllForegroundInitiallyHidden
|
||||
} WebSessionBootMode;
|
||||
|
||||
/// WebSessionSendMessageKind
|
||||
typedef enum {
|
||||
WebSessionSendMessageKind_BrowserEngineContent = 0x0, ///< BrowserEngine Content
|
||||
WebSessionSendMessageKind_SystemMessageAppear = 0x100, ///< SystemMessage Appear
|
||||
WebSessionSendMessageKind_Ack = 0x1000, ///< Ack
|
||||
} WebSessionSendMessageKind;
|
||||
|
||||
/// WebSessionReceiveMessageKind
|
||||
typedef enum {
|
||||
WebSessionReceiveMessageKind_BrowserEngineContent = 0x0, ///< BrowserEngine Content
|
||||
WebSessionReceiveMessageKind_AckBrowserEngine = 0x1000, ///< Ack BrowserEngine
|
||||
WebSessionReceiveMessageKind_AckSystemMessage = 0x1001, ///< Ack SystemMessage
|
||||
} WebSessionReceiveMessageKind;
|
||||
|
||||
/// Struct for the WebWifi applet input storage.
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Official sw sets this to 0 with appletStorageWrite, separately from the rest of the config struct.
|
||||
char conntest_url[0x100]; ///< Connection-test URL.
|
||||
char initial_url[0x400]; ///< Initial URL navigated to by the applet.
|
||||
u128 uuid; ///< NIFM Network UUID. Only used by the applet when conntest_url is set.
|
||||
Uuid uuid; ///< NIFM Network UUID. Only used by the applet when conntest_url is set.
|
||||
u32 rev; ///< Input value for nifm cmd SetRequirementByRevision. Only used by the applet when conntest_url is set.
|
||||
} PACKED WebWifiPageArg;
|
||||
} WebWifiPageArg;
|
||||
|
||||
/// Struct for the WebWifi applet output storage.
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Unknown.
|
||||
Result res; ///< Result
|
||||
} PACKED WebWifiReturnValue;
|
||||
} WebWifiReturnValue;
|
||||
|
||||
/// Config for WebWifi.
|
||||
typedef struct {
|
||||
@ -72,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 {
|
||||
@ -110,23 +133,50 @@ typedef struct {
|
||||
u8 visible;
|
||||
u16 unk_x5;
|
||||
u8 unk_x7;
|
||||
} PACKED WebBootFooterButtonEntry;
|
||||
} NX_PACKED WebBootFooterButtonEntry;
|
||||
|
||||
/// StorageHandleQueue
|
||||
typedef struct {
|
||||
s32 read_pos;
|
||||
s32 write_pos;
|
||||
s32 max_storages;
|
||||
bool is_full;
|
||||
AppletStorage storages[0x10];
|
||||
} WebSessionStorageHandleQueue;
|
||||
|
||||
/// WebSession
|
||||
typedef struct {
|
||||
Mutex mutex;
|
||||
WebCommonConfig *config;
|
||||
struct {
|
||||
u32 count;
|
||||
u32 cur_size;
|
||||
} queue[2];
|
||||
WebSessionStorageHandleQueue storage_queue;
|
||||
} WebSession;
|
||||
|
||||
/// SessionMessageHeader
|
||||
typedef struct {
|
||||
u32 kind; ///< Message Kind (\ref WebSessionSendMessageKind / \ref WebSessionReceiveMessageKind)
|
||||
u32 size; ///< Data size following the header.
|
||||
u8 reserved[0x8]; ///< Unused
|
||||
} WebSessionMessageHeader;
|
||||
|
||||
/// Types for \ref WebArgTLV, input storage.
|
||||
typedef enum {
|
||||
WebArgType_Url = 0x1, ///< [1.0.0+] String, size 0xC00. Initial URL.
|
||||
WebArgType_CallbackUrl = 0x3, ///< [1.0.0+] String, size 0x400.
|
||||
WebArgType_CallbackableUrl = 0x4, ///< [1.0.0+] String, size 0x400.
|
||||
WebArgType_ApplicationId = 0x5, ///< [1.0.0+] Offline-applet, u64 titleID
|
||||
WebArgType_ApplicationId = 0x5, ///< [1.0.0+] Offline-applet, u64 ApplicationId
|
||||
WebArgType_DocumentPath = 0x6, ///< [1.0.0+] Offline-applet, string with size 0xC00.
|
||||
WebArgType_DocumentKind = 0x7, ///< [1.0.0+] Offline-applet, u32 enum \WebDocumentKind.
|
||||
WebArgType_SystemDataId = 0x8, ///< [1.0.0+] Offline-applet, u64 titleID
|
||||
WebArgType_SystemDataId = 0x8, ///< [1.0.0+] Offline-applet, u64 SystemDataId
|
||||
WebArgType_ShareStartPage = 0x9, ///< [1.0.0+] u32 enum \WebShareStartPage
|
||||
WebArgType_Whitelist = 0xA, ///< [1.0.0+] String, size 0x1000.
|
||||
WebArgType_NewsFlag = 0xB, ///< [1.0.0+] u8 bool
|
||||
WebArgType_UnknownC = 0xC, ///< [1.0.0+] u8
|
||||
WebArgType_UnknownD = 0xD, ///< [1.0.0+] u8
|
||||
WebArgType_UserID = 0xE, ///< [1.0.0+] u128 userID, controls which user-specific savedata to mount.
|
||||
WebArgType_Uid = 0xE, ///< [1.0.0+] \ref AccountUid, controls which user-specific savedata to mount.
|
||||
WebArgType_AlbumEntry0 = 0xF, ///< [1.0.0+] Share-applet caps AlbumEntry, entry 0.
|
||||
WebArgType_ScreenShot = 0x10, ///< [1.0.0+] u8 bool
|
||||
WebArgType_EcClientCert = 0x11, ///< [1.0.0+] u8 bool
|
||||
@ -174,9 +224,10 @@ typedef enum {
|
||||
WebArgType_BootFooterButton = 0x3E, ///< [6.0.0+] Array of \ref WebBootFooterButtonEntry with 0x10 entries.
|
||||
WebArgType_OverrideWebAudioVolume = 0x3F, ///< [6.0.0+] float
|
||||
WebArgType_OverrideMediaAudioVolume = 0x40, ///< [6.0.0+] float
|
||||
WebArgType_SessionBootMode = 0x41, ///< [7.0.0+] u32 enum WebSessionBootMode
|
||||
WebArgType_SessionBootMode = 0x41, ///< [7.0.0+] u32 enum \ref WebSessionBootMode
|
||||
WebArgType_SessionFlag = 0x42, ///< [7.0.0+] u8 bool, enables using WebSession when set.
|
||||
WebArgType_MediaPlayerUi = 0x43, ///< [8.0.0+] u8 bool
|
||||
WebArgType_TransferMemory = 0x44, ///< [11.0.0+] u8 bool
|
||||
} WebArgType;
|
||||
|
||||
/// Types for \ref WebArgTLV, output storage.
|
||||
@ -196,7 +247,7 @@ typedef enum {
|
||||
typedef enum {
|
||||
WebDocumentKind_OfflineHtmlPage = 0x1, ///< Use the HtmlDocument NCA content from the application.
|
||||
WebDocumentKind_ApplicationLegalInformation = 0x2, ///< Use the LegalInformation NCA content from the application.
|
||||
WebDocumentKind_SystemDataPage = 0x3, ///< Use the Data NCA content from the specified title, see also: https://switchbrew.org/wiki/Title_list#System_Data_Archives
|
||||
WebDocumentKind_SystemDataPage = 0x3, ///< Use the Data NCA content from the specified SystemData, see also: https://switchbrew.org/wiki/Title_list#System_Data_Archives
|
||||
} WebDocumentKind;
|
||||
|
||||
/// This controls the initial page for ShareApplet, used by \ref webShareCreate.
|
||||
@ -242,7 +293,7 @@ typedef enum {
|
||||
* @param uuid NIFM Network UUID, for nifm cmd SetNetworkProfileId. Value 0 can be used. Only used by the applet when conntest_url is set.
|
||||
* @param rev Input value for nifm cmd SetRequirementByRevision. Value 0 can be used. Only used by the applet when conntest_url is set.
|
||||
*/
|
||||
void webWifiCreate(WebWifiConfig* config, const char* conntest_url, const char* initial_url, u128 uuid, u32 rev);
|
||||
void webWifiCreate(WebWifiConfig* config, const char* conntest_url, const char* initial_url, Uuid uuid, u32 rev);
|
||||
|
||||
/**
|
||||
* @brief Launches WifiWebAuthApplet with the specified config and waits for it to exit.
|
||||
@ -252,7 +303,7 @@ void webWifiCreate(WebWifiConfig* config, const char* conntest_url, const char*
|
||||
Result webWifiShow(WebWifiConfig* config, WebWifiReturnValue *out);
|
||||
|
||||
/**
|
||||
* @brief Creates the config for WebApplet. This applet uses an URL whitelist loaded from the user-process host title, which is only loaded when running under an Application.
|
||||
* @brief Creates the config for WebApplet. This applet uses an URL whitelist loaded from the user-process host Application, which is only loaded when running under an Application.
|
||||
* @note Sets ::WebArgType_UnknownD, and ::WebArgType_Unknown12 on pre-3.0.0, to value 1.
|
||||
* @param config WebCommonConfig object.
|
||||
* @param url Initial URL navigated to by the applet.
|
||||
@ -269,7 +320,7 @@ Result webPageCreate(WebCommonConfig* config, const char* url);
|
||||
Result webNewsCreate(WebCommonConfig* config, const char* url);
|
||||
|
||||
/**
|
||||
* @brief Creates the config for WebApplet. This is based on \ref webPageCreate, for YouTubeVideo. Hence other functions referencing \ref webPageCreate also apply to this. This uses a whitelist which essentially only allows youtube embed/ URLs (without mounting content from the host title).
|
||||
* @brief Creates the config for WebApplet. This is based on \ref webPageCreate, for YouTubeVideo. Hence other functions referencing \ref webPageCreate also apply to this. This uses a whitelist which essentially only allows youtube embed/ URLs (without mounting content from the host Application).
|
||||
* @note This is only available on [5.0.0+].
|
||||
* @note Sets ::WebArgType_UnknownD to value 1, and sets ::WebArgType_YouTubeVideoFlag to true. Also uses \ref webConfigSetBootAsMediaPlayer with flag=true.
|
||||
* @param config WebCommonConfig object.
|
||||
@ -278,7 +329,7 @@ Result webNewsCreate(WebCommonConfig* config, const char* url);
|
||||
Result webYouTubeVideoCreate(WebCommonConfig* config, const char* url);
|
||||
|
||||
/**
|
||||
* @brief Creates the config for Offline-applet. This applet uses local content loaded from titles.
|
||||
* @brief Creates the config for Offline-applet. This applet uses data loaded from content.
|
||||
* @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor and sets ::WebArgType_BootAsMediaPlayerInverted to false. Uses \ref webConfigSetPointer with flag = docKind == ::WebDocumentKind_OfflineHtmlPage.
|
||||
* @note For docKind ::WebDocumentKind_ApplicationLegalInformation / ::WebDocumentKind_SystemDataPage, uses \ref webConfigSetFooter with flag=true and \ref webConfigSetBackgroundKind with ::WebBackgroundKind_Default.
|
||||
* @note For docKind ::WebDocumentKind_SystemDataPage, uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_White.
|
||||
@ -289,16 +340,16 @@ Result webYouTubeVideoCreate(WebCommonConfig* config, const char* url);
|
||||
* @note Lastly, sets the TLVs as needed for the input params.
|
||||
* @param config WebCommonConfig object.
|
||||
* @param docKind \ref WebDocumentKind
|
||||
* @param titleID Title to load the content from. With docKind = ::WebDocumentKind_OfflineHtmlPage, titleID=0 should be used to specify the user-process titleID (non-zero is ignored with this docKind).
|
||||
* @param id Id to load the content from. With docKind = ::WebDocumentKind_OfflineHtmlPage, id=0 should be used to specify the user-process application (non-zero is ignored with this docKind).
|
||||
* @param docPath Initial document path in RomFS, without the leading '/'. For ::WebDocumentKind_OfflineHtmlPage, this is relative to "html-document/" in RomFS. For the other docKind values, this is relative to "/" in RomFS. This path must contain ".htdocs/".
|
||||
*/
|
||||
Result webOfflineCreate(WebCommonConfig* config, WebDocumentKind docKind, u64 titleID, const char* docPath);
|
||||
Result webOfflineCreate(WebCommonConfig* config, WebDocumentKind docKind, u64 id, const char* docPath);
|
||||
|
||||
/**
|
||||
* @brief Creates the config for ShareApplet. This applet is for social media posting/settings.
|
||||
* @note If a non-zero userID isn't set with \ref webConfigSetUserID prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account.
|
||||
* @note If a non-zero uid isn't set with \ref webConfigSetUid prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account.
|
||||
* @note An error will be displayed if neither \ref webConfigSetAlbumEntry, nor \ref webConfigSetApplicationAlbumEntry, nor \ref webConfigAddAlbumEntryAndMediaData are used prior to using \ref webConfigShow, with ::WebShareStartPage_Default.
|
||||
* @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetUserID with userID=0, \ref webConfigSetDisplayUrlKind with kind=true, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown3.
|
||||
* @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetUid with uid=0, \ref webConfigSetDisplayUrlKind with kind=true, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown3.
|
||||
* @param config WebCommonConfig object.
|
||||
* @param page \ref WebShareStartPage
|
||||
*/
|
||||
@ -307,8 +358,8 @@ Result webShareCreate(WebCommonConfig* config, WebShareStartPage page);
|
||||
/**
|
||||
* @brief Creates the config for LobbyApplet. This applet is for "Nintendo Switch Online Lounge".
|
||||
* @note Only available on [2.0.0+].
|
||||
* @note If a non-zero userID isn't set with \ref webConfigSetUserID prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account.
|
||||
* @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetPointer with flag=false on [3.0.0+], \ref webConfigSetUserID with userID=0, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown4, \ref webConfigSetBackgroundKind with ::WebBackgroundKind_Unknown2, and sets ::WebArgType_BootAsMediaPlayerInverted to false.
|
||||
* @note If a non-zero uid isn't set with \ref webConfigSetUid prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account.
|
||||
* @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetPointer with flag=false on [3.0.0+], \ref webConfigSetUid with uid=0, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown4, \ref webConfigSetBackgroundKind with ::WebBackgroundKind_Unknown2, and sets ::WebArgType_BootAsMediaPlayerInverted to false.
|
||||
* @param config WebCommonConfig object.
|
||||
*/
|
||||
Result webLobbyCreate(WebCommonConfig* config);
|
||||
@ -340,13 +391,13 @@ Result webConfigSetCallbackableUrl(WebCommonConfig* config, const char* url);
|
||||
Result webConfigSetWhitelist(WebCommonConfig* config, const char* whitelist);
|
||||
|
||||
/**
|
||||
* @brief Sets the account UserID. Controls which user-specific savedata to mount.
|
||||
* @brief Sets the account uid. Controls which user-specific savedata to mount.
|
||||
* @note Only available with config created by \ref webPageCreate, \ref webLobbyCreate, or with Share-applet.
|
||||
* @note Used automatically by \ref webShareCreate and \ref webLobbyCreate with userID=0.
|
||||
* @note Used automatically by \ref webShareCreate and \ref webLobbyCreate with uid=0.
|
||||
* @param config WebCommonConfig object.
|
||||
* @param userID Account userID
|
||||
* @param uid \ref AccountUid
|
||||
*/
|
||||
Result webConfigSetUserID(WebCommonConfig* config, u128 userID);
|
||||
Result webConfigSetUid(WebCommonConfig* config, AccountUid uid);
|
||||
|
||||
/**
|
||||
* @brief Sets the Share CapsAlbumEntry.
|
||||
@ -647,6 +698,14 @@ Result webConfigSetOverrideWebAudioVolume(WebCommonConfig* config, float value);
|
||||
*/
|
||||
Result webConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value);
|
||||
|
||||
/**
|
||||
* @brief Sets \ref WebSessionBootMode.
|
||||
* @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+].
|
||||
* @param config WebCommonConfig object.
|
||||
* @param mode \ref WebSessionBootMode
|
||||
*/
|
||||
Result webConfigSetBootMode(WebCommonConfig* config, WebSessionBootMode mode);
|
||||
|
||||
/**
|
||||
* @brief Sets whether MediaPlayerUi is enabled.
|
||||
* @note Only available with config created by \ref webOfflineCreate on [8.0.0+].
|
||||
@ -655,6 +714,14 @@ Result webConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value
|
||||
*/
|
||||
Result webConfigSetMediaPlayerUi(WebCommonConfig* config, bool flag);
|
||||
|
||||
/**
|
||||
* @brief Sets whether TransferMemory is enabled.
|
||||
* @note Only available with config created by \ref webPageCreate on [11.0.0+].
|
||||
* @param config WebCommonConfig object.
|
||||
* @param flag Flag
|
||||
*/
|
||||
Result webConfigSetTransferMemory(WebCommonConfig* config, bool flag);
|
||||
|
||||
/**
|
||||
* @brief Launches the {web applet} with the specified config and waits for it to exit.
|
||||
* @param config WebCommonConfig object.
|
||||
@ -724,3 +791,72 @@ Result webReplyGetPostId(WebCommonReply *reply, char *outstr, size_t outstr_maxs
|
||||
*/
|
||||
Result webReplyGetMediaPlayerAutoClosedByCompletion(WebCommonReply *reply, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref WebSession object.
|
||||
* @param s \ref WebSession
|
||||
* @param config WebCommonConfig object.
|
||||
*/
|
||||
void webSessionCreate(WebSession *s, WebCommonConfig* config);
|
||||
|
||||
/**
|
||||
* @brief Closes a \ref WebSession object.
|
||||
* @param s \ref WebSession
|
||||
*/
|
||||
void webSessionClose(WebSession *s);
|
||||
|
||||
/**
|
||||
* @brief Launches the applet for \ref WebSession.
|
||||
* @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+].
|
||||
* @note Do not use \ref webConfigShow when using WebSession.
|
||||
* @param s \ref WebSession
|
||||
* @param[out] out_event Output Event with autoclear=false, from \ref appletHolderGetExitEvent. Optional, can be NULL.
|
||||
*/
|
||||
Result webSessionStart(WebSession *s, Event **out_event);
|
||||
|
||||
/**
|
||||
* @brief Waits for the applet to exit.
|
||||
* @note This must be used before \ref webSessionClose, when \ref webSessionStart was used successfully.
|
||||
* @param s \ref WebSession
|
||||
* @param out Optional output applet reply data, can be NULL.
|
||||
*/
|
||||
Result webSessionWaitForExit(WebSession *s, WebCommonReply *out);
|
||||
|
||||
/**
|
||||
* @brief Request the applet to exit.
|
||||
* @note Use this instead of \ref webConfigRequestExit, when using WebSession.
|
||||
* @param s \ref WebSession
|
||||
*/
|
||||
Result webSessionRequestExit(WebSession *s);
|
||||
|
||||
/**
|
||||
* @brief Request the applet to Appear, this is only needed with ::WebSessionBootMode_AllForegroundInitiallyHidden.
|
||||
* @note This should not be used before \ref webSessionStart.
|
||||
* @param s \ref WebSession
|
||||
* @param[out] flag Whether the message was sent successfully.
|
||||
*/
|
||||
Result webSessionAppear(WebSession *s, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief TrySendContentMessage
|
||||
* @note This should not be used before \ref webSessionStart.
|
||||
* @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension.
|
||||
* @note The JS-side may ignore this if it's sent too soon after the applet launches.
|
||||
* @param s \ref WebSession
|
||||
* @param[in] content Input content NUL-terminated string.
|
||||
* @param[in] size Size of content.
|
||||
* @param[out] flag Whether the message was sent successfully.
|
||||
*/
|
||||
Result webSessionTrySendContentMessage(WebSession *s, const char *content, u32 size, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief TryReceiveContentMessage
|
||||
* @note This should not be used before \ref webSessionStart.
|
||||
* @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension.
|
||||
* @param s \ref WebSession
|
||||
* @param[out] content Output content string, always NUL-terminated.
|
||||
* @param[in] size Max size of content.
|
||||
* @param[out] out_size Original content size, prior to being clamped to the specified size param.
|
||||
* @param[out] flag Whether the message was received successfully.
|
||||
*/
|
||||
Result webSessionTryReceiveContentMessage(WebSession *s, char *content, u64 size, u64 *out_size, bool *flag);
|
||||
|
||||
|
@ -1,28 +0,0 @@
|
||||
/**
|
||||
* @file atomics.h
|
||||
* @brief AArch64 atomic operations.
|
||||
* @author plutoo
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
|
||||
/// Atomically increments a 32-bit value.
|
||||
static inline u32 atomicIncrement32(u32* p) {
|
||||
return __atomic_fetch_add(p, 1, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
/// Atomically decrements a 32-bit value.
|
||||
static inline u32 atomicDecrement32(u32* p) {
|
||||
return __atomic_sub_fetch(p, 1, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
/// Atomically increments a 64-bit value.
|
||||
static inline u64 atomicIncrement64(u64* p) {
|
||||
return __atomic_fetch_add(p, 1, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
/// Atomically decrements a 64-bit value.
|
||||
static inline u64 atomicDecrement64(u64* p) {
|
||||
return __atomic_sub_fetch(p, 1, __ATOMIC_SEQ_CST);
|
||||
}
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include "../types.h"
|
||||
|
||||
/// PcmFormat
|
||||
typedef enum {
|
||||
PcmFormat_Invalid = 0,
|
||||
PcmFormat_Int8 = 1,
|
||||
@ -18,6 +19,7 @@ typedef enum {
|
||||
PcmFormat_Adpcm = 6,
|
||||
} PcmFormat;
|
||||
|
||||
/// AudioDeviceName
|
||||
typedef struct {
|
||||
char name[0x100];
|
||||
} AudioDeviceName;
|
||||
|
@ -62,6 +62,7 @@ struct AudioDriverWaveBuf {
|
||||
bool audrvVoiceInit(AudioDriver* d, int id, int num_channels, PcmFormat format, int sample_rate);
|
||||
void audrvVoiceDrop(AudioDriver* d, int id);
|
||||
void audrvVoiceStop(AudioDriver* d, int id);
|
||||
bool audrvVoiceIsPaused(AudioDriver* d, int id);
|
||||
bool audrvVoiceIsPlaying(AudioDriver* d, int id);
|
||||
bool audrvVoiceAddWaveBuf(AudioDriver* d, int id, AudioDriverWaveBuf* wavebuf);
|
||||
u32 audrvVoiceGetWaveBufSeq(AudioDriver* d, int id);
|
||||
|
@ -24,11 +24,12 @@ do { \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/// Calculate a CRC32 over data.
|
||||
static inline u32 crc32Calculate(const void *src, size_t size) {
|
||||
/// Calculate a CRC32 over data using a seed.
|
||||
/// Can be used to calculate a CRC32 in chunks using an initial seed of zero for the first chunk.
|
||||
static inline u32 crc32CalculateWithSeed(u32 seed, const void *src, size_t size) {
|
||||
const u8 *src_u8 = (const u8 *)src;
|
||||
|
||||
u32 crc = 0xFFFFFFFF;
|
||||
u32 crc = ~seed;
|
||||
s64 len = size;
|
||||
|
||||
_CRC_ALIGN(u8, b);
|
||||
@ -44,14 +45,20 @@ static inline u32 crc32Calculate(const void *src, size_t size) {
|
||||
_CRC_REMAINDER(u16, h);
|
||||
_CRC_REMAINDER(u8, b);
|
||||
|
||||
return crc ^ 0xFFFFFFFF;
|
||||
return ~crc;
|
||||
}
|
||||
|
||||
/// Calculate a CRC32C over data.
|
||||
static inline u32 crc32cCalculate(const void *src, size_t size) {
|
||||
/// Calculate a CRC32 over data.
|
||||
static inline u32 crc32Calculate(const void *src, size_t size) {
|
||||
return crc32CalculateWithSeed(0, src, size);
|
||||
}
|
||||
|
||||
/// Calculate a CRC32C over data using a seed.
|
||||
/// Can be used to calculate a CRC32C in chunks using an initial seed of zero for the first chunk.
|
||||
static inline u32 crc32cCalculateWithSeed(u32 seed, const void *src, size_t size) {
|
||||
const u8 *src_u8 = (const u8 *)src;
|
||||
|
||||
u32 crc = 0xFFFFFFFF;
|
||||
u32 crc = ~seed;
|
||||
s64 len = size;
|
||||
|
||||
_CRC_ALIGN(u8, cb);
|
||||
@ -67,7 +74,12 @@ static inline u32 crc32cCalculate(const void *src, size_t size) {
|
||||
_CRC_REMAINDER(u16, ch);
|
||||
_CRC_REMAINDER(u8, cb);
|
||||
|
||||
return crc ^ 0xFFFFFFFF;
|
||||
return ~crc;
|
||||
}
|
||||
|
||||
/// Calculate a CRC32C over data.
|
||||
static inline u32 crc32cCalculate(const void *src, size_t size) {
|
||||
return crc32cCalculateWithSeed(0, src, size);
|
||||
}
|
||||
|
||||
#undef _CRC_REMAINDER
|
||||
|
@ -1,16 +1,15 @@
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
#define BINDER_FIRST_CALL_TRANSACTION 0x1
|
||||
|
||||
typedef struct {
|
||||
bool created : 1;
|
||||
bool initialized : 1;
|
||||
bool has_transact_auto : 1;
|
||||
bool created;
|
||||
bool initialized;
|
||||
s32 id;
|
||||
size_t ipc_buffer_size;
|
||||
size_t dummy;
|
||||
Service* relay;
|
||||
} Binder;
|
||||
|
||||
|
@ -11,7 +11,7 @@ typedef struct {
|
||||
} BqRect;
|
||||
|
||||
typedef struct {
|
||||
struct { s64 timestamp; } PACKED;
|
||||
struct { s64 timestamp; } NX_PACKED;
|
||||
s32 isAutoTimestamp;
|
||||
BqRect crop;
|
||||
s32 scalingMode;
|
||||
|
@ -58,10 +58,11 @@ NWindow* nwindowGetDefault(void);
|
||||
/**
|
||||
* @brief Creates a \ref NWindow.
|
||||
* @param[out] nw Output \ref NWindow structure.
|
||||
* @param[in] binder_session Service object for the Android IGraphicBufferProducer binder session.
|
||||
* @param[in] binder_id Android IGraphicBufferProducer binder session ID.
|
||||
* @param[in] producer_controlled_by_app Specifies whether the producer is controlled by the application.
|
||||
*/
|
||||
Result nwindowCreate(NWindow* nw, s32 binder_id, bool producer_controlled_by_app);
|
||||
Result nwindowCreate(NWindow* nw, Service* binder_session, s32 binder_id, bool producer_controlled_by_app);
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref NWindow operating on a \ref ViLayer.
|
||||
|
@ -40,7 +40,7 @@ Result condvarWaitTimeout(CondVar* c, Mutex* m, u64 timeout);
|
||||
*/
|
||||
static inline Result condvarWait(CondVar* c, Mutex* m)
|
||||
{
|
||||
return condvarWaitTimeout(c, m, U64_MAX);
|
||||
return condvarWaitTimeout(c, m, UINT64_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -51,7 +51,8 @@ static inline Result condvarWait(CondVar* c, Mutex* m)
|
||||
*/
|
||||
static inline Result condvarWake(CondVar* c, int num)
|
||||
{
|
||||
return svcSignalProcessWideKey(c, num);
|
||||
svcSignalProcessWideKey(c, num);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -6,37 +6,19 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../result.h"
|
||||
#include "svc.h"
|
||||
|
||||
/// Returns the kernel version that can be detected by checking kernel capabilities. This only goes from 1 (representing 1.0.0) up to 6 (representing 6.0.0 and above). Generally, \ref hosversionGet should be used instead of this function.
|
||||
int detectKernelVersion(void);
|
||||
/// Returns true if the process has a debugger attached.
|
||||
bool detectDebugger(void);
|
||||
/// Returns true if the kernel is patched to allow self-process-jit.
|
||||
bool detectJitKernelPatch(void);
|
||||
/// After this has been called, libnx will ignore the self-process-jit kernel patch. For testing purposes only.
|
||||
void detectIgnoreJitKernelPatch(void);
|
||||
|
||||
/// Returns true if the kernel version is equal to or above 2.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
|
||||
static inline bool kernelAbove200(void) {
|
||||
return detectKernelVersion() >= 2;
|
||||
NX_INLINE bool detectDebugger(void) {
|
||||
u64 tmp = 0;
|
||||
Result rc = svcGetInfo(&tmp, InfoType_DebuggerAttached, INVALID_HANDLE, 0);
|
||||
return R_SUCCEEDED(rc) && tmp != 0;
|
||||
}
|
||||
|
||||
/// Returns true if the kernel version is equal to or above 3.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
|
||||
static inline bool kernelAbove300(void) {
|
||||
return detectKernelVersion() >= 3;
|
||||
}
|
||||
|
||||
/// Returns true if the kernel version is equal to or above 4.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
|
||||
static inline bool kernelAbove400(void) {
|
||||
return detectKernelVersion() >= 4;
|
||||
}
|
||||
|
||||
/// Returns true if the kernel version is equal to or above 5.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
|
||||
static inline bool kernelAbove500(void) {
|
||||
return detectKernelVersion() >= 5;
|
||||
}
|
||||
|
||||
/// Returns true if the kernel version is equal to or above 6.0.0. Generally, \ref hosversionAtLeast should be used instead of this function.
|
||||
static inline bool kernelAbove600(void) {
|
||||
return detectKernelVersion() >= 6;
|
||||
/// Returns true if the underlying kernel is Mesosphère.
|
||||
NX_INLINE bool detectMesosphere(void) {
|
||||
u64 dummy = 0;
|
||||
Result rc = svcGetInfo(&dummy, 65000, INVALID_HANDLE, 0); // InfoType_MesosphereMeta
|
||||
return R_SUCCEEDED(rc);
|
||||
}
|
||||
|
@ -1,758 +0,0 @@
|
||||
/**
|
||||
* @file ipc.h
|
||||
* @brief Inter-process communication handling
|
||||
* @author plutoo
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../result.h"
|
||||
#include "../arm/tls.h"
|
||||
#include "../kernel/svc.h"
|
||||
|
||||
/// IPC input header magic
|
||||
#define SFCI_MAGIC 0x49434653
|
||||
/// IPC output header magic
|
||||
#define SFCO_MAGIC 0x4f434653
|
||||
|
||||
/// IPC invalid object ID
|
||||
#define IPC_INVALID_OBJECT_ID UINT32_MAX
|
||||
|
||||
///@name IPC request building
|
||||
///@{
|
||||
|
||||
/// IPC command (request) structure.
|
||||
#define IPC_MAX_BUFFERS 8
|
||||
#define IPC_MAX_OBJECTS 8
|
||||
|
||||
typedef enum {
|
||||
BufferType_Normal=0, ///< Regular buffer.
|
||||
BufferType_Type1=1, ///< Allows ProcessMemory and shared TransferMemory.
|
||||
BufferType_Invalid=2,
|
||||
BufferType_Type3=3 ///< Same as Type1 except remote process is not allowed to use device-mapping.
|
||||
} BufferType;
|
||||
|
||||
typedef enum {
|
||||
BufferDirection_Send=0,
|
||||
BufferDirection_Recv=1,
|
||||
BufferDirection_Exch=2,
|
||||
} BufferDirection;
|
||||
|
||||
typedef enum {
|
||||
IpcCommandType_Invalid = 0,
|
||||
IpcCommandType_LegacyRequest = 1,
|
||||
IpcCommandType_Close = 2,
|
||||
IpcCommandType_LegacyControl = 3,
|
||||
IpcCommandType_Request = 4,
|
||||
IpcCommandType_Control = 5,
|
||||
IpcCommandType_RequestWithContext = 6,
|
||||
IpcCommandType_ControlWithContext = 7,
|
||||
} IpcCommandType;
|
||||
|
||||
typedef enum {
|
||||
DomainMessageType_Invalid = 0,
|
||||
DomainMessageType_SendMessage = 1,
|
||||
DomainMessageType_Close = 2,
|
||||
} DomainMessageType;
|
||||
|
||||
/// IPC domain message header.
|
||||
typedef struct {
|
||||
u8 Type;
|
||||
u8 NumObjectIds;
|
||||
u16 Length;
|
||||
u32 ThisObjectId;
|
||||
u32 Pad[2];
|
||||
} DomainMessageHeader;
|
||||
|
||||
/// IPC domain response header.
|
||||
typedef struct {
|
||||
u32 NumObjectIds;
|
||||
u32 Pad[3];
|
||||
} DomainResponseHeader;
|
||||
|
||||
|
||||
typedef struct {
|
||||
size_t NumSend; // A
|
||||
size_t NumRecv; // B
|
||||
size_t NumExch; // W
|
||||
const void* Buffers[IPC_MAX_BUFFERS];
|
||||
size_t BufferSizes[IPC_MAX_BUFFERS];
|
||||
BufferType BufferTypes[IPC_MAX_BUFFERS];
|
||||
|
||||
size_t NumStaticIn; // X
|
||||
size_t NumStaticOut; // C
|
||||
const void* Statics[IPC_MAX_BUFFERS];
|
||||
size_t StaticSizes[IPC_MAX_BUFFERS];
|
||||
u8 StaticIndices[IPC_MAX_BUFFERS];
|
||||
|
||||
bool SendPid;
|
||||
size_t NumHandlesCopy;
|
||||
size_t NumHandlesMove;
|
||||
Handle Handles[IPC_MAX_OBJECTS];
|
||||
|
||||
size_t NumObjectIds;
|
||||
u32 ObjectIds[IPC_MAX_OBJECTS];
|
||||
} IpcCommand;
|
||||
|
||||
/**
|
||||
* @brief Initializes an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
*/
|
||||
static inline void ipcInitialize(IpcCommand* cmd) {
|
||||
*cmd = (IpcCommand){};
|
||||
}
|
||||
|
||||
/// IPC buffer descriptor.
|
||||
typedef struct {
|
||||
u32 Size; ///< Size of the buffer.
|
||||
u32 Addr; ///< Lower 32-bits of the address of the buffer
|
||||
u32 Packed; ///< Packed data (including higher bits of the address)
|
||||
} IpcBufferDescriptor;
|
||||
|
||||
/// IPC static send-buffer descriptor.
|
||||
typedef struct {
|
||||
u32 Packed; ///< Packed data (including higher bits of the address)
|
||||
u32 Addr; ///< Lower 32-bits of the address
|
||||
} IpcStaticSendDescriptor;
|
||||
|
||||
/// IPC static receive-buffer descriptor.
|
||||
typedef struct {
|
||||
u32 Addr; ///< Lower 32-bits of the address of the buffer
|
||||
u32 Packed; ///< Packed data (including higher bits of the address)
|
||||
} IpcStaticRecvDescriptor;
|
||||
|
||||
/**
|
||||
* @brief Adds a buffer to an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param buffer Address of the buffer.
|
||||
* @param size Size of the buffer.
|
||||
* @param type Buffer type.
|
||||
*/
|
||||
static inline void ipcAddSendBuffer(IpcCommand* cmd, const void* buffer, size_t size, BufferType type) {
|
||||
size_t off = cmd->NumSend;
|
||||
cmd->Buffers[off] = buffer;
|
||||
cmd->BufferSizes[off] = size;
|
||||
cmd->BufferTypes[off] = type;
|
||||
cmd->NumSend++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a receive-buffer to an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param buffer Address of the buffer.
|
||||
* @param size Size of the buffer.
|
||||
* @param type Buffer type.
|
||||
*/
|
||||
static inline void ipcAddRecvBuffer(IpcCommand* cmd, void* buffer, size_t size, BufferType type) {
|
||||
size_t off = cmd->NumSend + cmd->NumRecv;
|
||||
cmd->Buffers[off] = buffer;
|
||||
cmd->BufferSizes[off] = size;
|
||||
cmd->BufferTypes[off] = type;
|
||||
cmd->NumRecv++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds an exchange-buffer to an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param buffer Address of the buffer.
|
||||
* @param size Size of the buffer.
|
||||
* @param type Buffer type.
|
||||
*/
|
||||
static inline void ipcAddExchBuffer(IpcCommand* cmd, void* buffer, size_t size, BufferType type) {
|
||||
size_t off = cmd->NumSend + cmd->NumRecv + cmd->NumExch;
|
||||
cmd->Buffers[off] = buffer;
|
||||
cmd->BufferSizes[off] = size;
|
||||
cmd->BufferTypes[off] = type;
|
||||
cmd->NumExch++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a static-buffer to an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param buffer Address of the buffer.
|
||||
* @param size Size of the buffer.
|
||||
* @param index Index of buffer.
|
||||
*/
|
||||
static inline void ipcAddSendStatic(IpcCommand* cmd, const void* buffer, size_t size, u8 index) {
|
||||
size_t off = cmd->NumStaticIn;
|
||||
cmd->Statics[off] = buffer;
|
||||
cmd->StaticSizes[off] = size;
|
||||
cmd->StaticIndices[off] = index;
|
||||
cmd->NumStaticIn++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a static-receive-buffer to an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param buffer Address of the buffer.
|
||||
* @param size Size of the buffer.
|
||||
* @param index Index of buffer.
|
||||
*/
|
||||
static inline void ipcAddRecvStatic(IpcCommand* cmd, void* buffer, size_t size, u8 index) {
|
||||
size_t off = cmd->NumStaticIn + cmd->NumStaticOut;
|
||||
cmd->Statics[off] = buffer;
|
||||
cmd->StaticSizes[off] = size;
|
||||
cmd->StaticIndices[off] = index;
|
||||
cmd->NumStaticOut++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a smart-buffer (buffer + static-buffer pair) to an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param pointer_buffer_size Pointer buffer size.
|
||||
* @param buffer Address of the buffer.
|
||||
* @param size Size of the buffer.
|
||||
* @param index Index of buffer.
|
||||
*/
|
||||
static inline void ipcAddSendSmart(IpcCommand* cmd, size_t pointer_buffer_size, const void* buffer, size_t size, u8 index) {
|
||||
if (pointer_buffer_size != 0 && size <= pointer_buffer_size) {
|
||||
ipcAddSendBuffer(cmd, NULL, 0, BufferType_Normal);
|
||||
ipcAddSendStatic(cmd, buffer, size, index);
|
||||
} else {
|
||||
ipcAddSendBuffer(cmd, buffer, size, BufferType_Normal);
|
||||
ipcAddSendStatic(cmd, NULL, 0, index);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a smart-receive-buffer (buffer + static-receive-buffer pair) to an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param pointer_buffer_size Pointer buffer size.
|
||||
* @param buffer Address of the buffer.
|
||||
* @param size Size of the buffer.
|
||||
* @param index Index of buffer.
|
||||
*/
|
||||
static inline void ipcAddRecvSmart(IpcCommand* cmd, size_t pointer_buffer_size, void* buffer, size_t size, u8 index) {
|
||||
if (pointer_buffer_size != 0 && size <= pointer_buffer_size) {
|
||||
ipcAddRecvBuffer(cmd, NULL, 0, BufferType_Normal);
|
||||
ipcAddRecvStatic(cmd, buffer, size, index);
|
||||
} else {
|
||||
ipcAddRecvBuffer(cmd, buffer, size, BufferType_Normal);
|
||||
ipcAddRecvStatic(cmd, NULL, 0, index);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tags an IPC command structure to send the PID.
|
||||
* @param cmd IPC command structure.
|
||||
*/
|
||||
static inline void ipcSendPid(IpcCommand* cmd) {
|
||||
cmd->SendPid = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a copy-handle to be sent through an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param h Handle to send.
|
||||
* @remark The receiving process gets a copy of the handle.
|
||||
*/
|
||||
static inline void ipcSendHandleCopy(IpcCommand* cmd, Handle h) {
|
||||
cmd->Handles[cmd->NumHandlesCopy++] = h;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a move-handle to be sent through an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param h Handle to send.
|
||||
* @remark The sending process loses ownership of the handle, which is transferred to the receiving process.
|
||||
*/
|
||||
static inline void ipcSendHandleMove(IpcCommand* cmd, Handle h) {
|
||||
cmd->Handles[cmd->NumHandlesCopy + cmd->NumHandlesMove++] = h;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Prepares the header of an IPC command structure.
|
||||
* @param cmd IPC command structure.
|
||||
* @param sizeof_raw Size in bytes of the raw data structure to embed inside the IPC request
|
||||
* @return Pointer to the raw embedded data structure in the request, ready to be filled out.
|
||||
*/
|
||||
static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) {
|
||||
u32* buf = (u32*)armGetTls();
|
||||
size_t i;
|
||||
*buf++ = IpcCommandType_Request | (cmd->NumStaticIn << 16) | (cmd->NumSend << 20) | (cmd->NumRecv << 24) | (cmd->NumExch << 28);
|
||||
|
||||
u32* fill_in_size_later = buf;
|
||||
|
||||
if (cmd->NumStaticOut > 0) {
|
||||
*buf = (cmd->NumStaticOut + 2) << 10;
|
||||
}
|
||||
else {
|
||||
*buf = 0;
|
||||
}
|
||||
|
||||
if (cmd->SendPid || cmd->NumHandlesCopy > 0 || cmd->NumHandlesMove > 0) {
|
||||
*buf++ |= 0x80000000;
|
||||
*buf++ = (!!cmd->SendPid) | (cmd->NumHandlesCopy << 1) | (cmd->NumHandlesMove << 5);
|
||||
|
||||
if (cmd->SendPid)
|
||||
buf += 2;
|
||||
|
||||
for (i=0; i<(cmd->NumHandlesCopy + cmd->NumHandlesMove); i++)
|
||||
*buf++ = cmd->Handles[i];
|
||||
}
|
||||
else {
|
||||
buf++;
|
||||
}
|
||||
|
||||
for (i=0; i<cmd->NumStaticIn; i++, buf+=2) {
|
||||
IpcStaticSendDescriptor* desc = (IpcStaticSendDescriptor*) buf;
|
||||
|
||||
uintptr_t ptr = (uintptr_t) cmd->Statics[i];
|
||||
desc->Addr = ptr;
|
||||
desc->Packed = cmd->StaticIndices[i] | (cmd->StaticSizes[i] << 16) |
|
||||
(((ptr >> 32) & 15) << 12) | (((ptr >> 36) & 15) << 6);
|
||||
}
|
||||
|
||||
for (i=0; i<(cmd->NumSend + cmd->NumRecv + cmd->NumExch); i++, buf+=3) {
|
||||
IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf;
|
||||
desc->Size = cmd->BufferSizes[i];
|
||||
|
||||
uintptr_t ptr = (uintptr_t) cmd->Buffers[i];
|
||||
desc->Addr = ptr;
|
||||
desc->Packed = cmd->BufferTypes[i] |
|
||||
(((ptr >> 32) & 15) << 28) | ((ptr >> 36) << 2);
|
||||
}
|
||||
|
||||
u32 padding = ((16 - (((uintptr_t) buf) & 15)) & 15) / 4;
|
||||
u32* raw = (u32*) (buf + padding);
|
||||
|
||||
size_t raw_size = (sizeof_raw/4) + 4;
|
||||
buf += raw_size;
|
||||
|
||||
u16* buf_u16 = (u16*) buf;
|
||||
|
||||
for (i=0; i<cmd->NumStaticOut; i++) {
|
||||
size_t off = cmd->NumStaticIn + i;
|
||||
size_t sz = (uintptr_t) cmd->StaticSizes[off];
|
||||
|
||||
buf_u16[i] = (sz > 0xFFFF) ? 0 : sz;
|
||||
}
|
||||
|
||||
size_t u16s_size = ((2*cmd->NumStaticOut) + 3)/4;
|
||||
buf += u16s_size;
|
||||
raw_size += u16s_size;
|
||||
|
||||
*fill_in_size_later |= raw_size;
|
||||
|
||||
for (i=0; i<cmd->NumStaticOut; i++, buf+=2) {
|
||||
IpcStaticRecvDescriptor* desc = (IpcStaticRecvDescriptor*) buf;
|
||||
size_t off = cmd->NumStaticIn + i;
|
||||
|
||||
uintptr_t ptr = (uintptr_t) cmd->Statics[off];
|
||||
desc->Addr = ptr;
|
||||
desc->Packed = (ptr >> 32) | (cmd->StaticSizes[off] << 16);
|
||||
}
|
||||
|
||||
return (void*) raw;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Dispatches an IPC request.
|
||||
* @param session IPC session handle.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcDispatch(Handle session) {
|
||||
return svcSendSyncRequest(session);
|
||||
}
|
||||
|
||||
///@}
|
||||
|
||||
///@name IPC response parsing
|
||||
///@{
|
||||
|
||||
/// IPC parsed command (response) structure.
|
||||
typedef struct {
|
||||
IpcCommandType CommandType; ///< Type of the command
|
||||
|
||||
bool HasPid; ///< true if the 'Pid' field is filled out.
|
||||
u64 Pid; ///< PID included in the response (only if HasPid is true)
|
||||
|
||||
size_t NumHandles; ///< Number of handles copied.
|
||||
Handle Handles[IPC_MAX_OBJECTS]; ///< Handles.
|
||||
bool WasHandleCopied[IPC_MAX_OBJECTS]; ///< true if the handle was moved, false if it was copied.
|
||||
|
||||
bool IsDomainRequest; ///< true if the the message is a Domain message.
|
||||
DomainMessageType InMessageType; ///< Type of the domain message.
|
||||
u32 InMessageLength; ///< Size of rawdata (for domain messages).
|
||||
u32 InThisObjectId; ///< Object ID to call the command on (for domain messages).
|
||||
size_t InNumObjectIds; ///< Number of object IDs (for domain messages).
|
||||
u32 InObjectIds[IPC_MAX_OBJECTS]; ///< Object IDs (for domain messages).
|
||||
|
||||
bool IsDomainResponse; ///< true if the the message is a Domain response.
|
||||
size_t OutNumObjectIds; ///< Number of object IDs (for domain responses).
|
||||
u32 OutObjectIds[IPC_MAX_OBJECTS]; ///< Object IDs (for domain responses).
|
||||
|
||||
size_t NumBuffers; ///< Number of buffers in the response.
|
||||
void* Buffers[IPC_MAX_BUFFERS]; ///< Pointers to the buffers.
|
||||
size_t BufferSizes[IPC_MAX_BUFFERS]; ///< Sizes of the buffers.
|
||||
BufferType BufferTypes[IPC_MAX_BUFFERS]; ///< Types of the buffers.
|
||||
BufferDirection BufferDirections[IPC_MAX_BUFFERS]; ///< Direction of each buffer.
|
||||
|
||||
size_t NumStatics; ///< Number of statics in the response.
|
||||
void* Statics[IPC_MAX_BUFFERS]; ///< Pointers to the statics.
|
||||
size_t StaticSizes[IPC_MAX_BUFFERS]; ///< Sizes of the statics.
|
||||
u8 StaticIndices[IPC_MAX_BUFFERS]; ///< Indices of the statics.
|
||||
|
||||
size_t NumStaticsOut; ///< Number of output statics available in the response.
|
||||
|
||||
void* Raw; ///< Pointer to the raw embedded data structure in the response.
|
||||
void* RawWithoutPadding; ///< Pointer to the raw embedded data structure, without padding.
|
||||
size_t RawSize; ///< Size of the raw embedded data.
|
||||
} IpcParsedCommand;
|
||||
|
||||
/**
|
||||
* @brief Parse an IPC command response into an IPC parsed command structure.
|
||||
* @param r IPC parsed command structure to fill in.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcParse(IpcParsedCommand* r) {
|
||||
u32* buf = (u32*)armGetTls();
|
||||
u32 ctrl0 = *buf++;
|
||||
u32 ctrl1 = *buf++;
|
||||
size_t i;
|
||||
|
||||
r->IsDomainRequest = false;
|
||||
r->IsDomainResponse = false;
|
||||
|
||||
r->CommandType = (IpcCommandType) (ctrl0 & 0xffff);
|
||||
r->HasPid = false;
|
||||
r->RawSize = (ctrl1 & 0x1ff) * 4;
|
||||
r->NumHandles = 0;
|
||||
|
||||
r->NumStaticsOut = (ctrl1 >> 10) & 15;
|
||||
if (r->NumStaticsOut >> 1) r->NumStaticsOut--; // Value 2 -> Single descriptor
|
||||
if (r->NumStaticsOut >> 1) r->NumStaticsOut--; // Value 3+ -> (Value - 2) descriptors
|
||||
|
||||
if (ctrl1 & 0x80000000) {
|
||||
u32 ctrl2 = *buf++;
|
||||
|
||||
if (ctrl2 & 1) {
|
||||
r->HasPid = true;
|
||||
r->Pid = *buf++;
|
||||
r->Pid |= ((u64)(*buf++)) << 32;
|
||||
}
|
||||
|
||||
size_t num_handles_copy = ((ctrl2 >> 1) & 15);
|
||||
size_t num_handles_move = ((ctrl2 >> 5) & 15);
|
||||
|
||||
size_t num_handles = num_handles_copy + num_handles_move;
|
||||
u32* buf_after_handles = buf + num_handles;
|
||||
|
||||
if (num_handles > IPC_MAX_OBJECTS)
|
||||
num_handles = IPC_MAX_OBJECTS;
|
||||
|
||||
for (i=0; i<num_handles; i++)
|
||||
{
|
||||
r->Handles[i] = *(buf+i);
|
||||
r->WasHandleCopied[i] = (i < num_handles_copy);
|
||||
}
|
||||
|
||||
r->NumHandles = num_handles;
|
||||
buf = buf_after_handles;
|
||||
}
|
||||
|
||||
size_t num_statics = (ctrl0 >> 16) & 15;
|
||||
u32* buf_after_statics = buf + num_statics*2;
|
||||
|
||||
if (num_statics > IPC_MAX_BUFFERS)
|
||||
num_statics = IPC_MAX_BUFFERS;
|
||||
|
||||
for (i=0; i<num_statics; i++, buf+=2) {
|
||||
IpcStaticSendDescriptor* desc = (IpcStaticSendDescriptor*) buf;
|
||||
u64 packed = (u64) desc->Packed;
|
||||
|
||||
r->Statics[i] = (void*) (desc->Addr | (((packed >> 12) & 15) << 32) | (((packed >> 6) & 15) << 36));
|
||||
r->StaticSizes[i] = packed >> 16;
|
||||
r->StaticIndices[i] = packed & 63;
|
||||
}
|
||||
|
||||
r->NumStatics = num_statics;
|
||||
buf = buf_after_statics;
|
||||
|
||||
size_t num_bufs_send = (ctrl0 >> 20) & 15;
|
||||
size_t num_bufs_recv = (ctrl0 >> 24) & 15;
|
||||
size_t num_bufs_exch = (ctrl0 >> 28) & 15;
|
||||
|
||||
size_t num_bufs = num_bufs_send + num_bufs_recv + num_bufs_exch;
|
||||
r->Raw = (void*)(((uintptr_t)(buf + num_bufs*3) + 15) &~ 15);
|
||||
r->RawWithoutPadding = (void*)((uintptr_t)(buf + num_bufs*3));
|
||||
|
||||
if (num_bufs > IPC_MAX_BUFFERS)
|
||||
num_bufs = IPC_MAX_BUFFERS;
|
||||
|
||||
for (i=0; i<num_bufs; i++, buf+=3) {
|
||||
IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf;
|
||||
u64 packed = (u64) desc->Packed;
|
||||
|
||||
r->Buffers[i] = (void*) (desc->Addr | ((packed >> 28) << 32) | (((packed >> 2) & 15) << 36));
|
||||
r->BufferSizes[i] = desc->Size;
|
||||
r->BufferTypes[i] = (BufferType) (packed & 3);
|
||||
|
||||
if (i < num_bufs_send)
|
||||
r->BufferDirections[i] = BufferDirection_Send;
|
||||
else if (i < (num_bufs_send + num_bufs_recv))
|
||||
r->BufferDirections[i] = BufferDirection_Recv;
|
||||
else
|
||||
r->BufferDirections[i] = BufferDirection_Exch;
|
||||
}
|
||||
|
||||
r->NumBuffers = num_bufs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Queries the size of an IPC pointer buffer.
|
||||
* @param session IPC session handle.
|
||||
* @param size Output variable in which to store the size.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcQueryPointerBufferSize(Handle session, size_t *size) {
|
||||
u32* buf = (u32*)armGetTls();
|
||||
|
||||
buf[0] = IpcCommandType_Control;
|
||||
buf[1] = 8;
|
||||
buf[2] = 0;
|
||||
buf[3] = 0;
|
||||
buf[4] = SFCI_MAGIC;
|
||||
buf[5] = 0;
|
||||
buf[6] = 3;
|
||||
buf[7] = 0;
|
||||
|
||||
Result rc = ipcDispatch(session);
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
IpcParsedCommand r;
|
||||
ipcParse(&r);
|
||||
|
||||
struct ipcQueryPointerBufferSizeResponse {
|
||||
u64 magic;
|
||||
u64 result;
|
||||
u32 size;
|
||||
} *raw = (struct ipcQueryPointerBufferSizeResponse*)r.Raw;
|
||||
|
||||
rc = raw->result;
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
*size = raw->size & 0xffff;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Closes the IPC session with proper clean up.
|
||||
* @param session IPC session handle.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcCloseSession(Handle session) {
|
||||
u32* buf = (u32*)armGetTls();
|
||||
buf[0] = IpcCommandType_Close;
|
||||
buf[1] = 0;
|
||||
return ipcDispatch(session);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Clones an IPC session.
|
||||
* @param session IPC session handle.
|
||||
* @param unk Unknown.
|
||||
* @param new_session_out Output cloned IPC session handle.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcCloneSession(Handle session, u32 unk, Handle* new_session_out) {
|
||||
u32* buf = (u32*)armGetTls();
|
||||
|
||||
buf[0] = IpcCommandType_Control;
|
||||
buf[1] = 9;
|
||||
buf[2] = 0;
|
||||
buf[3] = 0;
|
||||
buf[4] = SFCI_MAGIC;
|
||||
buf[5] = 0;
|
||||
buf[6] = 4;
|
||||
buf[7] = 0;
|
||||
buf[8] = unk;
|
||||
|
||||
Result rc = ipcDispatch(session);
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
IpcParsedCommand r;
|
||||
ipcParse(&r);
|
||||
|
||||
struct ipcCloneSessionResponse {
|
||||
u64 magic;
|
||||
u64 result;
|
||||
} *raw = (struct ipcCloneSessionResponse*)r.Raw;
|
||||
|
||||
rc = raw->result;
|
||||
|
||||
if (R_SUCCEEDED(rc) && new_session_out) {
|
||||
*new_session_out = r.Handles[0];
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
///@}
|
||||
|
||||
///@name IPC domain handling
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Converts an IPC session handle into a domain.
|
||||
* @param session IPC session handle.
|
||||
* @param object_id_out Output variable in which to store the object ID.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcConvertSessionToDomain(Handle session, u32* object_id_out) {
|
||||
u32* buf = (u32*)armGetTls();
|
||||
|
||||
buf[0] = IpcCommandType_Control;
|
||||
buf[1] = 8;
|
||||
buf[4] = SFCI_MAGIC;
|
||||
buf[5] = 0;
|
||||
buf[6] = 0;
|
||||
buf[7] = 0;
|
||||
|
||||
Result rc = ipcDispatch(session);
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
IpcParsedCommand r;
|
||||
ipcParse(&r);
|
||||
|
||||
struct ipcConvertSessionToDomainResponse {
|
||||
u64 magic;
|
||||
u64 result;
|
||||
u32 object_id;
|
||||
} *raw = (struct ipcConvertSessionToDomainResponse*)r.Raw;
|
||||
|
||||
rc = raw->result;
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
*object_id_out = raw->object_id;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds an object ID to be sent through an IPC domain command structure.
|
||||
* @param cmd IPC domain command structure.
|
||||
* @param object_id Object ID to send.
|
||||
*/
|
||||
static inline void ipcSendObjectId(IpcCommand* cmd, u32 object_id) {
|
||||
cmd->ObjectIds[cmd->NumObjectIds++] = object_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Prepares the header of an IPC command structure (domain version).
|
||||
* @param cmd IPC command structure.
|
||||
* @param sizeof_raw Size in bytes of the raw data structure to embed inside the IPC request
|
||||
* @param object_id Domain object ID.
|
||||
* @return Pointer to the raw embedded data structure in the request, ready to be filled out.
|
||||
*/
|
||||
static inline void* ipcPrepareHeaderForDomain(IpcCommand* cmd, size_t sizeof_raw, u32 object_id) {
|
||||
void* raw = ipcPrepareHeader(cmd, sizeof_raw + sizeof(DomainMessageHeader) + cmd->NumObjectIds*sizeof(u32));
|
||||
DomainMessageHeader* hdr = (DomainMessageHeader*) raw;
|
||||
u32 *object_ids = (u32*)(((uintptr_t) raw) + sizeof(DomainMessageHeader) + sizeof_raw);
|
||||
|
||||
hdr->Type = DomainMessageType_SendMessage;
|
||||
hdr->NumObjectIds = (u8)cmd->NumObjectIds;
|
||||
hdr->Length = sizeof_raw;
|
||||
hdr->ThisObjectId = object_id;
|
||||
hdr->Pad[0] = hdr->Pad[1] = 0;
|
||||
|
||||
for(size_t i = 0; i < cmd->NumObjectIds; i++)
|
||||
object_ids[i] = cmd->ObjectIds[i];
|
||||
return (void*)(((uintptr_t) raw) + sizeof(DomainMessageHeader));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Parse an IPC command request into an IPC parsed command structure (domain version).
|
||||
* @param r IPC parsed command structure to fill in.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcParseDomainRequest(IpcParsedCommand* r) {
|
||||
Result rc = ipcParse(r);
|
||||
DomainMessageHeader *hdr;
|
||||
u32 *object_ids;
|
||||
if(R_FAILED(rc))
|
||||
return rc;
|
||||
|
||||
hdr = (DomainMessageHeader*) r->Raw;
|
||||
object_ids = (u32*)(((uintptr_t) hdr) + sizeof(DomainMessageHeader) + hdr->Length);
|
||||
r->Raw = (void*)(((uintptr_t) r->Raw) + sizeof(DomainMessageHeader));
|
||||
|
||||
r->IsDomainRequest = true;
|
||||
r->InMessageType = (DomainMessageType)(hdr->Type);
|
||||
switch (r->InMessageType) {
|
||||
case DomainMessageType_SendMessage:
|
||||
case DomainMessageType_Close:
|
||||
break;
|
||||
default:
|
||||
return MAKERESULT(Module_Libnx, LibnxError_DomainMessageUnknownType);
|
||||
}
|
||||
|
||||
r->InThisObjectId = hdr->ThisObjectId;
|
||||
r->InNumObjectIds = hdr->NumObjectIds > 8 ? 8 : hdr->NumObjectIds;
|
||||
if ((uintptr_t)object_ids + sizeof(u32) * r->InNumObjectIds - (uintptr_t)armGetTls() >= 0x100) {
|
||||
return MAKERESULT(Module_Libnx, LibnxError_DomainMessageTooManyObjectIds);
|
||||
}
|
||||
for(size_t i = 0; i < r->InNumObjectIds; i++)
|
||||
r->InObjectIds[i] = object_ids[i];
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Parse an IPC command response into an IPC parsed command structure (domain version).
|
||||
* @param r IPC parsed command structure to fill in.
|
||||
* @param sizeof_raw Size in bytes of the raw data structure.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcParseDomainResponse(IpcParsedCommand* r, size_t sizeof_raw) {
|
||||
Result rc = ipcParse(r);
|
||||
DomainResponseHeader *hdr;
|
||||
u32 *object_ids;
|
||||
if(R_FAILED(rc))
|
||||
return rc;
|
||||
|
||||
hdr = (DomainResponseHeader*) r->Raw;
|
||||
r->Raw = (void*)(((uintptr_t) r->Raw) + sizeof(DomainResponseHeader));
|
||||
object_ids = (u32*)(((uintptr_t) r->Raw) + sizeof_raw);//Official sw doesn't align this.
|
||||
|
||||
r->IsDomainResponse = true;
|
||||
|
||||
r->OutNumObjectIds = hdr->NumObjectIds > 8 ? 8 : hdr->NumObjectIds;
|
||||
if ((uintptr_t)object_ids + sizeof(u32) * r->OutNumObjectIds - (uintptr_t)armGetTls() >= 0x100) {
|
||||
return MAKERESULT(Module_Libnx, LibnxError_DomainMessageTooManyObjectIds);
|
||||
}
|
||||
for(size_t i = 0; i < r->OutNumObjectIds; i++)
|
||||
r->OutObjectIds[i] = object_ids[i];
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Closes a domain object by ID.
|
||||
* @param session IPC session handle.
|
||||
* @param object_id ID of the object to close.
|
||||
* @return Result code.
|
||||
*/
|
||||
static inline Result ipcCloseObjectById(Handle session, u32 object_id) {
|
||||
IpcCommand c;
|
||||
DomainMessageHeader* hdr;
|
||||
|
||||
ipcInitialize(&c);
|
||||
hdr = (DomainMessageHeader*)ipcPrepareHeader(&c, sizeof(DomainMessageHeader));
|
||||
|
||||
hdr->Type = DomainMessageType_Close;
|
||||
hdr->NumObjectIds = 0;
|
||||
hdr->Length = 0;
|
||||
hdr->ThisObjectId = object_id;
|
||||
hdr->Pad[0] = hdr->Pad[1] = 0;
|
||||
|
||||
return ipcDispatch(session); // this command has no associated response
|
||||
}
|
||||
|
||||
///@}
|
@ -6,11 +6,12 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "virtmem.h"
|
||||
|
||||
/// JIT implementation type.
|
||||
typedef enum {
|
||||
JitType_CodeMemory, ///< JIT supported using svcSetProcessMemoryPermission
|
||||
JitType_JitMemory, ///< JIT supported using 4.0.0+ code-memory syscalls (this isn't usable on 5.0.0+ so JitType_CodeMemory is used instead).
|
||||
JitType_SetProcessMemoryPermission, ///< JIT supported using svcSetProcessMemoryPermission
|
||||
JitType_CodeMemory, ///< JIT supported using [4.0.0+] CodeMemory syscalls
|
||||
} JitType;
|
||||
|
||||
/// JIT buffer object.
|
||||
@ -21,7 +22,10 @@ typedef struct {
|
||||
void* rx_addr;
|
||||
void* rw_addr;
|
||||
bool is_executable;
|
||||
Handle handle;
|
||||
union {
|
||||
Handle handle;
|
||||
VirtmemReservation* rv;
|
||||
};
|
||||
} Jit;
|
||||
|
||||
/**
|
||||
@ -58,11 +62,15 @@ Result jitClose(Jit* j);
|
||||
* @param j JIT buffer.
|
||||
* @return Pointer to alias of the JIT buffer that can be written to.
|
||||
*/
|
||||
void* jitGetRwAddr(Jit* j);
|
||||
NX_CONSTEXPR void* jitGetRwAddr(Jit* j) {
|
||||
return j->rw_addr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the address of the executable memory alias of a JIT buffer.
|
||||
* @param j JIT buffer.
|
||||
* @return Pointer to alias of the JIT buffer that can be executed.
|
||||
*/
|
||||
void* jitGetRxAddr(Jit* j);
|
||||
NX_CONSTEXPR void* jitGetRxAddr(Jit* j) {
|
||||
return j->rx_addr;
|
||||
}
|
||||
|
54
nx/include/switch/kernel/levent.h
Normal file
54
nx/include/switch/kernel/levent.h
Normal file
@ -0,0 +1,54 @@
|
||||
/**
|
||||
* @file levent.h
|
||||
* @brief Light event synchronization primitive [4.0.0+]
|
||||
* @author fincs
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../result.h"
|
||||
#include "svc.h"
|
||||
|
||||
/// User-mode light event structure.
|
||||
typedef struct LEvent {
|
||||
u32 counter;
|
||||
bool autoclear;
|
||||
} LEvent;
|
||||
|
||||
/**
|
||||
* @brief Initializes a user-mode light event.
|
||||
* @param[out] le Pointer to \ref LEvent structure.
|
||||
* @param[in] signaled Whether the event starts off in signaled state.
|
||||
* @param[in] autoclear Autoclear flag.
|
||||
*/
|
||||
NX_CONSTEXPR void leventInit(LEvent* le, bool signaled, bool autoclear) {
|
||||
le->counter = signaled ? 2 : 0;
|
||||
le->autoclear = autoclear;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Waits on a user-mode light event.
|
||||
* @param[in] le Pointer to \ref LEvent structure.
|
||||
* @param[in] timeout_ns Timeout in nanoseconds (pass UINT64_MAX to wait indefinitely).
|
||||
* @return true if wait succeeded, false if wait timed out.
|
||||
*/
|
||||
bool leventWait(LEvent* le, u64 timeout_ns);
|
||||
|
||||
/**
|
||||
* @brief Polls a user-mode light event.
|
||||
* @param[in] le Pointer to \ref LEvent structure.
|
||||
* @return true if event is signaled, false otherwise.
|
||||
*/
|
||||
bool leventTryWait(LEvent* le);
|
||||
|
||||
/**
|
||||
* @brief Signals a user-mode light event.
|
||||
* @param[in] le Pointer to \ref LEvent structure.
|
||||
*/
|
||||
void leventSignal(LEvent* le);
|
||||
|
||||
/**
|
||||
* @brief Clears a user-mode light event.
|
||||
* @param[in] le Pointer to \ref LEvent structure.
|
||||
*/
|
||||
void leventClear(LEvent* le);
|
@ -20,7 +20,7 @@ typedef _LOCK_RECURSIVE_T RMutex;
|
||||
*/
|
||||
static inline void mutexInit(Mutex* m)
|
||||
{
|
||||
*m = 0;
|
||||
*m = INVALID_HANDLE;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -42,6 +42,13 @@ bool mutexTryLock(Mutex* m);
|
||||
*/
|
||||
void mutexUnlock(Mutex* m);
|
||||
|
||||
/**
|
||||
* @brief Gets whether the current thread owns the mutex.
|
||||
* @param m Mutex object.
|
||||
* @return 1 if the mutex is locked by the current thread, and 0 otherwise.
|
||||
*/
|
||||
bool mutexIsLockedByCurrentThread(const Mutex* m);
|
||||
|
||||
/**
|
||||
* @brief Initializes a recursive mutex.
|
||||
* @param m Recursive mutex object.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file rwlock.h
|
||||
* @brief Read/write lock synchronization primitive.
|
||||
* @author plutoo
|
||||
* @author plutoo, SciresM
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
@ -11,10 +11,13 @@
|
||||
/// Read/write lock structure.
|
||||
typedef struct {
|
||||
Mutex mutex;
|
||||
CondVar condvar_readers;
|
||||
CondVar condvar_writer;
|
||||
u32 readers : 31;
|
||||
bool writer : 1;
|
||||
CondVar condvar_reader_wait;
|
||||
CondVar condvar_writer_wait;
|
||||
u32 read_lock_count;
|
||||
u32 read_waiter_count;
|
||||
u32 write_lock_count;
|
||||
u32 write_waiter_count;
|
||||
u32 write_owner_tag;
|
||||
} RwLock;
|
||||
|
||||
/**
|
||||
@ -29,6 +32,13 @@ void rwlockInit(RwLock* r);
|
||||
*/
|
||||
void rwlockReadLock(RwLock* r);
|
||||
|
||||
/**
|
||||
* @brief Attempts to lock the read/write lock for reading without waiting.
|
||||
* @param r Read/write lock object.
|
||||
* @return 1 if the mutex has been acquired successfully, and 0 on contention.
|
||||
*/
|
||||
bool rwlockTryReadLock(RwLock* r);
|
||||
|
||||
/**
|
||||
* @brief Unlocks the read/write lock for reading.
|
||||
* @param r Read/write lock object.
|
||||
@ -41,8 +51,30 @@ void rwlockReadUnlock(RwLock* r);
|
||||
*/
|
||||
void rwlockWriteLock(RwLock* r);
|
||||
|
||||
/**
|
||||
* @brief Attempts to lock the read/write lock for writing without waiting.
|
||||
* @param r Read/write lock object.
|
||||
* @return 1 if the mutex has been acquired successfully, and 0 on contention.
|
||||
*/
|
||||
bool rwlockTryWriteLock(RwLock* r);
|
||||
|
||||
/**
|
||||
* @brief Unlocks the read/write lock for writing.
|
||||
* @param r Read/write lock object.
|
||||
*/
|
||||
void rwlockWriteUnlock(RwLock* r);
|
||||
|
||||
/**
|
||||
* @brief Checks if the write lock is held by the current thread.
|
||||
* @param r Read/write lock object.
|
||||
* @return 1 if the current hold holds the write lock, and 0 if it does not.
|
||||
*/
|
||||
bool rwlockIsWriteLockHeldByCurrentThread(RwLock* r);
|
||||
|
||||
/**
|
||||
* @brief Checks if the read/write lock is owned by the current thread.
|
||||
* @param r Read/write lock object.
|
||||
* @return 1 if the current hold holds the write lock or if it holds read locks acquired
|
||||
* while it held the write lock, and 0 if it does not.
|
||||
*/
|
||||
bool rwlockIsOwnedByCurrentThread(RwLock* r);
|
||||
|
@ -40,6 +40,8 @@ typedef enum {
|
||||
MemType_KernelStack=0x13, ///< Mapped in kernel during \ref svcCreateThread.
|
||||
MemType_CodeReadOnly=0x14, ///< Mapped in kernel during \ref svcControlCodeMemory.
|
||||
MemType_CodeWritable=0x15, ///< Mapped in kernel during \ref svcControlCodeMemory.
|
||||
MemType_Coverage=0x16, ///< Not available.
|
||||
MemType_Insecure=0x17, ///< Mapped in kernel during \ref svcMapInsecurePhysicalMemory.
|
||||
} MemoryType;
|
||||
|
||||
/// Memory state bitmasks.
|
||||
@ -67,10 +69,11 @@ typedef enum {
|
||||
|
||||
/// Memory attribute bitmasks.
|
||||
typedef enum {
|
||||
MemAttr_IsBorrowed=BIT(0), ///< Is borrowed memory.
|
||||
MemAttr_IsIpcMapped=BIT(1), ///< Is IPC mapped (when IpcRefCount > 0).
|
||||
MemAttr_IsDeviceMapped=BIT(2), ///< Is device mapped (when DeviceRefCount > 0).
|
||||
MemAttr_IsUncached=BIT(3), ///< Is uncached.
|
||||
MemAttr_IsBorrowed=BIT(0), ///< Is borrowed memory.
|
||||
MemAttr_IsIpcMapped=BIT(1), ///< Is IPC mapped (when IpcRefCount > 0).
|
||||
MemAttr_IsDeviceMapped=BIT(2), ///< Is device mapped (when DeviceRefCount > 0).
|
||||
MemAttr_IsUncached=BIT(3), ///< Is uncached.
|
||||
MemAttr_IsPermissionLocked=BIT(4), ///< Is permission locked.
|
||||
} MemoryAttribute;
|
||||
|
||||
/// Memory permission bitmasks.
|
||||
@ -91,15 +94,36 @@ typedef struct {
|
||||
u32 type; ///< Memory type (see lower 8 bits of \ref MemoryState).
|
||||
u32 attr; ///< Memory attributes (see \ref MemoryAttribute).
|
||||
u32 perm; ///< Memory permissions (see \ref Permission).
|
||||
u32 device_refcount; ///< Device reference count.
|
||||
u32 ipc_refcount; ///< IPC reference count.
|
||||
u32 device_refcount; ///< Device reference count.
|
||||
u32 padding; ///< Padding.
|
||||
} MemoryInfo;
|
||||
|
||||
/// Physical memory information structure.
|
||||
typedef struct {
|
||||
u64 physical_address; ///< Physical address.
|
||||
u64 virtual_address; ///< Virtual address.
|
||||
u64 size; ///< Size.
|
||||
} PhysicalMemoryInfo;
|
||||
|
||||
/// Secure monitor arguments.
|
||||
typedef struct {
|
||||
u64 X[8]; ///< Values of X0 through X7.
|
||||
} PACKED SecmonArgs;
|
||||
} NX_PACKED SecmonArgs;
|
||||
|
||||
/// Break reasons
|
||||
typedef enum {
|
||||
BreakReason_Panic = 0,
|
||||
BreakReason_Assert = 1,
|
||||
BreakReason_User = 2,
|
||||
BreakReason_PreLoadDll = 3,
|
||||
BreakReason_PostLoadDll = 4,
|
||||
BreakReason_PreUnloadDll = 5,
|
||||
BreakReason_PostUnloadDll = 6,
|
||||
BreakReason_CppException = 7,
|
||||
|
||||
BreakReason_NotificationOnlyFlag = 0x80000000,
|
||||
} BreakReason;
|
||||
|
||||
/// Code memory mapping operations
|
||||
typedef enum {
|
||||
@ -118,6 +142,12 @@ typedef enum {
|
||||
LimitableResource_Sessions=4, ///<How many sessions can a process own.
|
||||
} LimitableResource;
|
||||
|
||||
/// Thread Activity.
|
||||
typedef enum {
|
||||
ThreadActivity_Runnable = 0, ///< Thread can run.
|
||||
ThreadActivity_Paused = 1, ///< Thread is paused.
|
||||
} ThreadActivity;
|
||||
|
||||
/// Process Information.
|
||||
typedef enum {
|
||||
ProcessInfoType_ProcessState=0, ///<What state is a process in.
|
||||
@ -135,6 +165,12 @@ typedef enum {
|
||||
ProcessState_DebugSuspended=7, ///<Process execution suspended by debugger.
|
||||
} ProcessState;
|
||||
|
||||
/// Process Activity.
|
||||
typedef enum {
|
||||
ProcessActivity_Runnable = 0, ///< Process can run.
|
||||
ProcessActivity_Paused = 1, ///< Process is paused.
|
||||
} ProcessActivity;
|
||||
|
||||
/// Debug Thread Parameters.
|
||||
typedef enum {
|
||||
DebugThreadParam_ActualPriority=0,
|
||||
@ -157,20 +193,28 @@ typedef enum {
|
||||
InfoType_DebuggerAttached = 8, ///< Whether current process is being debugged.
|
||||
InfoType_ResourceLimit = 9, ///< Current process's resource limit handle.
|
||||
InfoType_IdleTickCount = 10, ///< Number of idle ticks on CPU.
|
||||
InfoType_RandomEntropy = 11, ///< 2.0.0+ Random entropy for current process.
|
||||
InfoType_AslrRegionAddress = 12, ///< 2.0.0+ Base of the process's address space.
|
||||
InfoType_AslrRegionSize = 13, ///< 2.0.0+ Size of the process's address space.
|
||||
InfoType_StackRegionAddress = 14, ///< 2.0.0+ Base of the Stack memory region.
|
||||
InfoType_StackRegionSize = 15, ///< 2.0.0+ Size of the Stack memory region.
|
||||
InfoType_SystemResourceSizeTotal = 16, ///< 3.0.0+ Total memory allocated for process memory management.
|
||||
InfoType_SystemResourceSizeUsed = 17, ///< 3.0.0+ Amount of memory currently used by process memory management.
|
||||
InfoType_TitleId = 18, ///< 3.0.0+ Title ID for the process.
|
||||
InfoType_InitialProcessIdRange = 19, ///< 4.0.0-4.1.0 Min/max initial process IDs.
|
||||
InfoType_UserExceptionContextAddress = 20, ///< 5.0.0+ Address of the process's exception context (for break).
|
||||
InfoType_TotalNonSystemMemorySize = 21, ///< 6.0.0+ Total amount of memory available for process, excluding that for process memory management.
|
||||
InfoType_UsedNonSystemMemorySize = 22, ///< 6.0.0+ Amount of memory used by process, excluding that for process memory management.
|
||||
InfoType_RandomEntropy = 11, ///< [2.0.0+] Random entropy for current process.
|
||||
InfoType_AslrRegionAddress = 12, ///< [2.0.0+] Base of the process's address space.
|
||||
InfoType_AslrRegionSize = 13, ///< [2.0.0+] Size of the process's address space.
|
||||
InfoType_StackRegionAddress = 14, ///< [2.0.0+] Base of the Stack memory region.
|
||||
InfoType_StackRegionSize = 15, ///< [2.0.0+] Size of the Stack memory region.
|
||||
InfoType_SystemResourceSizeTotal = 16, ///< [3.0.0+] Total memory allocated for process memory management.
|
||||
InfoType_SystemResourceSizeUsed = 17, ///< [3.0.0+] Amount of memory currently used by process memory management.
|
||||
InfoType_ProgramId = 18, ///< [3.0.0+] Program ID for the process.
|
||||
InfoType_InitialProcessIdRange = 19, ///< [4.0.0-4.1.0] Min/max initial process IDs.
|
||||
InfoType_UserExceptionContextAddress = 20, ///< [5.0.0+] Address of the process's exception context (for break).
|
||||
InfoType_TotalNonSystemMemorySize = 21, ///< [6.0.0+] Total amount of memory available for process, excluding that for process memory management.
|
||||
InfoType_UsedNonSystemMemorySize = 22, ///< [6.0.0+] Amount of memory used by process, excluding that for process memory management.
|
||||
InfoType_IsApplication = 23, ///< [9.0.0+] Whether the specified process is an Application.
|
||||
InfoType_FreeThreadCount = 24, ///< [11.0.0+] The number of free threads available to the process's resource limit.
|
||||
InfoType_ThreadTickCount = 25, ///< [13.0.0+] Number of ticks spent on thread.
|
||||
InfoType_IsSvcPermitted = 26, ///< [14.0.0+] Does process have access to SVC (only usable with \ref svcSynchronizePreemptionState at present).
|
||||
InfoType_IoRegionHint = 27, ///< [16.0.0+] Low bits of the physical address for a KIoRegion.
|
||||
InfoType_AliasRegionExtraSize = 28, ///< [18.0.0+] Extra size added to the reserved region.
|
||||
|
||||
InfoType_ThreadTickCount = 0xF0000002, ///< Number of ticks spent on thread.
|
||||
InfoType_TransferMemoryHint = 34, ///< [19.0.0+] Low bits of the process address for a KTransferMemory.
|
||||
|
||||
InfoType_ThreadTickCountDeprecated = 0xF0000002, ///< [1.0.0-12.1.0] Number of ticks spent on thread.
|
||||
} InfoType;
|
||||
|
||||
/// GetSystemInfo IDs.
|
||||
@ -187,7 +231,7 @@ typedef enum {
|
||||
TickCountInfo_Core2 = 2, ///< Tick count on core 2.
|
||||
TickCountInfo_Core3 = 3, ///< Tick count on core 3.
|
||||
|
||||
TickCountInfo_Total = U64_MAX, ///< Tick count on all cores.
|
||||
TickCountInfo_Total = UINT64_MAX, ///< Tick count on all cores.
|
||||
} TickCountInfo;
|
||||
|
||||
/// GetInfo InitialProcessIdRange Sub IDs.
|
||||
@ -198,11 +242,53 @@ typedef enum {
|
||||
|
||||
/// GetSystemInfo PhysicalMemory Sub IDs.
|
||||
typedef enum {
|
||||
PhysicalMemoryInfo_Application = 0, ///< Memory allocated for application usage.
|
||||
PhysicalMemoryInfo_Applet = 1, ///< Memory allocated for applet usage.
|
||||
PhysicalMemoryInfo_System = 2, ///< Memory allocated for system usage.
|
||||
PhysicalMemoryInfo_SystemUnsafe = 3, ///< Memory allocated for unsafe system usage (accessible to devices).
|
||||
} PhysicalMemoryInfo;
|
||||
PhysicalMemorySystemInfo_Application = 0, ///< Memory allocated for application usage.
|
||||
PhysicalMemorySystemInfo_Applet = 1, ///< Memory allocated for applet usage.
|
||||
PhysicalMemorySystemInfo_System = 2, ///< Memory allocated for system usage.
|
||||
PhysicalMemorySystemInfo_SystemUnsafe = 3, ///< Memory allocated for unsafe system usage (accessible to devices).
|
||||
} PhysicalMemorySystemInfo;
|
||||
|
||||
/// SleepThread yield types.
|
||||
typedef enum {
|
||||
YieldType_WithoutCoreMigration = 0l, ///< Yields to another thread on the same core.
|
||||
YieldType_WithCoreMigration = -1l, ///< Yields to another thread (possibly on a different core).
|
||||
YieldType_ToAnyThread = -2l, ///< Yields and performs forced load-balancing.
|
||||
} YieldType;
|
||||
|
||||
/// SignalToAddress behaviors.
|
||||
typedef enum {
|
||||
SignalType_Signal = 0, ///< Signals the address.
|
||||
SignalType_SignalAndIncrementIfEqual = 1, ///< Signals the address and increments its value if equal to argument.
|
||||
SignalType_SignalAndModifyBasedOnWaitingThreadCountIfEqual = 2, ///< Signals the address and updates its value if equal to argument.
|
||||
} SignalType;
|
||||
|
||||
/// WaitForAddress behaviors.
|
||||
typedef enum {
|
||||
ArbitrationType_WaitIfLessThan = 0, ///< Wait if the 32-bit value is less than argument.
|
||||
ArbitrationType_DecrementAndWaitIfLessThan = 1, ///< Decrement the 32-bit value and wait if it is less than argument.
|
||||
ArbitrationType_WaitIfEqual = 2, ///< Wait if the 32-bit value is equal to argument.
|
||||
ArbitrationType_WaitIfEqual64 = 3, ///< [19.0.0+] Wait if the 64-bit value is equal to argument.
|
||||
} ArbitrationType;
|
||||
|
||||
/// Context of a scheduled thread.
|
||||
typedef struct {
|
||||
u64 fp; ///< Frame Pointer for the thread.
|
||||
u64 sp; ///< Stack Pointer for the thread.
|
||||
u64 lr; ///< Link Register for the thread.
|
||||
u64 pc; ///< Program Counter for the thread.
|
||||
} LastThreadContext;
|
||||
|
||||
/// Memory mapping type.
|
||||
typedef enum {
|
||||
MemoryMapping_IoRegister = 0, ///< Mapping IO registers.
|
||||
MemoryMapping_Uncached = 1, ///< Mapping normal memory without cache.
|
||||
MemoryMapping_Memory = 2, ///< Mapping normal memory.
|
||||
} MemoryMapping;
|
||||
|
||||
/// Io Pools.
|
||||
typedef enum {
|
||||
IoPoolType_PcieA2 = 0, ///< Physical address range 0x12000000-0x1FFFFFFF
|
||||
} IoPoolType;
|
||||
|
||||
///@name Memory management
|
||||
///@{
|
||||
@ -210,9 +296,9 @@ typedef enum {
|
||||
/**
|
||||
* @brief Set the process heap to a given size. It can both extend and shrink the heap.
|
||||
* @param[out] out_addr Variable to which write the address of the heap (which is randomized and fixed by the kernel)
|
||||
* @param[in] size Size of the heap, must be a multiple of 0x2000000 and [2.0.0+] less than 0x18000000.
|
||||
* @param[in] size Size of the heap, must be a multiple of 0x200000 and [2.0.0+] less than 0x18000000.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x00.
|
||||
* @note Syscall number 0x01.
|
||||
*/
|
||||
Result svcSetHeapSize(void** out_addr, u64 size);
|
||||
|
||||
@ -224,7 +310,7 @@ Result svcSetHeapSize(void** out_addr, u64 size);
|
||||
* @return Result code.
|
||||
* @remark Perm_X is not allowed. Setting write-only is not allowed either (Perm_W).
|
||||
* This can be used to move back and forth between Perm_None, Perm_R and Perm_Rw.
|
||||
* @note Syscall number 0x01.
|
||||
* @note Syscall number 0x02.
|
||||
*/
|
||||
Result svcSetMemoryPermission(void* addr, u64 size, u32 perm);
|
||||
|
||||
@ -236,7 +322,7 @@ Result svcSetMemoryPermission(void* addr, u64 size, u32 perm);
|
||||
* @param[in] val1 State1
|
||||
* @return Result code.
|
||||
* @remark See <a href="https://switchbrew.org/wiki/SVC#svcSetMemoryAttribute">switchbrew.org Wiki</a> for more details.
|
||||
* @note Syscall number 0x02.
|
||||
* @note Syscall number 0x03.
|
||||
*/
|
||||
Result svcSetMemoryAttribute(void* addr, u64 size, u32 val0, u32 val1);
|
||||
|
||||
@ -281,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.
|
||||
@ -301,11 +387,11 @@ Result svcStartThread(Handle handle);
|
||||
* @brief Exits the current thread.
|
||||
* @note Syscall number 0x0A.
|
||||
*/
|
||||
void NORETURN svcExitThread(void);
|
||||
void NX_NORETURN svcExitThread(void);
|
||||
|
||||
/**
|
||||
* @brief Sleeps the current thread for the specified amount of time.
|
||||
* @param[in] nano Number of nanoseconds to sleep, or 0, -1, -2 for yield.
|
||||
* @param[in] nano Number of nanoseconds to sleep, or \ref YieldType for yield.
|
||||
* @note Syscall number 0x0B.
|
||||
*/
|
||||
void svcSleepThread(s64 nano);
|
||||
@ -315,7 +401,7 @@ void svcSleepThread(s64 nano);
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x0C.
|
||||
*/
|
||||
Result svcGetThreadPriority(u32* priority, Handle handle);
|
||||
Result svcGetThreadPriority(s32* priority, Handle handle);
|
||||
|
||||
/**
|
||||
* @brief Sets a thread's priority.
|
||||
@ -329,7 +415,7 @@ Result svcSetThreadPriority(Handle handle, u32 priority);
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x0E.
|
||||
*/
|
||||
Result svcGetThreadCoreMask(s32* preferred_core, u32* affinity_mask, Handle handle);
|
||||
Result svcGetThreadCoreMask(s32* preferred_core, u64* affinity_mask, Handle handle);
|
||||
|
||||
/**
|
||||
* @brief Sets a thread's core mask.
|
||||
@ -471,10 +557,9 @@ Result svcWaitProcessWideKeyAtomic(u32* key, u32* tag_location, u32 self_tag, u6
|
||||
|
||||
/**
|
||||
* @brief Performs a condition variable wake-up operation in userspace.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x1D.
|
||||
*/
|
||||
Result svcSignalProcessWideKey(u32* key, s32 num);
|
||||
void svcSignalProcessWideKey(u32* key, s32 num);
|
||||
|
||||
///@}
|
||||
|
||||
@ -500,6 +585,13 @@ u64 svcGetSystemTick(void);
|
||||
*/
|
||||
Result svcConnectToNamedPort(Handle* session, const char* name);
|
||||
|
||||
/**
|
||||
* @brief Sends a light IPC synchronization request to a session.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x20.
|
||||
*/
|
||||
Result svcSendSyncRequestLight(Handle session);
|
||||
|
||||
/**
|
||||
* @brief Sends an IPC synchronization request to a session.
|
||||
* @return Result code.
|
||||
@ -548,14 +640,14 @@ Result svcGetThreadId(u64 *threadID, Handle handle);
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Breaks execution. Panic.
|
||||
* @param[in] breakReason Break reason.
|
||||
* @param[in] inval1 First break parameter.
|
||||
* @param[in] inval2 Second break parameter.
|
||||
* @brief Breaks execution.
|
||||
* @param[in] breakReason Break reason (see \ref BreakReason).
|
||||
* @param[in] address Address of the buffer to pass to the debugger.
|
||||
* @param[in] size Size of the buffer to pass to the debugger.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x26.
|
||||
*/
|
||||
Result svcBreak(u32 breakReason, u64 inval1, u64 inval2);
|
||||
Result svcBreak(u32 breakReason, uintptr_t address, uintptr_t size);
|
||||
|
||||
///@}
|
||||
|
||||
@ -581,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.
|
||||
@ -593,7 +685,29 @@ void NORETURN svcReturnFromException(Result res);
|
||||
* @remark The full list of property IDs can be found on the <a href="https://switchbrew.org/wiki/SVC#svcGetInfo">switchbrew.org wiki</a>.
|
||||
* @note Syscall number 0x29.
|
||||
*/
|
||||
Result svcGetInfo(u64* out, u64 id0, Handle handle, u64 id1);
|
||||
Result svcGetInfo(u64* out, u32 id0, Handle handle, u64 id1);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Cache Management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Flushes the entire data cache (by set/way).
|
||||
* @note Syscall number 0x2A.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
* @warning This syscall is dangerous, and should not be used.
|
||||
*/
|
||||
void svcFlushEntireDataCache(void);
|
||||
|
||||
/**
|
||||
* @brief Flushes data cache for a virtual address range.
|
||||
* @param[in] address Address of region to flush.
|
||||
* @param[in] size Size of region to flush.
|
||||
* @remark armDCacheFlush should be used instead of this syscall whenever possible.
|
||||
* @note Syscall number 0x2B.
|
||||
*/
|
||||
Result svcFlushDataCache(void *address, size_t size);
|
||||
|
||||
///@}
|
||||
|
||||
@ -604,7 +718,6 @@ Result svcGetInfo(u64* out, u64 id0, Handle handle, u64 id1);
|
||||
* @brief Maps new heap memory at the desired address. [3.0.0+]
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x2C.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcMapPhysicalMemory(void *address, u64 size);
|
||||
|
||||
@ -612,12 +725,38 @@ Result svcMapPhysicalMemory(void *address, u64 size);
|
||||
* @brief Undoes the effects of \ref svcMapPhysicalMemory. [3.0.0+]
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x2D.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcUnmapPhysicalMemory(void *address, u64 size);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Process and thread management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Gets information about a thread that will be scheduled in the future. [5.0.0+]
|
||||
* @param[out] out_context Output \ref LastThreadContext for the thread that will be scheduled.
|
||||
* @param[out] out_thread_id Output thread id for the thread that will be scheduled.
|
||||
* @param[in] debug Debug handle.
|
||||
* @param[in] ns Nanoseconds in the future to get scheduled thread at.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x2E.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetDebugFutureThreadInfo(LastThreadContext *out_context, u64 *out_thread_id, Handle debug, s64 ns);
|
||||
|
||||
/**
|
||||
* @brief Gets information about the previously-scheduled thread.
|
||||
* @param[out] out_context Output \ref LastThreadContext for the previously scheduled thread.
|
||||
* @param[out] out_tls_address Output tls address for the previously scheduled thread.
|
||||
* @param[out] out_flags Output flags for the previously scheduled thread.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x2F.
|
||||
*/
|
||||
Result svcGetLastThreadInfo(LastThreadContext *out_context, u64 *out_tls_address, u32 *out_flags);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Resource Limit Management
|
||||
///@{
|
||||
|
||||
@ -627,7 +766,7 @@ Result svcUnmapPhysicalMemory(void *address, u64 size);
|
||||
* @note Syscall number 0x30.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetResourceLimitLimitValue(u64 *out, Handle reslimit_h, LimitableResource which);
|
||||
Result svcGetResourceLimitLimitValue(s64 *out, Handle reslimit_h, LimitableResource which);
|
||||
|
||||
/**
|
||||
* @brief Gets the maximum value a LimitableResource can have, for a Resource Limit handle.
|
||||
@ -635,7 +774,7 @@ Result svcGetResourceLimitLimitValue(u64 *out, Handle reslimit_h, LimitableResou
|
||||
* @note Syscall number 0x31.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetResourceLimitCurrentValue(u64 *out, Handle reslimit_h, LimitableResource which);
|
||||
Result svcGetResourceLimitCurrentValue(s64 *out, Handle reslimit_h, LimitableResource which);
|
||||
|
||||
///@}
|
||||
|
||||
@ -647,7 +786,7 @@ Result svcGetResourceLimitCurrentValue(u64 *out, Handle reslimit_h, LimitableRes
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x32.
|
||||
*/
|
||||
Result svcSetThreadActivity(Handle thread, bool paused);
|
||||
Result svcSetThreadActivity(Handle thread, ThreadActivity paused);
|
||||
|
||||
/**
|
||||
* @brief Dumps the registers of a thread paused by @ref svcSetThreadActivity (register groups: all).
|
||||
@ -661,6 +800,110 @@ Result svcGetThreadContext3(ThreadContext* ctx, Handle thread);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Synchronization
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Arbitrates an address depending on type and value. [4.0.0+]
|
||||
* @param[in] address Address to arbitrate.
|
||||
* @param[in] arb_type \ref ArbitrationType to use.
|
||||
* @param[in] value Value to arbitrate on.
|
||||
* @param[in] timeout Maximum time in nanoseconds to wait.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x34.
|
||||
*/
|
||||
Result svcWaitForAddress(void *address, u32 arb_type, s64 value, s64 timeout);
|
||||
|
||||
/**
|
||||
* @brief Signals (and updates) an address depending on type and value. [4.0.0+]
|
||||
* @param[in] address Address to arbitrate.
|
||||
* @param[in] signal_type \ref SignalType to use.
|
||||
* @param[in] value Value to arbitrate on.
|
||||
* @param[in] count Number of waiting threads to signal.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x35.
|
||||
*/
|
||||
Result svcSignalToAddress(void *address, u32 signal_type, s32 value, s32 count);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Miscellaneous
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Sets thread preemption state (used during abort/panic). [8.0.0+]
|
||||
* @note Syscall number 0x36.
|
||||
*/
|
||||
void svcSynchronizePreemptionState(void);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Resource Limit Management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Gets the peak value a LimitableResource has had, for a Resource Limit handle. [11.0.0+]
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x37.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetResourceLimitPeakValue(s64 *out, Handle reslimit_h, LimitableResource which);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Memory Management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Creates an IO Pool. [13.0.0+]
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x39.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcCreateIoPool(Handle *out_handle, u32 pool_type);
|
||||
|
||||
/**
|
||||
* @brief Creates an IO Region. [13.0.0+]
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x3A.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcCreateIoRegion(Handle *out_handle, Handle io_pool_h, u64 physical_address, u64 size, u32 memory_mapping, u32 perm);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Debugging
|
||||
///@{
|
||||
/**
|
||||
* @brief Causes the kernel to dump debug information. [1.0.0-3.0.2]
|
||||
* @param[in] dump_info_type Type of information to dump.
|
||||
* @param[in] arg0 Argument to the debugging operation.
|
||||
* @note Syscall number 0x3C.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
void svcDumpInfo(u32 dump_info_type, u64 arg0);
|
||||
|
||||
/**
|
||||
* @brief Performs a debugging operation on the kernel. [4.0.0+]
|
||||
* @param[in] kern_debug_type Type of debugging operation to perform.
|
||||
* @param[in] arg0 First argument to the debugging operation.
|
||||
* @param[in] arg1 Second argument to the debugging operation.
|
||||
* @param[in] arg2 Third argument to the debugging operation.
|
||||
* @note Syscall number 0x3C.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
void svcKernelDebug(u32 kern_debug_type, u64 arg0, u64 arg1, u64 arg2);
|
||||
|
||||
/**
|
||||
* @brief Performs a debugging operation on the kernel. [4.0.0+]
|
||||
* @param[in] kern_trace_state Type of tracing the kernel should perform.
|
||||
* @note Syscall number 0x3D.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
void svcChangeKernelTraceState(u32 kern_trace_state);
|
||||
|
||||
///@}
|
||||
\
|
||||
///@name Inter-process communication (IPC)
|
||||
///@{
|
||||
|
||||
@ -680,6 +923,15 @@ Result svcCreateSession(Handle *server_handle, Handle *client_handle, u32 unk0,
|
||||
*/
|
||||
Result svcAcceptSession(Handle *session_handle, Handle port_handle);
|
||||
|
||||
/**
|
||||
* @brief Performs light IPC input/output.
|
||||
* @return Result code.
|
||||
* @param[in] handle Server or port handle to act on.
|
||||
* @note Syscall number 0x42.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcReplyAndReceiveLight(Handle handle);
|
||||
|
||||
/**
|
||||
* @brief Performs IPC input/output.
|
||||
* @return Result code.
|
||||
@ -714,6 +966,22 @@ Result svcCreateEvent(Handle* server_handle, Handle* client_handle);
|
||||
///@name Memory management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Maps an IO Region. [13.0.0+]
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x46.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcMapIoRegion(Handle io_region_h, void *address, u64 size, u32 perm);
|
||||
|
||||
/**
|
||||
* @brief Undoes the effects of \ref svcMapIoRegion. [13.0.0+]
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x47.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcUnmapIoRegion(Handle io_region_h, void *address, u64 size);
|
||||
|
||||
/**
|
||||
* @brief Maps unsafe memory (usable for GPU DMA) for a system module at the desired address. [5.0.0+]
|
||||
* @return Result code.
|
||||
@ -762,6 +1030,18 @@ Result svcControlCodeMemory(Handle code_handle, CodeMapOperation op, void* dst_a
|
||||
|
||||
///@}
|
||||
|
||||
///@name Power Management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Causes the system to enter deep sleep.
|
||||
* @note Syscall number 0x4D.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
void svcSleepSystem(void);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Device memory-mapped I/O (MMIO)
|
||||
///@{
|
||||
|
||||
@ -775,6 +1055,19 @@ Result svcReadWriteRegister(u32* outVal, u64 regAddr, u32 rwMask, u32 inVal);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Process and thread management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Configures the pause/unpause status of a process.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x4F.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcSetProcessActivity(Handle process, ProcessActivity paused);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Inter-process memory sharing
|
||||
///@{
|
||||
|
||||
@ -821,15 +1114,25 @@ Result svcCreateInterruptEvent(Handle* handle, u64 irqNum, u32 flag);
|
||||
* @note Syscall number 0x54.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcQueryPhysicalAddress(u64 out[3], u64 virtaddr);
|
||||
Result svcQueryPhysicalAddress(PhysicalMemoryInfo *out, u64 virtaddr);
|
||||
|
||||
/**
|
||||
* @brief Returns a virtual address mapped to a given IO range.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x55.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
* @warning Only exists on [10.0.0+]. For older versions use \ref svcLegacyQueryIoMapping.
|
||||
*/
|
||||
Result svcQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size);
|
||||
Result svcQueryMemoryMapping(u64* virtaddr, u64* out_size, u64 physaddr, u64 size);
|
||||
|
||||
/**
|
||||
* @brief Returns a virtual address mapped to a given IO range.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x55.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
* @warning Only exists on [1.0.0-9.2.0]. For newer versions use \ref svcQueryMemoryMapping.
|
||||
*/
|
||||
Result svcLegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size);
|
||||
|
||||
///@}
|
||||
|
||||
@ -867,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.
|
||||
@ -876,7 +1179,16 @@ Result svcMapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 ma
|
||||
* @note Syscall number 0x5A.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcMapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm);
|
||||
Result svcMapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option);
|
||||
|
||||
/**
|
||||
* @brief Maps an attached device address space to an userspace address. [1.0.0-12.1.0]
|
||||
* @return Result code.
|
||||
* @remark The userspace destination address must have the \ref MemState_MapDeviceAlignedAllowed bit set.
|
||||
* @note Syscall number 0x5B.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcMapDeviceAddressSpace(u64 *out_mapped_size, Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm);
|
||||
|
||||
/**
|
||||
* @brief Unmaps an attached device address space from an userspace address.
|
||||
@ -888,6 +1200,38 @@ Result svcUnmapDeviceAddressSpace(Handle handle, Handle proc_handle, u64 map_add
|
||||
|
||||
///@}
|
||||
|
||||
///@name Cache Management
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Invalidates data cache for a virtual address range within a process.
|
||||
* @param[in] address Address of region to invalidate.
|
||||
* @param[in] size Size of region to invalidate.
|
||||
* @note Syscall number 0x5D.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcInvalidateProcessDataCache(Handle process, uintptr_t address, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Stores data cache for a virtual address range within a process.
|
||||
* @param[in] address Address of region to store.
|
||||
* @param[in] size Size of region to store.
|
||||
* @note Syscall number 0x5E.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcStoreProcessDataCache(Handle process, uintptr_t address, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Flushes data cache for a virtual address range within a process.
|
||||
* @param[in] address Address of region to flush.
|
||||
* @param[in] size Size of region to flush.
|
||||
* @note Syscall number 0x5F.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcFlushProcessDataCache(Handle process, uintptr_t address, size_t size);
|
||||
|
||||
///@}
|
||||
|
||||
///@name Debugging
|
||||
///@{
|
||||
|
||||
@ -921,14 +1265,14 @@ Result svcTerminateDebugProcess(Handle debug);
|
||||
* @note Syscall number 0x63.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetDebugEvent(u8* event_out, Handle debug);
|
||||
Result svcGetDebugEvent(void* event_out, Handle debug);
|
||||
|
||||
/**
|
||||
* @brief Continues a debugging session.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x64.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
* @warning Only exists on 3.0.0+. For older versions use \ref svcLegacyContinueDebugEvent.
|
||||
* @warning Only exists on [3.0.0+]. For older versions use \ref svcLegacyContinueDebugEvent.
|
||||
*/
|
||||
Result svcContinueDebugEvent(Handle debug, u32 flags, u64* tid_list, u32 num_tids);
|
||||
|
||||
@ -937,7 +1281,7 @@ Result svcContinueDebugEvent(Handle debug, u32 flags, u64* tid_list, u32 num_tid
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x64.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
* @warning Only exists on 1.0.0-2.3.0. For newer versions use \ref svcContinueDebugEvent.
|
||||
* @warning Only exists on [1.0.0-2.3.0]. For newer versions use \ref svcContinueDebugEvent.
|
||||
*/
|
||||
Result svcLegacyContinueDebugEvent(Handle debug, u32 flags, u64 threadID);
|
||||
|
||||
@ -978,7 +1322,7 @@ Result svcSetDebugThreadContext(Handle debug, u64 threadID, const ThreadContext*
|
||||
* @note Syscall number 0x65.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetProcessList(u32 *num_out, u64 *pids_out, u32 max_pids);
|
||||
Result svcGetProcessList(s32 *num_out, u64 *pids_out, u32 max_pids);
|
||||
|
||||
/**
|
||||
* @brief Retrieves a list of all threads for a debug handle (or zero).
|
||||
@ -986,7 +1330,7 @@ Result svcGetProcessList(u32 *num_out, u64 *pids_out, u32 max_pids);
|
||||
* @note Syscall number 0x66.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetThreadList(u32 *num_out, u64 *tids_out, u32 max_tids, Handle debug);
|
||||
Result svcGetThreadList(s32 *num_out, u64 *tids_out, u32 max_tids, Handle debug);
|
||||
|
||||
///@}
|
||||
|
||||
@ -1017,6 +1361,14 @@ Result svcReadDebugProcessMemory(void* buffer, Handle debug, u64 addr, u64 size)
|
||||
*/
|
||||
Result svcWriteDebugProcessMemory(Handle debug, const void* buffer, u64 addr, u64 size);
|
||||
|
||||
/**
|
||||
* @brief Sets one of the hardware breakpoints.
|
||||
* @return Result code.
|
||||
* @note Syscall number 0x6C.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcSetHardwareBreakPoint(u32 which, u64 flags, u64 value);
|
||||
|
||||
/**
|
||||
* @brief Gets parameters from a thread in a debugging session.
|
||||
* @return Result code.
|
||||
@ -1187,7 +1539,7 @@ Result svcTerminateProcess(Handle proc);
|
||||
* @note Syscall number 0x7C.
|
||||
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
|
||||
*/
|
||||
Result svcGetProcessInfo(u64 *out, Handle proc, ProcessInfoType which);
|
||||
Result svcGetProcessInfo(s64 *out, Handle proc, ProcessInfoType which);
|
||||
|
||||
///@}
|
||||
|
||||
@ -1218,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);
|
||||
|
||||
///@}
|
@ -11,10 +11,11 @@
|
||||
|
||||
/// Thread information structure.
|
||||
typedef struct Thread {
|
||||
Handle handle; ///< Thread handle.
|
||||
void* stack_mem; ///< Pointer to stack memory.
|
||||
void* stack_mirror; ///< Pointer to stack memory mirror.
|
||||
size_t stack_sz; ///< Stack size.
|
||||
Handle handle; ///< Thread handle.
|
||||
bool owns_stack_mem; ///< Whether the stack memory is automatically allocated.
|
||||
void* stack_mem; ///< Pointer to stack memory.
|
||||
void* stack_mirror; ///< Pointer to stack memory mirror.
|
||||
size_t stack_sz; ///< Stack size.
|
||||
void** tls_array;
|
||||
struct Thread* next;
|
||||
struct Thread** prev_next;
|
||||
@ -31,14 +32,15 @@ static inline Waiter waiterForThread(Thread* t)
|
||||
* @param t Thread information structure which will be filled in.
|
||||
* @param entry Entrypoint of the thread.
|
||||
* @param arg Argument to pass to the entrypoint.
|
||||
* @param stack_sz Stack size (rounded up to page alignment).
|
||||
* @param stack_mem Memory to use as backing for stack/tls/reent. Must be page-aligned. NULL argument means to allocate new memory.
|
||||
* @param stack_sz If stack_mem is NULL, size to use for stack. If stack_mem is non-NULL, size to use for stack + reent + tls (must be page-aligned).
|
||||
* @param prio Thread priority (0x00~0x3F); 0x2C is the usual priority of the main thread, 0x3B is a special priority on cores 0..2 that enables preemptive multithreading (0x3F on core 3).
|
||||
* @param cpuid ID of the core on which to create the thread (0~3); or -2 to use the default core for the current process.
|
||||
* @return Result code.
|
||||
*/
|
||||
Result threadCreate(
|
||||
Thread* t, ThreadFunc entry, void* arg, size_t stack_sz, int prio,
|
||||
int cpuid);
|
||||
Thread* t, ThreadFunc entry, void* arg, void *stack_mem, size_t stack_sz,
|
||||
int prio, int cpuid);
|
||||
|
||||
/**
|
||||
* @brief Starts the execution of a thread.
|
||||
@ -50,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.
|
||||
@ -89,6 +91,12 @@ Result threadResume(Thread* t);
|
||||
*/
|
||||
Result threadDumpContext(ThreadContext* ctx, Thread* t);
|
||||
|
||||
/**
|
||||
* @brief Gets a pointer to the current thread structure.
|
||||
* @return Thread information structure.
|
||||
*/
|
||||
Thread *threadGetSelf(void);
|
||||
|
||||
/**
|
||||
* @brief Gets the raw handle to the current thread.
|
||||
* @return The current thread's handle.
|
||||
|
@ -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.
|
||||
|
@ -7,30 +7,55 @@
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
|
||||
/// Address space reservation type (see \ref virtmemAddReservation)
|
||||
typedef struct VirtmemReservation VirtmemReservation;
|
||||
|
||||
/// Locks the virtual memory manager mutex.
|
||||
void virtmemLock(void);
|
||||
|
||||
/// Unlocks the virtual memory manager mutex.
|
||||
void virtmemUnlock(void);
|
||||
|
||||
/**
|
||||
* @brief Reserves a slice of general purpose address space.
|
||||
* @param size The size of the slice of address space that will be reserved (rounded up to page alignment).
|
||||
* @brief Finds a random slice of free general purpose address space.
|
||||
* @param size Desired size of the slice (rounded up to page alignment).
|
||||
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
|
||||
* @return Pointer to the slice of address space, or NULL on failure.
|
||||
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
|
||||
*/
|
||||
void* virtmemReserve(size_t size);
|
||||
void* virtmemFindAslr(size_t size, size_t guard_size);
|
||||
|
||||
/**
|
||||
* @brief Relinquishes a slice of address space reserved with virtmemReserve (currently no-op).
|
||||
* @param addr Pointer to the slice.
|
||||
* @param size Size of the slice.
|
||||
*/
|
||||
void virtmemFree(void* addr, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Reserves a slice of address space inside the stack memory mapping region (for use with svcMapMemory).
|
||||
* @param size The size of the slice of address space that will be reserved (rounded up to page alignment).
|
||||
* @brief Finds a random slice of free stack address space.
|
||||
* @param size Desired size of the slice (rounded up to page alignment).
|
||||
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
|
||||
* @return Pointer to the slice of address space, or NULL on failure.
|
||||
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
|
||||
*/
|
||||
void* virtmemReserveStack(size_t size);
|
||||
void* virtmemFindStack(size_t size, size_t guard_size);
|
||||
|
||||
/**
|
||||
* @brief Relinquishes a slice of address space reserved with virtmemReserveStack (currently no-op).
|
||||
* @param addr Pointer to the slice.
|
||||
* @param size Size of the slice.
|
||||
* @brief Finds a random slice of free code memory address space.
|
||||
* @param size Desired size of the slice (rounded up to page alignment).
|
||||
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
|
||||
* @return Pointer to the slice of address space, or NULL on failure.
|
||||
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
|
||||
*/
|
||||
void virtmemFreeStack(void* addr, size_t size);
|
||||
void* virtmemFindCodeMemory(size_t size, size_t guard_size);
|
||||
|
||||
/**
|
||||
* @brief Reserves a range of memory address space.
|
||||
* @param mem Pointer to the address space slice.
|
||||
* @param size Size of the slice.
|
||||
* @return Pointer to a reservation object, or NULL on failure.
|
||||
* @remark This function is intended to be used in lieu of a memory map operation when the memory won't be mapped straight away.
|
||||
* @note The virtual memory manager mutex must be held during the find-and-reserve process (see \ref virtmemLock and \ref virtmemUnlock).
|
||||
*/
|
||||
VirtmemReservation* virtmemAddReservation(void* mem, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Releases a memory address space reservation.
|
||||
* @param rv Reservation to release.
|
||||
* @note The virtual memory manager mutex must be held before calling this function (see \ref virtmemLock and \ref virtmemUnlock).
|
||||
*/
|
||||
void virtmemRemoveReservation(VirtmemReservation* rv);
|
||||
|
@ -12,40 +12,83 @@ typedef struct {
|
||||
char author[0x100];
|
||||
} NacpLanguageEntry;
|
||||
|
||||
/// ApplicationNeighborDetectionGroupConfiguration
|
||||
typedef struct {
|
||||
NacpLanguageEntry lang[16];
|
||||
u64 group_id; ///< GroupId
|
||||
u8 key[0x10];
|
||||
} NacpApplicationNeighborDetectionGroupConfiguration;
|
||||
|
||||
u8 x3000_unk[0x24];////Normally all-zero?
|
||||
u32 x3024_unk;
|
||||
u32 x3028_unk;
|
||||
u32 x302C_unk;
|
||||
u32 x3030_unk;
|
||||
u32 x3034_unk;
|
||||
u64 titleID0;
|
||||
/// NeighborDetectionClientConfiguration
|
||||
typedef struct {
|
||||
NacpApplicationNeighborDetectionGroupConfiguration send_group_configuration; ///< SendGroupConfiguration
|
||||
NacpApplicationNeighborDetectionGroupConfiguration receivable_group_configurations[0x10]; ///< ReceivableGroupConfigurations
|
||||
} NacpNeighborDetectionClientConfiguration;
|
||||
|
||||
u8 x3040_unk[0x20];
|
||||
char version[0x10];
|
||||
/// ApplicationJitConfiguration
|
||||
typedef struct {
|
||||
u64 flags; ///< Flags
|
||||
u64 memory_size; ///< MemorySize
|
||||
} NacpApplicationJitConfiguration;
|
||||
|
||||
u64 titleID_DlcBase;
|
||||
u64 titleID1;
|
||||
|
||||
u32 x3080_unk;
|
||||
u32 x3084_unk;
|
||||
u32 x3088_unk;
|
||||
u8 x308C_unk[0x24];//zeros?
|
||||
|
||||
u64 titleID2;
|
||||
u64 titleIDs[7];//"Array of application titleIDs, normally the same as the above app-titleIDs. Only set for game-updates?"
|
||||
|
||||
u32 x30F0_unk;
|
||||
u32 x30F4_unk;
|
||||
|
||||
u64 titleID3;//"Application titleID. Only set for game-updates?"
|
||||
|
||||
char bcatPassphrase[0x40];
|
||||
u8 x3140_unk[0xEC0];//Normally all-zero?
|
||||
/// ns ApplicationControlProperty
|
||||
typedef struct {
|
||||
NacpLanguageEntry lang[16]; ///< \ref NacpLanguageEntry
|
||||
u8 isbn[0x25]; ///< Isbn
|
||||
u8 startup_user_account; ///< StartupUserAccount
|
||||
u8 user_account_switch_lock; ///< UserAccountSwitchLock
|
||||
u8 add_on_content_registration_type; ///< AddOnContentRegistrationType
|
||||
u32 attribute_flag; ///< AttributeFlag
|
||||
u32 supported_language_flag; ///< SupportedLanguageFlag
|
||||
u32 parental_control_flag; ///< ParentalControlFlag
|
||||
u8 screenshot; ///< Screenshot
|
||||
u8 video_capture; ///< VideoCapture
|
||||
u8 data_loss_confirmation; ///< DataLossConfirmation
|
||||
u8 play_log_policy; ///< PlayLogPolicy
|
||||
u64 presence_group_id; ///< PresenceGroupId
|
||||
s8 rating_age[0x20]; ///< RatingAge
|
||||
char display_version[0x10]; ///< DisplayVersion
|
||||
u64 add_on_content_base_id; ///< AddOnContentBaseId
|
||||
u64 save_data_owner_id; ///< SaveDataOwnerId
|
||||
u64 user_account_save_data_size; ///< UserAccountSaveDataSize
|
||||
u64 user_account_save_data_journal_size; ///< UserAccountSaveDataJournalSize
|
||||
u64 device_save_data_size; ///< DeviceSaveDataSize
|
||||
u64 device_save_data_journal_size; ///< DeviceSaveDataJournalSize
|
||||
u64 bcat_delivery_cache_storage_size; ///< BcatDeliveryCacheStorageSize
|
||||
u64 application_error_code_category; ///< ApplicationErrorCodeCategory
|
||||
u64 local_communication_id[0x8]; ///< LocalCommunicationId
|
||||
u8 logo_type; ///< LogoType
|
||||
u8 logo_handling; ///< LogoHandling
|
||||
u8 runtime_add_on_content_install; ///< RuntimeAddOnContentInstall
|
||||
u8 runtime_parameter_delivery; ///< RuntimeParameterDelivery
|
||||
u8 reserved_x30f4[0x2]; ///< Reserved
|
||||
u8 crash_report; ///< CrashReport
|
||||
u8 hdcp; ///< Hdcp
|
||||
u64 pseudo_device_id_seed; ///< SeedForPseudoDeviceId
|
||||
char bcat_passphrase[0x41]; ///< BcatPassphrase
|
||||
u8 startup_user_account_option; ///< StartupUserAccountOption
|
||||
u8 reserved_for_user_account_save_data_operation[0x6]; ///< ReservedForUserAccountSaveDataOperation
|
||||
u64 user_account_save_data_size_max; ///< UserAccountSaveDataSizeMax
|
||||
u64 user_account_save_data_journal_size_max; ///< UserAccountSaveDataJournalSizeMax
|
||||
u64 device_save_data_size_max; ///< DeviceSaveDataSizeMax
|
||||
u64 device_save_data_journal_size_max; ///< DeviceSaveDataJournalSizeMax
|
||||
u64 temporary_storage_size; ///< TemporaryStorageSize
|
||||
u64 cache_storage_size; ///< CacheStorageSize
|
||||
u64 cache_storage_journal_size; ///< CacheStorageJournalSize
|
||||
u64 cache_storage_data_and_journal_size_max; ///< CacheStorageDataAndJournalSizeMax
|
||||
u16 cache_storage_index_max; ///< CacheStorageIndexMax
|
||||
u8 reserved_x318a[0x6]; ///< Reserved
|
||||
u64 play_log_queryable_application_id[0x10]; ///< PlayLogQueryableApplicationId
|
||||
u8 play_log_query_capability; ///< PlayLogQueryCapability
|
||||
u8 repair_flag; ///< RepairFlag
|
||||
u8 program_index; ///< ProgramIndex
|
||||
u8 required_network_service_license_on_launch; ///< RequiredNetworkServiceLicenseOnLaunchFlag
|
||||
u32 reserved_x3214; ///< Reserved
|
||||
NacpNeighborDetectionClientConfiguration neighbor_detection_client_configuration; ///< NeighborDetectionClientConfiguration
|
||||
NacpApplicationJitConfiguration jit_configuration; ///< JitConfiguration
|
||||
u8 reserved_x33c0[0xc40]; ///< Reserved
|
||||
} NacpStruct;
|
||||
|
||||
/// Get the NacpLanguageEntry from the input nacp corresponding to the current system language (this may fallback to other languages when needed). Output langentry is NULL if none found / content of entry is empty.
|
||||
/// If you're using ns you may want to use \ref nsGetApplicationDesiredLanguage instead.
|
||||
Result nacpGetLanguageEntry(NacpStruct* nacp, NacpLanguageEntry** langentry);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -18,13 +18,14 @@ typedef struct NvGpuChannel
|
||||
u32 num_entries;
|
||||
} NvGpuChannel;
|
||||
|
||||
Result nvGpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as);
|
||||
Result nvGpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as, NvChannelPriority prio);
|
||||
void nvGpuChannelClose(NvGpuChannel* c);
|
||||
|
||||
Result nvGpuChannelZcullBind(NvGpuChannel* c, iova_t iova);
|
||||
Result nvGpuChannelAppendEntry(NvGpuChannel* c, iova_t start, size_t num_cmds, u32 flags, u32 flush_threshold);
|
||||
Result nvGpuChannelKickoff(NvGpuChannel* c);
|
||||
Result nvGpuChannelGetErrorNotification(NvGpuChannel* c, NvError* error);
|
||||
Result nvGpuChannelGetErrorNotification(NvGpuChannel* c, NvNotification* notif);
|
||||
Result nvGpuChannelGetErrorInfo(NvGpuChannel* c, NvError* error);
|
||||
|
||||
static inline u32 nvGpuChannelGetSyncpointId(NvGpuChannel* c)
|
||||
{
|
||||
|
@ -117,6 +117,11 @@ typedef struct {
|
||||
u32 mask;
|
||||
} nvioctl_zbc_slot_mask;
|
||||
|
||||
typedef struct {
|
||||
u64 timestamp;
|
||||
u64 reserved;
|
||||
} nvioctl_gpu_time;
|
||||
|
||||
typedef struct {
|
||||
u32 id;
|
||||
u32 value;
|
||||
@ -129,6 +134,41 @@ typedef struct {
|
||||
};
|
||||
} nvioctl_gpfifo_entry;
|
||||
|
||||
typedef struct {
|
||||
u32 mem;
|
||||
u32 offset;
|
||||
u32 words;
|
||||
} nvioctl_cmdbuf;
|
||||
|
||||
typedef struct {
|
||||
u32 cmdbuf_mem;
|
||||
u32 cmdbuf_offset;
|
||||
u32 target;
|
||||
u32 target_offset;
|
||||
} nvioctl_reloc;
|
||||
|
||||
typedef struct {
|
||||
u32 shift;
|
||||
} nvioctl_reloc_shift;
|
||||
|
||||
typedef struct {
|
||||
u32 syncpt_id;
|
||||
u32 syncpt_incrs;
|
||||
u32 waitbase_id; // Always -1
|
||||
u32 next; //< Next valid incr index, or -1
|
||||
u32 prev; //< Previous valid incr index, or -1
|
||||
} nvioctl_syncpt_incr;
|
||||
|
||||
typedef struct {
|
||||
u32 handle;
|
||||
u32 iova;
|
||||
} nvioctl_command_buffer_map;
|
||||
|
||||
typedef struct {
|
||||
u32 rate;
|
||||
u32 moduleid;
|
||||
} nvioctl_clk_rate;
|
||||
|
||||
#define NVGPU_ZBC_TYPE_INVALID 0
|
||||
#define NVGPU_ZBC_TYPE_COLOR 1
|
||||
#define NVGPU_ZBC_TYPE_DEPTH 2
|
||||
@ -181,21 +221,26 @@ typedef enum {
|
||||
} NvMapBufferFlags;
|
||||
|
||||
typedef enum {
|
||||
NvErrorType_FifoErrorIdleTimeout=8,
|
||||
NvErrorType_GrErrorSwNotify=13,
|
||||
NvErrorType_GrSemaphoreTimeout=24,
|
||||
NvErrorType_GrIllegalNotify=25,
|
||||
NvErrorType_FifoErrorMmuErrFlt=31,
|
||||
NvErrorType_PbdmaError=32,
|
||||
NvErrorType_ResetChannelVerifError=43,
|
||||
NvErrorType_PbdmaPushbufferCrcMismatch=80
|
||||
} NvErrorType;
|
||||
NvNotificationType_FifoErrorIdleTimeout=8,
|
||||
NvNotificationType_GrErrorSwNotify=13,
|
||||
NvNotificationType_GrSemaphoreTimeout=24,
|
||||
NvNotificationType_GrIllegalNotify=25,
|
||||
NvNotificationType_FifoErrorMmuErrFlt=31,
|
||||
NvNotificationType_PbdmaError=32,
|
||||
NvNotificationType_ResetChannelVerifError=43,
|
||||
NvNotificationType_PbdmaPushbufferCrcMismatch=80
|
||||
} NvNotificationType;
|
||||
|
||||
typedef struct {
|
||||
u64 tickstamp;
|
||||
u32 error_type;
|
||||
u16 unk16;
|
||||
u64 timestamp;
|
||||
u32 info32; // see NvNotificationType
|
||||
u16 info16;
|
||||
u16 status; // always -1
|
||||
} NvNotification;
|
||||
|
||||
typedef struct {
|
||||
u32 type;
|
||||
u32 info[31];
|
||||
} NvError;
|
||||
|
||||
Result nvioctlNvhostCtrl_SyncptRead(u32 fd, u32 id, u32* out);
|
||||
@ -214,6 +259,7 @@ Result nvioctlNvhostCtrlGpu_ZbcQueryTable(u32 fd, u32 index, nvioctl_zbc_entry *
|
||||
Result nvioctlNvhostCtrlGpu_GetCharacteristics(u32 fd, nvioctl_gpu_characteristics *out);
|
||||
Result nvioctlNvhostCtrlGpu_GetTpcMasks(u32 fd, void *buffer, size_t size);
|
||||
Result nvioctlNvhostCtrlGpu_ZbcGetActiveSlotMask(u32 fd, nvioctl_zbc_slot_mask *out);
|
||||
Result nvioctlNvhostCtrlGpu_GetGpuTime(u32 fd, nvioctl_gpu_time *out);
|
||||
|
||||
Result nvioctlNvhostAsGpu_BindChannel(u32 fd, u32 channel_fd);
|
||||
Result nvioctlNvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align_or_offset, u64 *offset);
|
||||
@ -236,8 +282,17 @@ Result nvioctlChannel_KickoffPb(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_e
|
||||
Result nvioctlChannel_AllocObjCtx(u32 fd, u32 class_num, u32 flags, u64* id_out);
|
||||
Result nvioctlChannel_ZCullBind(u32 fd, u64 gpu_va, u32 mode);
|
||||
Result nvioctlChannel_SetErrorNotifier(u32 fd, u32 enable);
|
||||
Result nvioctlChannel_GetErrorNotification(u32 fd, NvError* out);
|
||||
Result nvioctlChannel_GetErrorInfo(u32 fd, NvError* out);
|
||||
Result nvioctlChannel_GetErrorNotification(u32 fd, NvNotification* out);
|
||||
Result nvioctlChannel_SetPriority(u32 fd, u32 priority);
|
||||
Result nvioctlChannel_SetTimeout(u32 fd, u32 timeout);
|
||||
Result nvioctlChannel_AllocGpfifoEx2(u32 fd, u32 num_entries, u32 flags, u32 unk0, u32 unk1, u32 unk2, u32 unk3, nvioctl_fence *fence_out);
|
||||
Result nvioctlChannel_SetUserData(u32 fd, void* addr);
|
||||
Result nvioctlChannel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdbufs, const nvioctl_reloc *relocs, const nvioctl_reloc_shift *reloc_shifts, u32 num_relocs,
|
||||
const nvioctl_syncpt_incr *syncpt_incrs, u32 num_syncpt_incrs, nvioctl_fence *fences, u32 num_fences);
|
||||
Result nvioctlChannel_GetSyncpt(u32 fd, u32 module_id, u32 *syncpt);
|
||||
Result nvioctlChannel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq);
|
||||
Result nvioctlChannel_SetModuleClockRate(u32 fd, u32 module_id, u32 freq);
|
||||
Result nvioctlChannel_MapCommandBuffer(u32 fd, nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed);
|
||||
Result nvioctlChannel_UnmapCommandBuffer(u32 fd, const nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed);
|
||||
Result nvioctlChannel_SetSubmitTimeout(u32 fd, u32 timeout);
|
||||
|
@ -123,6 +123,9 @@ enum {
|
||||
LibnxError_NvinfoFailedToInitialize,
|
||||
LibnxError_NvbufFailedToInitialize,
|
||||
LibnxError_LibAppletBadExit,
|
||||
LibnxError_InvalidCmifOutHeader,
|
||||
LibnxError_ShouldNotHappen,
|
||||
LibnxError_Timeout,
|
||||
};
|
||||
|
||||
/// libnx binder error codes
|
||||
|
445
nx/include/switch/runtime/btdev.h
Normal file
445
nx/include/switch/runtime/btdev.h
Normal file
@ -0,0 +1,445 @@
|
||||
/**
|
||||
* @file btdev.h
|
||||
* @brief Wrapper around the bt/btmu services for using bluetooth BLE.
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note See also: https://switchbrew.org/wiki/BTM_services
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/btdrv_types.h"
|
||||
|
||||
/// GattAttribute
|
||||
typedef struct {
|
||||
u8 type; ///< Type
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
u16 handle; ///< Handle
|
||||
u32 connection_handle; ///< ConnectionHandle
|
||||
} BtdevGattAttribute;
|
||||
|
||||
/// GattService
|
||||
typedef struct {
|
||||
BtdevGattAttribute attr; ///< \ref BtdevGattAttribute
|
||||
u16 instance_id; ///< InstanceId
|
||||
u16 end_group_handle; ///< EndGroupHandle
|
||||
bool primary_service; ///< PrimaryService
|
||||
} BtdevGattService;
|
||||
|
||||
/// GattCharacteristic
|
||||
typedef struct {
|
||||
BtdevGattAttribute attr; ///< \ref BtdevGattAttribute
|
||||
u16 instance_id; ///< InstanceId
|
||||
u8 properties; ///< Properties
|
||||
u64 value_size; ///< Size of value.
|
||||
u8 value[0x200]; ///< Value
|
||||
} BtdevGattCharacteristic;
|
||||
|
||||
/// GattDescriptor
|
||||
typedef struct {
|
||||
BtdevGattAttribute attr; ///< \ref BtdevGattAttribute
|
||||
u64 value_size; ///< Size of value.
|
||||
u8 value[0x200]; ///< Value
|
||||
} BtdevGattDescriptor;
|
||||
|
||||
/// Initialize bt/btmu.
|
||||
Result btdevInitialize(void);
|
||||
|
||||
/// Exit bt/btmu.
|
||||
void btdevExit(void);
|
||||
|
||||
/// Compares two \ref BtdrvGattAttributeUuid, returning whether these match.
|
||||
bool btdevGattAttributeUuidIsSame(const BtdrvGattAttributeUuid *a, const BtdrvGattAttributeUuid *b);
|
||||
|
||||
/// Wrapper for \ref btmuAcquireBleScanEvent.
|
||||
Result btdevAcquireBleScanEvent(Event* out_event);
|
||||
|
||||
/// Wrapper for \ref btmuGetBleScanFilterParameter.
|
||||
Result btdevGetBleScanParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out);
|
||||
|
||||
/// Wrapper for \ref btmuGetBleScanFilterParameter2.
|
||||
Result btdevGetBleScanParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out);
|
||||
|
||||
/// Wrapper for \ref btdevStartBleScanGeneral.
|
||||
Result btdevStartBleScanGeneral(BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/// Wrapper for \ref btmuStopBleScanForGeneral.
|
||||
Result btdevStopBleScanGeneral(void);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetBleScanResultsForGeneral and \ref btmuGetBleScanResultsForSmartDevice.
|
||||
* @param[out] results Output array of \ref BtdrvBleScanResult.
|
||||
* @param[in] count Size of the results array in entries.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btdevGetBleScanResult(BtdrvBleScanResult *results, u8 count, u8 *total_out);
|
||||
|
||||
/// Wrapper for \ref btmuStartBleScanForPaired.
|
||||
Result btdevEnableBleAutoConnection(BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/// Wrapper for \ref btmuStopBleScanForPaired.
|
||||
Result btdevDisableBleAutoConnection(void);
|
||||
|
||||
/// Wrapper for \ref btmuStartBleScanForSmartDevice.
|
||||
Result btdevStartBleScanSmartDevice(const BtdrvGattAttributeUuid *uuid);
|
||||
|
||||
/// Wrapper for \ref btmuStopBleScanForSmartDevice.
|
||||
Result btdevStopBleScanSmartDevice(void);
|
||||
|
||||
/// Wrapper for \ref btmuAcquireBleConnectionEvent.
|
||||
Result btdevAcquireBleConnectionStateChangedEvent(Event* out_event);
|
||||
|
||||
/// Wrapper for \ref btmuBleConnect.
|
||||
Result btdevConnectToGattServer(BtdrvAddress addr);
|
||||
|
||||
/// Wrapper for \ref btmuBleDisconnect.
|
||||
Result btdevDisconnectFromGattServer(u32 connection_handle);
|
||||
|
||||
/// Wrapper for \ref btmuBleGetConnectionState.
|
||||
Result btdevGetBleConnectionInfoList(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out);
|
||||
|
||||
/// Wrapper for \ref btmuAcquireBleServiceDiscoveryEvent.
|
||||
Result btdevAcquireBleServiceDiscoveryEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetGattServices.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[out] services Output array of \ref BtdevGattService.
|
||||
* @param[in] count Size of the services array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btdevGetGattServices(u32 connection_handle, BtdevGattService *services, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetGattService.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] service \ref BtdevGattService
|
||||
* @param[out] flag Whether a \ref BtdevGattService was returned.
|
||||
*/
|
||||
Result btdevGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtdevGattService *service, bool *flag);
|
||||
|
||||
/// Wrapper for \ref btmuAcquireBlePairingEvent.
|
||||
Result btdevAcquireBlePairingEvent(Event* out_event);
|
||||
|
||||
/// Wrapper for \ref btmuBlePairDevice.
|
||||
Result btdevPairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/// Wrapper for \ref btmuBleUnPairDevice.
|
||||
Result btdevUnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/// Wrapper for \ref btmuBleUnPairDevice2.
|
||||
Result btdevUnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/// Wrapper for \ref btmuBleGetPairedDevices.
|
||||
Result btdevGetPairedGattServerAddress(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out);
|
||||
|
||||
/// Wrapper for \ref btmuAcquireBleMtuConfigEvent.
|
||||
Result btdevAcquireBleMtuConfigEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuConfigureBleMtu.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] mtu MTU, must be 0x18-0x200.
|
||||
*/
|
||||
Result btdevConfigureBleMtu(u32 connection_handle, u16 mtu);
|
||||
|
||||
/// Wrapper for \ref btmuGetBleMtu.
|
||||
Result btdevGetBleMtu(u32 connection_handle, u16 *out);
|
||||
|
||||
/// Wrapper for \ref btRegisterBleEvent.
|
||||
Result btdevAcquireBleGattOperationEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuRegisterBleGattDataPath.
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
Result btdevRegisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuUnregisterBleGattDataPath.
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
Result btdevUnregisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btGetLeEventInfo.
|
||||
* @param[out] out \ref BtdrvBleClientGattOperationInfo
|
||||
*/
|
||||
Result btdevGetGattOperationResult(BtdrvBleClientGattOperationInfo *out);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btLeClientReadCharacteristic.
|
||||
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
*/
|
||||
Result btdevReadGattCharacteristic(BtdevGattCharacteristic *c);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btLeClientWriteCharacteristic.
|
||||
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
|
||||
* @note This uses the Value from \ref btdevGattCharacteristicSetValue.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
*/
|
||||
Result btdevWriteGattCharacteristic(BtdevGattCharacteristic *c);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btLeClientRegisterNotification / \ref btLeClientDeregisterNotification.
|
||||
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
* @param[in] flag Whether to enable/disable, controls which func to call.
|
||||
*/
|
||||
Result btdevEnableGattCharacteristicNotification(BtdevGattCharacteristic *c, bool flag);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btLeClientReadDescriptor.
|
||||
* @param d \ref BtdevGattDescriptor
|
||||
*/
|
||||
Result btdevReadGattDescriptor(BtdevGattDescriptor *d);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btLeClientWriteDescriptor.
|
||||
* @note This uses the Value from \ref btdevGattDescriptorSetValue.
|
||||
* @param d \ref BtdevGattDescriptor
|
||||
*/
|
||||
Result btdevWriteGattDescriptor(BtdevGattDescriptor *d);
|
||||
|
||||
///@name GattAttribute
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref BtdevGattAttribute object. This is intended for internal use.
|
||||
* @param a \ref BtdevGattAttribute
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[in] handle Handle
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
*/
|
||||
void btdevGattAttributeCreate(BtdevGattAttribute *a, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle);
|
||||
|
||||
/**
|
||||
* @brief Gets the Type.
|
||||
* @param a \ref BtdevGattAttribute
|
||||
*/
|
||||
NX_CONSTEXPR u8 btdevGattAttributeGetType(BtdevGattAttribute *a) {
|
||||
return a->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the Uuid.
|
||||
* @param a \ref BtdevGattAttribute
|
||||
* @param[out] out \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
NX_CONSTEXPR void btdevGattAttributeGetUuid(BtdevGattAttribute *a, BtdrvGattAttributeUuid *out) {
|
||||
*out = a->uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the Handle.
|
||||
* @param a \ref BtdevGattAttribute
|
||||
*/
|
||||
NX_CONSTEXPR u16 btdevGattAttributeGetHandle(BtdevGattAttribute *a) {
|
||||
return a->handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the ConnectionHandle.
|
||||
* @param a \ref BtdevGattAttribute
|
||||
*/
|
||||
NX_CONSTEXPR u32 btdevGattAttributeGetConnectionHandle(BtdevGattAttribute *a) {
|
||||
return a->connection_handle;
|
||||
}
|
||||
|
||||
///@}
|
||||
|
||||
///@name GattService
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref BtdevGattService object. This is intended for internal use.
|
||||
* @param s \ref BtdevGattService
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[in] handle Handle
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] instance_id InstanceId
|
||||
* @param[in] end_group_handle EndGroupHandle
|
||||
* @param[in] primary_service PrimaryService
|
||||
*/
|
||||
void btdevGattServiceCreate(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u16 end_group_handle, bool primary_service);
|
||||
|
||||
/**
|
||||
* @brief Gets the InstanceId.
|
||||
* @param s \ref BtdevGattService
|
||||
*/
|
||||
NX_CONSTEXPR u16 btdevGattServiceGetInstanceId(BtdevGattService *s) {
|
||||
return s->instance_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the EndGroupHandle.
|
||||
* @param s \ref BtdevGattService
|
||||
*/
|
||||
NX_CONSTEXPR u16 btdevGattServiceGetEndGroupHandle(BtdevGattService *s) {
|
||||
return s->end_group_handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets whether this is the PrimaryService.
|
||||
* @param s \ref BtdevGattService
|
||||
*/
|
||||
NX_CONSTEXPR u16 btdevGattServiceIsPrimaryService(BtdevGattService *s) {
|
||||
return s->primary_service;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetGattIncludedServices.
|
||||
* @param s \ref BtdevGattService
|
||||
* @param[out] services Output array of \ref BtdevGattService.
|
||||
* @param[in] count Size of the services array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btdevGattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService *services, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetGattCharacteristics.
|
||||
* @param s \ref BtdevGattService
|
||||
* @param[out] characteristics Output array of \ref BtdevGattCharacteristic.
|
||||
* @param[in] count Size of the characteristics array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btdevGattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref btdevGattServiceGetCharacteristics except this only returns the \ref BtdevGattCharacteristic which contains a matching \ref BtdrvGattAttributeUuid.
|
||||
* @param s \ref BtdevGattService
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] characteristic \ref BtdevGattCharacteristic
|
||||
* @param[out] flag Whether a \ref BtdevGattService was returned.
|
||||
*/
|
||||
Result btdevGattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, BtdevGattCharacteristic *characteristic, bool *flag);
|
||||
|
||||
///@}
|
||||
|
||||
///@name GattCharacteristic
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref BtdevGattCharacteristic object. This is intended for internal use.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[in] handle Handle
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] instance_id InstanceId
|
||||
* @param[in] properties Properties
|
||||
*/
|
||||
void btdevGattCharacteristicCreate(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u8 properties);
|
||||
|
||||
/**
|
||||
* @brief Gets the InstanceId.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
*/
|
||||
NX_CONSTEXPR u16 btdevGattCharacteristicGetInstanceId(BtdevGattCharacteristic *c) {
|
||||
return c->instance_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the Properties.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
*/
|
||||
NX_CONSTEXPR u8 btdevGattCharacteristicGetProperties(BtdevGattCharacteristic *c) {
|
||||
return c->properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetBelongingGattService.
|
||||
* @note Gets the \ref BtdevGattService which belongs to this object.
|
||||
* @param c \ref BtdevGattCharacteristic.
|
||||
* @param[out] service \ref BtdevGattService
|
||||
*/
|
||||
Result btdevGattCharacteristicGetService(BtdevGattCharacteristic *c, BtdevGattService *service);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetGattDescriptors.
|
||||
* @note Gets the descriptors which belongs to this object.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
* @param[out] descriptors Output array of \ref BtdevGattDescriptor.
|
||||
* @param[in] count Size of the descriptors array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btdevGattCharacteristicGetDescriptors(BtdevGattCharacteristic *c, BtdevGattDescriptor *descriptors, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref btdevGattCharacteristicGetDescriptors except this only returns a \ref BtdevGattDescriptor which contains a matching \ref BtdrvGattAttributeUuid.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] descriptor \ref BtdevGattDescriptor
|
||||
* @param[out] flag Whether a \ref BtdevGattDescriptor was returned.
|
||||
*/
|
||||
Result btdevGattCharacteristicGetDescriptor(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, BtdevGattDescriptor *descriptor, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief Sets the Value in the object.
|
||||
* @note See also \ref btdevWriteGattCharacteristic.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
* @param[in] buffer Input buffer.
|
||||
* @param[in] size Input buffer size, max is 0x200.
|
||||
*/
|
||||
void btdevGattCharacteristicSetValue(BtdevGattCharacteristic *c, const void* buffer, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Gets the Value in the object, returns the copied value size.
|
||||
* @param c \ref BtdevGattCharacteristic
|
||||
* @param[out] buffer Output buffer.
|
||||
* @param[in] size Output buffer size, max is 0x200.
|
||||
*/
|
||||
u64 btdevGattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, size_t size);
|
||||
|
||||
///@}
|
||||
|
||||
///@name GattDescriptor
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref BtdevGattDescriptor object. This is intended for internal use.
|
||||
* @param d \ref BtdevGattDescriptor
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[in] handle Handle
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
*/
|
||||
void btdevGattDescriptorCreate(BtdevGattDescriptor *d, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetBelongingGattService.
|
||||
* @note Gets the \ref BtdevGattService which belongs to this object.
|
||||
* @param d \ref BtdevGattDescriptor
|
||||
* @param[out] service \ref BtdevGattService
|
||||
*/
|
||||
Result btdevGattDescriptorGetService(BtdevGattDescriptor *d, BtdevGattService *service);
|
||||
|
||||
/**
|
||||
* @brief Wrapper for \ref btmuGetGattCharacteristics.
|
||||
* @note Gets the \ref BtdevGattCharacteristic which belongs to this object.
|
||||
* @param d \ref BtdevGattDescriptor
|
||||
* @param[out] characteristic \ref BtdevGattCharacteristic
|
||||
*/
|
||||
Result btdevGattDescriptorGetCharacteristic(BtdevGattDescriptor *d, BtdevGattCharacteristic *characteristic);
|
||||
|
||||
/**
|
||||
* @brief Sets the Value in the object.
|
||||
* @note See also \ref btdevWriteGattDescriptor.
|
||||
* @param d \ref BtdevGattDescriptor
|
||||
* @param[in] buffer Input buffer.
|
||||
* @param[in] size Input buffer size, max is 0x200.
|
||||
*/
|
||||
void btdevGattDescriptorSetValue(BtdevGattDescriptor *d, const void* buffer, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Gets the Value in the object, returns the copied value size.
|
||||
* @param d \ref BtdevGattDescriptor
|
||||
* @param[out] buffer Output buffer.
|
||||
* @param[in] size Output buffer size, max is 0x200.
|
||||
*/
|
||||
u64 btdevGattDescriptorGetValue(BtdevGattDescriptor *d, void* buffer, size_t size);
|
||||
|
||||
///@}
|
||||
|
@ -103,8 +103,8 @@ struct PrintConsole
|
||||
int windowHeight; ///< Window height in characters
|
||||
|
||||
int tabSize; ///< Size of a tab
|
||||
int fg; ///< Foreground color
|
||||
int bg; ///< Background color
|
||||
u16 fg; ///< Foreground color
|
||||
u16 bg; ///< Background color
|
||||
int flags; ///< Reverse/bright flags
|
||||
|
||||
bool consoleInitialised; ///< True if the console is initialized
|
||||
@ -119,13 +119,14 @@ struct PrintConsole
|
||||
#define CONSOLE_COLOR_REVERSE (1<<6) ///< Reversed color text
|
||||
#define CONSOLE_CONCEAL (1<<7) ///< Concealed text
|
||||
#define CONSOLE_CROSSED_OUT (1<<8) ///< Crossed out text
|
||||
#define CONSOLE_FG_CUSTOM (1<<9) ///< Foreground custom color
|
||||
#define CONSOLE_BG_CUSTOM (1<<10) ///< Background custom color
|
||||
|
||||
/// Console debug devices supported by libnx.
|
||||
typedef enum {
|
||||
debugDevice_NULL, ///< Swallows prints to stderr
|
||||
debugDevice_SVC, ///< Outputs stderr debug statements using svcOutputDebugString, which can then be captured by interactive debuggers
|
||||
debugDevice_CONSOLE, ///< Directs stderr debug statements to Switch console window
|
||||
debugDevice_3DMOO = debugDevice_SVC,
|
||||
} debugDevice;
|
||||
|
||||
/**
|
||||
|
@ -19,14 +19,48 @@ typedef struct
|
||||
FsDir fd; ///< File descriptor
|
||||
ssize_t index; ///< Current entry index
|
||||
size_t size; ///< Current batch size
|
||||
FsDirectoryEntry entry_data[32]; ///< Temporary storage for reading entries
|
||||
} fsdev_dir_t;
|
||||
|
||||
/// Initializes and mounts the sdmc device if accessible. Also initializes current working directory to point to the folder containing the path to the executable (argv[0]), if it is provided by the environment.
|
||||
/// Retrieves a pointer to temporary stage for reading entries
|
||||
NX_CONSTEXPR FsDirectoryEntry* fsdevDirGetEntries(fsdev_dir_t *dir)
|
||||
{
|
||||
return (FsDirectoryEntry*)(void*)(dir+1);
|
||||
}
|
||||
|
||||
/// Initializes and mounts the sdmc device if accessible.
|
||||
Result fsdevMountSdmc(void);
|
||||
|
||||
/// Mounts the specified SaveData.
|
||||
Result fsdevMountSaveData(const char *name, u64 application_id, AccountUid uid);
|
||||
|
||||
/// Mounts the specified SaveData as ReadOnly.
|
||||
/// Only available on [2.0.0+].
|
||||
Result fsdevMountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid);
|
||||
|
||||
/// Mounts the specified BcatSaveData.
|
||||
Result fsdevMountBcatSaveData(const char *name, u64 application_id);
|
||||
|
||||
/// Mounts the specified DeviceSaveData.
|
||||
Result fsdevMountDeviceSaveData(const char *name, u64 application_id);
|
||||
|
||||
/// Mounts the TemporaryStorage for the current process.
|
||||
/// Only available on [3.0.0+].
|
||||
Result fsdevMountTemporaryStorage(const char *name);
|
||||
|
||||
/// Mounts the specified CacheStorage.
|
||||
/// Only available on [3.0.0+].
|
||||
Result fsdevMountCacheStorage(const char *name, u64 application_id, u16 save_data_index);
|
||||
|
||||
/// Mounts the specified SystemSaveData.
|
||||
Result fsdevMountSystemSaveData(const char *name, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid);
|
||||
|
||||
/// Mounts the specified SystemBcatSaveData.
|
||||
/// Only available on [4.0.0+].
|
||||
Result fsdevMountSystemBcatSaveData(const char *name, u64 system_save_data_id);
|
||||
|
||||
/// Mounts the input fs with the specified device name. fsdev will handle closing the fs when required, including when fsdevMountDevice() fails.
|
||||
/// Returns -1 when any errors occur.
|
||||
/// Input device name string shouldn't exceed 31 characters, and shouldn't have a trailing colon.
|
||||
int fsdevMountDevice(const char *name, FsFileSystem fs);
|
||||
|
||||
/// Unmounts the specified device.
|
||||
@ -39,17 +73,17 @@ Result fsdevCommitDevice(const char *name);
|
||||
/// Returns the FsFileSystem for the specified device. Returns NULL when the specified device isn't found.
|
||||
FsFileSystem* fsdevGetDeviceFileSystem(const char *name);
|
||||
|
||||
/// Returns the FsFileSystem for the default device (SD card), if mounted. Used internally by romfs_dev.
|
||||
FsFileSystem* fsdevGetDefaultFileSystem(void);
|
||||
|
||||
/// Writes the FS-path to outpath (which has buffer size FS_MAX_PATH), for the input path (as used in stdio). The FsFileSystem is also written to device when not NULL.
|
||||
int fsdevTranslatePath(const char *path, FsFileSystem** device, char *outpath);
|
||||
|
||||
/// This calls fsFsSetArchiveBit on the filesystem specified by the input path (as used in stdio).
|
||||
Result fsdevSetArchiveBit(const char *path);
|
||||
/// This calls fsFsSetConcatenationFileAttribute on the filesystem specified by the input path (as used in stdio).
|
||||
Result fsdevSetConcatenationFileAttribute(const char *path);
|
||||
|
||||
// Uses \ref fsFsIsValidSignedSystemPartitionOnSdCard with the specified device.
|
||||
Result fsdevIsValidSignedSystemPartitionOnSdCard(const char *name, bool *out);
|
||||
|
||||
/// This calls fsFsCreateFile on the filesystem specified by the input path (as used in stdio).
|
||||
Result fsdevCreateFile(const char* path, size_t size, int flags);
|
||||
Result fsdevCreateFile(const char* path, size_t size, u32 flags);
|
||||
|
||||
/// Recursively deletes the directory specified by the input path (as used in stdio).
|
||||
Result fsdevDeleteDirectoryRecursively(const char *path);
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include "../../types.h"
|
||||
#include "../../services/fs.h"
|
||||
#include "../../services/ncm_types.h"
|
||||
|
||||
/// RomFS header.
|
||||
typedef struct
|
||||
@ -53,12 +54,11 @@ typedef struct
|
||||
/**
|
||||
* @brief Mounts the Application's RomFS.
|
||||
* @param name Device mount name.
|
||||
* @remark This function is intended to be used to access one's own RomFS.
|
||||
* If the application is running as NRO, it mounts the embedded RomFS section inside the NRO.
|
||||
* If on the other hand it's an NSO, it behaves identically to \ref romfsMountFromCurrentProcess.
|
||||
*/
|
||||
Result romfsMount(const char *name);
|
||||
static inline Result romfsInit(void)
|
||||
{
|
||||
return romfsMount("romfs");
|
||||
}
|
||||
Result romfsMountSelf(const char *name);
|
||||
|
||||
/**
|
||||
* @brief Mounts RomFS from an open file.
|
||||
@ -67,10 +67,6 @@ static inline Result romfsInit(void)
|
||||
* @param name Device mount name.
|
||||
*/
|
||||
Result romfsMountFromFile(FsFile file, u64 offset, const char *name);
|
||||
static inline Result romfsInitFromFile(FsFile file, u64 offset)
|
||||
{
|
||||
return romfsMountFromFile(file, offset, "romfs");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Mounts RomFS from an open storage.
|
||||
@ -79,17 +75,21 @@ static inline Result romfsInitFromFile(FsFile file, u64 offset)
|
||||
* @param name Device mount name.
|
||||
*/
|
||||
Result romfsMountFromStorage(FsStorage storage, u64 offset, const char *name);
|
||||
static inline Result romfsInitFromStorage(FsStorage storage, u64 offset)
|
||||
{
|
||||
return romfsMountFromStorage(storage, offset, "romfs");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Mounts RomFS using the current process host title RomFS.
|
||||
* @brief Mounts RomFS using the current process host program RomFS.
|
||||
* @param name Device mount name.
|
||||
*/
|
||||
Result romfsMountFromCurrentProcess(const char *name);
|
||||
|
||||
/**
|
||||
* @brief Mounts RomFS of a running program.
|
||||
* @note Permission needs to be set in the NPDM.
|
||||
* @param program_id ProgramId to mount.
|
||||
* @param name Device mount name.
|
||||
*/
|
||||
Result romfsMountDataStorageFromProgram(u64 program_id, const char *name);
|
||||
|
||||
/**
|
||||
* @brief Mounts RomFS from a file path in a mounted fsdev device.
|
||||
* @param path File path.
|
||||
@ -99,17 +99,24 @@ Result romfsMountFromCurrentProcess(const char *name);
|
||||
Result romfsMountFromFsdev(const char *path, u64 offset, const char *name);
|
||||
|
||||
/**
|
||||
* @brief Mounts RomFS from a system data archive.
|
||||
* @param dataId Title ID of system data archive to mount.
|
||||
* @brief Mounts RomFS from SystemData.
|
||||
* @param dataId SystemDataId to mount.
|
||||
* @param storageId Storage ID to mount from.
|
||||
* @param name Device mount name.
|
||||
*/
|
||||
Result romfsMountFromDataArchive(u64 dataId, FsStorageId storageId, const char *name);
|
||||
Result romfsMountFromDataArchive(u64 dataId, NcmStorageId storageId, const char *name);
|
||||
|
||||
/// Unmounts the RomFS device.
|
||||
Result romfsUnmount(const char *name);
|
||||
|
||||
/// Wrapper for \ref romfsMountSelf with the default "romfs" device name.
|
||||
static inline Result romfsInit(void)
|
||||
{
|
||||
return romfsMountSelf("romfs");
|
||||
}
|
||||
|
||||
/// Wrapper for \ref romfsUnmount with the default "romfs" device name.
|
||||
static inline Result romfsExit(void)
|
||||
{
|
||||
return romfsUnmount("romfs");
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,17 @@
|
||||
#pragma once
|
||||
#include "../../types.h"
|
||||
|
||||
/// BSD service type used by the socket driver.
|
||||
typedef enum {
|
||||
BsdServiceType_User = BIT(0), ///< Uses bsd:u (default).
|
||||
BsdServiceType_System = BIT(1), ///< Uses bsd:s.
|
||||
BsdServiceType_Auto = BsdServiceType_User | BsdServiceType_System, ///< Tries to use bsd:s first, and if that fails uses bsd:u (official software behavior).
|
||||
} BsdServiceType;
|
||||
|
||||
/// Configuration structure for socketInitalize
|
||||
typedef struct {
|
||||
u32 bsdsockets_version; ///< Observed 1 on 2.0 LibAppletWeb, 2 on 3.0.
|
||||
|
||||
u32 tcp_tx_buf_size; ///< Size of the TCP transfer (send) buffer (initial or fixed).
|
||||
u32 tcp_rx_buf_size; ///< Size of the TCP recieve buffer (initial or fixed).
|
||||
u32 tcp_rx_buf_size; ///< Size of the TCP receive buffer (initial or fixed).
|
||||
u32 tcp_tx_buf_max_size; ///< Maximum size of the TCP transfer (send) buffer. If it is 0, the size of the buffer is fixed to its initial value.
|
||||
u32 tcp_rx_buf_max_size; ///< Maximum size of the TCP receive buffer. If it is 0, the size of the buffer is fixed to its initial value.
|
||||
|
||||
@ -15,10 +20,8 @@ typedef struct {
|
||||
|
||||
u32 sb_efficiency; ///< Number of buffers for each socket (standard values range from 1 to 8).
|
||||
|
||||
size_t serialized_out_addrinfos_max_size; ///< For getaddrinfo.
|
||||
size_t serialized_out_hostent_max_size; ///< For gethostbyname/gethostbyaddr.
|
||||
bool bypass_nsd; ///< For name gethostbyname/getaddrinfo: bypass the Name Server Daemon.
|
||||
int dns_timeout; ///< For DNS requests: timeout or 0.
|
||||
u32 num_bsd_sessions; ///< Number of BSD service sessions (typically 3).
|
||||
BsdServiceType bsd_service_type; ///< BSD service type (typically \ref BsdServiceType_User).
|
||||
} SocketInitConfig;
|
||||
|
||||
/// Fetch the default configuration for the socket driver.
|
||||
@ -26,14 +29,30 @@ const SocketInitConfig *socketGetDefaultInitConfig(void);
|
||||
/// Initalize the socket driver.
|
||||
Result socketInitialize(const SocketInitConfig *config);
|
||||
/// Fetch the last bsd:u/s Switch result code (thread-local).
|
||||
Result socketGetLastBsdResult(void);
|
||||
/// Fetch the last sfdnsres Switch result code (thread-local).
|
||||
Result socketGetLastSfdnsresResult(void);
|
||||
Result socketGetLastResult(void);
|
||||
/// Deinitialize the socket driver.
|
||||
void socketExit(void);
|
||||
|
||||
/// Initalize the socket driver using the default configuration.
|
||||
static inline Result socketInitializeDefault(void) {
|
||||
return socketInitialize(socketGetDefaultInitConfig());
|
||||
NX_INLINE Result socketInitializeDefault(void) {
|
||||
return socketInitialize(NULL);
|
||||
}
|
||||
|
||||
/// Wrapper for \ref sslConnectionSetSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored.
|
||||
int socketSslConnectionSetSocketDescriptor(SslConnection *c, int sockfd);
|
||||
|
||||
/// Wrapper for \ref sslConnectionGetSocketDescriptor. Returns the output sockfd on success and -1 on error.
|
||||
int socketSslConnectionGetSocketDescriptor(SslConnection *c);
|
||||
|
||||
#ifdef _SOCKLEN_T_DECLARED
|
||||
struct sockaddr;
|
||||
/// Wrapper for \ref sslConnectionSetDtlsSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored.
|
||||
int socketSslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const struct sockaddr *addr, socklen_t addrlen);
|
||||
#endif
|
||||
|
||||
/// Wrapper for \ref nifmRequestRegisterSocketDescriptor. Returns 0 on success and -1 on error.
|
||||
int socketNifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd);
|
||||
|
||||
/// Wrapper for \ref nifmRequestUnregisterSocketDescriptor. Returns 0 on success and -1 on error.
|
||||
int socketNifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
///@}
|
||||
|
15
nx/include/switch/runtime/diag.h
Normal file
15
nx/include/switch/runtime/diag.h
Normal file
@ -0,0 +1,15 @@
|
||||
/**
|
||||
* @file diag.h
|
||||
* @brief Debugging and diagnostics utilities
|
||||
* @author fincs
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../result.h"
|
||||
|
||||
/**
|
||||
* @brief Aborts program execution with a result code.
|
||||
* @param[in] res Result code.
|
||||
*/
|
||||
void NX_NORETURN diagAbortWithResult(Result res);
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/acc.h"
|
||||
|
||||
/// Structure representing an entry in the homebrew environment configuration.
|
||||
typedef struct {
|
||||
@ -27,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.
|
||||
@ -36,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 {
|
||||
@ -43,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).
|
||||
@ -80,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);
|
||||
@ -114,4 +116,4 @@ bool envHasRandomSeed(void);
|
||||
void envGetRandomSeed(u64 out[2]);
|
||||
|
||||
/// Returns a pointer to the user id storage area (if present).
|
||||
u128* envGetUserIdStorage(void);
|
||||
AccountUid* envGetUserIdStorage(void);
|
||||
|
@ -25,6 +25,9 @@ u32 hosversionGet(void);
|
||||
/// Sets or overrides the current HOS version. This function is normally called automatically by libnx on startup with the version info obtained with \ref setsysGetFirmwareVersion.
|
||||
void hosversionSet(u32 version);
|
||||
|
||||
/// Returns whether the current HOS version is augmented by running the Atmosphère custom firmware.
|
||||
bool hosversionIsAtmosphere(void);
|
||||
|
||||
/// Returns true if the current HOS version is equal to or above the specified major/minor/micro version.
|
||||
static inline bool hosversionAtLeast(u8 major, u8 minor, u8 micro) {
|
||||
return hosversionGet() >= MAKEHOSVERSION(major,minor,micro);
|
||||
|
@ -5,6 +5,7 @@
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
|
||||
struct in_addr;
|
||||
|
||||
@ -15,8 +16,20 @@ extern struct in_addr __nxlink_host;
|
||||
#define NXLINK_CLIENT_PORT 28771 ///< nxlink TCP client port
|
||||
|
||||
/**
|
||||
* @brief Sets up stdout/stderr redirection to the nxlink host.
|
||||
* @brief Connects to the nxlink host, setting up an output stream.
|
||||
* @param[in] redirStdout Whether to redirect stdout to nxlink output.
|
||||
* @param[in] redirStderr Whether to redirect stderr to nxlink output.
|
||||
* @return Socket fd on success, negative number on failure.
|
||||
* @note The socket should be closed with close() during application cleanup.
|
||||
*/
|
||||
int nxlinkStdio(void);
|
||||
int nxlinkConnectToHost(bool redirStdout, bool redirStderr);
|
||||
|
||||
/// Same as \ref nxlinkConnectToHost but redirecting both stdout/stderr.
|
||||
NX_INLINE int nxlinkStdio(void) {
|
||||
return nxlinkConnectToHost(true, true);
|
||||
}
|
||||
|
||||
/// Same as \ref nxlinkConnectToHost but redirecting only stderr.
|
||||
NX_INLINE int nxlinkStdioForDebug(void) {
|
||||
return nxlinkConnectToHost(false, true);
|
||||
}
|
||||
|
224
nx/include/switch/runtime/pad.h
Normal file
224
nx/include/switch/runtime/pad.h
Normal file
@ -0,0 +1,224 @@
|
||||
/**
|
||||
* @file pad.h
|
||||
* @brief Simple wrapper for the HID Npad API.
|
||||
* @author fincs
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/hid.h"
|
||||
|
||||
/// Mask including all existing controller IDs.
|
||||
#define PAD_ANY_ID_MASK 0x1000100FFUL
|
||||
|
||||
/// Pad state object.
|
||||
typedef struct {
|
||||
u8 id_mask;
|
||||
u8 active_id_mask;
|
||||
bool read_handheld;
|
||||
bool active_handheld;
|
||||
u32 style_set;
|
||||
u32 attributes;
|
||||
u64 buttons_cur;
|
||||
u64 buttons_old;
|
||||
HidAnalogStickState sticks[2];
|
||||
u32 gc_triggers[2];
|
||||
} PadState;
|
||||
|
||||
/// Pad button repeater state object.
|
||||
typedef struct {
|
||||
u64 button_mask;
|
||||
s32 counter;
|
||||
u16 delay;
|
||||
u16 repeat;
|
||||
} PadRepeater;
|
||||
|
||||
/**
|
||||
* @brief Configures the input layout supported by the application.
|
||||
* @param[in] max_players The maximum supported number of players (1 to 8).
|
||||
* @param[in] style_set Bitfield of supported controller styles (see \ref HidNpadStyleTag).
|
||||
*/
|
||||
void padConfigureInput(u32 max_players, u32 style_set);
|
||||
|
||||
/**
|
||||
* @brief Initializes a \ref PadState object to read input from one or more controller input sources.
|
||||
* @param[in] _pad Pointer to \ref PadState.
|
||||
* @remarks This is a variadic macro, pass the \ref HidNpadIdType value of each controller to add to the set.
|
||||
*/
|
||||
#define padInitialize(_pad, ...) ({ \
|
||||
const HidNpadIdType _pad_ids[] = { __VA_ARGS__ }; \
|
||||
u64 _pad_mask = 0; \
|
||||
for (unsigned _pad_i = 0; _pad_i < (sizeof(_pad_ids)/sizeof(_pad_ids[0])); ++_pad_i) \
|
||||
_pad_mask |= 1UL << (_pad_ids[_pad_i]); \
|
||||
padInitializeWithMask((_pad), _pad_mask); \
|
||||
})
|
||||
|
||||
/**
|
||||
* @brief Same as \ref padInitialize, but taking a bitfield of controller IDs directly.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @param[in] mask Bitfield of controller IDs (each bit's position indicates a different \ref HidNpadIdType value).
|
||||
*/
|
||||
void padInitializeWithMask(PadState* pad, u64 mask);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref padInitialize, but including every single controller input source.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @remark Use this function if you want to accept input from any controller.
|
||||
*/
|
||||
NX_INLINE void padInitializeAny(PadState* pad) {
|
||||
padInitializeWithMask(pad, PAD_ANY_ID_MASK);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Same as \ref padInitialize, but including \ref HidNpadIdType_No1 and \ref HidNpadIdType_Handheld.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @remark Use this function if you just want to accept input for a single-player application.
|
||||
*/
|
||||
NX_INLINE void padInitializeDefault(PadState* pad) {
|
||||
padInitialize(pad, HidNpadIdType_No1, HidNpadIdType_Handheld);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Updates pad state by reading from the controller input sources specified during initialization.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
*/
|
||||
void padUpdate(PadState* pad);
|
||||
|
||||
/**
|
||||
* @brief Retrieves whether \ref HidNpadIdType_Handheld is an active input source (i.e. it was possible to read from it).
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @return Boolean value.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR bool padIsHandheld(const PadState* pad) {
|
||||
return pad->active_handheld;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves whether the specified controller is an active input source (i.e. it was possible to read from it).
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @param[in] id ID of the controller input source (see \ref HidNpadIdType)
|
||||
* @return Boolean value.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR bool padIsNpadActive(const PadState* pad, HidNpadIdType id) {
|
||||
if (id <= HidNpadIdType_No8)
|
||||
return pad->active_id_mask & BIT(id);
|
||||
else if (id == HidNpadIdType_Handheld)
|
||||
return pad->active_handheld;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the set of input styles supported by the selected controller input sources.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @return Bitfield of \ref HidNpadStyleTag.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR u32 padGetStyleSet(const PadState* pad) {
|
||||
return pad->style_set;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the set of attributes reported by the system for the selected controller input sources.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @return Bitfield of \ref HidNpadAttribute.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR u32 padGetAttributes(const PadState* pad) {
|
||||
return pad->attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves whether any of the selected controller input sources is connected.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @return Boolean value.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR bool padIsConnected(const PadState* pad) {
|
||||
return pad->attributes & HidNpadAttribute_IsConnected;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the current set of pressed buttons across all selected controller input sources.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @return Bitfield of \ref HidNpadButton.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR u64 padGetButtons(const PadState* pad) {
|
||||
return pad->buttons_cur;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the set of buttons that are newly pressed.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @return Bitfield of \ref HidNpadButton.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR u64 padGetButtonsDown(const PadState* pad) {
|
||||
return ~pad->buttons_old & pad->buttons_cur;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the set of buttons that are newly released.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @return Bitfield of \ref HidNpadButton.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR u64 padGetButtonsUp(const PadState* pad) {
|
||||
return pad->buttons_old & ~pad->buttons_cur;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the position of an analog stick in a controller.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @param[in] i ID of the analog stick to read (0=left, 1=right).
|
||||
* @return \ref HidAnalogStickState.
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
*/
|
||||
NX_CONSTEXPR HidAnalogStickState padGetStickPos(const PadState* pad, unsigned i) {
|
||||
return pad->sticks[i];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the position of an analog trigger in a GameCube controller.
|
||||
* @param[in] pad Pointer to \ref PadState.
|
||||
* @param[in] i ID of the analog trigger to read (0=left, 1=right).
|
||||
* @return Analog trigger position (range is 0 to 0x7fff).
|
||||
* @remark \ref padUpdate must have been previously called.
|
||||
* @remark \ref HidNpadStyleTag_NpadGc must have been previously configured as a supported style in \ref padConfigureInput for GC trigger data to be readable.
|
||||
*/
|
||||
NX_CONSTEXPR u32 padGetGcTriggerPos(const PadState* pad, unsigned i) {
|
||||
return pad->gc_triggers[i];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initializes a \ref PadRepeater object with the specified settings.
|
||||
* @param[in] r Pointer to \ref PadRepeater.
|
||||
* @param[in] delay Number of input updates between button presses being first detected and them being considered for repeat.
|
||||
* @param[in] repeat Number of input updates between autogenerated repeat button presses.
|
||||
*/
|
||||
NX_CONSTEXPR void padRepeaterInitialize(PadRepeater* r, u16 delay, u16 repeat) {
|
||||
r->button_mask = 0;
|
||||
r->counter = 0;
|
||||
r->delay = delay;
|
||||
r->repeat = repeat;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Updates pad repeat state.
|
||||
* @param[in] r Pointer to \ref PadRepeater.
|
||||
* @param[in] button_mask Bitfield of currently pressed \ref HidNpadButton that will be considered for repeat.
|
||||
*/
|
||||
void padRepeaterUpdate(PadRepeater* r, u64 button_mask);
|
||||
|
||||
/**
|
||||
* @brief Retrieves the set of buttons that are being repeated according to the parameters specified in \ref padRepeaterInitialize.
|
||||
* @param[in] r Pointer to \ref PadRepeater.
|
||||
* @return Bitfield of \ref HidNpadButton.
|
||||
* @remark It is suggested to bitwise-OR the return value of this function with that of \ref padGetButtonsDown.
|
||||
*/
|
||||
NX_CONSTEXPR u64 padRepeaterGetButtons(const PadRepeater* r) {
|
||||
return r->counter == 0 ? r->button_mask : 0;
|
||||
}
|
29
nx/include/switch/runtime/resolver.h
Normal file
29
nx/include/switch/runtime/resolver.h
Normal file
@ -0,0 +1,29 @@
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
|
||||
/// Fetches the last resolver Switch result code of the current thread.
|
||||
Result resolverGetLastResult(void);
|
||||
|
||||
/// Retrieves a handle used to cancel the next resolver command on the current thread.
|
||||
u32 resolverGetCancelHandle(void);
|
||||
|
||||
/// Retrieves whether service discovery is enabled for resolver commands on the current thread.
|
||||
bool resolverGetEnableServiceDiscovery(void);
|
||||
|
||||
/// [5.0.0+] Retrieves whether the DNS cache is used to resolve queries on the current thread (not implemented).
|
||||
bool resolverGetEnableDnsCache(void);
|
||||
|
||||
/// Enables or disables service discovery for the current thread.
|
||||
void resolverSetEnableServiceDiscovery(bool enable);
|
||||
|
||||
/// [5.0.0+] Enables or disables the usage of the DNS cache on the current thread (not implemented).
|
||||
void resolverSetEnableDnsCache(bool enable);
|
||||
|
||||
/// Cancels a previous resolver command (handle obtained with \ref resolverGetCancelHandle prior to calling the command).
|
||||
Result resolverCancel(u32 handle);
|
||||
|
||||
/// [5.0.0+] Removes a hostname from the DNS cache (not implemented).
|
||||
Result resolverRemoveHostnameFromCache(const char* hostname);
|
||||
|
||||
/// [5.0.0+] Removes an IP address from the DNS cache (not implemented).
|
||||
Result resolverRemoveIpAddressFromCache(u32 ip);
|
257
nx/include/switch/runtime/ringcon.h
Normal file
257
nx/include/switch/runtime/ringcon.h
Normal file
@ -0,0 +1,257 @@
|
||||
/**
|
||||
* @file ringcon.h
|
||||
* @brief Wrapper for using the Ring-Con attached to a Joy-Con, with hidbus. See also: https://switchbrew.org/wiki/Ring-Con
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/hidbus.h"
|
||||
|
||||
#define RINGCON_CAL_MAGIC -0x3502 // 0xCAFE
|
||||
|
||||
/// Whether the output data is valid.
|
||||
typedef enum {
|
||||
RingConDataValid_Ok = 0, ///< Valid.
|
||||
RingConDataValid_CRC = 1, ///< Bad CRC.
|
||||
RingConDataValid_Cal = 2, ///< Only used with \ref ringconReadUserCal. Calibration is needed via \ref ringconUpdateUserCal.
|
||||
} RingConDataValid;
|
||||
|
||||
typedef enum {
|
||||
RingConErrorFlag_BadUserCalUpdate = 0, ///< The output from \ref ringconReadUserCal doesn't match the input used with \ref ringconWriteUserCal, or the \ref RingConDataValid is not ::RingConDataValid_Ok.
|
||||
RingConErrorFlag_BadFlag = 4, ///< The output flag from \ref ringconCmdx00020105 when successful is invalid.
|
||||
RingConErrorFlag_BadUserCal = 5, ///< BadUserCal
|
||||
RingConErrorFlag_BadManuCal = 6, ///< BadManuCal
|
||||
} RingConErrorFlag;
|
||||
|
||||
/// Ring-Con firmware version.
|
||||
typedef struct {
|
||||
u8 fw_main_ver; ///< Main firmware version.
|
||||
u8 fw_sub_ver; ///< Sub firmware version.
|
||||
} RingConFwVersion;
|
||||
|
||||
/// Ring-Con manufacturer calibration.
|
||||
typedef struct {
|
||||
s16 os_max; ///< (manu_)os_max
|
||||
s16 hk_max; ///< (manu_)hk_max
|
||||
s16 zero_min; ///< (manu_)zero_min
|
||||
s16 zero_max; ///< (manu_)zero_max
|
||||
} RingConManuCal;
|
||||
|
||||
/// Ring-Con user calibration.
|
||||
typedef struct {
|
||||
s16 os_max; ///< (user_)os_max
|
||||
s16 hk_max; ///< (user_)hk_max
|
||||
s16 zero; ///< (user_)zero
|
||||
RingConDataValid data_valid; ///< \ref RingConDataValid
|
||||
} RingConUserCal;
|
||||
|
||||
/// Polling data extracted from \ref HidbusJoyPollingReceivedData.
|
||||
typedef struct {
|
||||
s16 data; ///< Sensor state data.
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
} RingConPollingData;
|
||||
|
||||
/// Ring-Con state object.
|
||||
typedef struct {
|
||||
bool bus_initialized;
|
||||
HidbusBusHandle handle;
|
||||
void* workbuf;
|
||||
size_t workbuf_size;
|
||||
u64 polling_last_sampling_number;
|
||||
u32 error_flags;
|
||||
|
||||
u64 id_l, id_h;
|
||||
RingConFwVersion fw_ver;
|
||||
u32 flag;
|
||||
s16 unk_cal;
|
||||
s32 total_push_count;
|
||||
|
||||
RingConManuCal manu_cal;
|
||||
RingConUserCal user_cal;
|
||||
} RingCon;
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref RingCon object, and handles the various initialization for it.
|
||||
* @param c \ref RingCon
|
||||
* @param[in] id \ref HidNpadIdType. A Ring-Con must be attached to this controller.
|
||||
*/
|
||||
Result ringconCreate(RingCon *c, HidNpadIdType id);
|
||||
|
||||
/**
|
||||
* @brief Close a \ref RingCon.
|
||||
* @param c \ref RingCon
|
||||
*/
|
||||
void ringconClose(RingCon *c);
|
||||
|
||||
/**
|
||||
* @brief Gets the error flags field.
|
||||
* @param c \ref RingCon
|
||||
*/
|
||||
NX_CONSTEXPR u32 ringconGetErrorFlags(RingCon *c) {
|
||||
return c->error_flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the value of an error flag, set by \ref ringconSetErrorFlag.
|
||||
* @param c \ref RingCon
|
||||
* @param[in] flag \ref RingConErrorFlag
|
||||
*/
|
||||
NX_CONSTEXPR bool ringconGetErrorFlag(RingCon *c, RingConErrorFlag flag) {
|
||||
return (c->error_flags & BIT(flag)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref RingConFwVersion previously loaded by \ref ringconCreate.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out \ref RingConFwVersion
|
||||
*/
|
||||
NX_CONSTEXPR RingConFwVersion ringconGetFwVersion(RingCon *c) {
|
||||
return c->fw_ver;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the Id previously loaded by \ref ringconCreate.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] id_l Id low.
|
||||
* @param[out] id_h Id high.
|
||||
*/
|
||||
NX_CONSTEXPR void ringconGetId(RingCon *c, u64 *id_l, u64 *id_h) {
|
||||
*id_l = c->id_l;
|
||||
*id_h = c->id_h;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the unk_cal previously loaded by \ref ringconCreate with \ref ringconReadUnkCal. Only valid when the output flag from \ref ringconCmdx00020105 is valid.
|
||||
* @param c \ref RingCon
|
||||
*/
|
||||
NX_CONSTEXPR s16 ringconGetUnkCal(RingCon *c) {
|
||||
return c->unk_cal;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the total-push-count previously loaded by \ref ringconCreate.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out total_push_count
|
||||
*/
|
||||
NX_CONSTEXPR s32 ringconGetTotalPushCount(RingCon *c) {
|
||||
return c->total_push_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref RingConManuCal previously loaded by \ref ringconCreate.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out \ref RingConManuCal
|
||||
*/
|
||||
NX_CONSTEXPR void ringconGetManuCal(RingCon *c, RingConManuCal *out) {
|
||||
*out = c->manu_cal;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref RingConUserCal previously loaded by \ref ringconCreate.
|
||||
* @note The Ring-Con UserCal doesn't seem to be calibrated normally?
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out \ref RingConUserCal
|
||||
*/
|
||||
NX_CONSTEXPR void ringconGetUserCal(RingCon *c, RingConUserCal *out) {
|
||||
*out = c->user_cal;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Updates the \ref RingConUserCal.
|
||||
* @note The input \ref RingConUserCal is used with \ref ringconWriteUserCal, and the output from \ref ringconReadUserCal is verified with the input \ref RingConUserCal. This does not update the \ref RingConUserCal returned by \ref ringconGetUserCal.
|
||||
* @note The Ring-Con UserCal doesn't seem to be calibrated normally?
|
||||
* @param c \ref RingCon
|
||||
* @param[in] cal \ref RingConUserCal
|
||||
*/
|
||||
Result ringconUpdateUserCal(RingCon *c, RingConUserCal cal);
|
||||
|
||||
/**
|
||||
* @brief Reads the \ref RingConFwVersion.
|
||||
* @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetFwVersion instead.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out \ref RingConFwVersion
|
||||
*/
|
||||
Result ringconReadFwVersion(RingCon *c, RingConFwVersion *out);
|
||||
|
||||
/**
|
||||
* @brief Reads the Id.
|
||||
* @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetId instead.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] id_l Id low.
|
||||
* @param[out] id_h Id high.
|
||||
*/
|
||||
Result ringconReadId(RingCon *c, u64 *id_l, u64 *id_h);
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref RingConPollingData. Only returns entries which are new since the last time this was called (or if not previously called, all available entries up to count).
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out Output array of \ref RingConPollingData. Entry order is newest -> oldest.
|
||||
* @param[in] count Total size of the out array in entries, max value is 0x9.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result ringconGetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Uses cmd 0x00020105.
|
||||
* @note Used internally by \ref ringconCreate.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out Output value.
|
||||
*/
|
||||
Result ringconCmdx00020105(RingCon *c, u32 *out);
|
||||
|
||||
/**
|
||||
* @brief Reads the \ref RingConManuCal.
|
||||
* @note Used internally by \ref ringconCreate and \ref ringconReadUnkCal.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out \ref RingConManuCal
|
||||
*/
|
||||
Result ringconReadManuCal(RingCon *c, RingConManuCal *out);
|
||||
|
||||
/**
|
||||
* @brief Gets the unknown value derived from the output of cmd 0x00020504 and \ref ringconReadManuCal.
|
||||
* @note Used internally by \ref ringconCreate.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out Output value.
|
||||
*/
|
||||
Result ringconReadUnkCal(RingCon *c, s16 *out);
|
||||
|
||||
/**
|
||||
* @brief Reads the \ref RingConUserCal.
|
||||
* @note Used internally by \ref ringconCreate and \ref ringconUpdateUserCal.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out \ref RingConUserCal
|
||||
*/
|
||||
Result ringconReadUserCal(RingCon *c, RingConUserCal *out);
|
||||
|
||||
/**
|
||||
* @brief Reads the rep-count for Multitask Mode.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out Output value. Official sw using this clamps the output to range 0-500.
|
||||
* @param[out] data_valid \ref RingConDataValid
|
||||
*/
|
||||
Result ringconReadRepCount(RingCon *c, s32 *out, RingConDataValid *data_valid);
|
||||
|
||||
/**
|
||||
* @brief Reads the total-push-count, for Multitask Mode.
|
||||
* @note Used internally by \ref ringconCreate. Normally \ref ringconGetTotalPushCount should be used instead.
|
||||
* @param c \ref RingCon
|
||||
* @param[out] out Output value.
|
||||
* @param[out] data_valid \ref RingConDataValid
|
||||
*/
|
||||
Result ringconReadTotalPushCount(RingCon *c, s32 *out, RingConDataValid *data_valid);
|
||||
|
||||
/**
|
||||
* @brief This resets the value returned by \ref ringconReadRepCount to 0.
|
||||
* @param c \ref RingCon
|
||||
*/
|
||||
Result ringconResetRepCount(RingCon *c);
|
||||
|
||||
/**
|
||||
* @brief Writes the \ref RingConUserCal.
|
||||
* @note Used internally by \ref ringconUpdateUserCal.
|
||||
* @param c \ref RingCon
|
||||
* @param[in] cal \ref RingConUserCal
|
||||
*/
|
||||
Result ringconWriteUserCal(RingCon *c, RingConUserCal cal);
|
||||
|
@ -6,65 +6,101 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "sm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
#define ACC_USER_LIST_SIZE 8
|
||||
|
||||
typedef enum {
|
||||
AccountServiceType_Application = 0, ///< Initializes acc:u0.
|
||||
AccountServiceType_System = 1, ///< Initializes acc:u1.
|
||||
AccountServiceType_Administrator = 2, ///< Initializes acc:su.
|
||||
} AccountServiceType;
|
||||
|
||||
/// Profile
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s; ///< IProfile
|
||||
} AccountProfile;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 unk_x0;
|
||||
/// Account UserId.
|
||||
typedef struct {
|
||||
u64 uid[2]; ///< UserId. All-zero is invalid / Uid not set. See also \ref accountUidIsValid.
|
||||
} AccountUid;
|
||||
|
||||
/// UserData
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Unknown.
|
||||
u32 iconID; ///< Icon ID. 0 = Mii, the rest are character icon IDs.
|
||||
u8 iconBackgroundColorID; ///< Profile icon background color ID
|
||||
u8 unk_x9[0x7];
|
||||
u8 miiID[0x10]; ///< Some ID related to the Mii? All zeros when a character icon is used.
|
||||
u8 iconBackgroundColorID; ///< Profile icon background color ID
|
||||
u8 unk_x9[0x7]; ///< Unknown.
|
||||
u8 miiID[0x10]; ///< Some ID related to the Mii? All zeros when a character icon is used.
|
||||
u8 unk_x20[0x60]; ///< Usually zeros?
|
||||
} PACKED AccountUserData;
|
||||
} AccountUserData;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u128 userID;
|
||||
/// ProfileBase
|
||||
typedef struct {
|
||||
AccountUid uid; ///< \ref AccountUid
|
||||
u64 lastEditTimestamp; ///< POSIX UTC timestamp, for the last account edit.
|
||||
char username[0x20]; ///< UTF-8 Username.
|
||||
} PACKED AccountProfileBase;
|
||||
char nickname[0x20]; ///< UTF-8 Nickname.
|
||||
} AccountProfileBase;
|
||||
|
||||
Result accountInitialize(void);
|
||||
/// NetworkServiceAccountId
|
||||
typedef struct {
|
||||
u64 id; ///< Id.
|
||||
} AccountNetworkServiceAccountId;
|
||||
|
||||
/// Initialize account.
|
||||
Result accountInitialize(AccountServiceType service_type);
|
||||
|
||||
/// Exit account.
|
||||
void accountExit(void);
|
||||
|
||||
/// Gets the Service object for the actual account service session.
|
||||
Service* accountGetServiceSession(void);
|
||||
|
||||
/// Get the total number of user profiles
|
||||
/// Get the total number of user profiles.
|
||||
Result accountGetUserCount(s32* user_count);
|
||||
|
||||
/**
|
||||
* @brief Get a list of all user IDs. The returned list will never be larger than ACC_USER_LIST_SIZE.
|
||||
* @param userIDs Pointer to array of user IDs.
|
||||
* @param max_userIDs Maximum number of user IDs to return.
|
||||
* @param actual_total The actual total number of user IDs found.
|
||||
* @brief Get a list of all userIds. The returned list will never be larger than ACC_USER_LIST_SIZE.
|
||||
* @param uids Pointer to array of userIds.
|
||||
* @param max_uids Maximum number of userIds to return.
|
||||
* @param actual_total The actual total number of userIds found.
|
||||
*/
|
||||
Result accountListAllUsers(u128* userIDs, size_t max_userIDs, size_t *actual_total);
|
||||
Result accountListAllUsers(AccountUid* uids, s32 max_uids, s32 *actual_total);
|
||||
|
||||
/// Get the userID for the last opened user. The output userID is only valid when the output account_selected==1.
|
||||
Result accountGetLastOpenedUser(u128 *userID, bool *account_selected);
|
||||
/// Get the userId for the last opened user.
|
||||
Result accountGetLastOpenedUser(AccountUid *uid);
|
||||
|
||||
/// Get an AccountProfile for the specified userID.
|
||||
Result accountGetProfile(AccountProfile* out, u128 userID);
|
||||
/// Get an AccountProfile for the specified userId.
|
||||
Result accountGetProfile(AccountProfile* out, AccountUid uid);
|
||||
|
||||
/// IsUserRegistrationRequestPermitted
|
||||
Result accountIsUserRegistrationRequestPermitted(bool *out);
|
||||
|
||||
/// TrySelectUserWithoutInteraction
|
||||
Result accountTrySelectUserWithoutInteraction(AccountUid *uid, bool is_network_service_account_required);
|
||||
|
||||
/// Close the AccountProfile.
|
||||
void accountProfileClose(AccountProfile* profile);
|
||||
|
||||
/// Get \ref AccountUserData and \ref AccountProfileBase for the specified profile, userdata is optional (can be NULL).
|
||||
Result accountProfileGet(AccountProfile* profile, AccountUserData* userdata, AccountProfileBase* profilebase);
|
||||
|
||||
/// Get the icon image size.
|
||||
Result accountProfileGetImageSize(AccountProfile* profile, size_t* image_size);
|
||||
Result accountProfileGetImageSize(AccountProfile* profile, u32* image_size);
|
||||
|
||||
/// Load the JPEG profile icon, valid for both Miis and character icons. The output image_size is the same as the one from \ref accountProfileGetImageSize.
|
||||
Result accountProfileLoadImage(AccountProfile* profile, void* buf, size_t len, size_t* image_size);
|
||||
Result accountProfileLoadImage(AccountProfile* profile, void* buf, size_t len, u32* image_size);
|
||||
|
||||
void accountProfileClose(AccountProfile* profile);
|
||||
|
||||
/// Gets the userID which was selected by the profile-selector applet (if any), prior to launching the currently running Application title.
|
||||
/// Gets the userId which was selected by the profile-selector applet (if any), prior to launching the currently running Application.
|
||||
/// This gets the cached PreselectedUser loaded during accountInitialize, when PreselectedUser is available.
|
||||
Result accountGetPreselectedUser(u128 *userID);
|
||||
Result accountGetPreselectedUser(AccountUid *uid);
|
||||
|
||||
/**
|
||||
* @brief Checks whether the specified \ref AccountUid is valid/set (non-zero).
|
||||
* @param[in] Uid \ref AccountUid
|
||||
*/
|
||||
NX_CONSTEXPR bool accountUidIsValid(const AccountUid *Uid) {
|
||||
return Uid->uid[0]!=0 || Uid->uid[1]!=0;
|
||||
}
|
||||
|
||||
|
@ -1,23 +1,55 @@
|
||||
/**
|
||||
* @file apm.h
|
||||
* @brief Performance management (apm) service IPC wrapper. This is used internally by applet with __nx_applet_PerformanceConfiguration, however if you prefer non-init/exit can be used manually.
|
||||
* @brief Performance management (apm) service IPC wrapper. This is used internally by applet with __nx_applet_PerformanceConfiguration, however if you prefer non-init/exit can be used manually. See also: https://switchbrew.org/wiki/PTM_services#apm:am
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// PerformanceMode
|
||||
typedef enum {
|
||||
ApmPerformanceMode_Invalid = -1, ///< Invalid
|
||||
ApmPerformanceMode_Normal = 0, ///< Normal
|
||||
ApmPerformanceMode_Boost = 1, ///< Boost
|
||||
} ApmPerformanceMode;
|
||||
|
||||
/// CpuBoostMode. With \ref appletSetCpuBoostMode, only values 0/1 are available. This allows using higher clock rates.
|
||||
typedef enum {
|
||||
ApmCpuBoostMode_Disabled = 0, ///< Default, use normal PerformanceConfiguration.
|
||||
ApmCpuBoostMode_Type1 = 1, ///< Use performance configurations 0x92220009 (Docked) and 0x9222000A (Handheld), or 0x9222000B and 0x9222000C. All of these use the normal GPU clock rate for Docked-mode. The latter pair uses the normal CPU clock rate, while the former pair uses the maximum TX1 CPU clock rate. Memory clock rate is the same as normal.
|
||||
ApmCpuBoostMode_Type2 = 2, ///< Use performance configurations 0x9222000B and 0x9222000C.
|
||||
ApmCpuBoostMode_Normal = 0, ///< Default, boost-mode disabled.
|
||||
ApmCpuBoostMode_FastLoad = 1, ///< Boost CPU. Additionally, throttle GPU to minimum. Use performance configurations 0x92220009 (Docked) and 0x9222000A (Handheld), or 0x9222000B and 0x9222000C.
|
||||
ApmCpuBoostMode_Type2 = 2, ///< Conserve power. Only throttle GPU to minimum. Use performance configurations 0x9222000B and 0x9222000C.
|
||||
} ApmCpuBoostMode;
|
||||
|
||||
/// Initialize apm. Used automatically by \ref appletInitialize with AppletType_Application.
|
||||
Result apmInitialize(void);
|
||||
|
||||
/// Exit apm. Used automatically by \ref appletExit with AppletType_Application.
|
||||
void apmExit(void);
|
||||
|
||||
/// Gets the Service object for the actual apm service session.
|
||||
Service* apmGetServiceSession(void);
|
||||
|
||||
Result apmSetPerformanceConfiguration(u32 PerformanceMode, u32 PerformanceConfiguration);
|
||||
Result apmGetPerformanceConfiguration(u32 PerformanceMode, u32 *PerformanceConfiguration);
|
||||
/// Gets the Service object for ISession.
|
||||
Service* apmGetServiceSession_Session(void);
|
||||
|
||||
/**
|
||||
* @brief Gets the current ApmPerformanceMode.
|
||||
* @param[out] out_performanceMode ApmPerformanceMode
|
||||
*/
|
||||
Result apmGetPerformanceMode(ApmPerformanceMode* out_performanceMode);
|
||||
|
||||
/**
|
||||
* @brief Sets the PerformanceConfiguration for the specified PerformanceMode.
|
||||
* @param[in] PerformanceMode \ref ApmPerformanceMode
|
||||
* @param[in] PerformanceConfiguration PerformanceConfiguration
|
||||
*/
|
||||
Result apmSetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 PerformanceConfiguration);
|
||||
|
||||
/**
|
||||
* @brief Gets the PerformanceConfiguration for the specified PerformanceMode.
|
||||
* @param[in] PerformanceMode \ref ApmPerformanceMode
|
||||
* @param[out] PerformanceConfiguration PerformanceConfiguration
|
||||
*/
|
||||
Result apmGetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 *PerformanceConfiguration);
|
||||
|
File diff suppressed because it is too large
Load Diff
115
nx/include/switch/services/async.h
Normal file
115
nx/include/switch/services/async.h
Normal file
@ -0,0 +1,115 @@
|
||||
/**
|
||||
* @file async.h
|
||||
* @brief NS/NIM IAsync* IPC wrapper.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../applets/error.h"
|
||||
#include "../kernel/event.h"
|
||||
|
||||
/// AsyncValue
|
||||
typedef struct {
|
||||
Service s; ///< IAsyncValue
|
||||
Event event; ///< Event with autoclear=false.
|
||||
} AsyncValue;
|
||||
|
||||
/// AsyncResult
|
||||
typedef struct {
|
||||
Service s; ///< IAsyncResult
|
||||
Event event; ///< Event with autoclear=false.
|
||||
} AsyncResult;
|
||||
|
||||
///@name IAsyncValue
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Close a \ref AsyncValue.
|
||||
* @note When the object is initialized, this uses \ref asyncValueCancel then \ref asyncValueWait with timeout=UINT64_MAX.
|
||||
* @param a \ref AsyncValue
|
||||
*/
|
||||
void asyncValueClose(AsyncValue *a);
|
||||
|
||||
/**
|
||||
* @brief Waits for the async operation to finish using the specified timeout.
|
||||
* @param a \ref AsyncValue
|
||||
* @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout.
|
||||
*/
|
||||
Result asyncValueWait(AsyncValue *a, u64 timeout);
|
||||
|
||||
/**
|
||||
* @brief Gets the value size.
|
||||
* @param a \ref AsyncValue
|
||||
* @param[out] size Output size.
|
||||
*/
|
||||
Result asyncValueGetSize(AsyncValue *a, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Gets the value.
|
||||
* @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX.
|
||||
* @param a \ref AsyncValue
|
||||
* @param[out] buffer Output buffer.
|
||||
* @param[in] size Output buffer size.
|
||||
*/
|
||||
Result asyncValueGet(AsyncValue *a, void* buffer, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Cancels the async operation.
|
||||
* @note Used automatically by \ref asyncValueClose.
|
||||
* @param a \ref AsyncValue
|
||||
*/
|
||||
Result asyncValueCancel(AsyncValue *a);
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref ErrorContext.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param a \ref AsyncValue
|
||||
* @param[out] context \ref ErrorContext
|
||||
*/
|
||||
Result asyncValueGetErrorContext(AsyncValue *a, ErrorContext *context);
|
||||
|
||||
///@}
|
||||
|
||||
///@name IAsyncResult
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Close a \ref AsyncResult.
|
||||
* @note When the object is initialized, this uses \ref asyncResultCancel then \ref asyncResultWait with timeout=UINT64_MAX.
|
||||
* @param a \ref AsyncResult
|
||||
*/
|
||||
void asyncResultClose(AsyncResult *a);
|
||||
|
||||
/**
|
||||
* @brief Waits for the async operation to finish using the specified timeout.
|
||||
* @param a \ref AsyncResult
|
||||
* @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout.
|
||||
*/
|
||||
Result asyncResultWait(AsyncResult *a, u64 timeout);
|
||||
|
||||
/**
|
||||
* @brief Gets the Result.
|
||||
* @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX.
|
||||
* @param a \ref AsyncResult
|
||||
*/
|
||||
Result asyncResultGet(AsyncResult *a);
|
||||
|
||||
/**
|
||||
* @brief Cancels the async operation.
|
||||
* @note Used automatically by \ref asyncResultClose.
|
||||
* @param a \ref AsyncResult
|
||||
*/
|
||||
Result asyncResultCancel(AsyncResult *a);
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref ErrorContext.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param a \ref AsyncResult
|
||||
* @param[out] context \ref ErrorContext
|
||||
*/
|
||||
Result asyncResultGetErrorContext(AsyncResult *a, ErrorContext *context);
|
||||
|
||||
///@}
|
||||
|
70
nx/include/switch/services/audctl.h
Normal file
70
nx/include/switch/services/audctl.h
Normal file
@ -0,0 +1,70 @@
|
||||
/**
|
||||
* @file audctl.h
|
||||
* @brief Audio Control IPC wrapper.
|
||||
* @author plutoo
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../kernel/event.h"
|
||||
|
||||
typedef enum {
|
||||
AudioTarget_Invalid = 0,
|
||||
AudioTarget_Speaker = 1,
|
||||
AudioTarget_Headphone = 2,
|
||||
AudioTarget_Tv = 3,
|
||||
AudioTarget_UsbOutputDevice = 4,
|
||||
AudioTarget_Bluetooth = 5,
|
||||
} AudioTarget;
|
||||
|
||||
typedef enum {
|
||||
AudioOutputMode_Invalid = 0,
|
||||
AudioOutputMode_Pcm1ch = 1,
|
||||
AudioOutputMode_Pcm2ch = 2,
|
||||
AudioOutputMode_Pcm6ch = 3,
|
||||
AudioOutputMode_PcmAuto = 4,
|
||||
} AudioOutputMode;
|
||||
|
||||
typedef enum {
|
||||
AudioForceMutePolicy_Disable = 0,
|
||||
AudioForceMutePolicy_SpeakerMuteOnHeadphoneUnplugged = 1,
|
||||
} AudioForceMutePolicy;
|
||||
|
||||
typedef enum {
|
||||
AudioHeadphoneOutputLevelMode_Normal = 0,
|
||||
AudioHeadphoneOutputLevelMode_HighPower = 1,
|
||||
} AudioHeadphoneOutputLevelMode;
|
||||
|
||||
Result audctlInitialize(void);
|
||||
void audctlExit(void);
|
||||
Service* audctlGetServiceSession(void);
|
||||
|
||||
Result audctlGetTargetVolume(s32* volume_out, AudioTarget target);
|
||||
Result audctlSetTargetVolume(AudioTarget target, s32 volume);
|
||||
Result audctlGetTargetVolumeMin(s32* volume_out);
|
||||
Result audctlGetTargetVolumeMax(s32* volume_out);
|
||||
Result audctlIsTargetMute(bool* mute_out, AudioTarget target);
|
||||
Result audctlSetTargetMute(AudioTarget target, bool mute);
|
||||
Result audctlIsTargetConnected(bool* connected_out, AudioTarget target); ///< [1.0.0-17.0.1]
|
||||
Result audctlSetDefaultTarget(AudioTarget target, u64 fade_in_ns, u64 fade_out_ns);
|
||||
Result audctlGetDefaultTarget(AudioTarget* target_out);
|
||||
Result audctlGetAudioOutputMode(AudioOutputMode* mode_out, AudioTarget target);
|
||||
Result audctlSetAudioOutputMode(AudioTarget target, AudioOutputMode mode);
|
||||
Result audctlSetForceMutePolicy(AudioForceMutePolicy policy); ///< [1.0.0-13.2.1]
|
||||
Result audctlGetForceMutePolicy(AudioForceMutePolicy* policy_out); ///< [1.0.0-13.2.1]
|
||||
Result audctlGetOutputModeSetting(AudioOutputMode* mode_out, AudioTarget target);
|
||||
Result audctlSetOutputModeSetting(AudioTarget target, AudioOutputMode mode);
|
||||
Result audctlSetOutputTarget(AudioTarget target);
|
||||
Result audctlSetInputTargetForceEnabled(bool enable);
|
||||
Result audctlSetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode mode); ///< [3.0.0+]
|
||||
Result audctlGetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode* mode_out); ///< [3.0.0+]
|
||||
Result audctlAcquireAudioVolumeUpdateEventForPlayReport(Event* event_out); ///< [3.0.0-13.2.1]
|
||||
Result audctlAcquireAudioOutputDeviceUpdateEventForPlayReport(Event* event_out); ///< [3.0.0-13.2.1]
|
||||
Result audctlGetAudioOutputTargetForPlayReport(AudioTarget* target_out); ///< [3.0.0+]
|
||||
Result audctlNotifyHeadphoneVolumeWarningDisplayedEvent(void); ///< [3.0.0+]
|
||||
Result audctlSetSystemOutputMasterVolume(float volume); ///< [4.0.0+]
|
||||
Result audctlGetSystemOutputMasterVolume(float* volume_out); ///< [4.0.0+]
|
||||
Result audctlGetActiveOutputTarget(AudioTarget* target);
|
@ -1,19 +1,25 @@
|
||||
/**
|
||||
* @file auddev.h
|
||||
* @brief Audio device.
|
||||
* @brief IAudioDevice IPC wrapper.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Initialize IAudioDevice.
|
||||
Result auddevInitialize(void);
|
||||
|
||||
/// Exit IAudioDevice.
|
||||
void auddevExit(void);
|
||||
|
||||
/// Gets the Service object for IAudioDevice.
|
||||
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);
|
||||
|
@ -6,7 +6,9 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef enum {
|
||||
AudioInState_Started = 0,
|
||||
@ -25,10 +27,19 @@ struct AudioInBuffer
|
||||
u64 data_offset; ///< Offset of data inside the buffer. (Unused?)
|
||||
};
|
||||
|
||||
/// Initialize audin.
|
||||
Result audinInitialize(void);
|
||||
|
||||
/// Exit audin.
|
||||
void audinExit(void);
|
||||
|
||||
Result audinListAudioIns(char *DeviceNames, u32 *DeviceNamesCount);
|
||||
/// Gets the Service object for the actual audin service session.
|
||||
Service* audinGetServiceSession(void);
|
||||
|
||||
/// Gets the Service object for IAudioIn.
|
||||
Service* audinGetServiceSession_AudioIn(void);
|
||||
|
||||
Result audinListAudioIns(char *DeviceNames, s32 count, u32 *DeviceNamesCount);
|
||||
Result audinOpenAudioIn(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioInState *State);
|
||||
Result audinGetAudioInState(AudioInState *State);
|
||||
Result audinStartAudioIn(void);
|
||||
@ -52,7 +63,7 @@ Result audinCaptureBuffer(AudioInBuffer *source, AudioInBuffer **released);
|
||||
* @brief Waits for audio capture to finish.
|
||||
* @param released AudioInBuffer to receive the first captured buffer after being released.
|
||||
* @param released_count Pointer to receive the number of captured buffers.
|
||||
* @param timeout Timeout value, use U64_MAX to wait until all finished.
|
||||
* @param timeout Timeout value, use UINT64_MAX to wait until all finished.
|
||||
*/
|
||||
Result audinWaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout);
|
||||
|
||||
|
@ -6,7 +6,9 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef enum {
|
||||
AudioOutState_Started = 0,
|
||||
@ -25,10 +27,19 @@ struct AudioOutBuffer
|
||||
u64 data_offset; ///< Offset of data inside the buffer. (Unused?)
|
||||
};
|
||||
|
||||
/// Initialize audout.
|
||||
Result audoutInitialize(void);
|
||||
|
||||
/// Exit audout.
|
||||
void audoutExit(void);
|
||||
|
||||
Result audoutListAudioOuts(char *DeviceNames, u32 *DeviceNamesCount);
|
||||
/// Gets the Service object for the actual audout service session.
|
||||
Service* audoutGetServiceSession(void);
|
||||
|
||||
/// Gets the Service object for IAudioOut.
|
||||
Service* audoutGetServiceSession_AudioOut(void);
|
||||
|
||||
Result audoutListAudioOuts(char *DeviceNames, s32 count, u32 *DeviceNamesCount);
|
||||
Result audoutOpenAudioOut(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioOutState *State);
|
||||
Result audoutGetAudioOutState(AudioOutState *State);
|
||||
Result audoutStartAudioOut(void);
|
||||
@ -40,6 +51,17 @@ Result audoutAppendAudioOutBuffer(AudioOutBuffer *Buffer);
|
||||
Result audoutGetReleasedAudioOutBuffer(AudioOutBuffer **Buffer, u32 *ReleasedBuffersCount);
|
||||
Result audoutContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer);
|
||||
|
||||
/// Only available with [4.0.0+].
|
||||
Result audoutGetAudioOutBufferCount(u32 *count);
|
||||
/// Only available with [4.0.0+].
|
||||
Result audoutGetAudioOutPlayedSampleCount(u64 *count);
|
||||
/// Only available with [4.0.0+].
|
||||
Result audoutFlushAudioOutBuffers(bool *flushed);
|
||||
/// Only available with [6.0.0+].
|
||||
Result audoutSetAudioOutVolume(float volume);
|
||||
/// Only available with [6.0.0+].
|
||||
Result audoutGetAudioOutVolume(float *volume);
|
||||
|
||||
/**
|
||||
* @brief Submits an audio sample data buffer for playing and waits for it to finish playing.
|
||||
* @brief Uses \ref audoutAppendAudioOutBuffer and \ref audoutWaitPlayFinish internally.
|
||||
@ -52,7 +74,7 @@ Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer **released);
|
||||
* @brief Waits for audio playback to finish.
|
||||
* @param released AudioOutBuffer to receive the first played buffer after being released.
|
||||
* @param released_count Pointer to receive the number of played buffers.
|
||||
* @param timeout Timeout value, use U64_MAX to wait until all finished.
|
||||
* @param timeout Timeout value, use UINT64_MAX to wait until all finished.
|
||||
*/
|
||||
Result audoutWaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout);
|
||||
|
||||
|
50
nx/include/switch/services/audrec.h
Normal file
50
nx/include/switch/services/audrec.h
Normal file
@ -0,0 +1,50 @@
|
||||
/**
|
||||
* @file audrec.h
|
||||
* @brief Audio Recorder IPC wrapper.
|
||||
* @author plutoo
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../kernel/event.h"
|
||||
|
||||
typedef struct {
|
||||
u64 released_ns;
|
||||
u64 next_buffer_ptr;
|
||||
u64 sample_buffer_ptr;
|
||||
u64 sample_buffer_capacity;
|
||||
u64 data_size;
|
||||
u64 data_offset;
|
||||
} FinalOutputRecorderBuffer;
|
||||
|
||||
typedef struct {
|
||||
u32 sample_rate;
|
||||
u32 channel_count;
|
||||
} FinalOutputRecorderParameter;
|
||||
|
||||
typedef struct {
|
||||
u32 sample_rate;
|
||||
u32 channel_count;
|
||||
u32 sample_format;
|
||||
u32 state;
|
||||
} FinalOutputRecorderParameterInternal;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
} AudrecRecorder;
|
||||
|
||||
Result audrecInitialize(void);
|
||||
void audrecExit(void);
|
||||
Service* audrecGetServiceSession(void);
|
||||
|
||||
Result audrecOpenFinalOutputRecorder(AudrecRecorder* recorder_out, FinalOutputRecorderParameter* param_in, u64 aruid, FinalOutputRecorderParameterInternal* param_out);
|
||||
|
||||
Result audrecRecorderStart(AudrecRecorder* recorder);
|
||||
Result audrecRecorderStop(AudrecRecorder* recorder);
|
||||
Result audrecRecorderRegisterBufferEvent(AudrecRecorder* recorder, Event* out_event);
|
||||
Result audrecRecorderAppendFinalOutputRecorderBuffer(AudrecRecorder* recorder, u64 buffer_client_ptr, FinalOutputRecorderBuffer* param);
|
||||
Result audrecRecorderGetReleasedFinalOutputRecorderBuffers(AudrecRecorder* recorder, u64* out_buffers, u64* inout_count, u64* out_released);
|
||||
void audrecRecorderClose(AudrecRecorder* recorder);
|
@ -6,14 +6,9 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../services/sm.h"
|
||||
|
||||
#if __cplusplus >= 201402L
|
||||
#define AUDREN_CONSTEXPR constexpr
|
||||
#else
|
||||
#define AUDREN_CONSTEXPR static inline
|
||||
#endif
|
||||
#include "../sf/service.h"
|
||||
|
||||
#define AUDREN_TIMER_FREQ_HZ 200.0f
|
||||
#define AUDREN_TIMER_PERIOD_MS 5.0f
|
||||
@ -287,12 +282,12 @@ static inline u32 audrenGetRevision(void)
|
||||
return g_audrenRevision;
|
||||
}
|
||||
|
||||
AUDREN_CONSTEXPR int audrenGetMemPoolCount(const AudioRendererConfig* config)
|
||||
NX_CONSTEXPR int audrenGetMemPoolCount(const AudioRendererConfig* config)
|
||||
{
|
||||
return config->num_effects + 4 * config->num_voices;
|
||||
}
|
||||
|
||||
AUDREN_CONSTEXPR size_t audrenGetInputParamSize(const AudioRendererConfig* config)
|
||||
NX_CONSTEXPR size_t audrenGetInputParamSize(const AudioRendererConfig* config)
|
||||
{
|
||||
size_t size = 0;
|
||||
size += sizeof(AudioRendererUpdateDataHeader);
|
||||
@ -307,7 +302,7 @@ AUDREN_CONSTEXPR size_t audrenGetInputParamSize(const AudioRendererConfig* confi
|
||||
return size;
|
||||
}
|
||||
|
||||
AUDREN_CONSTEXPR size_t audrenGetOutputParamSize(const AudioRendererConfig* config)
|
||||
NX_CONSTEXPR size_t audrenGetOutputParamSize(const AudioRendererConfig* config)
|
||||
{
|
||||
size_t size = 0;
|
||||
size += sizeof(AudioRendererUpdateDataHeader);
|
||||
@ -320,9 +315,15 @@ AUDREN_CONSTEXPR size_t audrenGetOutputParamSize(const AudioRendererConfig* conf
|
||||
return size;
|
||||
}
|
||||
|
||||
/// Initialize audren.
|
||||
Result audrenInitialize(const AudioRendererConfig* config);
|
||||
|
||||
/// Exit audren.
|
||||
void audrenExit(void);
|
||||
Service* audrenGetServiceSession(void);
|
||||
|
||||
/// Gets the Service object for IAudioRenderer.
|
||||
Service* audrenGetServiceSession_AudioRenderer(void);
|
||||
|
||||
void audrenWaitFrame(void);
|
||||
Result audrenGetState(u32* out_state);
|
||||
Result audrenRequestUpdateAudioRenderer(const void* in_param_buf, size_t in_param_buf_size, void* out_param_buf, size_t out_param_buf_size, void* perf_buf, size_t perf_buf_size);
|
||||
|
45
nx/include/switch/services/avm.h
Normal file
45
nx/include/switch/services/avm.h
Normal file
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* @file avm.h
|
||||
* @brief AVM services IPC wrapper. Only available on [6.0.0+].
|
||||
* @author Behemoth
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef struct {
|
||||
u64 application_id;
|
||||
u32 version;
|
||||
u32 required;
|
||||
} AvmVersionListEntry;
|
||||
|
||||
typedef struct {
|
||||
u64 application_id;
|
||||
u32 version;
|
||||
} AvmRequiredVersionEntry;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
} AvmVersionListImporter;
|
||||
|
||||
Result avmInitialize(void);
|
||||
void avmExit(void);
|
||||
|
||||
Service *avmGetServiceSession(void);
|
||||
|
||||
Result avmGetHighestAvailableVersion(u64 id_1, u64 id_2, u32 *version);
|
||||
Result avmGetHighestRequiredVersion(u64 id_1, u64 id_2, u32 *version);
|
||||
Result avmGetVersionListEntry(u64 application_id, AvmVersionListEntry *entry);
|
||||
Result avmGetVersionListImporter(AvmVersionListImporter *out);
|
||||
Result avmGetLaunchRequiredVersion(u64 application_id, u32 *version);
|
||||
Result avmUpgradeLaunchRequiredVersion(u64 application_id, u32 version);
|
||||
Result avmPushLaunchVersion(u64 application_id, u32 version);
|
||||
Result avmListVersionList(AvmVersionListEntry *buffer, size_t count, u32 *out);
|
||||
Result avmListRequiredVersion(AvmRequiredVersionEntry *buffer, size_t count, u32 *out);
|
||||
|
||||
void avmVersionListImporterClose(AvmVersionListImporter *srv);
|
||||
Result avmVersionListImporterSetTimestamp(AvmVersionListImporter *srv, u64 timestamp);
|
||||
Result avmVersionListImporterSetData(AvmVersionListImporter *srv, const AvmVersionListEntry *entries, u32 count);
|
||||
Result avmVersionListImporterFlush(AvmVersionListImporter *srv);
|
@ -6,17 +6,23 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef enum {
|
||||
BpcSleepButtonState_Held = 0,
|
||||
BpcSleepButtonState_Released = 1,
|
||||
} BpcSleepButtonState;
|
||||
|
||||
/// Initialize bpc.
|
||||
Result bpcInitialize(void);
|
||||
|
||||
/// Exit bpc.
|
||||
void bpcExit(void);
|
||||
|
||||
/// Gets the Service object for the actual bpc service session.
|
||||
Service* bpcGetServiceSession(void);
|
||||
|
||||
Result bpcShutdownSystem(void);
|
||||
Result bpcRebootSystem(void);
|
||||
Result bpcGetSleepButtonState(BpcSleepButtonState *out);
|
||||
Result bpcGetSleepButtonState(BpcSleepButtonState *out); ///< [2.0.0-13.2.1]
|
||||
Result bpcGetPowerButton(bool* out_is_pushed); ///< [6.0.0+]
|
||||
|
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* @file bsd.h
|
||||
* @brief BSD sockets (bsd:u/s) service IPC wrapper. Please use socket.c instead.
|
||||
* @brief BSD sockets (bsd:u/s) service IPC wrapper. Please use the standard <sys/socket.h> interface instead.
|
||||
* @author plutoo
|
||||
* @author TuxSH
|
||||
* @copyright libnx Authors
|
||||
@ -12,14 +12,17 @@
|
||||
|
||||
#include "../types.h"
|
||||
#include "../kernel/tmem.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Configuration structure for bsdInitalize
|
||||
typedef struct {
|
||||
u32 version; ///< Observed 1 on 2.0 LibAppletWeb, 2 on 3.0.
|
||||
u32 version; ///< Observed 1 on [2.0.0+] LibAppletWeb, 2 on [3.0.0+].
|
||||
|
||||
void *tmem_buffer; ///< User-provided buffer to use as backing for transfer memory. If NULL, a buffer will be allocated automatically. Must be large enough and page-aligned.
|
||||
size_t tmem_buffer_size; ///< Size of the user-provided transfer memory backing buffer. Must be large enough and page-aligned.
|
||||
|
||||
u32 tcp_tx_buf_size; ///< Size of the TCP transfer (send) buffer (initial or fixed).
|
||||
u32 tcp_rx_buf_size; ///< Size of the TCP recieve buffer (initial or fixed).
|
||||
u32 tcp_rx_buf_size; ///< Size of the TCP receive buffer (initial or fixed).
|
||||
u32 tcp_tx_buf_max_size; ///< Maximum size of the TCP transfer (send) buffer. If it is 0, the size of the buffer is fixed to its initial value.
|
||||
u32 tcp_rx_buf_max_size; ///< Maximum size of the TCP receive buffer. If it is 0, the size of the buffer is fixed to its initial value.
|
||||
|
||||
@ -34,10 +37,14 @@ extern __thread int g_bsdErrno; ///< Last errno, per-thread
|
||||
|
||||
/// Fetch the default configuration for bsdInitialize.
|
||||
const BsdInitConfig *bsdGetDefaultInitConfig(void);
|
||||
|
||||
/// Initialize the BSD service.
|
||||
Result bsdInitialize(const BsdInitConfig *config);
|
||||
/// Deinitialize the BSD service.
|
||||
Result bsdInitialize(const BsdInitConfig *config, u32 num_sessions, u32 service_type);
|
||||
|
||||
/// Exit the BSD service.
|
||||
void bsdExit(void);
|
||||
|
||||
/// Gets the Service object for the actual BSD service session.
|
||||
Service* bsdGetServiceSession(void);
|
||||
|
||||
/// Creates a socket.
|
||||
@ -71,10 +78,7 @@ ssize_t bsdRead(int fd, void *buf, size_t count);
|
||||
int bsdClose(int fd);
|
||||
/// Duplicate a socket (bsd:s).
|
||||
int bsdDuplicateSocket(int sockfd);
|
||||
int bsdRecvMMsg(int sockfd, void *buf, size_t size, unsigned int vlen, int flags, struct timespec *timeout);
|
||||
int bsdSendMMsg(int sockfd, void *buf, size_t size, unsigned int vlen, int flags);
|
||||
|
||||
// TODO: Reverse-engineer GetResourceStatistics. Implement sendmmsg/recvmmsg (custom (un)serialization)
|
||||
|
||||
/// Initialize the BSD service using the default configuration.
|
||||
static inline Result bsdInitializeDefault(void) {
|
||||
return bsdInitialize(bsdGetDefaultInitConfig());
|
||||
}
|
||||
// TODO: Reverse-engineer GetResourceStatistics.
|
||||
|
132
nx/include/switch/services/bt.h
Normal file
132
nx/include/switch/services/bt.h
Normal file
@ -0,0 +1,132 @@
|
||||
/**
|
||||
* @file bt.h
|
||||
* @brief Bluetooth user (bt) service IPC wrapper.
|
||||
* @note See also btdev.
|
||||
* @author yellows8, ndeadly
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/btdrv.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Initialize bt. Only available on [5.0.0+].
|
||||
Result btInitialize(void);
|
||||
|
||||
/// Exit bt.
|
||||
void btExit(void);
|
||||
|
||||
/// Gets the Service object for the actual bt service session.
|
||||
Service* btGetServiceSession(void);
|
||||
|
||||
/**
|
||||
* @brief LeClientReadCharacteristic
|
||||
* @note This is essentially the same as \ref btdrvReadGattCharacteristic.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
* @param[in] auth_req \ref BtdrvGattAuthReqType
|
||||
*/
|
||||
Result btLeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req);
|
||||
|
||||
/**
|
||||
* @brief LeClientReadDescriptor
|
||||
* @note This is essentially the same as \ref btdrvReadGattDescriptor.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
* @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
|
||||
* @param[in] auth_req \ref BtdrvGattAuthReqType
|
||||
*/
|
||||
Result btLeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req);
|
||||
|
||||
/**
|
||||
* @brief LeClientWriteCharacteristic
|
||||
* @note This is essentially the same as \ref btdrvWriteGattCharacteristic.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
* @param[in] buffer Input buffer.
|
||||
* @param[in] size Input buffer size, must be <=0x258.
|
||||
* @param[in] auth_req \ref BtdrvGattAuthReqType
|
||||
* @param[in] with_response Whether to use Write-With-Response write type or not
|
||||
*/
|
||||
Result btLeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response);
|
||||
|
||||
/**
|
||||
* @brief LeClientWriteDescriptor
|
||||
* @note This is essentially the same as \ref btdrvWriteGattDescriptor.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
* @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
|
||||
* @param[in] buffer Input buffer.
|
||||
* @param[in] size Input buffer size, must be <=0x258.
|
||||
* @param[in] auth_req \ref BtdrvGattAuthReqType
|
||||
*/
|
||||
Result btLeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req);
|
||||
|
||||
/**
|
||||
* @brief LeClientRegisterNotification
|
||||
* @note This is essentially the same as \ref btdrvRegisterGattNotification.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
*/
|
||||
Result btLeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
|
||||
|
||||
/**
|
||||
* @brief LeClientDeregisterNotification
|
||||
* @note This is essentially the same as \ref btdrvUnregisterGattNotification.
|
||||
* @param[in] connection_handle ConnectionHandle
|
||||
* @param[in] is_primary Is a primary service or not
|
||||
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
|
||||
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
|
||||
*/
|
||||
Result btLeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
|
||||
|
||||
/**
|
||||
* @brief SetLeResponse
|
||||
* @param[in] server_if Server interface ID
|
||||
* @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[in] buffer Input buffer.
|
||||
* @param[in] size Input buffer size, must be <=0x258.
|
||||
*/
|
||||
Result btSetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size);
|
||||
|
||||
/**
|
||||
* @brief LeSendIndication
|
||||
* @param[in] server_if Server interface ID
|
||||
* @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
|
||||
* @param[in] buffer Input buffer.
|
||||
* @param[in] size Input buffer size, clamped to max size 0x258.
|
||||
* @param[in] noconfirm Whether no confirmation is required (notification) or not (indication)
|
||||
*/
|
||||
Result btLeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm);
|
||||
|
||||
/**
|
||||
* @brief GetLeEventInfo
|
||||
* @note This is identical to \ref btdrvGetLeHidEventInfo except different state is used.
|
||||
* @note The state used by this is reset after writing the data to output.
|
||||
* @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo.
|
||||
* @param[in] size Output buffer size.
|
||||
* @param[out] type Output BtdrvBleEventType.
|
||||
*/
|
||||
Result btGetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type);
|
||||
|
||||
/**
|
||||
* @brief RegisterBleEvent
|
||||
* @note This is identical to \ref btdrvRegisterBleHidEvent except different state is used.
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btRegisterBleEvent(Event* out_event);
|
||||
|
1574
nx/include/switch/services/btdrv.h
Normal file
1574
nx/include/switch/services/btdrv.h
Normal file
File diff suppressed because it is too large
Load Diff
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;
|
455
nx/include/switch/services/btdrv_types.h
Normal file
455
nx/include/switch/services/btdrv_types.h
Normal file
@ -0,0 +1,455 @@
|
||||
/**
|
||||
* @file btdrv_types.h
|
||||
* @brief Bluetooth driver (btdrv) service types (see btdrv.h for the rest).
|
||||
* @author yellows8, ndeadly
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "btdrv_ids.h"
|
||||
|
||||
/// BluetoothPropertyType [1.0.0-11.0.1]
|
||||
typedef enum {
|
||||
BtdrvBluetoothPropertyType_Name = 1, ///< Name. String, max length 0xF8 excluding NUL-terminator.
|
||||
BtdrvBluetoothPropertyType_Address = 2, ///< \ref BtdrvAddress
|
||||
BtdrvBluetoothPropertyType_Unknown3 = 3, ///< Only available with \ref btdrvSetAdapterProperty. Unknown, \ref BtdrvAddress.
|
||||
BtdrvBluetoothPropertyType_ClassOfDevice = 5, ///< 3-bytes, Class of Device.
|
||||
BtdrvBluetoothPropertyType_FeatureSet = 6, ///< 1-byte, FeatureSet. The default is value 0x68.
|
||||
} BtdrvBluetoothPropertyType;
|
||||
|
||||
/// AdapterPropertyType [12.0.0+]
|
||||
typedef enum {
|
||||
BtdrvAdapterPropertyType_Address = 0, ///< \ref BtdrvAddress
|
||||
BtdrvAdapterPropertyType_Name = 1, ///< Name. String, max length 0xF8 excluding NUL-terminator.
|
||||
BtdrvAdapterPropertyType_ClassOfDevice = 2, ///< 3-bytes, Class of Device.
|
||||
BtdrvAdapterPropertyType_Unknown3 = 3, ///< Only available with \ref btdrvSetAdapterProperty. Unknown, \ref BtdrvAddress.
|
||||
} BtdrvAdapterPropertyType;
|
||||
|
||||
/// EventType
|
||||
typedef enum {
|
||||
///< BtdrvEventType_* should be used on [12.0.0+]
|
||||
BtdrvEventType_InquiryDevice = 0, ///< Device found during Inquiry.
|
||||
BtdrvEventType_InquiryStatus = 1, ///< Inquiry status changed.
|
||||
BtdrvEventType_PairingPinCodeRequest = 2, ///< Pairing PIN code request.
|
||||
BtdrvEventType_SspRequest = 3, ///< SSP confirm request / SSP passkey notification.
|
||||
BtdrvEventType_Connection = 4, ///< Connection
|
||||
BtdrvEventType_Tsi = 5, ///< SetTsi (\ref btdrvSetTsi)
|
||||
BtdrvEventType_BurstMode = 6, ///< SetBurstMode (\ref btdrvEnableBurstMode)
|
||||
BtdrvEventType_SetZeroRetransmission = 7, ///< \ref btdrvSetZeroRetransmission
|
||||
BtdrvEventType_PendingConnections = 8, ///< \ref btdrvGetPendingConnections
|
||||
BtdrvEventType_MoveToSecondaryPiconet = 9, ///< \ref btdrvMoveToSecondaryPiconet
|
||||
BtdrvEventType_BluetoothCrash = 10, ///< BluetoothCrash
|
||||
|
||||
///< BtdrvEventTypeOld_* should be used on [1.0.0-11.0.1]
|
||||
BtdrvEventTypeOld_Unknown0 = 0, ///< Unused
|
||||
BtdrvEventTypeOld_InquiryDevice = 3, ///< Device found during Inquiry.
|
||||
BtdrvEventTypeOld_InquiryStatus = 4, ///< Inquiry status changed.
|
||||
BtdrvEventTypeOld_PairingPinCodeRequest = 5, ///< Pairing PIN code request.
|
||||
BtdrvEventTypeOld_SspRequest = 6, ///< SSP confirm request / SSP passkey notification.
|
||||
BtdrvEventTypeOld_Connection = 7, ///< Connection
|
||||
BtdrvEventTypeOld_BluetoothCrash = 13, ///< BluetoothCrash
|
||||
} BtdrvEventType;
|
||||
|
||||
/// BtdrvInquiryStatus
|
||||
typedef enum {
|
||||
BtdrvInquiryStatus_Stopped = 0, ///< Inquiry stopped.
|
||||
BtdrvInquiryStatus_Started = 1, ///< Inquiry started.
|
||||
} BtdrvInquiryStatus;
|
||||
|
||||
/// ConnectionEventType
|
||||
typedef enum {
|
||||
BtdrvConnectionEventType_Status = 0, ///< BtdrvEventInfo::connection::status
|
||||
BtdrvConnectionEventType_SspConfirmRequest = 1, ///< SSP confirm request.
|
||||
BtdrvConnectionEventType_Suspended = 2, ///< ACL Link is now Suspended.
|
||||
} BtdrvConnectionEventType;
|
||||
|
||||
/// ExtEventType [1.0.0-11.0.1]
|
||||
typedef enum {
|
||||
BtdrvExtEventType_SetTsi = 0, ///< SetTsi (\ref btdrvSetTsi)
|
||||
BtdrvExtEventType_ExitTsi = 1, ///< ExitTsi (\ref btdrvSetTsi)
|
||||
BtdrvExtEventType_SetBurstMode = 2, ///< SetBurstMode (\ref btdrvEnableBurstMode)
|
||||
BtdrvExtEventType_ExitBurstMode = 3, ///< ExitBurstMode (\ref btdrvEnableBurstMode)
|
||||
BtdrvExtEventType_SetZeroRetransmission = 4, ///< \ref btdrvSetZeroRetransmission
|
||||
BtdrvExtEventType_PendingConnections = 5, ///< \ref btdrvGetPendingConnections
|
||||
BtdrvExtEventType_MoveToSecondaryPiconet = 6, ///< \ref btdrvMoveToSecondaryPiconet
|
||||
} BtdrvExtEventType;
|
||||
|
||||
/// BluetoothHhReportType
|
||||
/// Bit0-1 directly control the HID bluetooth transaction report-type value.
|
||||
/// Bit2-3: these directly control the Parameter Reserved field for SetReport, for GetReport these control the Parameter Reserved and Size bits.
|
||||
typedef enum {
|
||||
BtdrvBluetoothHhReportType_Other = 0, ///< Other
|
||||
BtdrvBluetoothHhReportType_Input = 1, ///< Input
|
||||
BtdrvBluetoothHhReportType_Output = 2, ///< Output
|
||||
BtdrvBluetoothHhReportType_Feature = 3, ///< Feature
|
||||
} BtdrvBluetoothHhReportType;
|
||||
|
||||
/// HidEventType
|
||||
typedef enum {
|
||||
///< BtdrvHidEventType_* should be used on [12.0.0+]
|
||||
BtdrvHidEventType_Connection = 0, ///< Connection. Only used with \ref btdrvGetHidEventInfo.
|
||||
BtdrvHidEventType_Data = 1, ///< DATA report on the Interrupt channel.
|
||||
BtdrvHidEventType_SetReport = 2, ///< Response to SET_REPORT.
|
||||
BtdrvHidEventType_GetReport = 3, ///< Response to GET_REPORT.
|
||||
|
||||
///< BtdrvHidEventTypeOld_* should be used on [1.0.0-11.0.1]
|
||||
BtdrvHidEventTypeOld_Connection = 0, ///< Connection. Only used with \ref btdrvGetHidEventInfo.
|
||||
BtdrvHidEventTypeOld_Data = 4, ///< DATA report on the Interrupt channel.
|
||||
BtdrvHidEventTypeOld_Ext = 7, ///< Response for extensions. Only used with \ref btdrvGetHidEventInfo.
|
||||
BtdrvHidEventTypeOld_SetReport = 8, ///< Response to SET_REPORT.
|
||||
BtdrvHidEventTypeOld_GetReport = 9, ///< Response to GET_REPORT.
|
||||
} BtdrvHidEventType;
|
||||
|
||||
/// HidConnectionStatus [12.0.0+]
|
||||
typedef enum {
|
||||
///< BtdrvHidConnectionStatus_* should be used on [12.0.0+]
|
||||
BtdrvHidConnectionStatus_Closed = 0,
|
||||
BtdrvHidConnectionStatus_Opened = 1,
|
||||
BtdrvHidConnectionStatus_Failed = 2,
|
||||
|
||||
///< BtdrvHidConnectionStatusOld_* should be used on [1.0.0-11.0.1]
|
||||
BtdrvHidConnectionStatusOld_Opened = 0,
|
||||
BtdrvHidConnectionStatusOld_Closed = 2,
|
||||
BtdrvHidConnectionStatusOld_Failed = 8,
|
||||
} BtdrvHidConnectionStatus;
|
||||
|
||||
/// This determines the u16 data to write into a CircularBuffer.
|
||||
typedef enum {
|
||||
BtdrvFatalReason_Invalid = 0, ///< Only for \ref BtdrvEventInfo: invalid.
|
||||
BtdrvFatalReason_Unknown1 = 1, ///< Can only be triggered by \ref btdrvEmulateBluetoothCrash, not triggered by the sysmodule otherwise.
|
||||
BtdrvFatalReason_CommandTimeout = 2, ///< HCI command timeout.
|
||||
BtdrvFatalReason_HardwareError = 3, ///< HCI event HCI_Hardware_Error occurred.
|
||||
BtdrvFatalReason_Enable = 7, ///< Only for \ref BtdrvEventInfo: triggered after enabling bluetooth, depending on the value of a global state field.
|
||||
BtdrvFatalReason_Audio = 9, ///< [12.0.0+] Only for \ref BtdrvEventInfo: triggered by Audio cmds in some cases.
|
||||
} BtdrvFatalReason;
|
||||
|
||||
/// BleEventType
|
||||
typedef enum {
|
||||
BtdrvBleEventType_ClientRegistration = 0, ///< GATT client registration.
|
||||
BtdrvBleEventType_ServerRegistration = 1, ///< GATT server registration.
|
||||
BtdrvBleEventType_ConnectionUpdate = 2, ///< Connection update.
|
||||
BtdrvBleEventType_PreferredConnectionParameters = 3, ///< Preferred connection parameters.
|
||||
BtdrvBleEventType_ClientConnection = 4, ///< GATT client connection.
|
||||
BtdrvBleEventType_ServerConnection = 5, ///< GATT server connection.
|
||||
BtdrvBleEventType_ScanResult = 6, ///< Scan result.
|
||||
BtdrvBleEventType_ScanFilter = 7, ///< Scan filter status.
|
||||
BtdrvBleEventType_ClientNotify = 8, ///< GATT client notify.
|
||||
BtdrvBleEventType_ClientCacheSave = 9, ///< GATT client cache save.
|
||||
BtdrvBleEventType_ClientCacheLoad = 10, ///< GATT client cache load.
|
||||
BtdrvBleEventType_ClientConfigureMtu = 11, ///< GATT client configure MTU.
|
||||
BtdrvBleEventType_ServerAddAttribute = 12, ///< GATT server add attribute.
|
||||
BtdrvBleEventType_ServerAttributeOperation = 13, ///< GATT server attribute operation.
|
||||
} BtdrvBleEventType;
|
||||
|
||||
/// GattAttributeType
|
||||
typedef enum {
|
||||
BtdrvGattAttributeType_IncludedService = 0, ///< Included service
|
||||
BtdrvGattAttributeType_Characteristic = 1, ///< Characteristic
|
||||
BtdrvGattAttributeType_Descriptor = 2, ///< Descriptor
|
||||
BtdrvGattAttributeType_Service = 3, ///< Service
|
||||
} BtdrvGattAttributeType;
|
||||
|
||||
/// GattAttributePermission
|
||||
typedef enum {
|
||||
BtdrvGattAttributePermission_Read = BIT(0),
|
||||
BtdrvGattAttributePermission_ReadEncrypted = BIT(1),
|
||||
BtdrvGattAttributePermission_ReadEncryptedMitm = BIT(2),
|
||||
BtdrvGattAttributePermission_Write = BIT(4),
|
||||
BtdrvGattAttributePermission_WriteEncrypted = BIT(5),
|
||||
BtdrvGattAttributePermission_WriteEncryptedMitm = BIT(6),
|
||||
BtdrvGattAttributePermission_WriteSigned = BIT(7),
|
||||
BtdrvGattAttributePermission_WriteSignedMitm = BIT(8),
|
||||
|
||||
BtdrvGattAttributePermission_ReadAllowed = BtdrvGattAttributePermission_Read | BtdrvGattAttributePermission_ReadEncrypted | BtdrvGattAttributePermission_ReadEncryptedMitm,
|
||||
BtdrvGattAttributePermission_ReadAuthRequired = BtdrvGattAttributePermission_ReadEncrypted,
|
||||
BtdrvGattAttributePermission_ReadMitmRequired = BtdrvGattAttributePermission_ReadEncryptedMitm,
|
||||
BtdrvGattAttributePermission_ReadEncryptedRequired = BtdrvGattAttributePermission_ReadEncrypted | BtdrvGattAttributePermission_ReadEncryptedMitm,
|
||||
|
||||
BtdrvGattAttributePermission_WriteAllowed = BtdrvGattAttributePermission_Write | BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteEncryptedMitm | BtdrvGattAttributePermission_WriteSigned | BtdrvGattAttributePermission_WriteSignedMitm,
|
||||
BtdrvGattAttributePermission_WriteAuthRequired = BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteSigned,
|
||||
BtdrvGattAttributePermission_WriteMitmRequired = BtdrvGattAttributePermission_WriteEncryptedMitm | BtdrvGattAttributePermission_WriteSignedMitm,
|
||||
BtdrvGattAttributePermission_WriteEncryptedRequired = BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteEncryptedMitm,
|
||||
BtdrvGattAttributePermission_WriteSignedRequired = BtdrvGattAttributePermission_WriteSigned | BtdrvGattAttributePermission_WriteSignedMitm,
|
||||
} BtdrvGattAttributePermission;
|
||||
|
||||
/// GattCharacteristicProperty
|
||||
typedef enum {
|
||||
BtdrvGattCharacteristicProperty_Broadcast = BIT(0),
|
||||
BtdrvGattCharacteristicProperty_Read = BIT(1),
|
||||
BtdrvGattCharacteristicProperty_WriteNoResponse = BIT(2),
|
||||
BtdrvGattCharacteristicProperty_Write = BIT(3),
|
||||
BtdrvGattCharacteristicProperty_Notify = BIT(4),
|
||||
BtdrvGattCharacteristicProperty_Indicate = BIT(5),
|
||||
BtdrvGattCharacteristicProperty_Authentication = BIT(6),
|
||||
BtdrvGattCharacteristicProperty_ExtendedProperties = BIT(7),
|
||||
} BtdrvGattCharacteristicProperty;
|
||||
|
||||
/// GattAuthReqType
|
||||
typedef enum {
|
||||
BtdrvGattAuthReqType_None = 0,
|
||||
BtdrvGattAuthReqType_NoMitm = 1,
|
||||
BtdrvGattAuthReqType_Mitm = 2,
|
||||
BtdrvGattAuthReqType_SignedNoMitm = 3,
|
||||
BtdrvGattAuthReqType_SignedMitm = 4,
|
||||
} BtdrvGattAuthReqType;
|
||||
|
||||
/// BtdrvBleAdBit
|
||||
typedef enum {
|
||||
BtdrvBleAdBit_DeviceName = BIT(0),
|
||||
BtdrvBleAdBit_Flags = BIT(1),
|
||||
BtdrvBleAdBit_Manufacturer = BIT(2),
|
||||
BtdrvBleAdBit_TxPower = BIT(3),
|
||||
BtdrvBleAdBit_Service32 = BIT(4),
|
||||
BtdrvBleAdBit_IntRange = BIT(5),
|
||||
BtdrvBleAdBit_Service = BIT(6),
|
||||
BtdrvBleAdBit_ServiceSol = BIT(7),
|
||||
BtdrvBleAdBit_ServiceData = BIT(8),
|
||||
BtdrvBleAdBit_SignData = BIT(9),
|
||||
BtdrvBleAdBit_Service128Sol = BIT(10),
|
||||
BtdrvBleAdBit_Appearance = BIT(11),
|
||||
BtdrvBleAdBit_PublicAddress = BIT(12),
|
||||
BtdrvBleAdBit_RandomAddress = BIT(13),
|
||||
BtdrvBleAdBit_Service32Sol = BIT(14),
|
||||
BtdrvBleAdBit_Proprietary = BIT(15),
|
||||
BtdrvBleAdBit_Service128 = BIT(16),
|
||||
} BtdrvBleAdBit;
|
||||
|
||||
/// BtdrvBleAdFlag
|
||||
typedef enum {
|
||||
BtdrvBleAdFlag_None = 0,
|
||||
BtdrvBleAdFlag_LimitedDiscovery = BIT(0),
|
||||
BtdrvBleAdFlag_GeneralDiscovery = BIT(1),
|
||||
BtdrvBleAdFlag_BrEdrNotSupported = BIT(2),
|
||||
BtdrvBleAdFlag_DualModeControllerSupport = BIT(3),
|
||||
BtdrvBleAdFlag_DualModeHostSupport = BIT(4),
|
||||
} BtdrvBleAdFlag;
|
||||
|
||||
/// AudioEventType
|
||||
typedef enum {
|
||||
BtdrvAudioEventType_None = 0, ///< None
|
||||
BtdrvAudioEventType_Connection = 1, ///< Connection
|
||||
} BtdrvAudioEventType;
|
||||
|
||||
/// AudioOutState
|
||||
typedef enum {
|
||||
BtdrvAudioOutState_Stopped = 0, ///< Stopped
|
||||
BtdrvAudioOutState_Started = 1, ///< Started
|
||||
} BtdrvAudioOutState;
|
||||
|
||||
/// AudioCodec
|
||||
typedef enum {
|
||||
BtdrvAudioCodec_Pcm = 0, ///< Raw PCM
|
||||
} BtdrvAudioCodec;
|
||||
|
||||
/// Address
|
||||
typedef struct {
|
||||
u8 address[0x6]; ///< Address
|
||||
} BtdrvAddress;
|
||||
|
||||
/// ClassOfDevice
|
||||
typedef struct {
|
||||
u8 class_of_device[0x3]; ///< ClassOfDevice
|
||||
} BtdrvClassOfDevice;
|
||||
|
||||
/// AdapterProperty [1.0.0-11.0.1]
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< Same as the data for ::BtdrvBluetoothPropertyType_Address.
|
||||
BtdrvClassOfDevice class_of_device; ///< Same as the data for ::BtdrvBluetoothPropertyType_ClassOfDevice.
|
||||
char name[0xF9]; ///< Same as the data for ::BtdrvBluetoothPropertyType_Name (last byte is not initialized).
|
||||
u8 feature_set; ///< Set to hard-coded value 0x68 (same as the data for ::BtdrvBluetoothPropertyType_FeatureSet).
|
||||
} BtdrvAdapterPropertyOld;
|
||||
|
||||
/// AdapterProperty [12.0.0+]
|
||||
typedef struct {
|
||||
u8 type; ///< \ref BtdrvAdapterPropertyType
|
||||
u8 size; ///< Data size.
|
||||
u8 data[0x100]; ///< Data (above size), as specified by the type.
|
||||
} BtdrvAdapterProperty;
|
||||
|
||||
/// AdapterPropertySet [12.0.0+]
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< Same as the data for ::BtdrvBluetoothPropertyType_Address.
|
||||
BtdrvClassOfDevice class_of_device; ///< Same as the data for ::BtdrvBluetoothPropertyType_ClassOfDevice.
|
||||
char name[0xF9]; ///< Same as the data for ::BtdrvBluetoothPropertyType_Name.
|
||||
} BtdrvAdapterPropertySet;
|
||||
|
||||
/// BluetoothPinCode [1.0.0-11.0.1]
|
||||
typedef struct {
|
||||
char code[0x10]; ///< PinCode
|
||||
} BtdrvBluetoothPinCode;
|
||||
|
||||
/// BtdrvPinCode [12.0.0+]
|
||||
typedef struct {
|
||||
char code[0x10]; ///< PinCode
|
||||
u8 length; ///< Length
|
||||
} BtdrvPinCode;
|
||||
|
||||
/// HidData [1.0.0-8.1.1]
|
||||
typedef struct {
|
||||
u16 size; ///< Size of data.
|
||||
u8 data[0x280]; ///< Data
|
||||
} BtdrvHidData;
|
||||
|
||||
/// HidReport [9.0.0+].
|
||||
typedef struct {
|
||||
u16 size; ///< Size of data.
|
||||
u8 data[0x2BC]; ///< Data
|
||||
} BtdrvHidReport;
|
||||
|
||||
/// PlrStatistics
|
||||
typedef struct {
|
||||
u8 unk_x0[0x84]; ///< Unknown
|
||||
} BtdrvPlrStatistics;
|
||||
|
||||
/// PlrList
|
||||
typedef struct {
|
||||
u8 unk_x0[0xA4]; ///< Unknown
|
||||
} BtdrvPlrList;
|
||||
|
||||
/// ChannelMapList
|
||||
typedef struct {
|
||||
u8 unk_x0[0x88]; ///< Unknown
|
||||
} BtdrvChannelMapList;
|
||||
|
||||
/// GattAttributeUuid
|
||||
typedef struct {
|
||||
u32 size; ///< UUID size, must be 0x2, 0x4, or 0x10.
|
||||
u8 uuid[0x10]; ///< UUID with the above size.
|
||||
} BtdrvGattAttributeUuid;
|
||||
|
||||
/// GattId
|
||||
typedef struct {
|
||||
u8 instance_id; ///< InstanceId
|
||||
u8 pad[3]; ///< Padding
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
} BtdrvGattId;
|
||||
|
||||
/// GattAttribute
|
||||
typedef struct {
|
||||
BtdrvGattId id; ///< \ref BtdrvGattId
|
||||
u16 type; ///< \ref BtdrvGattAttributeType
|
||||
u16 handle;
|
||||
u16 group_end_handle;
|
||||
u8 property; ///< Only used when type is characteristic. \ref BtdrvGattCharacteristicProperty
|
||||
bool is_primary; ///< Only used when type is service
|
||||
} BtdrvGattAttribute;
|
||||
|
||||
/// LeConnectionParams [5.0.0-8.1.1]
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
u16 min_conn_interval; ///< Minimum connection interval
|
||||
u16 max_conn_interval; ///< Maximum connection interval
|
||||
u16 scan_interval; ///< Scan interval
|
||||
u16 scan_window; ///< Scan window
|
||||
u16 slave_latency; ///< Slave latency
|
||||
u16 supervision_tout; ///< Connection supervision timeout multiplier
|
||||
u8 preference; ///< Unused
|
||||
u8 pad; ///< Padding
|
||||
} BtdrvLeConnectionParams;
|
||||
|
||||
/// BleConnectionParameter [9.0.0+]
|
||||
typedef struct {
|
||||
u16 min_conn_interval; ///< Minimum connection interval
|
||||
u16 max_conn_interval; ///< Maximum connection interval
|
||||
u16 scan_interval; ///< Scan interval
|
||||
u16 scan_window; ///< Scan window
|
||||
u16 slave_latency; ///< Slave latency
|
||||
u16 supervision_tout; ///< Connection supervision timeout multiplier
|
||||
} BtdrvBleConnectionParameter;
|
||||
|
||||
/// BtdrvBleAdvertisePacketData
|
||||
typedef struct {
|
||||
u32 adv_data_mask; ///< Bitmask of following AD data to be included in advertising packets \ref BtdrvBleAdBit
|
||||
u8 flag; ///< AD flag value to be advertised \ref BtdrvBleAdFlag. Included with BtdrvBleAdBit_Flags
|
||||
u8 manu_data_len; ///< Size of manu_data below
|
||||
u8 manu_data[0x1F]; ///< Manufacturer-specific data to be advertised. Included with BtdrvBleAdBit_Manufacturer
|
||||
u8 pad[1]; ///< Padding
|
||||
u16 appearance_data; ///< Device appearance data to be advertised \ref BtdrvAppearanceType. Included with BtdrvBleAdBit_Appearance
|
||||
u8 num_service; ///< Number of services in uuid_val array below
|
||||
u8 pad2[3]; ///< Padding
|
||||
BtdrvGattAttributeUuid uuid_val[0x6]; ///< Array of 16-bit UUIDs to be advertised \ref BtdrvGattAttributeUuid. Included with BtdrvBleAdBit_Service
|
||||
u8 service_data_len; ///< Size of service_data below
|
||||
u8 pad3[1]; ///< Padding
|
||||
u16 service_data_uuid; ///< 16-bit UUID of service_data below
|
||||
u8 service_data[0x1F]; ///< Service data to be advertised. Included with BtdrvBleAdBit_ServiceData
|
||||
bool is_scan_rsp; ///< Whether this is an inquiry scan response or advertising data
|
||||
u8 tx_power; ///< Inquiry transmit power to be advertised. Included with BtdrvBleAdBit_TxPower
|
||||
u8 pad4[3]; ///< Padding
|
||||
} BtdrvBleAdvertisePacketData;
|
||||
|
||||
/// BleAdvertisement
|
||||
typedef struct {
|
||||
u8 size; ///< Size of data below.
|
||||
u8 type; ///< \ref BtdrvAdType
|
||||
u8 data[0x1D]; ///< Advertisement data
|
||||
} BtdrvBleAdvertisement;
|
||||
|
||||
/// BleAdvertiseFilter
|
||||
typedef struct {
|
||||
u8 index; ///< Filter index
|
||||
BtdrvBleAdvertisement adv; ///< \ref BtdrvBleAdvertisement
|
||||
u8 mask[0x1D]; ///< Mask for advertisement data above
|
||||
u8 mask_size; ///< Size of mask above.
|
||||
} BtdrvBleAdvertiseFilter;
|
||||
|
||||
/// BleAdvertisePacketParameter
|
||||
typedef struct {
|
||||
u16 company_id;
|
||||
u8 pattern_data[6];
|
||||
} BtdrvBleAdvertisePacketParameter;
|
||||
|
||||
/// BleScanResult
|
||||
typedef struct {
|
||||
u8 unk_x0; ///< Unknown
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
u8 unk_x7[0x139]; ///< Unknown
|
||||
s32 count; ///< Unknown
|
||||
s32 unk_x144; ///< Unknown
|
||||
} BtdrvBleScanResult;
|
||||
|
||||
/// BleConnectionInfo
|
||||
typedef struct {
|
||||
u32 connection_handle; ///< ConnectionHandle, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid.
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
u8 pad[2]; ///< Padding
|
||||
} BtdrvBleConnectionInfo;
|
||||
|
||||
/// LeEventInfo
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Unknown
|
||||
u32 unk_x4; ///< Unknown
|
||||
u8 unk_x8; ///< Unknown
|
||||
u8 pad[3]; ///< Padding
|
||||
BtdrvGattAttributeUuid uuid0; ///< \ref BtdrvGattAttributeUuid
|
||||
BtdrvGattAttributeUuid uuid1; ///< \ref BtdrvGattAttributeUuid
|
||||
BtdrvGattAttributeUuid uuid2; ///< \ref BtdrvGattAttributeUuid
|
||||
u16 size; ///< Size of the below data.
|
||||
u8 data[0x3B6]; ///< Data.
|
||||
} BtdrvLeEventInfo;
|
||||
|
||||
/// BleClientGattOperationInfo
|
||||
typedef struct {
|
||||
u8 unk_x0; ///< Converted from BtdrvLeEventInfo::unk_x0.
|
||||
u8 pad[3]; ///< Padding
|
||||
u32 unk_x4; ///< BtdrvLeEventInfo::unk_x4
|
||||
u8 unk_x8; ///< BtdrvLeEventInfo::unk_x8
|
||||
u8 pad2[3]; ///< Padding
|
||||
BtdrvGattAttributeUuid uuid0; ///< BtdrvLeEventInfo::uuid0
|
||||
BtdrvGattAttributeUuid uuid1; ///< BtdrvLeEventInfo::uuid1
|
||||
BtdrvGattAttributeUuid uuid2; ///< BtdrvLeEventInfo::uuid2
|
||||
u64 size; ///< BtdrvLeEventInfo::size
|
||||
u8 data[0x200]; ///< BtdrvLeEventInfo::data
|
||||
} BtdrvBleClientGattOperationInfo;
|
||||
|
||||
/// PcmParameter
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Must be 0-3. Controls number of channels: 0 = mono, non-zero = stereo.
|
||||
s32 sample_rate; ///< Sample rate. Must be one of the following: 16000, 32000, 44100, 48000.
|
||||
u32 bits_per_sample; ///< Bits per sample. Must be 8 or 16.
|
||||
} BtdrvPcmParameter;
|
||||
|
||||
/// AudioControlButtonState
|
||||
typedef struct {
|
||||
u8 unk_x0[0x10]; ///< Unknown
|
||||
} BtdrvAudioControlButtonState;
|
||||
|
491
nx/include/switch/services/btm.h
Normal file
491
nx/include/switch/services/btm.h
Normal file
@ -0,0 +1,491 @@
|
||||
/**
|
||||
* @file btm.h
|
||||
* @brief btm service IPC wrapper.
|
||||
* @note See also: https://switchbrew.org/wiki/BTM_services
|
||||
* @author yellows8
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/btdrv_types.h"
|
||||
#include "../services/btm_types.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Initialize btm.
|
||||
Result btmInitialize(void);
|
||||
|
||||
/// Exit btm.
|
||||
void btmExit(void);
|
||||
|
||||
/// Gets the Service object for the actual btm service session.
|
||||
Service* btmGetServiceSession(void);
|
||||
|
||||
/**
|
||||
* @brief GetState
|
||||
* @param[out] out \ref BtmState
|
||||
*/
|
||||
Result btmGetState(BtmState *out);
|
||||
|
||||
/**
|
||||
* @brief GetHostDeviceProperty
|
||||
* @param[out] out \ref BtmHostDeviceProperty
|
||||
*/
|
||||
Result btmGetHostDeviceProperty(BtmHostDeviceProperty *out);
|
||||
|
||||
/**
|
||||
* @brief AcquireDeviceConditionEvent
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireDeviceConditionEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief GetDeviceCondition [1.0.0-12.1.0]
|
||||
* @param[out] out \ref BtmDeviceCondition
|
||||
*/
|
||||
Result btmLegacyGetDeviceCondition(BtmDeviceCondition *out);
|
||||
|
||||
/**
|
||||
* @brief GetDeviceCondition [13.0.0+]
|
||||
* @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile.
|
||||
* @param[out] out \ref BtmConnectedDeviceV13
|
||||
* @param[in] count Size of the out array in entries.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmGetDeviceCondition(BtmProfile profile, BtmConnectedDeviceV13 *out, size_t count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief SetBurstMode
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] flag Flag
|
||||
*/
|
||||
Result btmSetBurstMode(BtdrvAddress addr, bool flag);
|
||||
|
||||
/**
|
||||
* @brief SetSlotMode
|
||||
* @param[in] list \ref BtmDeviceSlotModeList
|
||||
*/
|
||||
Result btmSetSlotMode(const BtmDeviceSlotModeList *list);
|
||||
|
||||
/**
|
||||
* @brief SetBluetoothMode
|
||||
* @note Only available on pre-9.0.0.
|
||||
* @param[in] mode \ref BtmBluetoothMode
|
||||
*/
|
||||
Result btmSetBluetoothMode(BtmBluetoothMode mode);
|
||||
|
||||
/**
|
||||
* @brief SetWlanMode
|
||||
* @param[in] mode \ref BtmWlanMode
|
||||
*/
|
||||
Result btmSetWlanMode(BtmWlanMode mode);
|
||||
|
||||
/**
|
||||
* @brief AcquireDeviceInfoEvent
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireDeviceInfoEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief GetDeviceInfo [1.0.0-12.1.0]
|
||||
* @param[out] out \ref BtmDeviceInfoList
|
||||
*/
|
||||
Result btmLegacyGetDeviceInfo(BtmDeviceInfoList *out);
|
||||
|
||||
/**
|
||||
* @brief GetDeviceInfo [13.0.0+]
|
||||
* @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile.
|
||||
* @param[out] out \ref BtmDeviceInfoV13
|
||||
* @param[in] count Size of the out array in entries.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmGetDeviceInfo(BtmProfile profile, BtmDeviceInfoV13 *out, size_t count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AddDeviceInfo
|
||||
* @param[in] info \ref BtmDeviceInfo
|
||||
*/
|
||||
Result btmAddDeviceInfo(const BtmDeviceInfo *info);
|
||||
|
||||
/**
|
||||
* @brief RemoveDeviceInfo
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmRemoveDeviceInfo(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief IncreaseDeviceInfoOrder
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmIncreaseDeviceInfoOrder(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief LlrNotify
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] unk [9.0.0+] Unknown
|
||||
*/
|
||||
Result btmLlrNotify(BtdrvAddress addr, s32 unk);
|
||||
|
||||
/**
|
||||
* @brief EnableRadio
|
||||
*/
|
||||
Result btmEnableRadio(void);
|
||||
|
||||
/**
|
||||
* @brief DisableRadio
|
||||
*/
|
||||
Result btmDisableRadio(void);
|
||||
|
||||
/**
|
||||
* @brief HidDisconnect
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmHidDisconnect(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief HidSetRetransmissionMode
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] list \ref BtmZeroRetransmissionList
|
||||
*/
|
||||
Result btmHidSetRetransmissionMode(BtdrvAddress addr, const BtmZeroRetransmissionList *list);
|
||||
|
||||
/**
|
||||
* @brief AcquireAwakeReqEvent
|
||||
* @note Only available on [2.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireAwakeReqEvent(Event* out_event);
|
||||
|
||||
|
||||
/**
|
||||
* @brief AcquireLlrStateEvent
|
||||
* @note Only available on [4.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireLlrStateEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief IsLlrStarted
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
*/
|
||||
Result btmIsLlrStarted(bool *out);
|
||||
|
||||
/**
|
||||
* @brief EnableSlotSaving
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] flag Flag
|
||||
*/
|
||||
Result btmEnableSlotSaving(bool flag);
|
||||
|
||||
/**
|
||||
* @brief ProtectDeviceInfo
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] flag Flag
|
||||
*/
|
||||
Result btmProtectDeviceInfo(BtdrvAddress addr, bool flag);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleScanEvent
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireBleScanEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanParameterGeneral
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] parameter_id Must be value 0x1 or 0xFFFF.
|
||||
* @param[out] out \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmGetBleScanParameterGeneral(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanParameterSmartDevice
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] parameter_id Must be value 0x2.
|
||||
* @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0.
|
||||
*/
|
||||
Result btmGetBleScanParameterSmartDevice(u16 parameter_id, BtdrvGattAttributeUuid *out);
|
||||
|
||||
/**
|
||||
* @brief StartBleScanForGeneral
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmStartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief StopBleScanForGeneral
|
||||
* @note Only available on [5.1.0+].
|
||||
*/
|
||||
Result btmStopBleScanForGeneral(void);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanResultsForGeneral
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[out] results Output array of \ref BtdrvBleScanResult.
|
||||
* @param[in] count Size of the results array in entries. The max is 10.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmGetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief StartBleScanForPaired
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmStartBleScanForPaired(BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief StopBleScanForPaired
|
||||
* @note Only available on [5.1.0+].
|
||||
*/
|
||||
Result btmStopBleScanForPaired(void);
|
||||
|
||||
/**
|
||||
* @brief StartBleScanForSmartDevice
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
Result btmStartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid);
|
||||
|
||||
/**
|
||||
* @brief StopBleScanForSmartDevice
|
||||
* @note Only available on [5.1.0+].
|
||||
*/
|
||||
Result btmStopBleScanForSmartDevice(void);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanResultsForSmartDevice
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[out] results Output array of \ref BtdrvBleScanResult.
|
||||
* @param[in] count Size of the results array in entries. The max is 10.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmGetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleConnectionEvent
|
||||
* @note Only available on [5.1.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireBleConnectionEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief BleConnect
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note The \ref BtdrvAddress must not be already connected. A maximum of 4 devices can be connected.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmBleConnect(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief BleOverrideConnection
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] id Same as \ref btmBleDisconnect.
|
||||
*/
|
||||
Result btmBleOverrideConnection(u32 id);
|
||||
|
||||
/**
|
||||
* @brief BleDisconnect
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
|
||||
*/
|
||||
Result btmBleDisconnect(u32 connection_handle);
|
||||
|
||||
/**
|
||||
* @brief BleGetConnectionState
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[out] info Output array of \ref BtdrvBleConnectionInfo.
|
||||
* @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmBleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief BleGetGattClientConditionList
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[out] list \ref BtmGattClientConditionList
|
||||
*/
|
||||
Result btmBleGetGattClientConditionList(BtmGattClientConditionList *list);
|
||||
|
||||
/**
|
||||
* @brief AcquireBlePairingEvent
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireBlePairingEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief BlePairDevice
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief BleUnpairDeviceOnBoth
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmBleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief BleUnPairDevice
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmBleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief BleGetPairedAddresses
|
||||
* @note Only available on [5.1.0+].
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
* @param[out] addrs Output array of \ref BtdrvAddress.
|
||||
* @param[in] count Size of the addrs array in entries.
|
||||
* @param[out] total_out Total output entries. The max is 10.
|
||||
*/
|
||||
Result btmBleGetPairedAddresses(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleServiceDiscoveryEvent
|
||||
* @note Only available on [5.1.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireBleServiceDiscoveryEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief GetGattServices
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[out] services Output array of \ref BtmGattService.
|
||||
* @param[in] count Size of the services array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref btmGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid.
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] service \ref BtmGattService
|
||||
* @param[out] flag Whether a \ref BtmGattService was returned.
|
||||
*/
|
||||
Result btmGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref btmGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields.
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] service_handle ServiceHandle
|
||||
* @param[out] services \ref BtmGattService
|
||||
* @param[in] count Size of the services array in entries. The max is 100.
|
||||
* @param[out] out Output value.
|
||||
*/
|
||||
Result btmGetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out);
|
||||
|
||||
/**
|
||||
* @brief This is similar to \ref btmGetGattIncludedServices except this only returns 1 \ref BtmGattService.
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] attribute_handle AttributeHandle
|
||||
* @param[out] service \ref BtmGattService
|
||||
* @param[out] flag Whether a \ref BtmGattService was returned.
|
||||
*/
|
||||
Result btmGetBelongingService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief GetGattCharacteristics
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return.
|
||||
* @param[out] characteristics \ref BtmGattCharacteristic
|
||||
* @param[in] count Size of the characteristics array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmGetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief GetGattDescriptors
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return.
|
||||
* @param[out] descriptors \ref BtmGattDescriptor
|
||||
* @param[in] count Size of the descriptors array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmGetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleMtuConfigEvent
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmAcquireBleMtuConfigEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief ConfigureBleMtu
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[in] mtu MTU
|
||||
*/
|
||||
Result btmConfigureBleMtu(u32 connection_handle, u16 mtu);
|
||||
|
||||
/**
|
||||
* @brief GetBleMtu
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] connection_handle Same as \ref btmBleDisconnect.
|
||||
* @param[out] out Output MTU.
|
||||
*/
|
||||
Result btmGetBleMtu(u32 connection_handle, u16 *out);
|
||||
|
||||
/**
|
||||
* @brief RegisterBleGattDataPath
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] path \ref BtmBleDataPath
|
||||
*/
|
||||
Result btmRegisterBleGattDataPath(const BtmBleDataPath *path);
|
||||
|
||||
/**
|
||||
* @brief UnregisterBleGattDataPath
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] path \ref BtmBleDataPath
|
||||
*/
|
||||
Result btmUnregisterBleGattDataPath(const BtmBleDataPath *path);
|
||||
|
||||
/**
|
||||
* @brief RegisterAppletResourceUserId
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] AppletResourceUserId AppletResourceUserId
|
||||
* @param[in] unk Unknown
|
||||
*/
|
||||
Result btmRegisterAppletResourceUserId(u64 AppletResourceUserId, u32 unk);
|
||||
|
||||
/**
|
||||
* @brief UnregisterAppletResourceUserId
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] AppletResourceUserId AppletResourceUserId
|
||||
*/
|
||||
Result btmUnregisterAppletResourceUserId(u64 AppletResourceUserId);
|
||||
|
||||
/**
|
||||
* @brief SetAppletResourceUserId
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] AppletResourceUserId AppletResourceUserId
|
||||
*/
|
||||
Result btmSetAppletResourceUserId(u64 AppletResourceUserId);
|
||||
|
305
nx/include/switch/services/btm_types.h
Normal file
305
nx/include/switch/services/btm_types.h
Normal file
@ -0,0 +1,305 @@
|
||||
/**
|
||||
* @file btm_types.h
|
||||
* @brief btm service types.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
|
||||
/// BtmState
|
||||
typedef enum {
|
||||
BtmState_NotInitialized = 0, ///< NotInitialized
|
||||
BtmState_RadioOff = 1, ///< RadioOff
|
||||
BtmState_MinorSlept = 2, ///< MinorSlept
|
||||
BtmState_RadioOffMinorSlept = 3, ///< RadioOffMinorSlept
|
||||
BtmState_Slept = 4, ///< Slept
|
||||
BtmState_RadioOffSlept = 5, ///< RadioOffSlept
|
||||
BtmState_Initialized = 6, ///< Initialized
|
||||
BtmState_Working = 7, ///< Working
|
||||
} BtmState;
|
||||
|
||||
/// BluetoothMode
|
||||
typedef enum {
|
||||
BtmBluetoothMode_Dynamic2Slot = 0, ///< Dynamic2Slot
|
||||
BtmBluetoothMode_StaticJoy = 1, ///< StaticJoy
|
||||
} BtmBluetoothMode;
|
||||
|
||||
/// WlanMode
|
||||
typedef enum {
|
||||
BtmWlanMode_Local4 = 0, ///< Local4
|
||||
BtmWlanMode_Local8 = 1, ///< Local8
|
||||
BtmWlanMode_None = 2, ///< None
|
||||
} BtmWlanMode;
|
||||
|
||||
/// TsiMode
|
||||
typedef enum {
|
||||
BtmTsiMode_0Fd3Td3Si10 = 0, ///< 0Fd3Td3Si10
|
||||
BtmTsiMode_1Fd1Td1Si5 = 1, ///< 1Fd1Td1Si5
|
||||
BtmTsiMode_2Fd1Td3Si10 = 2, ///< 2Fd1Td3Si10
|
||||
BtmTsiMode_3Fd1Td5Si15 = 3, ///< 3Fd1Td5Si15
|
||||
BtmTsiMode_4Fd3Td1Si10 = 4, ///< 4Fd3Td1Si10
|
||||
BtmTsiMode_5Fd3Td3Si15 = 5, ///< 5Fd3Td3Si15
|
||||
BtmTsiMode_6Fd5Td1Si15 = 6, ///< 6Fd5Td1Si15
|
||||
BtmTsiMode_7Fd1Td3Si15 = 7, ///< 7Fd1Td3Si15
|
||||
BtmTsiMode_8Fd3Td1Si15 = 8, ///< 8Fd3Td1Si15
|
||||
BtmTsiMode_9Fd1Td1Si10 = 9, ///< 9Fd1Td1Si10
|
||||
BtmTsiMode_10Fd1Td1Si15 = 10, ///< 10Fd1Td1Si15
|
||||
BtmTsiMode_Active = 255, ///< Active
|
||||
} BtmTsiMode;
|
||||
|
||||
/// SlotMode
|
||||
typedef enum {
|
||||
BtmSlotMode_2 = 0, ///< 2
|
||||
BtmSlotMode_4 = 1, ///< 4
|
||||
BtmSlotMode_6 = 2, ///< 6
|
||||
BtmSlotMode_Active = 3, ///< Active
|
||||
} BtmSlotMode;
|
||||
|
||||
/// Profile
|
||||
typedef enum {
|
||||
BtmProfile_None = 0, ///< None
|
||||
BtmProfile_Hid = 1, ///< Hid
|
||||
BtmProfile_Audio = 2, ///< [13.0.0+] Audio
|
||||
} BtmProfile;
|
||||
|
||||
/// BdName
|
||||
typedef struct {
|
||||
char name[0x20]; ///< Name string.
|
||||
} BtmBdName;
|
||||
|
||||
/// ClassOfDevice
|
||||
typedef struct {
|
||||
u8 class_of_device[0x3]; ///< ClassOfDevice
|
||||
} BtmClassOfDevice;
|
||||
|
||||
/// LinkKey
|
||||
typedef struct {
|
||||
u8 link_key[0x10]; ///< LinkKey
|
||||
} BtmLinkKey;
|
||||
|
||||
/// HidDeviceInfo
|
||||
typedef struct {
|
||||
u16 vid; ///< Vid
|
||||
u16 pid; ///< Pid
|
||||
} BtmHidDeviceInfo;
|
||||
|
||||
/// HostDeviceProperty
|
||||
typedef struct {
|
||||
union {
|
||||
struct {
|
||||
BtdrvAddress addr; ///< Same as BtdrvAdapterProperty::addr.
|
||||
BtmClassOfDevice class_of_device; ///< Same as BtdrvAdapterProperty::class_of_device.
|
||||
BtmBdName name; ///< Same as BtdrvAdapterProperty::name (except the last byte which is always zero).
|
||||
u8 feature_set; ///< Same as BtdrvAdapterProperty::feature_set.
|
||||
} v1; ///< [1.0.0-12.1.0]
|
||||
|
||||
struct {
|
||||
BtdrvAddress addr; ///< Same as BtdrvAdapterProperty::addr.
|
||||
BtmClassOfDevice class_of_device; ///< Same as BtdrvAdapterProperty::class_of_device.
|
||||
char name[0xF9]; ///< Same as BtdrvAdapterProperty::name (except the last byte which is always zero).
|
||||
u8 feature_set; ///< Same as BtdrvAdapterProperty::feature_set.
|
||||
} v13; ///< [13.0.0+]
|
||||
};
|
||||
} BtmHostDeviceProperty;
|
||||
|
||||
/// BtmConnectedDevice [1.0.0-12.1.0]
|
||||
typedef struct {
|
||||
BtdrvAddress address;
|
||||
u8 pad[2];
|
||||
u32 unk_x8;
|
||||
char name[0x20];
|
||||
u8 unk_x2C[0x1C];
|
||||
u16 vid;
|
||||
u16 pid;
|
||||
u8 unk_x4C[0x20];
|
||||
} BtmConnectedDeviceV1;
|
||||
|
||||
/// BtmConnectedDevice [13.0.0+]
|
||||
typedef struct {
|
||||
BtdrvAddress address;
|
||||
u8 pad[2];
|
||||
u32 profile; ///< \ref BtmProfile
|
||||
u8 unk_xC[0x40];
|
||||
char name[0x20];
|
||||
u8 unk_x6C[0xD9];
|
||||
u8 pad2[3];
|
||||
} BtmConnectedDeviceV13;
|
||||
|
||||
/// DeviceCondition [1.0.0-5.0.2]
|
||||
typedef struct {
|
||||
u32 unk_x0;
|
||||
u32 unk_x4;
|
||||
u8 unk_x8;
|
||||
u8 unk_x9;
|
||||
u8 max_count;
|
||||
u8 connected_count;
|
||||
BtmConnectedDeviceV1 devices[8];
|
||||
} BtmDeviceConditionV100;
|
||||
|
||||
/// DeviceCondition [5.1.0-7.0.1]
|
||||
typedef struct {
|
||||
u32 unk_x0;
|
||||
u32 unk_x4;
|
||||
u8 unk_x8;
|
||||
u8 unk_x9[2];
|
||||
u8 max_count;
|
||||
u8 connected_count;
|
||||
u8 pad[3];
|
||||
BtmConnectedDeviceV1 devices[8];
|
||||
} BtmDeviceConditionV510;
|
||||
|
||||
/// DeviceCondition [8.0.0-8.1.1]
|
||||
typedef struct {
|
||||
u32 unk_x0;
|
||||
u32 unk_x4;
|
||||
u8 unk_x8;
|
||||
u8 unk_x9;
|
||||
u8 max_count;
|
||||
u8 connected_count;
|
||||
BtmConnectedDeviceV1 devices[8];
|
||||
} BtmDeviceConditionV800;
|
||||
|
||||
/// DeviceCondition [9.0.0-12.1.0]
|
||||
typedef struct {
|
||||
u32 unk_x0;
|
||||
u8 unk_x4;
|
||||
u8 unk_x5;
|
||||
u8 max_count;
|
||||
u8 connected_count;
|
||||
BtmConnectedDeviceV1 devices[8];
|
||||
} BtmDeviceConditionV900;
|
||||
|
||||
/// DeviceCondition [1.0.0-12.1.0]
|
||||
typedef union {
|
||||
BtmDeviceConditionV100 v100;
|
||||
BtmDeviceConditionV510 v510;
|
||||
BtmDeviceConditionV800 v800;
|
||||
BtmDeviceConditionV900 v900;
|
||||
} BtmDeviceCondition;
|
||||
|
||||
/// DeviceSlotMode
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
u8 reserved[2]; ///< Reserved
|
||||
u32 slot_mode; ///< \ref BtmSlotMode
|
||||
} BtmDeviceSlotMode;
|
||||
|
||||
/// DeviceSlotModeList
|
||||
typedef struct {
|
||||
u8 device_count; ///< DeviceCount
|
||||
u8 reserved[3]; ///< Reserved
|
||||
BtmDeviceSlotMode devices[8]; ///< Array of \ref BtmDeviceSlotMode with the above count.
|
||||
} BtmDeviceSlotModeList;
|
||||
|
||||
/// DeviceInfo [1.0.0-12.1.0]
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
BtmClassOfDevice class_of_device; ///< ClassOfDevice
|
||||
BtmBdName name; ///< BdName
|
||||
BtmLinkKey link_key; ///< LinkKey
|
||||
u8 reserved[3]; ///< Reserved
|
||||
u32 profile; ///< \ref BtmProfile
|
||||
union {
|
||||
u8 data[0x4]; ///< Empty (Profile = None)
|
||||
BtmHidDeviceInfo hid_device_info; ///< \ref BtmHidDeviceInfo (Profile = Hid)
|
||||
} profile_info;
|
||||
u8 reserved2[0x1C]; ///< Reserved
|
||||
} BtmDeviceInfoV1;
|
||||
|
||||
/// DeviceInfo [13.0.0+]
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
BtmClassOfDevice class_of_device; ///< ClassOfDevice
|
||||
BtmLinkKey link_key; ///< LinkKey
|
||||
u8 reserved[3]; ///< Reserved
|
||||
u32 profile; ///< \ref BtmProfile
|
||||
union {
|
||||
u8 data[0x4]; ///< Empty (Profile = None)
|
||||
BtmHidDeviceInfo hid_device_info; ///< \ref BtmHidDeviceInfo (Profile = Hid)
|
||||
} profile_info;
|
||||
u8 reserved2[0x1C]; ///< Reserved
|
||||
char name[0xF9]; ///< Name
|
||||
u8 pad[3]; ///< Padding
|
||||
} BtmDeviceInfoV13;
|
||||
|
||||
/// DeviceInfo [1.0.0-13.0.0]
|
||||
typedef union {
|
||||
BtmDeviceInfoV1 v1;
|
||||
BtmDeviceInfoV13 v13;
|
||||
} BtmDeviceInfo;
|
||||
|
||||
/// DeviceInfoList
|
||||
typedef struct {
|
||||
u8 device_count; ///< DeviceCount
|
||||
u8 reserved[3]; ///< Reserved
|
||||
BtmDeviceInfoV1 devices[10]; ///< Array of \ref BtmDeviceInfoV1 with the above count.
|
||||
} BtmDeviceInfoList;
|
||||
|
||||
/// DeviceProperty
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< \ref BtdrvAddress
|
||||
BtmClassOfDevice class_of_device; ///< ClassOfDevice
|
||||
BtmBdName name; ///< BdName
|
||||
} BtmDeviceProperty;
|
||||
|
||||
/// DevicePropertyList
|
||||
typedef struct {
|
||||
u8 device_count; ///< DeviceCount
|
||||
BtmDeviceProperty devices[15]; ///< Array of \ref BtmDeviceProperty.
|
||||
} BtmDevicePropertyList;
|
||||
|
||||
/// ZeroRetransmissionList
|
||||
typedef struct {
|
||||
u8 enabled_report_id_count; ///< EnabledReportIdCount
|
||||
u8 enabled_report_id[0x10]; ///< Array of EnabledReportId.
|
||||
} BtmZeroRetransmissionList;
|
||||
|
||||
/// GattClientConditionList
|
||||
typedef struct {
|
||||
u8 unk_x0[0x74]; ///< Unknown
|
||||
} BtmGattClientConditionList;
|
||||
|
||||
/// GattService
|
||||
typedef struct {
|
||||
u8 unk_x0[0x4]; ///< Unknown
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
u16 handle; ///< Handle
|
||||
u8 unk_x1A[0x2]; ///< Unknown
|
||||
u16 instance_id; ///< InstanceId
|
||||
u16 end_group_handle; ///< EndGroupHandle
|
||||
u8 primary_service; ///< PrimaryService
|
||||
u8 pad[3]; ///< Padding
|
||||
} BtmGattService;
|
||||
|
||||
/// GattCharacteristic
|
||||
typedef struct {
|
||||
u8 unk_x0[0x4]; ///< Unknown
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
u16 handle; ///< Handle
|
||||
u8 unk_x1A[0x2]; ///< Unknown
|
||||
u16 instance_id; ///< InstanceId
|
||||
u8 properties; ///< Properties
|
||||
u8 unk_x1F[0x5]; ///< Unknown
|
||||
} BtmGattCharacteristic;
|
||||
|
||||
/// GattDescriptor
|
||||
typedef struct {
|
||||
u8 unk_x0[0x4]; ///< Unknown
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
u16 handle; ///< Handle
|
||||
u8 unk_x1A[0x6]; ///< Unknown
|
||||
} BtmGattDescriptor;
|
||||
|
||||
/// BleDataPath
|
||||
typedef struct {
|
||||
u8 unk_x0; ///< Unknown
|
||||
u8 pad[3]; ///< Padding
|
||||
BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid
|
||||
} BtmBleDataPath;
|
||||
|
||||
/// AudioDevice
|
||||
typedef struct {
|
||||
BtdrvAddress addr; ///< Device address
|
||||
char name[0xF9]; ///< Device name
|
||||
} BtmAudioDevice;
|
185
nx/include/switch/services/btmsys.h
Normal file
185
nx/include/switch/services/btmsys.h
Normal file
@ -0,0 +1,185 @@
|
||||
/**
|
||||
* @file btmsys.h
|
||||
* @brief btm:sys (btm system) service IPC wrapper.
|
||||
* @author yellows8
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/btdrv_types.h"
|
||||
#include "../services/btm_types.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Initialize btm:sys.
|
||||
Result btmsysInitialize(void);
|
||||
|
||||
/// Exit btm:sys.
|
||||
void btmsysExit(void);
|
||||
|
||||
/// Gets the Service object for the actual btm:sys service session. This object must be closed by the user once finished using cmds with this.
|
||||
Result btmsysGetServiceSession(Service* srv_out);
|
||||
|
||||
/// Gets the Service object for IBtmSystemCore.
|
||||
Service* btmsysGetServiceSession_IBtmSystemCore(void);
|
||||
|
||||
/**
|
||||
* @brief StartGamepadPairing
|
||||
*/
|
||||
Result btmsysStartGamepadPairing(void);
|
||||
|
||||
/**
|
||||
* @brief CancelGamepadPairing
|
||||
*/
|
||||
Result btmsysCancelGamepadPairing(void);
|
||||
|
||||
/**
|
||||
* @brief ClearGamepadPairingDatabase
|
||||
*/
|
||||
Result btmsysClearGamepadPairingDatabase(void);
|
||||
|
||||
/**
|
||||
* @brief GetPairedGamepadCount
|
||||
* @param[out] out Output count.
|
||||
*/
|
||||
Result btmsysGetPairedGamepadCount(u8 *out);
|
||||
|
||||
/**
|
||||
* @brief EnableRadio
|
||||
*/
|
||||
Result btmsysEnableRadio(void);
|
||||
|
||||
/**
|
||||
* @brief DisableRadio
|
||||
*/
|
||||
Result btmsysDisableRadio(void);
|
||||
|
||||
/**
|
||||
* @brief GetRadioOnOff
|
||||
* @param[out] out Output flag.
|
||||
*/
|
||||
Result btmsysGetRadioOnOff(bool *out);
|
||||
|
||||
/**
|
||||
* @brief AcquireRadioEvent
|
||||
* @note Only available on [3.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmsysAcquireRadioEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief AcquireGamepadPairingEvent
|
||||
* @note Only available on [3.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmsysAcquireGamepadPairingEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief IsGamepadPairingStarted
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
*/
|
||||
Result btmsysIsGamepadPairingStarted(bool *out);
|
||||
|
||||
/**
|
||||
* @brief StartAudioDeviceDiscovery
|
||||
* @note Only available on [13.0.0+].
|
||||
*/
|
||||
Result btmsysStartAudioDeviceDiscovery(void);
|
||||
|
||||
/**
|
||||
* @brief StopAudioDeviceDiscovery
|
||||
* @note Only available on [13.0.0+].
|
||||
*/
|
||||
Result btmsysStopAudioDeviceDiscovery(void);
|
||||
|
||||
/**
|
||||
* @brief IsDiscoveryingAudioDevice
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
*/
|
||||
Result btmsysIsDiscoveryingAudioDevice(bool *out);
|
||||
|
||||
/**
|
||||
* @brief GetDiscoveredAudioDevice
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[out] out Output array of \ref BtmAudioDevice.
|
||||
* @param[in] count Size of the out array in entries. The max is 15.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmsysGetDiscoveredAudioDevice(BtmAudioDevice *out, s32 count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireAudioDeviceConnectionEvent
|
||||
* @note Only available on [13.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmsysAcquireAudioDeviceConnectionEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief ConnectAudioDevice
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmsysConnectAudioDevice(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief IsConnectingAudioDevice
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[out] out Output flag.
|
||||
*/
|
||||
Result btmsysIsConnectingAudioDevice(bool *out);
|
||||
|
||||
/**
|
||||
* @brief GetConnectedAudioDevices
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[out] out Output array of \ref BtmAudioDevice.
|
||||
* @param[in] count Size of the out array in entries. The max is 8.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmsysGetConnectedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief DisconnectAudioDevice
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmsysDisconnectAudioDevice(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief AcquirePairedAudioDeviceInfoChangedEvent
|
||||
* @note Only available on [13.0.0+].
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmsysAcquirePairedAudioDeviceInfoChangedEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief GetPairedAudioDevices
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[out] out Output array of \ref BtmAudioDevice.
|
||||
* @param[in] count Size of the out array in entries. The max is 10.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmsysGetPairedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out);
|
||||
|
||||
/**
|
||||
* @brief RemoveAudioDevicePairing
|
||||
* @note Only available on [13.0.0+].
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmsysRemoveAudioDevicePairing(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief RequestAudioDeviceConnectionRejection
|
||||
* @note Only available on [13.0.0+].
|
||||
*/
|
||||
Result btmsysRequestAudioDeviceConnectionRejection(void);
|
||||
|
||||
/**
|
||||
* @brief CancelAudioDeviceConnectionRejection
|
||||
* @note Only available on [13.0.0+].
|
||||
*/
|
||||
Result btmsysCancelAudioDeviceConnectionRejection(void);
|
290
nx/include/switch/services/btmu.h
Normal file
290
nx/include/switch/services/btmu.h
Normal file
@ -0,0 +1,290 @@
|
||||
/**
|
||||
* @file btmu.h
|
||||
* @brief btm:u (btm user) service IPC wrapper.
|
||||
* @note Only available on [5.0.0+].
|
||||
* @note See also btdev.
|
||||
* @note See also: https://switchbrew.org/wiki/BTM_services
|
||||
* @author yellows8
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/btdrv_types.h"
|
||||
#include "../services/btm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Initialize btm:u.
|
||||
Result btmuInitialize(void);
|
||||
|
||||
/// Exit btm:u.
|
||||
void btmuExit(void);
|
||||
|
||||
/// Gets the Service object for the actual btm:u service session. This object must be closed by the user once finished using cmds with this.
|
||||
Result btmuGetServiceSession(Service* srv_out);
|
||||
|
||||
/// Gets the Service object for IBtmUserCore.
|
||||
Service* btmuGetServiceSession_IBtmUserCore(void);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleScanEvent
|
||||
* @note This is similar to \ref btmAcquireBleScanEvent.
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmuAcquireBleScanEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanFilterParameter
|
||||
* @note This is the same as \ref btmGetBleScanParameterGeneral.
|
||||
* @param[in] parameter_id Must be value 0x1 or 0xFFFF.
|
||||
* @param[out] out \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmuGetBleScanFilterParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanFilterParameter2
|
||||
* @note This is the same as \ref btmGetBleScanParameterSmartDevice.
|
||||
* @param[in] parameter_id Must be value 0x2.
|
||||
* @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0.
|
||||
*/
|
||||
Result btmuGetBleScanFilterParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out);
|
||||
|
||||
/**
|
||||
* @brief StartBleScanForGeneral
|
||||
* @note This is similar to \ref btmStartBleScanForGeneral.
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmuStartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief StopBleScanForGeneral
|
||||
* @note This is similar to \ref btmStopBleScanForGeneral.
|
||||
*/
|
||||
Result btmuStopBleScanForGeneral(void);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanResultsForGeneral
|
||||
* @note This is similar to \ref btmGetBleScanResultsForGeneral.
|
||||
* @param[out] results Output array of \ref BtdrvBleScanResult.
|
||||
* @param[in] count Size of the results array in entries. The max is 10.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmuGetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief StartBleScanForPaired
|
||||
* @note This is similar to \ref btmStartBleScanForPaired.
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmuStartBleScanForPaired(BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief StopBleScanForPaired
|
||||
* @note This is similar to \ref btmStopBleScanForPaired.
|
||||
*/
|
||||
Result btmuStopBleScanForPaired(void);
|
||||
|
||||
/**
|
||||
* @brief StartBleScanForSmartDevice
|
||||
* @note This is similar to \ref btmStartBleScanForSmartDevice.
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
*/
|
||||
Result btmuStartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid);
|
||||
|
||||
/**
|
||||
* @brief StopBleScanForSmartDevice
|
||||
* @note This is similar to \ref btmStopBleScanForSmartDevice.
|
||||
*/
|
||||
Result btmuStopBleScanForSmartDevice(void);
|
||||
|
||||
/**
|
||||
* @brief GetBleScanResultsForSmartDevice
|
||||
* @note This is similar to \ref btmGetBleScanResultsForSmartDevice.
|
||||
* @param[out] results Output array of \ref BtdrvBleScanResult.
|
||||
* @param[in] count Size of the results array in entries. The max is 10.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmuGetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleConnectionEvent
|
||||
* @note This is similar to \ref btmAcquireBleConnectionEvent.
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmuAcquireBleConnectionEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief BleConnect
|
||||
* @note This is similar to \ref btmBleConnect.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
*/
|
||||
Result btmuBleConnect(BtdrvAddress addr);
|
||||
|
||||
/**
|
||||
* @brief BleDisconnect
|
||||
* @note This is similar to \ref btmBleDisconnect.
|
||||
* @param[in] connection_handle This must match a BtdrvBleConnectionInfo::connection_handle from \ref btmuBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
|
||||
*/
|
||||
Result btmuBleDisconnect(u32 connection_handle);
|
||||
|
||||
/**
|
||||
* @brief BleGetConnectionState
|
||||
* @note This is similar to \ref btmBleGetConnectionState.
|
||||
* @param[out] info Output array of \ref BtdrvBleConnectionInfo.
|
||||
* @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmuBleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireBlePairingEvent
|
||||
* @note This is similar to \ref btmAcquireBlePairingEvent.
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmuAcquireBlePairingEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief BlePairDevice
|
||||
* @note This is similar to \ref btmBlePairDevice.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmuBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief BleUnPairDevice
|
||||
* @note This is similar to \ref btmBleUnpairDeviceOnBoth.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmuBleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief BleUnPairDevice2
|
||||
* @note This is similar to \ref btmBleUnPairDevice.
|
||||
* @param[in] addr \ref BtdrvAddress
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
*/
|
||||
Result btmuBleUnPairDevice2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
|
||||
|
||||
/**
|
||||
* @brief BleGetPairedDevices
|
||||
* @note This is similar to \ref btmBleGetPairedAddresses.
|
||||
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
|
||||
* @param[out] addrs Output array of \ref BtdrvAddress.
|
||||
* @param[in] count Size of the addrs array in entries.
|
||||
* @param[out] total_out Total output entries. The max is 10.
|
||||
*/
|
||||
Result btmuBleGetPairedDevices(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleServiceDiscoveryEvent
|
||||
* @note This is similar to \ref btmAcquireBleServiceDiscoveryEvent.
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmuAcquireBleServiceDiscoveryEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief GetGattServices
|
||||
* @note This is similar to \ref btmGetGattServices.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[out] services Output array of \ref BtmGattService.
|
||||
* @param[in] count Size of the services array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmuGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref btmuGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid.
|
||||
* @note This is similar to \ref btmGetGattService.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] uuid \ref BtdrvGattAttributeUuid
|
||||
* @param[out] service \ref BtmGattService
|
||||
* @param[out] flag Whether a \ref BtmGattService was returned.
|
||||
*/
|
||||
Result btmuGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref btmuGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields.
|
||||
* @note This is similar to \ref btmGetGattIncludedServices.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] service_handle ServiceHandle
|
||||
* @param[out] services \ref BtmGattService
|
||||
* @param[in] count Size of the services array in entries. The max is 100.
|
||||
* @param[out] out Output value.
|
||||
*/
|
||||
Result btmuGetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out);
|
||||
|
||||
/**
|
||||
* @brief This is similar to \ref btmuGetGattIncludedServices except this only returns 1 \ref BtmGattService.
|
||||
* @note This is similar to \ref btmGetBelongingService.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] attribute_handle AttributeHandle
|
||||
* @param[out] service \ref BtmGattService
|
||||
* @param[out] flag Whether a \ref BtmGattService was returned.
|
||||
*/
|
||||
Result btmuGetBelongingGattService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag);
|
||||
|
||||
/**
|
||||
* @brief GetGattCharacteristics
|
||||
* @note This is similar to \ref btmGetGattCharacteristics.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return.
|
||||
* @param[out] characteristics \ref BtmGattCharacteristic
|
||||
* @param[in] count Size of the characteristics array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmuGetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief GetGattDescriptors
|
||||
* @note This is similar to \ref btmGetGattDescriptors.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return.
|
||||
* @param[out] descriptors \ref BtmGattDescriptor
|
||||
* @param[in] count Size of the descriptors array in entries. The max is 100.
|
||||
* @param[out] total_out Total output entries.
|
||||
*/
|
||||
Result btmuGetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
|
||||
|
||||
/**
|
||||
* @brief AcquireBleMtuConfigEvent
|
||||
* @note This is similar to \ref btmAcquireBleMtuConfigEvent.
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=true.
|
||||
*/
|
||||
Result btmuAcquireBleMtuConfigEvent(Event* out_event);
|
||||
|
||||
/**
|
||||
* @brief ConfigureBleMtu
|
||||
* @note This is similar to \ref btmConfigureBleMtu.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[in] mtu MTU
|
||||
*/
|
||||
Result btmuConfigureBleMtu(u32 connection_handle, u16 mtu);
|
||||
|
||||
/**
|
||||
* @brief GetBleMtu
|
||||
* @note This is similar to \ref btmGetBleMtu.
|
||||
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
|
||||
* @param[out] out Output MTU.
|
||||
*/
|
||||
Result btmuGetBleMtu(u32 connection_handle, u16 *out);
|
||||
|
||||
/**
|
||||
* @brief RegisterBleGattDataPath
|
||||
* @note This is similar to \ref btmRegisterBleGattDataPath.
|
||||
* @param[in] path \ref BtmBleDataPath
|
||||
*/
|
||||
Result btmuRegisterBleGattDataPath(const BtmBleDataPath *path);
|
||||
|
||||
/**
|
||||
* @brief UnregisterBleGattDataPath
|
||||
* @note This is similar to \ref btmUnregisterBleGattDataPath.
|
||||
* @param[in] path \ref BtmBleDataPath
|
||||
*/
|
||||
Result btmuUnregisterBleGattDataPath(const BtmBleDataPath *path);
|
||||
|
24
nx/include/switch/services/capmtp.h
Normal file
24
nx/include/switch/services/capmtp.h
Normal file
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* @file capmtp.h
|
||||
* @brief capmtp service IPC wrapper.
|
||||
* @note Only available on [11.0.0+].
|
||||
* @author Behemoth
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
Result capmtpInitialize(void* mem, size_t size, u32 app_count, u32 max_img, u32 max_vid, const char *other_name);
|
||||
void capmtpExit(void);
|
||||
|
||||
Service* capmtpGetRootServiceSession(void);
|
||||
Service* capmtpGetServiceSession(void);
|
||||
|
||||
Result capmtpStartCommandHandler(void);
|
||||
Result capmtpStopCommandHandler(void);
|
||||
bool capmtpIsRunning(void);
|
||||
Event *capmtpGetConnectionEvent(void);
|
||||
bool capmtpIsConnected(void);
|
||||
Event *capmtpGetScanErrorEvent(void);
|
||||
Result capmtpGetScanError(void);
|
@ -6,28 +6,229 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../services/acc.h"
|
||||
|
||||
/// ImageOrientation
|
||||
typedef enum {
|
||||
AlbumImageOrientation_Unknown0 = 0, ///< Unknown. Default.
|
||||
AlbumImageOrientation_Unknown1 = 1, ///< Unknown.
|
||||
AlbumImageOrientation_Unknown2 = 2, ///< Unknown.
|
||||
AlbumImageOrientation_Unknown3 = 3, ///< Unknown.
|
||||
} AlbumImageOrientation;
|
||||
|
||||
/// AlbumReportOption
|
||||
typedef enum {
|
||||
AlbumReportOption_Disable = 0, ///< Don't display the screenshot-taken Overlay-applet notification.
|
||||
AlbumReportOption_Enable = 1, ///< Display the screenshot-taken Overlay notification.
|
||||
} AlbumReportOption;
|
||||
|
||||
typedef enum {
|
||||
CapsAlbumStorage_Nand = 0, ///< Nand
|
||||
CapsAlbumStorage_Sd = 1, ///< Sd
|
||||
} CapsAlbumStorage;
|
||||
|
||||
/// ContentType
|
||||
typedef enum {
|
||||
CapsContentType_Screenshot = 0, ///< Album screenshots.
|
||||
CapsContentType_Movie = 1, ///< Album videos.
|
||||
CapsContentType_ExtraMovie = 3, ///< Videos recorded by the current host Application via \ref grcCreateMovieMaker.
|
||||
} CapsContentType;
|
||||
|
||||
/// ScreenShotAttribute
|
||||
typedef struct {
|
||||
u32 unk_x0;
|
||||
u8 unk_x4[0x3c];
|
||||
u32 unk_x0; ///< Always set to 0 by official sw.
|
||||
u32 orientation; ///< \ref AlbumImageOrientation
|
||||
u32 unk_x8; ///< Always set to 0 by official sw.
|
||||
u32 unk_xc; ///< Always set to 1 by official sw.
|
||||
u8 unk_x10[0x30]; ///< Always set to 0 by official sw.
|
||||
} CapsScreenShotAttribute;
|
||||
|
||||
/// ScreenShotAttributeForApplication. Only unk_x0 is used by official sw.
|
||||
typedef struct {
|
||||
u32 unk_x0; ///< Unknown.
|
||||
u8 unk_x4; ///< Unknown.
|
||||
u8 unk_x5; ///< Unknown.
|
||||
u8 unk_x6; ///< Unknown.
|
||||
u8 pad; ///< Padding.
|
||||
u32 unk_x8; ///< Unknown.
|
||||
u32 unk_xc; ///< Unknown.
|
||||
u32 unk_x10; ///< Unknown.
|
||||
u32 unk_x14; ///< Unknown.
|
||||
u32 unk_x18; ///< Unknown.
|
||||
u32 unk_x1c; ///< Unknown.
|
||||
u16 unk_x20; ///< Unknown.
|
||||
u16 unk_x22; ///< Unknown.
|
||||
u16 unk_x24; ///< Unknown.
|
||||
u16 unk_x26; ///< Unknown.
|
||||
u8 reserved[0x18]; ///< Always zero.
|
||||
} CapsScreenShotAttributeForApplication;
|
||||
|
||||
/// ScreenShotDecoderFlag
|
||||
typedef enum {
|
||||
CapsScreenShotDecoderFlag_None = 0, ///< No special processing.
|
||||
CapsScreenShotDecoderFlag_EnableFancyUpsampling = BIT(0), ///< See libjpeg-turbo do_fancy_upsampling.
|
||||
CapsScreenShotDecoderFlag_EnableBlockSmoothing = BIT(1), ///< See libjpeg-turbo do_block_smoothing.
|
||||
} CapsScreenShotDecoderFlag;
|
||||
|
||||
/// ScreenShotDecodeOption
|
||||
typedef struct {
|
||||
u64 flags; ///< Bitflags, see \ref CapsScreenShotDecoderFlag.
|
||||
u64 reserved[0x3]; ///< Reserved. Unused by official sw.
|
||||
} CapsScreenShotDecodeOption;
|
||||
|
||||
/// AlbumFileDateTime. This corresponds to each field in the Album entry filename, prior to the "-": "YYYYMMDDHHMMSSII".
|
||||
typedef struct {
|
||||
u16 year; ///< Year.
|
||||
u8 month; ///< Month.
|
||||
u8 day; ///< Day of the month.
|
||||
u8 hour; ///< Hour.
|
||||
u8 minute; ///< Minute.
|
||||
u8 second; ///< Second.
|
||||
u8 id; ///< Unique ID for when there's multiple Album files with the same timestamp.
|
||||
} CapsAlbumFileDateTime;
|
||||
|
||||
/// AlbumEntryId
|
||||
typedef struct {
|
||||
u64 application_id; ///< ApplicationId
|
||||
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
|
||||
u8 storage; ///< \ref CapsAlbumStorage
|
||||
u8 content; ///< \ref CapsAlbumFileContents
|
||||
u8 unknown_12; ///< [19.0.0+]
|
||||
u8 unknown_13; ///< [19.0.0+]
|
||||
u8 pad_x14[0x4]; ///< padding
|
||||
} CapsAlbumFileId;
|
||||
|
||||
/// AlbumEntry
|
||||
typedef struct {
|
||||
u8 unk_x0[0x20];
|
||||
u64 size; ///< Size.
|
||||
CapsAlbumFileId file_id; ///< \ref CapsAlbumFileId
|
||||
} CapsAlbumEntry;
|
||||
|
||||
/// ApplicationAlbumEntry
|
||||
typedef struct {
|
||||
u8 unk_x0[0x20];
|
||||
union {
|
||||
u8 data[0x20]; ///< Data.
|
||||
|
||||
struct {
|
||||
u8 unk_x0[0x20]; ///< aes256 with random key over \ref AlbumEntry.
|
||||
} v0; ///< Pre-7.0.0
|
||||
|
||||
struct {
|
||||
u64 size; ///< size of the entry
|
||||
u64 hash; ///< aes256 with hardcoded key over \ref AlbumEntry.
|
||||
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
|
||||
u8 storage; ///< \ref CapsAlbumStorage
|
||||
u8 content; ///< \ref CapsAlbumFileContents
|
||||
u8 pad_x1a[0x5]; ///< padding
|
||||
u8 unk_x1f; ///< Set to 1 by official software
|
||||
} v1; ///< [7.0.0+]
|
||||
};
|
||||
} CapsApplicationAlbumEntry;
|
||||
|
||||
/// ImageOrientation
|
||||
typedef enum {
|
||||
AlbumImageOrientation_Unknown0 = 0, ///< Unknown.
|
||||
AlbumImageOrientation_Unknown1 = 1, ///< Unknown.
|
||||
AlbumImageOrientation_Unknown2 = 2, ///< Unknown.
|
||||
AlbumImageOrientation_Unknown3 = 3, ///< Unknown.
|
||||
} AlbumImageOrientation;
|
||||
/// ApplicationAlbumFileEntry
|
||||
typedef struct {
|
||||
CapsApplicationAlbumEntry entry; ///< \ref CapsApplicationAlbumEntry
|
||||
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
|
||||
u64 unk_x28; ///< Unknown.
|
||||
} CapsApplicationAlbumFileEntry;
|
||||
|
||||
/// ApplicationData
|
||||
typedef struct {
|
||||
u8 userdata[0x400]; ///< UserData.
|
||||
u32 size; ///< UserData size.
|
||||
} CapsApplicationData;
|
||||
|
||||
/// AlbumFileContents
|
||||
typedef enum {
|
||||
CapsAlbumFileContents_ScreenShot = 0,
|
||||
CapsAlbumFileContents_Movie = 1,
|
||||
CapsAlbumFileContents_ExtraScreenShot = 2,
|
||||
CapsAlbumFileContents_ExtraMovie = 3,
|
||||
} CapsAlbumFileContents;
|
||||
|
||||
typedef enum {
|
||||
CapsAlbumContentsUsageFlag_HasGreaterUsage = BIT(0), ///< Indicates that there are additional files not captured by the count/size fields of CapsAlbumContentsUsage
|
||||
CapsAlbumContentsUsageFlag_IsUnknownContents = BIT(1), ///< Indicates that the file is not a known content type
|
||||
} CapsAlbumContentsUsageFlag;
|
||||
|
||||
typedef struct {
|
||||
s64 count; ///< Count.
|
||||
s64 size; ///< Size. Used storage space.
|
||||
u32 flags; ///< \ref CapsAlbumContentsUsageFlag
|
||||
u8 file_contents; ///< \ref CapsAlbumFileContents
|
||||
u8 pad_x15[0x3]; ///< Unused
|
||||
} CapsAlbumContentsUsage;
|
||||
|
||||
typedef struct {
|
||||
CapsAlbumContentsUsage usages[2]; ///< \ref CapsAlbumContentsUsage
|
||||
} CapsAlbumUsage2;
|
||||
|
||||
typedef struct {
|
||||
CapsAlbumContentsUsage usages[3]; ///< \ref CapsAlbumContentsUsage
|
||||
} CapsAlbumUsage3;
|
||||
|
||||
typedef struct {
|
||||
CapsAlbumContentsUsage usages[16]; ///< \ref CapsAlbumContentsUsage
|
||||
} CapsAlbumUsage16;
|
||||
|
||||
/// UserIdList
|
||||
typedef struct {
|
||||
AccountUid uids[ACC_USER_LIST_SIZE]; ///< \ref AccountUid
|
||||
u8 count; ///< Total userIDs.
|
||||
u8 pad[7]; ///< Padding.
|
||||
} CapsUserIdList;
|
||||
|
||||
/// LoadAlbumScreenShotImageOutputForApplication
|
||||
typedef struct {
|
||||
s64 width; ///< Width. Official sw copies this to a s32 output field.
|
||||
s64 height; ///< Height. Official sw copies this to a s32 output field.
|
||||
CapsScreenShotAttributeForApplication attr; ///< \ref CapsScreenShotAttributeForApplication
|
||||
CapsApplicationData appdata; ///< \ref CapsApplicationData
|
||||
u8 reserved[0xac]; ///< Unused.
|
||||
} CapsLoadAlbumScreenShotImageOutputForApplication;
|
||||
|
||||
/// LoadAlbumScreenShotImageOutput
|
||||
typedef struct {
|
||||
s64 width; ///< Width. Official sw copies this to a s32 output field.
|
||||
s64 height; ///< Height. Official sw copies this to a s32 output field.
|
||||
CapsScreenShotAttribute attr; ///< \ref CapsScreenShotAttribute
|
||||
u8 unk_x50[0x400]; ///< Unused.
|
||||
} CapsLoadAlbumScreenShotImageOutput;
|
||||
|
||||
/// AlbumFileContentsFlag
|
||||
typedef enum {
|
||||
CapsAlbumFileContentsFlag_ScreenShot = BIT(0), ///< Query for ScreenShot files.
|
||||
CapsAlbumFileContentsFlag_Movie = BIT(1), ///< Query for Movie files.
|
||||
} CapsAlbumFileContentsFlag;
|
||||
|
||||
/// AlbumCache
|
||||
typedef struct {
|
||||
u64 count; ///< Count
|
||||
u64 unk_x8; ///< Unknown
|
||||
} CapsAlbumCache;
|
||||
|
||||
/// Gets the ShimLibraryVersion.
|
||||
u64 capsGetShimLibraryVersion(void);
|
||||
|
||||
/// Gets the default start_datetime.
|
||||
static inline CapsAlbumFileDateTime capsGetDefaultStartDateTime(void) {
|
||||
return (CapsAlbumFileDateTime){.year = 1970, .month = 1, .day = 1};
|
||||
}
|
||||
|
||||
/// Gets the default end_datetime.
|
||||
static inline CapsAlbumFileDateTime capsGetDefaultEndDateTime(void) {
|
||||
return (CapsAlbumFileDateTime){.year = 3000, .month = 1, .day = 1};
|
||||
}
|
||||
|
||||
/// Convert a \ref CapsApplicationAlbumFileEntry to \ref CapsApplicationAlbumEntry.
|
||||
static inline void capsConvertApplicationAlbumFileEntryToApplicationAlbumEntry(CapsApplicationAlbumEntry *out, CapsApplicationAlbumFileEntry *in) {
|
||||
*out = in->entry;
|
||||
}
|
||||
|
||||
/// Convert a \ref CapsApplicationAlbumEntry to \ref CapsApplicationAlbumFileEntry. Should only be used on [7.0.0+].
|
||||
static inline void capsConvertApplicationAlbumEntryToApplicationAlbumFileEntry(CapsApplicationAlbumFileEntry *out, CapsApplicationAlbumEntry *in) {
|
||||
out->entry = *in;
|
||||
out->datetime = in->v1.datetime;
|
||||
out->unk_x28 = 0;
|
||||
}
|
||||
|
||||
|
414
nx/include/switch/services/capsa.h
Normal file
414
nx/include/switch/services/capsa.h
Normal file
@ -0,0 +1,414 @@
|
||||
/**
|
||||
* @file capsa.h
|
||||
* @brief Album Accessor (caps:a) service IPC wrapper.
|
||||
* @author Behemoth
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/caps.h"
|
||||
|
||||
/// Initialize caps:a.
|
||||
Result capsaInitialize(void);
|
||||
|
||||
/// Exit caps:a.
|
||||
void capsaExit(void);
|
||||
|
||||
/// Gets the Service for caps:a.
|
||||
Service* capsaGetServiceSession(void);
|
||||
|
||||
/// Gets the Service for IAlbumAccessorSession, only initialized after \ref capsaOpenAlbumMovieStream was used (unaffected by using \ref capsaCloseAlbumMovieStream).
|
||||
Service* capsaGetServiceSession_Accessor(void);
|
||||
|
||||
/**
|
||||
* @brief Gets the amount of files at a AlbumStorage.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[out] count Amount of files.
|
||||
*/
|
||||
Result capsaGetAlbumFileCount(CapsAlbumStorage storage, u64 *count);
|
||||
|
||||
/**
|
||||
* @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage matches the input one.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[out] out Total output entries.
|
||||
* @param[out] entries Output array of \ref CapsAlbumEntry.
|
||||
* @param[in] count Reserved entry count.
|
||||
*/
|
||||
Result capsaGetAlbumFileList(CapsAlbumStorage storage, u64 *out, CapsAlbumEntry *entries, u64 count);
|
||||
|
||||
/**
|
||||
* @brief Loads a file into the specified buffer.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[out] out_size Size of the AlbumFile.
|
||||
* @param[out] filebuf File output buffer.
|
||||
* @param[in] filebuf_size Size of the filebuf.
|
||||
*/
|
||||
Result capsaLoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* filebuf, u64 filebuf_size);
|
||||
|
||||
/**
|
||||
* @brief Deletes an AlbumFile corresponding to the specified \ref CapsAlbumFileId.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
*/
|
||||
Result capsaDeleteAlbumFile(const CapsAlbumFileId *file_id);
|
||||
|
||||
/**
|
||||
* @brief Copies an AlbumFile to the specified \ref CapsAlbumStorage.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] dst_storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capsaStorageCopyAlbumFile(const CapsAlbumFileId *file_id, CapsAlbumStorage dst_storage);
|
||||
|
||||
/**
|
||||
* @brief Gets the mount status of the specified \ref CapsAlbumStorage.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[out] is_mounted Boolean over whether the storage is mounted or not.
|
||||
*/
|
||||
Result capsaIsAlbumMounted(CapsAlbumStorage storage, bool *is_mounted);
|
||||
|
||||
/**
|
||||
* @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[out] out \ref CapsAlbumUsage2
|
||||
*/
|
||||
Result capsaGetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out);
|
||||
|
||||
/**
|
||||
* @brief Gets the size for the specified AlbumFile.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[out] size Size of the file.
|
||||
*/
|
||||
Result capsaGetAlbumFileSize(const CapsAlbumFileId *file_id, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Load the Thumbnail for the specified AlbumFile.
|
||||
* @note Will always be 320x180.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[out] out_size Size of the Thumbnail.
|
||||
* @param[out] image JPEG image output buffer.
|
||||
* @param[in] image_size Image buffer size.
|
||||
*/
|
||||
Result capsaLoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotImage for the specified AlbumFile.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsaLoadAlbumScreenShotImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsaLoadAlbumScreenShotThumbnailImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an ApplicationId.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[out] entry \ref CapsAlbumEntry
|
||||
* @param[in] application_entry \ref CapsApplicationAlbumEntry
|
||||
* @param[in] application_id ApplicationId
|
||||
*/
|
||||
Result capsaGetAlbumEntryFromApplicationAlbumEntry(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry, u64 application_id);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotImage for the specified AlbumFile.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsaLoadAlbumScreenShotImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsaLoadAlbumScreenShotThumbnailImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotImage for the specified AlbumFile.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[out] attr \ref CapsScreenShotAttribute
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsaLoadAlbumScreenShotImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[out] out \ref CapsAlbumUsage3
|
||||
*/
|
||||
Result capsaGetAlbumUsage3(CapsAlbumStorage storage, CapsAlbumUsage3 *out);
|
||||
|
||||
/**
|
||||
* @brief Returns the result for a AlbumStorage mount.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capsaGetAlbumMountResult(CapsAlbumStorage storage);
|
||||
|
||||
/**
|
||||
* @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[in] flags \ref CapsAlbumFileContentsFlag
|
||||
* @param[out] out \ref CapsAlbumUsage16
|
||||
*/
|
||||
Result capsaGetAlbumUsage16(CapsAlbumStorage storage, u8 flags, CapsAlbumUsage16 *out);
|
||||
|
||||
/**
|
||||
* @brief Returns the start and end of the Applet Id range.
|
||||
* @note Only available on [6.0.0+].
|
||||
* @param[out] success Returns bool over whether the call was handled or not.
|
||||
* @param[out] min Mimimum applet id. Always 0x0100000000001000
|
||||
* @param[out] max Maximum applet id. Always 0x0100000000001FFF
|
||||
*/
|
||||
Result capsaGetMinMaxAppletId(bool* success, u64* min, u64* max);
|
||||
|
||||
/**
|
||||
* @brief Gets the amount of files of the specified type at a AlbumStorage.
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[in] flags \ref CapsAlbumFileContentsFlag
|
||||
* @param[out] count Amount of files.
|
||||
*/
|
||||
Result capsaGetAlbumFileCountEx0(CapsAlbumStorage storage, u8 flags, u64 *count);
|
||||
|
||||
/**
|
||||
* @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage and type matches the input one.
|
||||
* @note Only available on [5.0.0+].
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[in] flags \ref CapsAlbumFileContentsFlag
|
||||
* @param[out] out Total output entries.
|
||||
* @param[out] entries Output array of \ref CapsAlbumEntry.
|
||||
* @param[in] count Reserved entry count.
|
||||
*/
|
||||
Result capsaGetAlbumFileListEx0(CapsAlbumStorage storage, u8 flags, u64 *out, CapsAlbumEntry *entries, u64 count);
|
||||
|
||||
/**
|
||||
* @brief Returns the image from the last shown ScreenShot Overlay.
|
||||
* @param[out] file_id \ref CapsAlbumFileId
|
||||
* @param[out] out_size Size of the thumbnail image. Always 0x5100.
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54.
|
||||
*/
|
||||
Result capsaGetLastOverlayScreenShotThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size);
|
||||
|
||||
/**
|
||||
* @brief Returns the image from the last shown Movie Overlay.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[out] file_id \ref CapsAlbumFileId
|
||||
* @param[out] out_size Size of the thumbnail image. Always 0x5100.
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54.
|
||||
*/
|
||||
Result capsaGetLastOverlayMovieThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size);
|
||||
|
||||
/**
|
||||
* @brief Gets the currently set autosaving storage.
|
||||
* @note Wrapper around setsysGetPrimaryAlbumStorage but defaults to NAND if SD isn't available.
|
||||
* @param[out] storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capsaGetAutoSavingStorage(CapsAlbumStorage *storage);
|
||||
|
||||
/**
|
||||
* @brief Gets required size to copy all files from one Storage to another.
|
||||
* @param[in] dst_storage \ref CapsAlbumStorage
|
||||
* @param[in] src_storage \ref CapsAlbumStorage
|
||||
* @param[out] out Required storage space size.
|
||||
*/
|
||||
Result capsaGetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64 *out);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
|
||||
* @note Only available on [3.0.0+].
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[out] attr \ref CapsScreenShotAttribute
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsLoadAlbumScreenShotThumbnailImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotImage for the specified AlbumFile.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption
|
||||
* @param[out] out \ref CapsLoadAlbumScreenShotImageOutput
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsaLoadAlbumScreenShotImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption
|
||||
* @param[out] out \ref CapsLoadAlbumScreenShotImageOutput
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
*/
|
||||
Result capsaLoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size);
|
||||
|
||||
/**
|
||||
* @brief Unmounts the specified AlbumStorage.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capsaForceAlbumUnmounted(CapsAlbumStorage storage);
|
||||
|
||||
/**
|
||||
* @brief Resets mount status for the specified AlbumStorage.
|
||||
* @note Mounts the Storage if available.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capsaResetAlbumMountStatus(CapsAlbumStorage storage);
|
||||
|
||||
/**
|
||||
* @brief Refreshs Album Cache for the specified AlbumStorage.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capsaRefreshAlbumCache(CapsAlbumStorage storage);
|
||||
|
||||
/**
|
||||
* @brief Gets the AlbumCache of the specified AlbumStorage.
|
||||
* @note Stubbed on [4.0.0+].
|
||||
* @note use \ref capsaGetAlbumCacheEx instead.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[out] cache \ref CapsAlbumCache
|
||||
*/
|
||||
Result capsaGetAlbumCache(CapsAlbumStorage storage, CapsAlbumCache *cache);
|
||||
|
||||
/**
|
||||
* @brief Gets the AlbumCache for the specified type of the specified AlbumStorage.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
* @param[in] contents \ref CapsAlbumFileContents
|
||||
* @param[out] cache \ref CapsAlbumCache
|
||||
*/
|
||||
Result capsaGetAlbumCacheEx(CapsAlbumStorage storage, CapsAlbumFileContents contents, CapsAlbumCache *cache);
|
||||
|
||||
/**
|
||||
* @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an AppletResourceUserId.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[out] entry \ref CapsAlbumEntry
|
||||
* @param[in] application_entry \ref CapsApplicationAlbumEntry
|
||||
*/
|
||||
Result capsaGetAlbumEntryFromApplicationAlbumEntryAruid(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry);
|
||||
|
||||
/**
|
||||
* @brief Opens an AlbumMovieStream.
|
||||
* @note This opens IAlbumAccessorSession if not previously opened, it's closed during \ref capsaExit.
|
||||
* @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[out] stream Stream handle.
|
||||
* @param[in] entry \ref CapsAlbumFileId
|
||||
*/
|
||||
Result capsaOpenAlbumMovieStream(u64 *stream, const CapsAlbumFileId *file_id);
|
||||
|
||||
/**
|
||||
* @brief Closes an AlbumMovieStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capsaCloseAlbumMovieStream(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Gets the data size of an AlbumMovieStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] size Size of the actual MP4, without the JPEG at the end.
|
||||
*/
|
||||
Result capsaGetAlbumMovieStreamSize(u64 stream, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Reads data from an AlbumMovieStream.
|
||||
* @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes.
|
||||
* @note When offset(+size) goes beyond the size from \ref capsaGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[out] Output data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
* @param[out] actual_size Actual read size.
|
||||
*/
|
||||
Result capsaReadMovieDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size);
|
||||
|
||||
/**
|
||||
* @brief Gets the BrokenReason for an AlbumMovieStream.
|
||||
* @note Official sw doesn't use this.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capsaGetAlbumMovieReadStreamBrokenReason(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Gets the data size of an Image taken from an AlbumMovieStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] size Expected size of an Image.
|
||||
*/
|
||||
Result capsaGetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Reads data of an Image taken from an AlbumMovieStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[out] Output data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
* @param[out] actual_size Actual read size.
|
||||
*/
|
||||
Result capsaReadImageDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size);
|
||||
|
||||
/**
|
||||
* @brief Gets the file attribute of an AlbumMovieStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] attr \ref CapsScreenShotAttribute
|
||||
*/
|
||||
Result capsaReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attr);
|
340
nx/include/switch/services/capsc.h
Normal file
340
nx/include/switch/services/capsc.h
Normal file
@ -0,0 +1,340 @@
|
||||
/**
|
||||
* @file capsc.h
|
||||
* @brief Album Control (caps:c) service IPC wrapper.
|
||||
* @author Behemoth
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/caps.h"
|
||||
|
||||
typedef struct {
|
||||
u64 application_id;
|
||||
u8 unknown_08;
|
||||
u8 unknown_09;
|
||||
u8 reserved[6];
|
||||
} CapsApplicationId;
|
||||
|
||||
/// Initialize caps:c
|
||||
Result capscInitialize(void);
|
||||
|
||||
/// Exit caps:c.
|
||||
void capscExit(void);
|
||||
|
||||
/// Gets the Service for caps:c.
|
||||
Service* capscGetServiceSession(void);
|
||||
|
||||
/**
|
||||
* @brief Notify the service that a storage is now available.
|
||||
* @note This will result in capsrv mounting the image directory on that storage medium.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capscNotifyAlbumStorageIsAvailable(CapsAlbumStorage storage);
|
||||
|
||||
/**
|
||||
* @brief Notify the service that a storage is now unavailable.
|
||||
* @note This will result in capsrv unmounting the image directory on that storage medium.
|
||||
* @param[in] storage \ref CapsAlbumStorage
|
||||
*/
|
||||
Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage);
|
||||
|
||||
/**
|
||||
* @brief Register an applet for later usage.
|
||||
* @note Called at application launch by the system.
|
||||
* @note Will generate a random AES-256 key for this application for use on Shim-Version 0.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[in] appletResourceUserId AppletResourceUserId.
|
||||
* @param[in] application_id ApplicationId.
|
||||
*/
|
||||
Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id);
|
||||
|
||||
/**
|
||||
* @brief Unregister an applet.
|
||||
* @note Called at application exit by the system.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[in] appletResourceUserId AppletResourceUserId.
|
||||
* @param[in] application_id ApplicationId.
|
||||
*/
|
||||
Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id);
|
||||
|
||||
/**
|
||||
* @brief Get an ApplicationId that corresponds to an AppletResourceUserId.
|
||||
* @note Returns value set by \ref capscRegisterAppletResourceUserId.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[out] application_id ApplicationId.
|
||||
* @param[in] appletResourceUserId AppletResourceUserId.
|
||||
*/
|
||||
Result capscGetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid);
|
||||
|
||||
/**
|
||||
* @brief Checks whether an ApplicationId is registered.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[in] application_id ApplicationId.
|
||||
*/
|
||||
Result capscCheckApplicationIdRegistered(u64 application_id);
|
||||
|
||||
/**
|
||||
* @brief Generate an AlbumFileId based on parameters and current time.
|
||||
* @param[in] application_id ApplicationId.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[in] contents \ref CapsAlbumFileContents
|
||||
* @param[out] file_id \ref CapsAlbumFileId
|
||||
*/
|
||||
Result capscGenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id);
|
||||
|
||||
/**
|
||||
* @brief Generate an ApplicationAlbumEntry based on parameters.
|
||||
* @note Output will be different between Shim Version 0 and 1.
|
||||
* @note Only available on [2.0.0+].
|
||||
* @param[out] appEntry \ref CapsApplicationAlbumEntry
|
||||
* @param[in] entry \ref CapsAlbumEntry
|
||||
* @param[in] application_id ApplicationId.
|
||||
*/
|
||||
Result capscGenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id);
|
||||
|
||||
/**
|
||||
* @brief Save a jpeg image.
|
||||
* @note Only available on [2.0.0-3.0.2].
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] buffer JPEG image buffer.
|
||||
* @param[in] buffer_size Size of the JPEG image.
|
||||
*/
|
||||
Result capscSaveAlbumScreenShotFile(const CapsAlbumFileId *file_id, const void* buffer, u64 buffer_size);
|
||||
|
||||
/**
|
||||
* @brief Save a jpeg image.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @note Version 3 as of [9.1.0].
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] version Revision number.
|
||||
* @param[in] makernote_offset Offset to makernote in JPEG buffer.
|
||||
* @param[in] makernote_size Size of the makernote in JPEG buffer.
|
||||
* @param[in] buffer JPEG image buffer.
|
||||
* @param[in] buffer_size Size of the JPEG image.
|
||||
*/
|
||||
Result capscSaveAlbumScreenShotFileEx(const CapsAlbumFileId *file_id, u64 version, u64 makernote_offset, u64 makernote_size, const void* buffer, u64 buffer_size);
|
||||
|
||||
/**
|
||||
* @brief Sets thumbnail data for the last taken screenshot.
|
||||
* @note 96×54 Image will get saved.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] image RGBA8 image buffer.
|
||||
* @param[in] image_size size of the RGBA8 image buffer.
|
||||
*/
|
||||
Result capscSetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size);
|
||||
|
||||
/**
|
||||
* @brief Sets thumbnail data for the last recorded movie.
|
||||
* @note Only availabe on [4.0.0+].
|
||||
* @note 96×54 Image will get saved.
|
||||
* @param[in] file_id \ref CapsAlbumFileId
|
||||
* @param[in] image RGBA8 image buffer.
|
||||
* @param[in] image_size size of the RGBA8 image buffer.
|
||||
*/
|
||||
Result capscSetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size);
|
||||
|
||||
/**
|
||||
* @brief Opens an AlbumMovieReadStream.
|
||||
* @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capscExit.
|
||||
* @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[out] stream Stream handle.
|
||||
* @param[in] entry \ref CapsAlbumFileId
|
||||
*/
|
||||
Result capscOpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id);
|
||||
|
||||
/**
|
||||
* @brief Closes an AlbumMovieReadStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscCloseAlbumMovieStream(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Gets the data size of an AlbumMovieReadStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] size Size of the actual MP4, without the JPEG at the end.
|
||||
*/
|
||||
Result capscGetAlbumMovieStreamSize(u64 stream, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Reads data from an AlbumMovieReadStream.
|
||||
* @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes.
|
||||
* @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[out] Output data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
* @param[out] actual_size Actual read size.
|
||||
*/
|
||||
Result capscReadMovieDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size);
|
||||
|
||||
/**
|
||||
* @brief Gets the BrokenReason for an AlbumMovieReadStream.
|
||||
* @note Official sw doesn't use this.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscGetAlbumMovieReadStreamBrokenReason(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Gets the data size of an Image taken from an AlbumMovieReadStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] size Expected size of an Image.
|
||||
*/
|
||||
Result capscGetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Reads data of an Image taken from an AlbumMovieReadStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[out] buffer Output data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
* @param[out] actual_size Actual read size.
|
||||
*/
|
||||
Result capscReadImageDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size);
|
||||
|
||||
/**
|
||||
* @brief Gets the file attribute of an AlbumMovieReadStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] attr \ref CapsScreenShotAttribute
|
||||
*/
|
||||
Result capscReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attribute);
|
||||
|
||||
/**
|
||||
* @brief Opens an AlbumMovieWriteStream.
|
||||
* @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capsaExit.
|
||||
* @note Up to 2 streams can be open at the same time.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[out] stream Stream handle.
|
||||
* @param[in] entry \ref CapsAlbumFileId
|
||||
*/
|
||||
Result capscOpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_id);
|
||||
|
||||
/**
|
||||
* @brief Finish write to AlbumMovieWriteStream.
|
||||
* @note Copies file from save to destination storage and deletes the temporary file.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscFinishAlbumMovieWriteStream(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Closes a finished AlbumMovieWriteStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscCommitAlbumMovieWriteStream(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Closes an AlbumMovieWriteStream in any state.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscDiscardAlbumMovieWriteStream(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Closes an AlbumMovieWriteStream in any state without deleting the temporary file.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscDiscardAlbumMovieWriteStreamNoDelete(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Closes a finished AlbumMovieWriteStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] entry \ref CapsAlbumEntry
|
||||
*/
|
||||
Result capscCommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry);
|
||||
|
||||
/**
|
||||
* @brief Start AlbumMovieWriteStream data section.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscStartAlbumMovieWriteStreamDataSection(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief End AlbumMovieWriteStream data section.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscEndAlbumMovieWriteStreamDataSection(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Start AlbumMovieWriteStream meta section.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscStartAlbumMovieWriteStreamMetaSection(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief End AlbumMovieWriteStream meta section.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscEndAlbumMovieWriteStreamMetaSection(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Reads data from an AlbumMovieWriteStream.
|
||||
* @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes.
|
||||
* @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[out] buffer Output data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
* @param[out] actual_size Actual read size.
|
||||
*/
|
||||
Result capscReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size);
|
||||
|
||||
/**
|
||||
* @brief Write data to an AlbumMovieWriteStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[in] buffer Input data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
*/
|
||||
Result capscWriteDataToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size);
|
||||
|
||||
/**
|
||||
* @brief Write meta data to an AlbumMovieWriteStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[in] buffer Input data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
*/
|
||||
Result capscWriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size);
|
||||
|
||||
/**
|
||||
* @brief Gets the BrokenReason for an AlbumMovieWriteStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capscGetAlbumMovieWriteStreamBrokenReason(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Gets the data size of an AlbumMovieWriteStream.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] size Size of the data section.
|
||||
*/
|
||||
Result capscGetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Sets the data size of an AlbumMovieWriteStream.
|
||||
* @note Must not be bigger than 2GiB.
|
||||
* @note Only available on [4.0.0+].
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] size Size of the data section.
|
||||
*/
|
||||
Result capscSetAlbumMovieWriteStreamDataSize(u64 stream, u64 size);
|
63
nx/include/switch/services/capsdc.h
Normal file
63
nx/include/switch/services/capsdc.h
Normal file
@ -0,0 +1,63 @@
|
||||
/**
|
||||
* @file capsdc.h
|
||||
* @brief Jpeg Decoder (caps:dc) service IPC wrapper. Only available on [4.0.0+].
|
||||
* @note Only holds one session that is occupied by capsrv.
|
||||
* @author Behemoth
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/caps.h"
|
||||
|
||||
/// Initialize caps:dc
|
||||
Result capsdcInitialize(void);
|
||||
|
||||
/// Exit caps:dc.
|
||||
void capsdcExit(void);
|
||||
|
||||
/// Gets the Service for caps:dc.
|
||||
Service* capsdcGetServiceSession(void);
|
||||
|
||||
/**
|
||||
* @brief Decodes a jpeg buffer into RGBX.
|
||||
* @param[in] width Image width.
|
||||
* @param[in] height Image height.
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption.
|
||||
* @param[in] jpeg Jpeg image input buffer.
|
||||
* @param[in] jpeg_size Input image buffer size.
|
||||
* @param[out] out_image RGBA8 image output buffer.
|
||||
* @param[in] out_image_size Output image buffer size, should be at least large enough for RGBA8 width x height.
|
||||
*/
|
||||
Result capsdcDecodeJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_image, size_t out_image_size);
|
||||
|
||||
/**
|
||||
* @brief Shrinks a jpeg's dimensions by 2.
|
||||
* @note Tries to compress with jpeg quality in this order: 98, 95, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0.
|
||||
* @note Only available on [17.0.0+].
|
||||
* @param[in] width Input image width.
|
||||
* @param[in] height Input image width.
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption.
|
||||
* @param[in] jpeg Jpeg image input buffer.
|
||||
* @param[in] jpeg_size Input image buffer size.
|
||||
* @param[out] out_jpeg Jpeg image output buffer
|
||||
* @param[in] out_jpeg_size Output image buffer size.
|
||||
* @param[out] out_result_size size of the resulting JPEG.
|
||||
*/
|
||||
Result capsdcShrinkJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size);
|
||||
|
||||
/**
|
||||
* @brief Shrinks a jpeg.
|
||||
* @note Fails if the scaled size is larger than the original or the output buffer isn't large enough.
|
||||
* @note Only available on [19.0.0+].
|
||||
* @param[in] scaled_width Wanted image width.
|
||||
* @param[in] scaled_height Wanted image width.
|
||||
* @param[in] jpeg_quality has to be in range 0-100.
|
||||
* @param[in] opts \ref CapsScreenShotDecodeOption.
|
||||
* @param[in] jpeg Jpeg image input buffer.
|
||||
* @param[in] jpeg_size Input image buffer size.
|
||||
* @param[out] out_jpeg Jpeg image output buffer
|
||||
* @param[in] out_jpeg_size Output image buffer size.
|
||||
* @param[out] out_result_size size of the resulting jpeg.
|
||||
*/
|
||||
Result capsdcShrinkJpegEx(u32 scaled_width, u32 scaled_height, u32 jpeg_quality, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size);
|
@ -6,26 +6,69 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../services/caps.h"
|
||||
#include "../sf/service.h"
|
||||
#include "vi.h"
|
||||
|
||||
/// Initialize caps:sc. Only available on 2.0.0+.
|
||||
#define CAPSSC_JPEG_BUFFER_SIZE 0x80000
|
||||
|
||||
/// Initialize caps:sc. Only available on [2.0.0+].
|
||||
Result capsscInitialize(void);
|
||||
|
||||
/// Exit caps:sc.
|
||||
void capsscExit(void);
|
||||
|
||||
/// Gets the Service for caps:sc.
|
||||
Service* capsscGetServiceSession(void);
|
||||
|
||||
/**
|
||||
* @brief This takes a screenshot, with the screenshot being written into the output buffer.
|
||||
* @note Not available with 5.0.0+ (stubbed).
|
||||
* @note Not available with [5.0.0+] (stubbed).
|
||||
* @note buffer_index and buffer_count correspond to buffers with size 0x384000(1280*720*4). These must not be negative.
|
||||
* @param buf Output buffer containing the RGBA8 image.
|
||||
* @param size Size of buf, should be 0x384000(1280*720*4) * buffer_count.
|
||||
* @param inval Value 0 can be used for this.
|
||||
* @param layer_stack \ref ViLayerStack
|
||||
* @param width Image width, must be 1280.
|
||||
* @param height Image height, must be 720.
|
||||
* @param buffer_count Total number of output image buffers.
|
||||
* @param buffer_index Starting image buffer index. Must be < buffer_count.
|
||||
* @param timeout Timeout in nanoseconds. A default value of 100000000 can be used.
|
||||
*/
|
||||
Result capsscCaptureScreenshot(void* buf, size_t size, u32 inval, u64 width, u64 height, s64 buffer_count, s64 buffer_index, u64 timeout);
|
||||
Result capsscCaptureRawImageWithTimeout(void* buf, size_t size, ViLayerStack layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, s64 timeout);
|
||||
|
||||
/**
|
||||
* @brief This takes a raw screenshot, with the screenshot being held until \ref capsscCloseRawScreenShotReadStream is called.
|
||||
* @note Only available on [3.0.0+]. Requires debug mode.
|
||||
* @param out_size Pointer to write the size of the captured raw image to. Always 0x384000(1280*720*4).
|
||||
* @param out_width Pointer to write the width of the captured raw image to. Always 1280.
|
||||
* @param out_height Pointer to write the height of the captured raw image to. Always 720.
|
||||
* @param layer_stack \ref ViLayerStack
|
||||
* @param timeout Timeout in nanoseconds.
|
||||
*/
|
||||
Result capsscOpenRawScreenShotReadStream(u64 *out_size, u64 *out_width, u64 *out_height, ViLayerStack layer_stack, s64 timeout);
|
||||
|
||||
/**
|
||||
* @brief Discards a stream opened by \ref capsscOpenRawScreenShotReadStream.
|
||||
* @note Only available on [3.0.0+]. Requires debug mode.
|
||||
*/
|
||||
Result capsscCloseRawScreenShotReadStream(void);
|
||||
|
||||
/**
|
||||
* @brief Reads from a stream opened by \ref capsscOpenRawScreenShotReadStream.
|
||||
* @note Only available on [3.0.0+]. Requires debug mode.
|
||||
* @param bytes_read Pointer to write the amounts of bytes written to buffer.
|
||||
* @param buf Output buffer containing the RGBA8 image.
|
||||
* @param size Size of buf.
|
||||
* @param offset Offset in image where read should start.
|
||||
*/
|
||||
Result capsscReadRawScreenShotReadStream(u64 *bytes_read, void* buf, size_t size, u64 offset);
|
||||
|
||||
/**
|
||||
* @brief This takes a screenshot, with the screenshot being written as jpeg into the output buffer.
|
||||
* @note Only available on [9.0.0+]. Requires debug mode before [10.0.0].
|
||||
* @param out_jpeg_size Pointer to write the size of the captured jpeg to.
|
||||
* @param jpeg_buf Output buffer containing the JPEG image.
|
||||
* @param jpeg_buf_size Size of jpeg_buf, official software uses 0x80000.
|
||||
* @param layer_stack \ref ViLayerStack
|
||||
* @param timeout Timeout in nanoseconds.
|
||||
*/
|
||||
Result capsscCaptureJpegScreenShot(u64* out_jpeg_size, void* jpeg_buf, size_t jpeg_buf_size, ViLayerStack layer_stack, s64 timeout);
|
@ -6,17 +6,89 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/acc.h"
|
||||
#include "../services/caps.h"
|
||||
|
||||
/// Initialize caps:su. Only available on 4.0.0+.
|
||||
/// Initialize caps:su. Only available on [4.0.0+].
|
||||
Result capssuInitialize(void);
|
||||
|
||||
/// Exit caps:su.
|
||||
void capssuExit(void);
|
||||
|
||||
/// Gets the Service for caps:su.
|
||||
Service* capssuGetServiceSession(void);
|
||||
|
||||
/// Same as \ref capssuSaveScreenShotEx0, except this uses an all-zero CapsScreenShotAttribute where the first u32 is set to attr_val. attr_val can be zero.
|
||||
Result capssuSaveScreenShot(const void* buffer, size_t size, u32 unk, u32 attr_val, CapsApplicationAlbumEntry *out);
|
||||
/**
|
||||
* @brief This is a wrapper for \ref capssuSaveScreenShotEx0.
|
||||
* @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1.
|
||||
* @param[in] buffer RGBA8 1280x720 image buffer.
|
||||
* @param[in] size Size of the buffer.
|
||||
* @param[in] reportoption \ref AlbumReportOption
|
||||
* @param[in] orientation \ref AlbumImageOrientation
|
||||
* @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL.
|
||||
*/
|
||||
Result capssuSaveScreenShot(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, CapsApplicationAlbumEntry *out);
|
||||
|
||||
/// Saves an Album screenshot using the specified gfx data in buffer (1280x720 RGBA8), size must be at least 0x384000. unk can be zero.
|
||||
Result capssuSaveScreenShotEx0(const void* buffer, size_t size, CapsScreenShotAttribute *attr, u32 unk, CapsApplicationAlbumEntry *out);
|
||||
/**
|
||||
* @brief Similar to \ref capssuSaveScreenShot, except this is a wrapper for \ref capssuSaveScreenShotEx1.
|
||||
* @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1.
|
||||
* @note Only available on [8.0.0+].
|
||||
* @param[in] buffer RGBA8 1280x720 image data buffer.
|
||||
* @param[in] size Size of the buffer.
|
||||
* @param[in] reportoption \ref AlbumReportOption
|
||||
* @param[in] orientation \ref AlbumImageOrientation
|
||||
* @param[in] userdata Input UserData buffer. If NULL, the \ref CapsApplicationData will be empty.
|
||||
* @param[in] userdata_size Input UserData size, must be within bounds for CapsApplicationData::userdata. If 0, the \ref CapsApplicationData will be empty.
|
||||
* @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL.
|
||||
*/
|
||||
Result capssuSaveScreenShotWithUserData(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const void* userdata, size_t userdata_size, CapsApplicationAlbumEntry *out);
|
||||
|
||||
/**
|
||||
* @brief Similar to \ref capssuSaveScreenShot, except this is a wrapper for \ref capssuSaveScreenShotEx2.
|
||||
* @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1.
|
||||
* @note Only available on [6.0.0+].
|
||||
* @param[in] buffer RGBA8 1280x720 image data buffer.
|
||||
* @param[in] size Size of the buffer.
|
||||
* @param[in] reportoption \ref AlbumReportOption
|
||||
* @param[in] orientation \ref AlbumImageOrientation
|
||||
* @param[in] uids Input array of \ref AccountUid. If NULL, the \ref CapsUserIdList will be empty.
|
||||
* @param[in] uid_count Size of the uids array in entries, must be within bounds for CapsUserIdList::uids. If 0, the \ref CapsUserIdList will be empty.
|
||||
* @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL.
|
||||
*/
|
||||
Result capssuSaveScreenShotWithUserIds(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const AccountUid* uids, size_t uid_count, CapsApplicationAlbumEntry *out);
|
||||
|
||||
/**
|
||||
* @brief Saves an Album screenshot using the specified gfx data in the buffer, with the specified \ref CapsScreenShotAttribute.
|
||||
* @param[in] buffer RGBA8 1280x720 image data buffer.
|
||||
* @param[in] size Size of the buffer, must be at least 0x384000.
|
||||
* @param[in] attr \ref CapsScreenShotAttribute
|
||||
* @param[in] reportoption \ref AlbumReportOption
|
||||
* @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL.
|
||||
*/
|
||||
Result capssuSaveScreenShotEx0(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationAlbumEntry *out);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref capssuSaveScreenShotEx0, except this allows specifying the \ref CapsApplicationData.
|
||||
* @note Only available on [8.0.0+].
|
||||
* @param[in] buffer RGBA8 1280x720 image data buffer.
|
||||
* @param[in] size Size of the buffer, must be at least 0x384000.
|
||||
* @param[in] attr \ref CapsScreenShotAttribute
|
||||
* @param[in] reportoption \ref AlbumReportOption
|
||||
* @param[in] appdata \ref CapsApplicationData
|
||||
* @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL.
|
||||
*/
|
||||
Result capssuSaveScreenShotEx1(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationData *appdata, CapsApplicationAlbumEntry *out);
|
||||
|
||||
/**
|
||||
* @brief Same as \ref capssuSaveScreenShotEx0, except this allows specifying the \ref CapsUserIdList.
|
||||
* @note Only available on [6.0.0+].
|
||||
* @param[in] buffer RGBA8 1280x720 image data buffer.
|
||||
* @param[in] size Size of the buffer, must be at least 0x384000.
|
||||
* @param[in] attr \ref CapsScreenShotAttribute
|
||||
* @param[in] reportoption \ref AlbumReportOption
|
||||
* @param[in] list \ref CapsUserIdList
|
||||
* @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL.
|
||||
*/
|
||||
Result capssuSaveScreenShotEx2(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsUserIdList *list, CapsApplicationAlbumEntry *out);
|
||||
|
||||
|
173
nx/include/switch/services/capsu.h
Normal file
173
nx/include/switch/services/capsu.h
Normal file
@ -0,0 +1,173 @@
|
||||
/**
|
||||
* @file capsu.h
|
||||
* @brief Application Album (caps:u) service IPC wrapper.
|
||||
* This is only usable with AlbumFiles associated with the current host Application.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/caps.h"
|
||||
#include "../services/acc.h"
|
||||
|
||||
/// Initialize caps:u. Only available on [5.0.0+].
|
||||
Result capsuInitialize(void);
|
||||
|
||||
/// Exit caps:u.
|
||||
void capsuExit(void);
|
||||
|
||||
/// Gets the Service for caps:u.
|
||||
Service* capsuGetServiceSession(void);
|
||||
|
||||
/// Gets the Service for IAlbumAccessorApplicationSession, only initialized after \ref capsuOpenAlbumMovieStream was used (unaffected by using \ref capsuCloseAlbumMovieStream).
|
||||
Service* capsuGetServiceSession_Accessor(void);
|
||||
|
||||
/**
|
||||
* @brief Gets a listing of \ref CapsApplicationAlbumFileEntry.
|
||||
* @note On [6.0.0+] this uses GetAlbumFileList1AafeAruidDeprecated, otherwise this uses GetAlbumFileList0AafeAruidDeprecated.
|
||||
* @note This is an old version of \ref capsuGetAlbumFileList3.
|
||||
* @param[out] entries Output array of \ref CapsApplicationAlbumFileEntry.
|
||||
* @param[in] count Max size of the output array in entries.
|
||||
* @param[in] type \ref CapsContentType
|
||||
* @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[out] total_entries Total output entries.
|
||||
*/
|
||||
Result capsuGetAlbumFileListDeprecated1(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries);
|
||||
|
||||
/**
|
||||
* @brief Gets a listing of \ref CapsApplicationAlbumFileEntry, where the AlbumFile has an UserId which matches the input one. See also \ref capssuSaveScreenShotWithUserIds.
|
||||
* @note Only available on [6.0.0+].
|
||||
* @note This is an old version of \ref capsuGetAlbumFileList4.
|
||||
* @param[out] entries Output array of \ref CapsApplicationAlbumFileEntry.
|
||||
* @param[in] count Max size of the output array in entries.
|
||||
* @param[in] type \ref CapsContentType
|
||||
* @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[out] total_entries Total output entries.
|
||||
*/
|
||||
Result capsuGetAlbumFileListDeprecated2(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries);
|
||||
|
||||
/**
|
||||
* @brief Gets a listing of \ref CapsApplicationAlbumEntry.
|
||||
* @note Only available on [7.0.0+], on prior sysvers use \ref capsuGetAlbumFileListDeprecated1 instead.
|
||||
* @param[out] entries Output array of \ref CapsApplicationAlbumEntry.
|
||||
* @param[in] count Max size of the output array in entries.
|
||||
* @param[in] type \ref CapsContentType
|
||||
* @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[out] total_entries Total output entries.
|
||||
*/
|
||||
Result capsuGetAlbumFileList3(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries);
|
||||
|
||||
/**
|
||||
* @brief Gets a listing of \ref CapsApplicationAlbumEntry, where the AlbumFile has an UserId which matches the input one. See also \ref capssuSaveScreenShotWithUserIds.
|
||||
* @note Only available on [7.0.0+], on prior sysvers use \ref capsuGetAlbumFileListDeprecated2 instead.
|
||||
* @param[out] entries Output array of \ref CapsApplicationAlbumEntry.
|
||||
* @param[in] count Max size of the output array in entries.
|
||||
* @param[in] type \ref CapsContentType
|
||||
* @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used.
|
||||
* @param[in] uid \ref AccountUid
|
||||
* @param[out] total_entries Total output entries.
|
||||
*/
|
||||
Result capsuGetAlbumFileList4(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries);
|
||||
|
||||
/**
|
||||
* @brief Deletes the specified AlbumFile.
|
||||
* @param[in] type \ref CapsContentType, must match ::CapsContentType_ExtraMovie.
|
||||
* @param[in] entry \ref CapsApplicationAlbumFileEntry
|
||||
*/
|
||||
Result capsuDeleteAlbumFile(CapsContentType type, const CapsApplicationAlbumFileEntry *entry);
|
||||
|
||||
/**
|
||||
* @brief Gets the filesize for the entire specified AlbumFile.
|
||||
* @param[in] entry \ref CapsApplicationAlbumFileEntry
|
||||
* @param[out] size Output filesize.
|
||||
*/
|
||||
Result capsuGetAlbumFileSize(const CapsApplicationAlbumFileEntry *entry, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotImage for the specified AlbumFile.
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[out] attr \ref CapsScreenShotAttributeForApplication
|
||||
* @param[out] userdata Output buffer containing the UserData. Optional, can be NULL. This buffer is cleared to 0 using userdata_maxsize, prior to doing the memcpy.
|
||||
* @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0.
|
||||
* @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed.
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
* @param[in] entry \ref CapsApplicationAlbumFileEntry
|
||||
* @param[in] option \ref CapsScreenShotDecodeOption
|
||||
*/
|
||||
Result capsuLoadAlbumScreenShotImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option);
|
||||
|
||||
/**
|
||||
* @brief Load the ScreenShotThumbnailImage for the specified AlbumFile.
|
||||
* @param[out] width Output image width. Optional, can be NULL.
|
||||
* @param[out] height Output image height. Optional, can be NULL.
|
||||
* @param[out] attr \ref CapsScreenShotAttributeForApplication
|
||||
* @param[out] userdata Output buffer containing the UserData. Optional, can be NULL. This buffer is cleared to 0 using userdata_maxsize, prior to doing the memcpy.
|
||||
* @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0.
|
||||
* @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed.
|
||||
* @param[out] image RGBA8 image output buffer.
|
||||
* @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180.
|
||||
* @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns.
|
||||
* @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile.
|
||||
* @param[in] entry \ref CapsApplicationAlbumFileEntry
|
||||
* @param[in] option \ref CapsScreenShotDecodeOption
|
||||
*/
|
||||
Result capsuLoadAlbumScreenShotThumbnailImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option);
|
||||
|
||||
/**
|
||||
* @brief PrecheckToCreateContents. Official sw only uses this with ::CapsContentType_ExtraMovie.
|
||||
* @param[in] type \ref CapsContentType
|
||||
* @param[in] unk Unknown.
|
||||
*/
|
||||
Result capsuPrecheckToCreateContents(CapsContentType type, u64 unk);
|
||||
|
||||
/**
|
||||
* @brief Opens an AlbumMovieStream.
|
||||
* @note This opens IAlbumAccessorApplicationSession if not previously opened, it's closed during \ref capsuExit.
|
||||
* @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsApplicationAlbumFileEntry.
|
||||
* @param[out] stream Stream handle.
|
||||
* @param[in] entry \ref CapsApplicationAlbumFileEntry
|
||||
*/
|
||||
Result capsuOpenAlbumMovieStream(u64 *stream, const CapsApplicationAlbumFileEntry *entry);
|
||||
|
||||
/**
|
||||
* @brief Closes an AlbumMovieStream.
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capsuCloseAlbumMovieStream(u64 stream);
|
||||
|
||||
/**
|
||||
* @brief Gets the data size of an AlbumMovieStream.
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[out] size Size of the actual MP4, without the JPEG at the end.
|
||||
*/
|
||||
Result capsuGetAlbumMovieStreamSize(u64 stream, u64 *size);
|
||||
|
||||
/**
|
||||
* @brief Reads data from an AlbumMovieStream.
|
||||
* @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes.
|
||||
* @note When offset(+size) goes beyond the size from \ref capsuGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size.
|
||||
* @param[in] stream Stream handle.
|
||||
* @param[in] offset Offset.
|
||||
* @param[out] Output data buffer.
|
||||
* @param[in] size Data buffer size.
|
||||
* @param[out] actual_size Actual read size.
|
||||
*/
|
||||
Result capsuReadAlbumMovieStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size);
|
||||
|
||||
/**
|
||||
* @brief Gets the BrokenReason for an AlbumMovieStream.
|
||||
* @note Official sw doesn't use this.
|
||||
* @param[in] stream Stream handle.
|
||||
*/
|
||||
Result capsuGetAlbumMovieStreamBrokenReason(u64 stream);
|
||||
|
@ -6,15 +6,20 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/pcv.h"
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s;
|
||||
} ClkrstSession;
|
||||
|
||||
/// Initialize clkrst. Only available on [8.0.0+].
|
||||
Result clkrstInitialize(void);
|
||||
|
||||
/// Exit clkrst.
|
||||
void clkrstExit(void);
|
||||
|
||||
/// Gets the Service object for the actual clkrst service session.
|
||||
Service* clkrstGetServiceSession(void);
|
||||
|
||||
/// Opens a ClkrstSession for the requested PcvModuleId, unk is set to 3 in official sysmodules.
|
||||
@ -22,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);
|
||||
|
@ -6,10 +6,15 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Initialize csrng.
|
||||
Result csrngInitialize(void);
|
||||
|
||||
/// Exit csrng.
|
||||
void csrngExit(void);
|
||||
|
||||
/// Gets the Service object for the actual csrng service session.
|
||||
Service* csrngGetServiceSession(void);
|
||||
|
||||
Result csrngGetRandomBytes(void *out, size_t out_size);
|
||||
|
32
nx/include/switch/services/ectx.h
Normal file
32
nx/include/switch/services/ectx.h
Normal file
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @file ectx.h
|
||||
* @brief [11.0.0+] Error Context services IPC wrapper.
|
||||
* @author SciresM
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// Initialize ectx:r.
|
||||
Result ectxrInitialize(void);
|
||||
|
||||
/// Exit ectx:r.
|
||||
void ectxrExit(void);
|
||||
|
||||
/// Gets the Service object for the actual ectx:r service session.
|
||||
Service* ectxrGetServiceSession(void);
|
||||
|
||||
/**
|
||||
* @brief Retrieves the error context associated with an error descriptor and result.
|
||||
* @param[out] out0 Output value.
|
||||
* @param[out] out_total_size Total error context size.
|
||||
* @param[out] out_size Error context size.
|
||||
* @param[out] dst Buffer for output error context.
|
||||
* @param[in] dst_size Buffer size for output error context.
|
||||
* @param[in] descriptor Error descriptor.
|
||||
* @param[in] result Error result.
|
||||
* @return Result code.
|
||||
*/
|
||||
Result ectxrPullContext(s32 *out0, u32 *out_total_size, u32 *out_size, void *dst, size_t dst_size, u32 descriptor, Result result);
|
32
nx/include/switch/services/fan.h
Normal file
32
nx/include/switch/services/fan.h
Normal file
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @file fan.h
|
||||
* @brief Fan service IPC wrapper.
|
||||
* @author Behemoth
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
} FanController;
|
||||
|
||||
/// Initialize fan.
|
||||
Result fanInitialize(void);
|
||||
|
||||
/// Exit fan.
|
||||
void fanExit(void);
|
||||
|
||||
/// Gets the Service object for the actual fan service session.
|
||||
Service* fanGetServiceSession(void);
|
||||
|
||||
/// Opens IController session.
|
||||
Result fanOpenController(FanController *out, u32 device_code);
|
||||
|
||||
/// Close IController session.
|
||||
void fanControllerClose(FanController *controller);
|
||||
|
||||
/// @warning Disabling your fan can damage your system.
|
||||
Result fanControllerSetRotationSpeedLevel(FanController *controller, float level);
|
||||
Result fanControllerGetRotationSpeedLevel(FanController *controller, float *level);
|
@ -9,10 +9,10 @@
|
||||
|
||||
/// Type of thrown fatal error.
|
||||
typedef enum {
|
||||
FatalType_ErrorReportAndErrorScreen = 0,
|
||||
FatalType_ErrorReport = 1,
|
||||
FatalType_ErrorScreen = 2 ///< Only available with 3.0.0+. If specified, FatalType_ErrorReportAndErrorScreen will be used instead on pre-3.0.0.
|
||||
} FatalType;
|
||||
FatalPolicy_ErrorReportAndErrorScreen = 0,
|
||||
FatalPolicy_ErrorReport = 1,
|
||||
FatalPolicy_ErrorScreen = 2 ///< Only available with [3.0.0+]. If specified, FatalPolicy_ErrorReportAndErrorScreen will be used instead on pre-3.0.0.
|
||||
} FatalPolicy;
|
||||
|
||||
/// Struct for fatal Cpu context, 64-bit.
|
||||
typedef struct {
|
||||
@ -71,29 +71,29 @@ typedef struct {
|
||||
|
||||
bool is_aarch32;
|
||||
u32 type;
|
||||
} FatalContext;
|
||||
} FatalCpuContext;
|
||||
|
||||
/**
|
||||
* @brief Triggers a system fatal error.
|
||||
* @param[in] err Result code to throw.
|
||||
* @note This function does not return.
|
||||
* @note This uses \ref fatalWithType with \ref FatalType_ErrorScreen internally.
|
||||
* @note This uses \ref fatalThrowWithPolicy with \ref FatalPolicy_ErrorScreen internally.
|
||||
*/
|
||||
void NORETURN fatalSimple(Result err);
|
||||
void NX_NORETURN fatalThrow(Result err);
|
||||
|
||||
/**
|
||||
* @brief Triggers a system fatal error with a custom \ref FatalType.
|
||||
* @brief Triggers a system fatal error with a custom \ref FatalPolicy.
|
||||
* @param[in] err Result code to throw.
|
||||
* @param[in] type Type of fatal error to throw.
|
||||
* @note This function may not return, depending on \ref FatalType.
|
||||
* @note This function may not return, depending on \ref FatalPolicy.
|
||||
*/
|
||||
void fatalWithType(Result err, FatalType type);
|
||||
void fatalThrowWithPolicy(Result err, FatalPolicy type);
|
||||
|
||||
/**
|
||||
* @brief Triggers a system fatal error with a custom \ref FatalType and \ref FatalContext.
|
||||
* @brief Triggers a system fatal error with a custom \ref FatalPolicy and \ref FatalCpuContext.
|
||||
* @param[in] err Result code to throw.
|
||||
* @param[in] type Type of fatal error to throw.
|
||||
* @param[in] ctx Cpu context for fatal error to throw.
|
||||
* @note This function may not return, depending on \ref FatalType.
|
||||
* @note This function may not return, depending on \ref FatalPolicy.
|
||||
*/
|
||||
void fatalWithContext(Result err, FatalType type, FatalContext *ctx);
|
||||
void fatalThrowWithContext(Result err, FatalPolicy type, FatalCpuContext *ctx);
|
||||
|
91
nx/include/switch/services/friends.h
Normal file
91
nx/include/switch/services/friends.h
Normal file
@ -0,0 +1,91 @@
|
||||
/**
|
||||
* @file friend.h
|
||||
* @brief Friends (friend:*) service IPC wrapper.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/applet.h"
|
||||
#include "../services/acc.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef enum {
|
||||
FriendsServiceType_User = 0, ///< Initializes friend:u
|
||||
FriendsServiceType_Viewer = 1, ///< Initializes friend:v
|
||||
FriendsServiceType_Manager = 2, ///< Initializes friend:m
|
||||
FriendsServiceType_System = 3, ///< Initializes friend:s
|
||||
FriendsServiceType_Administrator = 4, ///< Initializes friend:a
|
||||
} FriendsServiceType;
|
||||
|
||||
/// InAppScreenName
|
||||
typedef struct {
|
||||
char name[0x40]; ///< UTF-8 string, NUL-terminated.
|
||||
u64 languageCode; ///< LanguageCode, see set.h.
|
||||
} FriendsInAppScreenName;
|
||||
|
||||
/// FriendInvitationGameModeDescription
|
||||
typedef struct {
|
||||
u8 unk_x0[0xc00]; ///< Unknown.
|
||||
} FriendsFriendInvitationGameModeDescription;
|
||||
|
||||
/// FriendInvitationId
|
||||
typedef struct {
|
||||
u64 id; ///< Id.
|
||||
} FriendsFriendInvitationId;
|
||||
|
||||
/// FriendInvitationGroupId
|
||||
typedef struct {
|
||||
u64 id; ///< Id.
|
||||
} FriendsFriendInvitationGroupId;
|
||||
|
||||
/// FriendsUserSetting
|
||||
typedef struct {
|
||||
AccountUid uid; ///< User ID
|
||||
u32 presence_permission; ///< Presence permission
|
||||
u32 play_log_permission; ///< Play log permission
|
||||
u64 friend_request_reception; ///< Unknown
|
||||
char friend_code[0x20]; ///< Friend Code
|
||||
u64 friend_code_next_issuable_time; ///< Unknown
|
||||
u8 unk_x48[0x7C8]; ///< Unknown
|
||||
} FriendsUserSetting;
|
||||
|
||||
/// Initialize friends
|
||||
Result friendsInitialize(FriendsServiceType service_type);
|
||||
|
||||
/// Exit friends
|
||||
void friendsExit(void);
|
||||
|
||||
/// Gets the Service object for the friends service session.
|
||||
Service* friendsGetServiceSession(void);
|
||||
|
||||
/// Gets the Service object for the actual IFriendsService service session.
|
||||
Service* friendsGetServiceSession_IFriendsService(void);
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref FriendsUserSetting details
|
||||
* @param[in] uid \ref User AccountUid.
|
||||
* @param[out] user_setting \ref FriendsUserSetting
|
||||
*/
|
||||
Result friendsGetUserSetting(AccountUid uid, FriendsUserSetting *user_setting);
|
||||
|
||||
/**
|
||||
* @brief Gets an Event which is signaled when data is available with \ref friendsTryPopFriendInvitationNotificationInfo.
|
||||
* @note This is a wrapper for \ref appletGetFriendInvitationStorageChannelEvent, see that for the usage requirements.
|
||||
* @note The Event must be closed by the user once finished with it.
|
||||
* @param[out] out_event Output Event with autoclear=false.
|
||||
*/
|
||||
NX_INLINE Result friendsGetFriendInvitationNotificationEvent(Event *out_event) {
|
||||
return appletGetFriendInvitationStorageChannelEvent(out_event);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Uses \ref appletTryPopFromFriendInvitationStorageChannel then reads the data from there into the output params.
|
||||
* @note This is a wrapper for \ref appletTryPopFromFriendInvitationStorageChannel, see that for the usage requirements.
|
||||
* @param[out] uid \ref AccountUid. Optional, can be NULL.
|
||||
* @param[out] buffer Output buffer.
|
||||
* @param[out] size Output buffer size.
|
||||
* @param[out] out_size Size of the data which was written into the output buffer. Optional, can be NULL.
|
||||
*/
|
||||
Result friendsTryPopFriendInvitationNotificationInfo(AccountUid *uid, void* buffer, u64 size, u64 *out_size);
|
@ -8,117 +8,133 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/ncm_types.h"
|
||||
#include "../services/acc.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
// We use wrapped handles for type safety.
|
||||
|
||||
#define FS_MAX_PATH 0x301
|
||||
|
||||
/// For use with FsSave.
|
||||
#define FS_SAVEDATA_CURRENT_TITLEID 0
|
||||
|
||||
/// For use with \ref FsSave and \ref FsSaveDataInfo.
|
||||
#define FS_SAVEDATA_USERID_COMMONSAVE 0
|
||||
/// For use with \ref FsSaveDataAttribute.
|
||||
#define FS_SAVEDATA_CURRENT_APPLICATIONID 0
|
||||
|
||||
typedef struct {
|
||||
u8 c[0x10];
|
||||
} FsRightsId;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s;
|
||||
} FsFileSystem;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s;
|
||||
} FsFile;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s;
|
||||
} FsDir;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s;
|
||||
} FsStorage;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
} FsSaveDataIterator;
|
||||
Service s;
|
||||
} FsSaveDataInfoReader;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s;
|
||||
} FsEventNotifier;
|
||||
|
||||
typedef struct {
|
||||
Service s;
|
||||
Service s;
|
||||
} FsDeviceOperator;
|
||||
|
||||
/// Directory entry.
|
||||
typedef struct
|
||||
{
|
||||
char name[FS_MAX_PATH]; ///< Entry name.
|
||||
typedef struct {
|
||||
char name[FS_MAX_PATH]; ///< Entry name.
|
||||
u8 pad[3];
|
||||
s8 type; ///< See FsEntryType.
|
||||
u8 pad2[3]; ///< ?
|
||||
u64 fileSize; ///< File size.
|
||||
s8 type; ///< See FsDirEntryType.
|
||||
u8 pad2[3]; ///< ?
|
||||
s64 file_size; ///< File size.
|
||||
} FsDirectoryEntry;
|
||||
|
||||
/// Save Struct
|
||||
typedef struct
|
||||
{
|
||||
u64 titleID; ///< titleID of the savedata to access when accessing other titles' savedata via SaveData, otherwise FS_SAVEDATA_CURRENT_TITLEID.
|
||||
union { u128 userID; } PACKED; ///< userID of the user-specific savedata to access, otherwise FS_SAVEDATA_USERID_COMMONSAVE. See account.h.
|
||||
u64 saveID; ///< saveID, 0 for SaveData.
|
||||
u8 saveDataType; ///< See \ref FsSaveDataType.
|
||||
u8 rank; ///< Save data 'rank' or 'precedence'. 0 if this save data is considered the primary save data. 1 if it's considered the secondary save data.
|
||||
u16 index; ///< Save data index.
|
||||
u32 pad_x24; ///< Padding.
|
||||
u64 unk_x28; ///< 0 for SystemSaveData/SaveData.
|
||||
u64 unk_x30; ///< 0 for SystemSaveData/SaveData.
|
||||
u64 unk_x38; ///< 0 for SystemSaveData/SaveData.
|
||||
} FsSave;
|
||||
|
||||
/// SaveDataExtraData Struct
|
||||
/// SaveDataAttribute
|
||||
typedef struct {
|
||||
FsSave save; ///< Save struct.
|
||||
u64 ownerId; ///< Title id of the owner of this save data. 0 for SystemSaveData.
|
||||
u64 timestamp; ///< POSIX timestamp.
|
||||
u32 flags; ///< Save data flags. See \ref FsSaveDataFlags.
|
||||
u32 unk_x54; ///< Normally 0. Possibly unused?
|
||||
u64 dataSize; ///< Usable save data size.
|
||||
u64 journalSize; ///< Journal size of the save data.
|
||||
u64 commitId; ///< Id of the latest commit.
|
||||
u8 unused[0x190]; ///< Uninitialized.
|
||||
u64 application_id; ///< ApplicationId of the savedata to access when accessing other programs' savedata via SaveData, otherwise FS_SAVEDATA_CURRENT_APPLICATIONID.
|
||||
AccountUid uid; ///< \ref AccountUid for the user-specific savedata to access, otherwise 0 for common savedata.
|
||||
u64 system_save_data_id; ///< SystemSaveDataId, 0 for ::FsSaveDataType_Account.
|
||||
u8 save_data_type; ///< \ref FsSaveDataType
|
||||
u8 save_data_rank; ///< \ref FsSaveDataRank
|
||||
u16 save_data_index; ///< SaveDataIndex
|
||||
u32 pad_x24; ///< Padding.
|
||||
u64 unk_x28; ///< 0 for ::FsSaveDataType_System/::FsSaveDataType_Account.
|
||||
u64 unk_x30; ///< 0 for ::FsSaveDataType_System/::FsSaveDataType_Account.
|
||||
u64 unk_x38; ///< 0 for ::FsSaveDataType_System/::FsSaveDataType_Account.
|
||||
} FsSaveDataAttribute;
|
||||
|
||||
/// SaveDataExtraData
|
||||
typedef struct {
|
||||
FsSaveDataAttribute attr; ///< \ref FsSaveDataAttribute
|
||||
u64 owner_id; ///< ProgramId of the owner of this save data. 0 for ::FsSaveDataType_System.
|
||||
u64 timestamp; ///< POSIX timestamp.
|
||||
u32 flags; ///< \ref FsSaveDataFlags
|
||||
u32 unk_x54; ///< Normally 0. Possibly unused?
|
||||
s64 data_size; ///< Usable save data size.
|
||||
s64 journal_size; ///< Journal size of the save data.
|
||||
u64 commit_id; ///< Id of the latest commit.
|
||||
u8 unused[0x190]; ///< Uninitialized.
|
||||
} FsSaveDataExtraData;
|
||||
|
||||
/// SaveCreate Struct
|
||||
/// SaveDataMetaInfo
|
||||
typedef struct {
|
||||
u64 size; ///< Size of the save data.
|
||||
u64 journalSize; ///< Journal size of the save data.
|
||||
u64 blockSize; ///< Block size of the save data.
|
||||
u64 ownerId; ///< Title id of the owner of this save data. 0 for SystemSaveData.
|
||||
u32 flags; ///< Save data flags. See \ref FsSaveDataFlags.
|
||||
u8 saveDataSpaceId; ///< See \ref FsSaveDataSpaceId.
|
||||
u8 unk; ///< 0 for SystemSaveData.
|
||||
u8 padding[0x1A]; ///< Uninitialized for SystemSaveData.
|
||||
} FsSaveCreate;
|
||||
u32 size;
|
||||
u8 type; ///< \ref FsSaveDataMetaType
|
||||
u8 reserved[0x0B];
|
||||
} FsSaveDataMetaInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u64 saveID_unk;
|
||||
u8 saveDataSpaceId; ///< See \ref FsSaveDataSpaceId.
|
||||
u8 saveDataType; ///< See \ref FsSaveDataType.
|
||||
u8 pad[6]; ///< Padding.
|
||||
u128 userID; ///< See userID for \ref FsSave.
|
||||
u64 saveID; ///< See saveID for \ref FsSave.
|
||||
u64 titleID; ///< titleID for FsSaveDataType_SaveData.
|
||||
u64 size; ///< Raw saveimage size.
|
||||
u16 index; ///< Save data index.
|
||||
u8 rank; ///< Save data 'rank' or 'precedence'. 0 if this save data is considered the primary save data. 1 if it's considered the secondary save data.
|
||||
u8 unk_x3b[0x25]; ///< Unknown. Usually zeros?
|
||||
/// SaveDataCreationInfo
|
||||
typedef struct {
|
||||
s64 save_data_size; ///< Size of the save data.
|
||||
s64 journal_size; ///< Journal size of the save data.
|
||||
u64 available_size; ///< AvailableSize
|
||||
u64 owner_id; ///< ProgramId of the owner of this save data. 0 for ::FsSaveDataType_System.
|
||||
u32 flags; ///< \ref FsSaveDataFlags
|
||||
u8 save_data_space_id; ///< \ref FsSaveDataSpaceId
|
||||
u8 unk; ///< 0 for ::FsSaveDataType_System.
|
||||
u8 padding[0x1a]; ///< Uninitialized for ::FsSaveDataType_System.
|
||||
} FsSaveDataCreationInfo;
|
||||
|
||||
/// SaveDataInfo
|
||||
typedef struct {
|
||||
u64 save_data_id; ///< SaveDataId
|
||||
u8 save_data_space_id; ///< \ref FsSaveDataSpaceId
|
||||
u8 save_data_type; ///< \ref FsSaveDataType
|
||||
u8 pad[6]; ///< Padding.
|
||||
AccountUid uid; ///< FsSave::userID
|
||||
u64 system_save_data_id; ///< FsSaveDataAttribute::system_save_data_id
|
||||
u64 application_id; ///< ApplicationId for ::FsSaveDataType_Account.
|
||||
u64 size; ///< Raw saveimage size.
|
||||
u16 save_data_index; ///< SaveDataIndex
|
||||
u8 save_data_rank; ///< \ref FsSaveDataRank
|
||||
u8 unk_x3b[0x25]; ///< Unknown. Usually zeros?
|
||||
} FsSaveDataInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/// 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.
|
||||
u64 accessed; ///< POSIX timestamp.
|
||||
@ -126,102 +142,135 @@ typedef struct
|
||||
u8 padding[7];
|
||||
} FsTimeStampRaw;
|
||||
|
||||
/// This is nn::fssystem::ArchiveMacKey. Used by \ref setsysGetThemeKey and \ref setsysSetThemeKey. Does not appear to be in use elsewhere.
|
||||
typedef struct {
|
||||
u8 key[0x10];
|
||||
} FsArchiveMacKey;
|
||||
|
||||
/// Returned by fsFsGetEntryType.
|
||||
typedef enum {
|
||||
ENTRYTYPE_DIR = 0,
|
||||
ENTRYTYPE_FILE = 1,
|
||||
} FsEntryType;
|
||||
FsDirEntryType_Dir = 0, ///< Entry is a directory.
|
||||
FsDirEntryType_File = 1, ///< Entry is a file.
|
||||
} FsDirEntryType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FS_OPEN_READ = BIT(0), ///< Open for reading.
|
||||
FS_OPEN_WRITE = BIT(1), ///< Open for writing.
|
||||
FS_OPEN_APPEND = BIT(2), ///< Append file.
|
||||
} FsFileFlags;
|
||||
/// For use with fsFsOpenFile.
|
||||
typedef enum {
|
||||
FsOpenMode_Read = BIT(0), ///< Open for reading.
|
||||
FsOpenMode_Write = BIT(1), ///< Open for writing.
|
||||
FsOpenMode_Append = BIT(2), ///< Append file.
|
||||
} FsOpenMode;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FS_CREATE_BIG_FILE = BIT(0), ///< Creates a ConcatenationFile (dir with archive bit) instead of file.
|
||||
} FsFileCreateFlags;
|
||||
/// For use with fsFsCreateFile.
|
||||
typedef enum {
|
||||
FsCreateOption_BigFile = BIT(0), ///< Creates a ConcatenationFile (dir with archive bit) instead of file.
|
||||
} FsCreateOption;
|
||||
|
||||
/// For use with fsFsOpenDirectory.
|
||||
typedef enum
|
||||
{
|
||||
FS_DIROPEN_DIRECTORY = BIT(0), ///< Enable reading directory entries.
|
||||
FS_DIROPEN_FILE = BIT(1), ///< Enable reading file entries.
|
||||
FS_DIROPEN_NO_FILE_SIZE = BIT(31), ///< Causes result entries to not contain filesize information (always 0).
|
||||
} FsDirectoryFlags;
|
||||
typedef enum {
|
||||
FsDirOpenMode_ReadDirs = BIT(0), ///< Enable reading directory entries.
|
||||
FsDirOpenMode_ReadFiles = BIT(1), ///< Enable reading file entries.
|
||||
FsDirOpenMode_NoFileSize = BIT(31), ///< Causes result entries to not contain filesize information (always 0).
|
||||
} FsDirOpenMode;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FS_READOPTION_NONE = 0, ///< No Option.
|
||||
/// For use with fsFileRead.
|
||||
typedef enum {
|
||||
FsReadOption_None = 0, ///< No option.
|
||||
} FsReadOption;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FS_WRITEOPTION_NONE = 0, ///< No option.
|
||||
FS_WRITEOPTION_FLUSH = BIT(0), ///< Forces a flush after write.
|
||||
/// For use with fsFileWrite.
|
||||
typedef enum {
|
||||
FsWriteOption_None = 0, ///< No option.
|
||||
FsWriteOption_Flush = BIT(0), ///< Forces a flush after write.
|
||||
} FsWriteOption;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FsStorageId_None = 0,
|
||||
FsStorageId_Host = 1,
|
||||
FsStorageId_GameCard = 2,
|
||||
FsStorageId_NandSystem = 3,
|
||||
FsStorageId_NandUser = 4,
|
||||
FsStorageId_SdCard = 5,
|
||||
} FsStorageId;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FS_CONTENTSTORAGEID_NandSystem = 0,
|
||||
FS_CONTENTSTORAGEID_NandUser = 1,
|
||||
FS_CONTENTSTORAGEID_SdCard = 2,
|
||||
typedef enum {
|
||||
FsContentStorageId_System = 0, ///< System
|
||||
FsContentStorageId_User = 1, ///< User
|
||||
FsContentStorageId_SdCard = 2, ///< SdCard
|
||||
FsContentStorageId_System0 = 3, ///< [16.0.0+] System0
|
||||
} FsContentStorageId;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FsSaveDataSpaceId_NandSystem = 0,
|
||||
FsSaveDataSpaceId_NandUser = 1,
|
||||
FsSaveDataSpaceId_SdCard = 2,
|
||||
FsSaveDataSpaceId_TemporaryStorage = 3,
|
||||
typedef enum {
|
||||
FsCustomStorageId_System = 0,
|
||||
FsCustomStorageId_SdCard = 1,
|
||||
} FsCustomStorageId;
|
||||
|
||||
FsSaveDataSpaceId_All = -1, ///< Pseudo value for fsOpenSaveDataIterator().
|
||||
/// ImageDirectoryId
|
||||
typedef enum {
|
||||
FsImageDirectoryId_Nand = 0,
|
||||
FsImageDirectoryId_Sd = 1,
|
||||
} FsImageDirectoryId;
|
||||
|
||||
/// SaveDataSpaceId
|
||||
typedef enum {
|
||||
FsSaveDataSpaceId_System = 0, ///< System
|
||||
FsSaveDataSpaceId_User = 1, ///< User
|
||||
FsSaveDataSpaceId_SdSystem = 2, ///< SdSystem
|
||||
FsSaveDataSpaceId_Temporary = 3, ///< [3.0.0+] Temporary
|
||||
FsSaveDataSpaceId_SdUser = 4, ///< [4.0.0+] SdUser
|
||||
FsSaveDataSpaceId_ProperSystem = 100, ///< [3.0.0+] ProperSystem
|
||||
FsSaveDataSpaceId_SafeMode = 101, ///< [3.0.0+] SafeMode
|
||||
|
||||
FsSaveDataSpaceId_All = -1, ///< Pseudo value for fsOpenSaveDataInfoReader().
|
||||
} FsSaveDataSpaceId;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FsSaveDataType_SystemSaveData = 0,
|
||||
FsSaveDataType_SaveData = 1,
|
||||
FsSaveDataType_BcatDeliveryCacheStorage = 2,
|
||||
FsSaveDataType_DeviceSaveData = 3,
|
||||
FsSaveDataType_TemporaryStorage = 4, ///< [3.0.0+]
|
||||
FsSaveDataType_CacheStorage = 5, ///< [3.0.0+]
|
||||
/// SaveDataType
|
||||
typedef enum {
|
||||
FsSaveDataType_System = 0, ///< System
|
||||
FsSaveDataType_Account = 1, ///< Account
|
||||
FsSaveDataType_Bcat = 2, ///< Bcat
|
||||
FsSaveDataType_Device = 3, ///< Device
|
||||
FsSaveDataType_Temporary = 4, ///< [3.0.0+] Temporary
|
||||
FsSaveDataType_Cache = 5, ///< [3.0.0+] Cache
|
||||
FsSaveDataType_SystemBcat = 6, ///< [4.0.0+] SystemBcat
|
||||
} FsSaveDataType;
|
||||
|
||||
/// SaveDataRank
|
||||
typedef enum {
|
||||
FsSaveDataRank_Primary = 0, ///< Primary
|
||||
FsSaveDataRank_Secondary = 1, ///< Secondary
|
||||
} FsSaveDataRank;
|
||||
|
||||
/// SaveDataFlags
|
||||
typedef enum {
|
||||
FsSaveDataFlags_SurviveFactoryReset = BIT(0),
|
||||
FsSaveDataFlags_SurviveFactoryResetForRefurbishment = BIT(1),
|
||||
FsSaveDataFlags_SurviveFactoryResetWithoutUserSaveData = BIT(2),
|
||||
FsSaveDataFlags_KeepAfterResettingSystemSaveData = BIT(0),
|
||||
FsSaveDataFlags_KeepAfterRefurbishment = BIT(1),
|
||||
FsSaveDataFlags_KeepAfterResettingSystemSaveDataWithoutUserSaveData = BIT(2),
|
||||
FsSaveDataFlags_NeedsSecureDelete = BIT(3),
|
||||
} FsSaveDataFlags;
|
||||
|
||||
/// SaveDataMetaType
|
||||
typedef enum {
|
||||
FsGameCardAttribute_AutoBoot = (1 << 0), ///< Causes the cartridge to automatically start on bootup
|
||||
FsGameCardAttribute_ForceError = (1 << 1), ///< Causes NS to throw an error on attempt to load the cartridge
|
||||
FsGameCardAttribute_Repair = (1 << 2), ///< Indicates that this gamecard is a repair tool.
|
||||
FsSaveDataMetaType_None = 0,
|
||||
FsSaveDataMetaType_Thumbnail = 1,
|
||||
FsSaveDataMetaType_ExtensionContext = 2,
|
||||
} FsSaveDataMetaType;
|
||||
|
||||
typedef enum {
|
||||
FsGameCardAttribute_AutoBootFlag = BIT(0), ///< Causes the cartridge to automatically start on bootup
|
||||
FsGameCardAttribute_HistoryEraseFlag = BIT(1), ///< Causes NS to throw an error on attempt to load the cartridge
|
||||
FsGameCardAttribute_RepairToolFlag = BIT(2), ///< [4.0.0+] Indicates that this gamecard is a repair tool.
|
||||
FsGameCardAttribute_DifferentRegionCupToTerraDeviceFlag = BIT(3), ///< [9.0.0+] DifferentRegionCupToTerraDeviceFlag
|
||||
FsGameCardAttribute_DifferentRegionCupToGlobalDeviceFlag = BIT(4), ///< [9.0.0+] DifferentRegionCupToGlobalDeviceFlag
|
||||
} FsGameCardAttribute;
|
||||
|
||||
typedef enum {
|
||||
FsGameCardPartiton_Update = 0,
|
||||
FsGameCardPartiton_Normal = 1,
|
||||
FsGameCardPartiton_Secure = 2,
|
||||
} FsGameCardPartiton;
|
||||
FsGameCardPartition_Update = 0,
|
||||
FsGameCardPartition_Normal = 1,
|
||||
FsGameCardPartition_Secure = 2,
|
||||
FsGameCardPartition_Logo = 3, ///< [4.0.0+]
|
||||
} FsGameCardPartition;
|
||||
|
||||
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.
|
||||
@ -235,158 +284,410 @@ typedef enum {
|
||||
FsOperationId_QueryRange, ///< Retrieves information on data for supported file/storage.
|
||||
} FsOperationId;
|
||||
|
||||
/// BisPartitionId
|
||||
typedef enum {
|
||||
FsBisStorageId_Boot0 = 0,
|
||||
FsBisPartitionId_BootPartition1Root = 0,
|
||||
|
||||
FsBisStorageId_Boot1 = 10,
|
||||
FsBisPartitionId_BootPartition2Root = 10,
|
||||
|
||||
FsBisStorageId_UserDataRoot = 20,
|
||||
FsBisStorageId_BootConfigAndPackage2NormalMain = 21,
|
||||
FsBisStorageId_BootConfigAndPackage2NormalSub = 22,
|
||||
FsBisStorageId_BootConfigAndPackage2SafeMain = 23,
|
||||
FsBisStorageId_BootConfigAndPackage2SafeSub = 24,
|
||||
FsBisStorageId_BootConfigAndPackage2RepairMain = 25,
|
||||
FsBisStorageId_BootConfigAndPackage2RepairSub = 26,
|
||||
FsBisStorageId_CalibrationBinary = 27,
|
||||
FsBisStorageId_CalibrationFile = 28,
|
||||
FsBisStorageId_SafeMode = 29,
|
||||
FsBisStorageId_User = 30,
|
||||
FsBisStorageId_System = 31,
|
||||
FsBisStorageId_SystemProperEncryption = 32,
|
||||
FsBisStorageId_SystemProperPartition = 33,
|
||||
} FsBisStorageId;
|
||||
FsBisPartitionId_UserDataRoot = 20,
|
||||
FsBisPartitionId_BootConfigAndPackage2Part1 = 21,
|
||||
FsBisPartitionId_BootConfigAndPackage2Part2 = 22,
|
||||
FsBisPartitionId_BootConfigAndPackage2Part3 = 23,
|
||||
FsBisPartitionId_BootConfigAndPackage2Part4 = 24,
|
||||
FsBisPartitionId_BootConfigAndPackage2Part5 = 25,
|
||||
FsBisPartitionId_BootConfigAndPackage2Part6 = 26,
|
||||
FsBisPartitionId_CalibrationBinary = 27,
|
||||
FsBisPartitionId_CalibrationFile = 28,
|
||||
FsBisPartitionId_SafeMode = 29,
|
||||
FsBisPartitionId_User = 30,
|
||||
FsBisPartitionId_System = 31,
|
||||
FsBisPartitionId_SystemProperEncryption = 32,
|
||||
FsBisPartitionId_SystemProperPartition = 33,
|
||||
FsBisPartitionId_SignedSystemPartitionOnSafeMode = 34,
|
||||
FsBisPartitionId_DeviceTreeBlob = 35,
|
||||
FsBisPartitionId_System0 = 36,
|
||||
} FsBisPartitionId;
|
||||
|
||||
/// FileSystemType
|
||||
typedef enum {
|
||||
FsFileSystemType_Logo = 2, ///< Logo
|
||||
FsFileSystemType_ContentControl = 3, ///< ContentControl
|
||||
FsFileSystemType_ContentManual = 4, ///< ContentManual
|
||||
FsFileSystemType_ContentMeta = 5, ///< ContentMeta
|
||||
FsFileSystemType_ContentData = 6, ///< ContentData
|
||||
FsFileSystemType_ApplicationPackage = 7, ///< ApplicationPackage
|
||||
FsFileSystemType_RegisteredUpdate = 8, ///< [4.0.0+] RegisteredUpdate
|
||||
} FsFileSystemType;
|
||||
|
||||
/// FileSystemQueryId
|
||||
typedef enum {
|
||||
FsFileSystemQueryId_SetConcatenationFileAttribute = 0, ///< [4.0.0+]
|
||||
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,
|
||||
FsPriority_Realtime = 1,
|
||||
FsPriority_Low = 2,
|
||||
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);
|
||||
|
||||
/// Exit fsp-srv. Used automatically during app exit.
|
||||
void fsExit(void);
|
||||
|
||||
/// Gets the Service object for the actual fsp-srv service session.
|
||||
Service* fsGetServiceSession(void);
|
||||
|
||||
Result fsOpenBisStorage(FsStorage* out, FsBisStorageId partitionId);
|
||||
Result fsOpenBisFileSystem(FsFileSystem* out, FsBisStorageId partitionId, const char* string);
|
||||
/// [5.0.0+] Configures the \ref FsPriority of all filesystem commands issued within the current thread.
|
||||
void fsSetPriority(FsPriority prio);
|
||||
|
||||
Result fsCreateSaveDataFileSystemBySystemSaveDataId(const FsSave* save, const FsSaveCreate* create);
|
||||
Result fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId saveDataSpaceId, u64 saveID);
|
||||
|
||||
Result fsIsExFatSupported(bool* out);
|
||||
Result fsOpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartiton partition);
|
||||
Result fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId saveDataSpaceId, u64 saveID);
|
||||
Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID);
|
||||
Result fsWriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId saveDataSpaceId, u64 saveID);
|
||||
/// Mount requested filesystem type from content file
|
||||
Result fsOpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath); ///< same as calling fsOpenFileSystemWithId with 0 as id
|
||||
Result fsOpenDataFileSystemByCurrentProcess(FsFileSystem *out);
|
||||
Result fsOpenFileSystemWithPatch(FsFileSystem* out, u64 id, FsFileSystemType fsType); ///< [2.0.0+], like OpenFileSystemWithId but without content path.
|
||||
Result fsOpenFileSystemWithId(FsFileSystem* out, u64 id, FsFileSystemType fsType, const char* contentPath, FsContentAttributes attr); ///< works on all firmwares, id is ignored on [1.0.0], attr is ignored before [16.0.0]
|
||||
Result fsOpenDataFileSystemByProgramId(FsFileSystem *out, u64 program_id); ///< [3.0.0+]
|
||||
Result fsOpenBisFileSystem(FsFileSystem* out, FsBisPartitionId partitionId, const char* string);
|
||||
Result fsOpenBisStorage(FsStorage* out, FsBisPartitionId partitionId);
|
||||
|
||||
/// Do not call this directly, see fs_dev.h.
|
||||
Result fsMountSdcard(FsFileSystem* out);
|
||||
Result fsOpenSdCardFileSystem(FsFileSystem* out);
|
||||
|
||||
Result fsMountSaveData(FsFileSystem* out, u8 inval, FsSave *save);
|
||||
Result fsMountSystemSaveData(FsFileSystem* out, u8 inval, FsSave *save);
|
||||
Result fsOpenSaveDataIterator(FsSaveDataIterator* out, s32 saveDataSpaceId);
|
||||
Result fsOpenHostFileSystem(FsFileSystem* out, const char *path);
|
||||
Result fsOpenHostFileSystemWithOption(FsFileSystem* out, const char *path, u32 flags); ///< [9.0.0+]
|
||||
|
||||
Result fsDeleteSaveDataFileSystem(u64 application_id);
|
||||
Result fsCreateSaveDataFileSystem(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info, const FsSaveDataMetaInfo* meta);
|
||||
Result fsCreateSaveDataFileSystemBySystemSaveDataId(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info);
|
||||
Result fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID); ///< [2.0.0+]
|
||||
Result fsDeleteSaveDataFileSystemBySaveDataAttribute(FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute* attr); ///< [4.0.0+]
|
||||
|
||||
Result fsIsExFatSupported(bool* out);
|
||||
|
||||
Result fsOpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartition partition);
|
||||
|
||||
Result fsExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize); ///< [3.0.0+]
|
||||
|
||||
Result fsOpenSaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr);
|
||||
Result fsOpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr);
|
||||
Result fsOpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); ///< [2.0.0+].
|
||||
|
||||
Result fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID);
|
||||
Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID);
|
||||
Result fsWriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID);
|
||||
|
||||
Result fsOpenSaveDataInfoReader(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id);
|
||||
|
||||
Result fsOpenSaveDataInfoReaderWithFilter(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataFilter *save_data_filter); ///< [6.0.0+]
|
||||
|
||||
Result fsOpenImageDirectoryFileSystem(FsFileSystem* out, FsImageDirectoryId image_directory_id);
|
||||
Result fsOpenContentStorageFileSystem(FsFileSystem* out, FsContentStorageId content_storage_id);
|
||||
Result fsOpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id); ///< [7.0.0+]
|
||||
|
||||
Result fsOpenDataStorageByCurrentProcess(FsStorage* out);
|
||||
Result fsOpenDataStorageByDataId(FsStorage* out, u64 dataId, FsStorageId storageId);
|
||||
Result fsOpenDataStorageByProgramId(FsStorage *out, u64 program_id); /// <[3.0.0+]
|
||||
Result fsOpenDataStorageByDataId(FsStorage* out, u64 dataId, NcmStorageId storageId);
|
||||
Result fsOpenPatchDataStorageByCurrentProcess(FsStorage* out);
|
||||
|
||||
Result fsOpenDeviceOperator(FsDeviceOperator* out);
|
||||
Result fsOpenSdCardDetectionEventNotifier(FsEventNotifier* out);
|
||||
|
||||
/// Retrieves the rights id corresponding to the content path. Only available on [2.0.0+].
|
||||
Result fsIsSignedSystemPartitionOnSdCardValid(bool *out);
|
||||
|
||||
Result fsGetProgramId(u64* out, const char *path, FsContentAttributes attr); ///< [17.0.0+]
|
||||
|
||||
/// Retrieves the rights id corresponding to the content path. Only available on [2.0.0-15.0.1].
|
||||
Result fsGetRightsIdByPath(const char* path, FsRightsId* out_rights_id);
|
||||
|
||||
/// Retrieves the rights id and key generation corresponding to the content path. Only available on [3.0.0+].
|
||||
Result fsGetRightsIdAndKeyGenerationByPath(const char* path, u8* out_key_generation, FsRightsId* out_rights_id);
|
||||
/// Retrieves the rights id and key generation corresponding to the content path. Only available on [3.0.0+], attr is ignored before [16.0.0].
|
||||
Result fsGetRightsIdAndKeyGenerationByPath(const char* path, FsContentAttributes attr, u8* out_key_generation, FsRightsId* out_rights_id);
|
||||
|
||||
Result fsGetContentStorageInfoIndex(s32 *out); ///< [19.0.0+]
|
||||
|
||||
Result fsDisableAutoSaveDataCreation(void);
|
||||
// todo: Rest of commands here
|
||||
|
||||
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 saveDataSpaceId, u64 saveID, u128 userID, u64 ownerId, u64 size, u64 journalSize, u32 flags);
|
||||
Result fsCreate_SystemSaveData(FsSaveDataSpaceId saveDataSpaceId, u64 saveID, u64 size, u64 journalSize, u32 flags);
|
||||
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);
|
||||
|
||||
/// FsFileSystem can be mounted with fs_dev for use with stdio, see fs_dev.h.
|
||||
/// Wrapper for fsOpenSaveDataFileSystem.
|
||||
/// See \ref FsSaveDataAttribute for application_id and uid.
|
||||
Result fsOpen_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid);
|
||||
|
||||
/// Wrapper(s) for fsMountSaveData.
|
||||
/// See FsSave for titleID and userID.
|
||||
Result fsMount_SaveData(FsFileSystem* out, u64 titleID, u128 userID);
|
||||
/// Wrapper for fsOpenReadOnlySaveDataFileSystem.
|
||||
/// Only available on [2.0.0+].
|
||||
/// See \ref FsSaveDataAttribute for application_id and uid.
|
||||
Result fsOpen_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid);
|
||||
|
||||
/// Wrapper for fsMountSystemSaveData.
|
||||
/// Wrapper for fsOpenSaveDataFileSystem, for opening BcatSaveData.
|
||||
Result fsOpen_BcatSaveData(FsFileSystem* out, u64 application_id);
|
||||
|
||||
/// Wrapper for fsOpenSaveDataFileSystem, for opening DeviceSaveData.
|
||||
/// See \ref FsSaveDataAttribute for application_id.
|
||||
Result fsOpen_DeviceSaveData(FsFileSystem* out, u64 application_id);
|
||||
|
||||
/// Wrapper for fsOpenSaveDataFileSystem, for opening TemporaryStorage.
|
||||
/// Only available on [3.0.0+].
|
||||
Result fsOpen_TemporaryStorage(FsFileSystem* out);
|
||||
|
||||
/// Wrapper for fsOpenSaveDataFileSystem, for opening CacheStorage.
|
||||
/// Only available on [3.0.0+].
|
||||
/// See \ref FsSaveDataAttribute for application_id.
|
||||
Result fsOpen_CacheStorage(FsFileSystem* out, u64 application_id, u16 save_data_index);
|
||||
|
||||
/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemSaveData.
|
||||
/// WARNING: You can brick when writing to SystemSaveData, if the data is corrupted etc.
|
||||
Result fsMount_SystemSaveData(FsFileSystem* out, u64 saveID);
|
||||
Result fsOpen_SystemSaveData(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FsFileSystemType_Logo = 2,
|
||||
FsFileSystemType_ContentControl = 3,
|
||||
FsFileSystemType_ContentManual = 4,
|
||||
FsFileSystemType_ContentMeta = 5,
|
||||
FsFileSystemType_ContentData = 6,
|
||||
FsFileSystemType_ApplicationPackage = 7,
|
||||
} FsFileSystemType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FsFileSystemQueryType_SetArchiveBit = 0,
|
||||
} FsFileSystemQueryType;
|
||||
|
||||
/// Mount requested filesystem type from content file
|
||||
Result fsOpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath); /// same as calling fsOpenFileSystemWithId with 0 as titleId
|
||||
Result fsOpenFileSystemWithId(FsFileSystem* out, u64 titleId, FsFileSystemType fsType, const char* contentPath); /// works on all firmwares, titleId is ignored on 1.0.0
|
||||
Result fsOpenFileSystemWithPatch(FsFileSystem* out, u64 titleId, FsFileSystemType fsType); /// 2.0.0+, like OpenFileSystemWithId but without content path.
|
||||
/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemBcatSaveData.
|
||||
/// Only available on [4.0.0+].
|
||||
Result fsOpen_SystemBcatSaveData(FsFileSystem* out, u64 system_save_data_id);
|
||||
|
||||
// IFileSystem
|
||||
Result fsFsCreateFile(FsFileSystem* fs, const char* path, size_t size, int flags);
|
||||
Result fsFsCreateFile(FsFileSystem* fs, const char* path, s64 size, u32 option);
|
||||
Result fsFsDeleteFile(FsFileSystem* fs, const char* path);
|
||||
Result fsFsCreateDirectory(FsFileSystem* fs, const char* path);
|
||||
Result fsFsDeleteDirectory(FsFileSystem* fs, const char* path);
|
||||
Result fsFsDeleteDirectoryRecursively(FsFileSystem* fs, const char* path);
|
||||
Result fsFsRenameFile(FsFileSystem* fs, const char* cur_path, const char* new_path);
|
||||
Result fsFsRenameDirectory(FsFileSystem* fs, const char* cur_path, const char* new_path);
|
||||
Result fsFsGetEntryType(FsFileSystem* fs, const char* path, FsEntryType* out);
|
||||
Result fsFsOpenFile(FsFileSystem* fs, const char* path, int flags, FsFile* out);
|
||||
Result fsFsOpenDirectory(FsFileSystem* fs, const char* path, int flags, FsDir* out);
|
||||
Result fsFsGetEntryType(FsFileSystem* fs, const char* path, FsDirEntryType* out);
|
||||
Result fsFsOpenFile(FsFileSystem* fs, const char* path, u32 mode, FsFile* out);
|
||||
Result fsFsOpenDirectory(FsFileSystem* fs, const char* path, u32 mode, FsDir* out);
|
||||
Result fsFsCommit(FsFileSystem* fs);
|
||||
Result fsFsGetFreeSpace(FsFileSystem* fs, const char* path, u64* out);
|
||||
Result fsFsGetTotalSpace(FsFileSystem* fs, const char* path, u64* 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, FsFileSystemQueryType query_type);/// 4.0.0+
|
||||
Result fsFsGetFreeSpace(FsFileSystem* fs, const char* path, s64* out);
|
||||
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.
|
||||
/// This will cause HOS to treat the directory as if it were a file containing the directory's concatenated contents.
|
||||
Result fsFsSetArchiveBit(FsFileSystem* fs, const char *path);
|
||||
Result fsFsSetConcatenationFileAttribute(FsFileSystem* fs, const char *path);
|
||||
|
||||
/// Wrapper for fsFsQueryEntry with FsFileSystemQueryId_IsValidSignedSystemPartitionOnSdCard.
|
||||
/// Only available on [8.0.0+].
|
||||
Result fsFsIsValidSignedSystemPartitionOnSdCard(FsFileSystem* fs, bool *out);
|
||||
|
||||
// IFile
|
||||
Result fsFileRead(FsFile* f, u64 off, void* buf, size_t len, u32 option, size_t* out);
|
||||
Result fsFileWrite(FsFile* f, u64 off, const void* buf, size_t len, u32 option);
|
||||
Result fsFileRead(FsFile* f, s64 off, void* buf, u64 read_size, u32 option, u64* bytes_read);
|
||||
Result fsFileWrite(FsFile* f, s64 off, const void* buf, u64 write_size, u32 option);
|
||||
Result fsFileFlush(FsFile* f);
|
||||
Result fsFileSetSize(FsFile* f, u64 sz);
|
||||
Result fsFileGetSize(FsFile* f, u64* out);
|
||||
Result fsFileOperateRange(FsFile* f, FsOperationId op_id, u64 off, size_t len, FsRangeInfo* out); /// 4.0.0+
|
||||
Result fsFileSetSize(FsFile* f, s64 sz);
|
||||
Result fsFileGetSize(FsFile* f, s64* out);
|
||||
Result fsFileOperateRange(FsFile* f, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); ///< [4.0.0+]
|
||||
void fsFileClose(FsFile* f);
|
||||
|
||||
// IDirectory
|
||||
Result fsDirRead(FsDir* d, u64 inval, size_t* total_entries, size_t max_entries, FsDirectoryEntry *buf);
|
||||
Result fsDirGetEntryCount(FsDir* d, u64* count);
|
||||
Result fsDirRead(FsDir* d, s64* total_entries, size_t max_entries, FsDirectoryEntry *buf);
|
||||
Result fsDirGetEntryCount(FsDir* d, s64* count);
|
||||
void fsDirClose(FsDir* d);
|
||||
|
||||
// IStorage
|
||||
Result fsStorageRead(FsStorage* s, u64 off, void* buf, size_t len);
|
||||
Result fsStorageWrite(FsStorage* s, u64 off, const void* buf, size_t len);
|
||||
Result fsStorageRead(FsStorage* s, s64 off, void* buf, u64 read_size);
|
||||
Result fsStorageWrite(FsStorage* s, s64 off, const void* buf, u64 write_size);
|
||||
Result fsStorageFlush(FsStorage* s);
|
||||
Result fsStorageSetSize(FsStorage* s, u64 sz);
|
||||
Result fsStorageGetSize(FsStorage* s, u64* out);
|
||||
Result fsStorageOperateRange(FsStorage* s, FsOperationId op_id, u64 off, size_t len, FsRangeInfo* out); /// 4.0.0+
|
||||
Result fsStorageSetSize(FsStorage* s, s64 sz);
|
||||
Result fsStorageGetSize(FsStorage* s, s64* out);
|
||||
Result fsStorageOperateRange(FsStorage* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); ///< [4.0.0+]
|
||||
void fsStorageClose(FsStorage* s);
|
||||
|
||||
// ISaveDataInfoReader
|
||||
|
||||
/// Read FsSaveDataInfo data into the buf array.
|
||||
Result fsSaveDataIteratorRead(FsSaveDataIterator *s, FsSaveDataInfo* buf, size_t max_entries, size_t* total_entries);
|
||||
void fsSaveDataIteratorClose(FsSaveDataIterator *s);
|
||||
Result fsSaveDataInfoReaderRead(FsSaveDataInfoReader *s, FsSaveDataInfo* buf, size_t max_entries, s64* total_entries);
|
||||
void fsSaveDataInfoReaderClose(FsSaveDataInfoReader *s);
|
||||
|
||||
// IEventNotifier
|
||||
Result fsEventNotifierGetEventHandle(FsEventNotifier* e, Handle* out);
|
||||
Result fsEventNotifierGetEventHandle(FsEventNotifier* e, Event* out, bool autoclear);
|
||||
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);
|
||||
|
@ -6,13 +6,26 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/fs.h"
|
||||
#include "../crypto/sha256.h"
|
||||
#include "../services/ncm_types.h"
|
||||
|
||||
typedef struct {
|
||||
u8 signature[0x100];
|
||||
u8 hash[SHA256_HASH_SIZE];
|
||||
bool is_signed;
|
||||
u8 reserved[3];
|
||||
} FsCodeInfo;
|
||||
|
||||
/// Initialize fsp-ldr.
|
||||
Result fsldrInitialize(void);
|
||||
|
||||
/// Exit fsp-ldr.
|
||||
void fsldrExit(void);
|
||||
|
||||
/// Gets the Service object for the actual fsp-ldr service session.
|
||||
Service* fsldrGetServiceSession(void);
|
||||
|
||||
Result fsldrOpenCodeFileSystem(u64 tid, const char *path, FsFileSystem* out);
|
||||
Result fsldrOpenCodeFileSystem(FsCodeInfo* out_code_info, u64 tid, NcmStorageId storage_id, const char *path, FsContentAttributes attr, FsFileSystem* out);
|
||||
Result fsldrIsArchivedProgram(u64 pid, bool *out);
|
||||
Result fsldrSetCurrentProcess(void);
|
@ -6,14 +6,19 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../services/sm.h"
|
||||
#include "../services/fs.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/ncm_types.h"
|
||||
|
||||
/// Initialize fsp-pr.
|
||||
Result fsprInitialize(void);
|
||||
|
||||
/// Exit fsp-pr.
|
||||
void fsprExit(void);
|
||||
|
||||
/// Gets the Service object for the actual fsp-pr service session.
|
||||
Service* fsprGetServiceSession(void);
|
||||
|
||||
Result fsprRegisterProgram(u64 pid, u64 titleID, FsStorageId storageID, 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);
|
||||
|
@ -6,12 +6,14 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "sm.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
typedef enum {
|
||||
GpioPadName_AudioCodec = 1,
|
||||
GpioPadName_ButtonVolUp = 25,
|
||||
GpioPadName_AudioCodec = 1,
|
||||
GpioPadName_ButtonVolUp = 25,
|
||||
GpioPadName_ButtonVolDown = 26,
|
||||
GpioPadName_SdCd = 56,
|
||||
} GpioPadName;
|
||||
|
||||
typedef struct {
|
||||
@ -19,23 +21,57 @@ typedef struct {
|
||||
} GpioPadSession;
|
||||
|
||||
typedef enum {
|
||||
GpioDirection_Input = 0,
|
||||
GpioDirection_Input = 0,
|
||||
GpioDirection_Output = 1,
|
||||
} GpioDirection;
|
||||
|
||||
typedef enum {
|
||||
GpioValue_Low = 0,
|
||||
GpioValue_Low = 0,
|
||||
GpioValue_High = 1,
|
||||
} GpioValue;
|
||||
|
||||
typedef enum {
|
||||
GpioInterruptMode_LowLevel = 0,
|
||||
GpioInterruptMode_HighLevel = 1,
|
||||
GpioInterruptMode_RisingEdge = 2,
|
||||
GpioInterruptMode_FallingEdge = 3,
|
||||
GpioInterruptMode_AnyEdge = 4,
|
||||
} GpioInterruptMode;
|
||||
|
||||
typedef enum {
|
||||
GpioInterruptStatus_Inactive = 0,
|
||||
GpioInterruptStatus_Active = 1,
|
||||
} GpioInterruptStatus;
|
||||
|
||||
/// Initialize gpio.
|
||||
Result gpioInitialize(void);
|
||||
|
||||
/// Exit gpio.
|
||||
void gpioExit(void);
|
||||
|
||||
/// Gets the Service object for the actual gpio service session.
|
||||
Service* gpioGetServiceSession(void);
|
||||
|
||||
Result gpioOpenSession(GpioPadSession *out, GpioPadName name);
|
||||
Result gpioOpenSession2(GpioPadSession *out, u32 device_code, u32 access_mode);
|
||||
|
||||
Result gpioIsWakeEventActive(bool *out, GpioPadName name);
|
||||
Result gpioIsWakeEventActive2(bool *out, u32 device_code);
|
||||
|
||||
Result gpioPadSetDirection(GpioPadSession *p, GpioDirection dir);
|
||||
Result gpioPadGetDirection(GpioPadSession *p, GpioDirection *out);
|
||||
Result gpioPadSetInterruptMode(GpioPadSession *p, GpioInterruptMode mode);
|
||||
Result gpioPadGetInterruptMode(GpioPadSession *p, GpioInterruptMode *out);
|
||||
Result gpioPadSetInterruptEnable(GpioPadSession *p, bool en);
|
||||
Result gpioPadGetInterruptEnable(GpioPadSession *p, bool *out);
|
||||
Result gpioPadGetInterruptStatus(GpioPadSession *p, GpioInterruptStatus *out); ///< [1.0.0-16.1.0]
|
||||
Result gpioPadClearInterruptStatus(GpioPadSession *p); ///< [1.0.0-16.1.0]
|
||||
Result gpioPadSetValue(GpioPadSession *p, GpioValue val);
|
||||
Result gpioPadGetValue(GpioPadSession *p, GpioValue *out);
|
||||
Result gpioPadBindInterrupt(GpioPadSession *p, Event *out);
|
||||
Result gpioPadUnbindInterrupt(GpioPadSession *p);
|
||||
Result gpioPadSetDebounceEnabled(GpioPadSession *p, bool en);
|
||||
Result gpioPadGetDebounceEnabled(GpioPadSession *p, bool *out);
|
||||
Result gpioPadSetDebounceTime(GpioPadSession *p, s32 ms);
|
||||
Result gpioPadGetDebounceTime(GpioPadSession *p, s32 *out);
|
||||
void gpioPadClose(GpioPadSession *p);
|
||||
|
197
nx/include/switch/services/grc.h
Normal file
197
nx/include/switch/services/grc.h
Normal file
@ -0,0 +1,197 @@
|
||||
/**
|
||||
* @file grc.h
|
||||
* @brief GRC Game Recording (grc:*) service IPC wrapper.
|
||||
* @author yellows8
|
||||
* @copyright libnx Authors
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../sf/service.h"
|
||||
#include "../services/caps.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../kernel/tmem.h"
|
||||
#include "../display/native_window.h"
|
||||
|
||||
/// Stream type values for \ref grcdTransfer.
|
||||
typedef enum {
|
||||
GrcStream_Video = 0, ///< Video stream with H.264 NAL units. Official sw uses buffer size 0x32000.
|
||||
GrcStream_Audio = 1, ///< Audio stream with PcmFormat_Int16, 2 channels, and samplerate = 48000Hz. Official sw uses buffer size 0x1000.
|
||||
} GrcStream;
|
||||
|
||||
/// GameMovieTrimmer
|
||||
typedef struct {
|
||||
Service s; ///< IGameMovieTrimmer
|
||||
TransferMemory tmem; ///< TransferMemory
|
||||
} GrcGameMovieTrimmer;
|
||||
|
||||
/// IMovieMaker
|
||||
typedef struct {
|
||||
Service a; ///< applet IMovieMaker
|
||||
Service s; ///< grc IMovieMaker
|
||||
Service video_proxy; ///< IHOSBinderDriver VideoProxy
|
||||
Event recording_event; ///< Output Event from GetOffscreenLayerRecordingFinishReadyEvent with autoclear=false.
|
||||
Event audio_event; ///< Output Event from GetOffscreenLayerAudioEncodeReadyEvent with autoclear=false.
|
||||
TransferMemory tmem; ///< TransferMemory
|
||||
NWindow win; ///< \ref NWindow
|
||||
u64 layer_handle; ///< LayerHandle
|
||||
bool layer_open; ///< Whether OpenOffscreenLayer was used successfully, indicating that CloseOffscreenLayer should be used during \ref grcMovieMakerClose.
|
||||
bool started_flag; ///< Whether \ref grcMovieMakerStart was used successfully. This is also used by \ref grcMovieMakerAbort.
|
||||
} GrcMovieMaker;
|
||||
|
||||
/// GameMovieId
|
||||
typedef struct {
|
||||
CapsAlbumFileId file_id; ///< \ref CapsAlbumFileId
|
||||
u8 reserved[0x28]; ///< Unused, always zero.
|
||||
} GrcGameMovieId;
|
||||
|
||||
/// OffscreenRecordingParameter
|
||||
typedef struct {
|
||||
u8 unk_x0[0x10]; ///< Unknown. Default value is 0.
|
||||
u32 unk_x10; ///< Unknown. Must match value 0x103, which is the default value.
|
||||
|
||||
s32 video_bitrate; ///< VideoBitRate, 0 is invalid. Default value is 8000000.
|
||||
s32 video_width; ///< VideoWidth, must match 1280 or 1920. Default value is 1280.
|
||||
s32 video_height; ///< VideoHeight, must match 720 or 1080. Default value is 720.
|
||||
s32 video_framerate; ///< VideoFrameRate, must match 30 or 60. Default value is 30.
|
||||
s32 video_keyFrameInterval; ///< VideoKeyFrameInterval, 0 is invalid. Default value is 30.
|
||||
|
||||
s32 audio_bitrate; ///< AudioBitRate. Default value is 128000 ([5.0.0-5.1.0] 1536000).
|
||||
s32 audio_samplerate; ///< AudioSampleRate, 0 is invalid. Default value is 48000.
|
||||
s32 audio_channel_count; ///< AudioChannelCount. Must match 2, which is the default value.
|
||||
s32 audio_sample_format; ///< \ref PcmFormat AudioSampleFormat. Must match PcmFormat_Int16, which is the default value.
|
||||
|
||||
s32 video_imageOrientation; ///< \ref AlbumImageOrientation VideoImageOrientation. Default value is ::AlbumImageOrientation_Unknown0.
|
||||
|
||||
u8 unk_x3c[0x44]; ///< Unknown. Default value is 0.
|
||||
} GrcOffscreenRecordingParameter;
|
||||
|
||||
/// Default size for \ref grcCreateMovieMaker, this is the size used by official sw.
|
||||
#define GRC_MOVIEMAKER_WORKMEMORY_SIZE_DEFAULT 0x6000000
|
||||
|
||||
///@name Trimming
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref GrcGameMovieTrimmer using \ref appletCreateGameMovieTrimmer, uses the cmds from it to trim the specified video, then closes it.
|
||||
* @note See \ref appletCreateGameMovieTrimmer for the requirements for using this.
|
||||
* @note This will block until video trimming finishes.
|
||||
* @param[out] dst_movieid \ref GrcGameMovieId for the output video.
|
||||
* @param[in] src_movieid \ref GrcGameMovieId for the input video.
|
||||
* @param[in] tmem_size TransferMemory size. Official sw uses size 0x2000000.
|
||||
* @param[in] thumbnail Optional, can be NULL. RGBA8 1280x720 thumbnail image data.
|
||||
* @param[in] start Start timestamp in 0.5s units.
|
||||
* @param[in] end End timestamp in 0.5s units.
|
||||
*/
|
||||
Result grcTrimGameMovie(GrcGameMovieId *dst_movieid, const GrcGameMovieId *src_movieid, size_t tmem_size, const void* thumbnail, s32 start, s32 end);
|
||||
|
||||
///@}
|
||||
|
||||
///@name IMovieMaker
|
||||
///@{
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref GrcOffscreenRecordingParameter with the default values, see \ref GrcOffscreenRecordingParameter for the default values.
|
||||
* @param[out] param \ref GrcOffscreenRecordingParameter
|
||||
*/
|
||||
void grcCreateOffscreenRecordingParameter(GrcOffscreenRecordingParameter *param);
|
||||
|
||||
/**
|
||||
* @brief Creates a \ref GrcMovieMaker using \ref appletCreateMovieMaker, and does the required initialization.
|
||||
* @note See \ref appletCreateMovieMaker for the requirements for using this.
|
||||
* @param[out] m \ref GrcMovieMaker
|
||||
* @param[in] size TransferMemory WorkMemory size. See \ref GRC_MOVIEMAKER_WORKMEMORY_SIZE_DEFAULT.
|
||||
*/
|
||||
Result grcCreateMovieMaker(GrcMovieMaker *m, size_t size);
|
||||
|
||||
/**
|
||||
* @brief Closes a \ref GrcMovieMaker.
|
||||
* @note This also uses \ref grcMovieMakerAbort.
|
||||
* @param m \ref GrcMovieMaker
|
||||
*/
|
||||
void grcMovieMakerClose(GrcMovieMaker *m);
|
||||
|
||||
/**
|
||||
* @brief Gets the \ref NWindow for the specified MovieMaker.
|
||||
* @param m \ref GrcMovieMaker
|
||||
*/
|
||||
static inline NWindow* grcMovieMakerGetNWindow(GrcMovieMaker *m) {
|
||||
return &m->win;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Aborts recording with the specified MovieMaker.
|
||||
* @note This is used automatically by \ref grcMovieMakerClose.
|
||||
* @note This will throw an error if \ref grcMovieMakerStart was not used previously, with the flag used for this being cleared afterwards on success.
|
||||
* @param m \ref GrcMovieMaker
|
||||
*/
|
||||
Result grcMovieMakerAbort(GrcMovieMaker *m);
|
||||
|
||||
/**
|
||||
* @brief Starts recording with the specified MovieMaker and \ref GrcOffscreenRecordingParameter.
|
||||
* @param m \ref GrcMovieMaker
|
||||
* @param[in] param \ref GrcOffscreenRecordingParameter
|
||||
*/
|
||||
Result grcMovieMakerStart(GrcMovieMaker *m, const GrcOffscreenRecordingParameter *param);
|
||||
|
||||
/**
|
||||
* @brief Finishes recording with the specified MovieMaker.
|
||||
* @note This automatically uses \ref grcMovieMakerAbort on error.
|
||||
* @note The recorded video will not be accessible via the Album-applet since it's stored separately from other Album data.
|
||||
* @param m \ref GrcMovieMaker
|
||||
* @param width Width for the thumbnail, must be 1280.
|
||||
* @param height Height for the thumbnail, must be 720.
|
||||
* @param[in] userdata UserData input buffer for the JPEG thumbnail. Optional, can be NULL.
|
||||
* @param[in] userdata_size Size of the UserData input buffer. Optional, can be 0. Must be <=0x400.
|
||||
* @param[in] thumbnail RGBA8 image buffer containing the thumbnail. Optional, can be NULL.
|
||||
* @param[in] thumbnail_size Size of the thumbnail buffer. Optional, can be 0.
|
||||
* @param[out] entry Output \ref CapsApplicationAlbumEntry for the recorded video. Optional, can be NULL. Only available on [7.0.0+], if this is not NULL on pre-7.0.0 an error is thrown.
|
||||
*/
|
||||
Result grcMovieMakerFinish(GrcMovieMaker *m, s32 width, s32 height, const void* userdata, size_t userdata_size, const void* thumbnail, size_t thumbnail_size, CapsApplicationAlbumEntry *entry);
|
||||
|
||||
/**
|
||||
* @brief Gets the recording error with the specified MovieMaker.
|
||||
* @param m \ref GrcMovieMaker
|
||||
*/
|
||||
Result grcMovieMakerGetError(GrcMovieMaker *m);
|
||||
|
||||
/**
|
||||
* @brief Encodes audio sample data with the specified MovieMaker.
|
||||
* @note This waits on the event and uses the cmd repeatedly until the entire input buffer is handled.
|
||||
* @note If you don't use this the recorded video will be missing audio.
|
||||
* @param m \ref GrcMovieMaker
|
||||
* @param[in] buffer Audio buffer.
|
||||
* @param[in] size Size of the buffer.
|
||||
*/
|
||||
Result grcMovieMakerEncodeAudioSample(GrcMovieMaker *m, const void* buffer, size_t size);
|
||||
|
||||
///@}
|
||||
|
||||
///@name grc:d
|
||||
///@{
|
||||
|
||||
/// Initialize grc:d.
|
||||
Result grcdInitialize(void);
|
||||
|
||||
/// Exit grc:d.
|
||||
void grcdExit(void);
|
||||
|
||||
/// Gets the Service for grc:d.
|
||||
Service* grcdGetServiceSession(void);
|
||||
|
||||
/// Begins streaming. This must not be called more than once, even from a different service session: otherwise the sysmodule will assert.
|
||||
Result grcdBegin(void);
|
||||
|
||||
/**
|
||||
* @brief Retrieves stream data from the continuous recorder in use (from the video recording of the currently running application).
|
||||
* @note This will block until data is available. This will hang if there is no application running which has video capture enabled.
|
||||
* @param[in] stream \ref GrcStream
|
||||
* @param[out] buffer Output buffer.
|
||||
* @param[in] size Max size of the output buffer.
|
||||
* @param[out] num_frames num_frames
|
||||
* @param[out] data_size Actual output data size.
|
||||
* @param[out] start_timestamp Start timestamp.
|
||||
*/
|
||||
Result grcdTransfer(GrcStream stream, void* buffer, size_t size, u32 *num_frames, u32 *data_size, u64 *start_timestamp);
|
||||
|
||||
///@}
|
||||
|
File diff suppressed because it is too large
Load Diff
219
nx/include/switch/services/hidbus.h
Normal file
219
nx/include/switch/services/hidbus.h
Normal file
@ -0,0 +1,219 @@
|
||||
/**
|
||||
* @file hidbus.h
|
||||
* @brief hidbus service IPC wrapper, for using external devices attached to HID controllers. See also: https://switchbrew.org/wiki/HID_services#hidbus
|
||||
* @note Only available on [5.0.0+].
|
||||
* @author yellows8
|
||||
*/
|
||||
#pragma once
|
||||
#include "../types.h"
|
||||
#include "../kernel/event.h"
|
||||
#include "../services/hid.h"
|
||||
#include "../sf/service.h"
|
||||
|
||||
/// BusType
|
||||
typedef enum {
|
||||
HidbusBusType_LeftJoyRail = 0, ///< LeftJoyRail
|
||||
HidbusBusType_RightJoyRail = 1, ///< RightJoyRail
|
||||
HidbusBusType_RightLarkRail = 2, ///< [6.0.0+] RightLarkRail (for microphone).
|
||||
} HidbusBusType;
|
||||
|
||||
/// JoyPollingMode
|
||||
typedef enum {
|
||||
HidbusJoyPollingMode_SixAxisSensorDisable = 0, ///< SixAxisSensorDisable
|
||||
HidbusJoyPollingMode_SixAxisSensorEnable = 1, ///< JoyEnableSixAxisPollingData
|
||||
HidbusJoyPollingMode_ButtonOnly = 2, ///< [6.0.0+] ButtonOnly
|
||||
} HidbusJoyPollingMode;
|
||||
|
||||
/// BusHandle
|
||||
typedef struct {
|
||||
u32 abstracted_pad_id; ///< AbstractedPadId
|
||||
u8 internal_index; ///< InternalIndex
|
||||
u8 player_number; ///< PlayerNumber
|
||||
u8 bus_type_id; ///< BusTypeId
|
||||
u8 is_valid; ///< IsValid
|
||||
} HidbusBusHandle;
|
||||
|
||||
/// JoyPollingReceivedData
|
||||
typedef struct {
|
||||
u8 data[0x30]; ///< Data.
|
||||
u64 out_size; ///< Size of data.
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
} HidbusJoyPollingReceivedData;
|
||||
|
||||
/// HidbusDataAccessorHeader
|
||||
typedef struct {
|
||||
Result res; ///< Result.
|
||||
u32 pad; ///< Padding.
|
||||
u8 unused[0x18]; ///< Initialized sysmodule-side, not used by sdknso.
|
||||
u64 latest_entry; ///< Latest entry.
|
||||
u64 total_entries; ///< Total entries.
|
||||
} HidbusDataAccessorHeader;
|
||||
|
||||
/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData
|
||||
typedef struct {
|
||||
u8 data[0x26]; ///< Data.
|
||||
u8 out_size; ///< Size of data.
|
||||
u8 pad; ///< Padding.
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
} HidbusJoyDisableSixAxisPollingDataAccessorEntryData;
|
||||
|
||||
/// HidbusJoyDisableSixAxisPollingDataAccessorEntry
|
||||
typedef struct {
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
HidbusJoyDisableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyDisableSixAxisPollingDataAccessorEntryData
|
||||
} HidbusJoyDisableSixAxisPollingDataAccessorEntry;
|
||||
|
||||
/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData
|
||||
typedef struct {
|
||||
u8 data[0x8]; ///< Data.
|
||||
u8 out_size; ///< Size of data.
|
||||
u8 pad[7]; ///< Padding.
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
} HidbusJoyEnableSixAxisPollingDataAccessorEntryData;
|
||||
|
||||
/// HidbusJoyEnableSixAxisPollingDataAccessorEntry
|
||||
typedef struct {
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
HidbusJoyEnableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
|
||||
} HidbusJoyEnableSixAxisPollingDataAccessorEntry;
|
||||
|
||||
/// HidbusJoyButtonOnlyPollingDataAccessorEntryData
|
||||
typedef struct {
|
||||
u8 data[0x2c]; ///< Data.
|
||||
u8 out_size; ///< Size of data.
|
||||
u8 pad[3]; ///< Padding.
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
} HidbusJoyButtonOnlyPollingDataAccessorEntryData;
|
||||
|
||||
/// HidbusJoyButtonOnlyPollingDataAccessorEntry
|
||||
typedef struct {
|
||||
u64 sampling_number; ///< SamplingNumber
|
||||
HidbusJoyButtonOnlyPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
|
||||
} HidbusJoyButtonOnlyPollingDataAccessorEntry;
|
||||
|
||||
/// HidbusJoyDisableSixAxisPollingDataAccessor
|
||||
typedef struct {
|
||||
HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
|
||||
HidbusJoyDisableSixAxisPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyDisableSixAxisPollingDataAccessorEntry
|
||||
} HidbusJoyDisableSixAxisPollingDataAccessor;
|
||||
|
||||
/// HidbusJoyEnableSixAxisPollingDataAccessor
|
||||
typedef struct {
|
||||
HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
|
||||
HidbusJoyEnableSixAxisPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntry
|
||||
} HidbusJoyEnableSixAxisPollingDataAccessor;
|
||||
|
||||
/// HidbusJoyButtonOnlyPollingDataAccessor
|
||||
typedef struct {
|
||||
HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
|
||||
HidbusJoyButtonOnlyPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyButtonOnlyPollingDataAccessorEntry
|
||||
} HidbusJoyButtonOnlyPollingDataAccessor;
|
||||
|
||||
/// Common data for HidbusStatusManagerEntry*.
|
||||
typedef struct {
|
||||
u8 is_connected; ///< IsConnected
|
||||
u8 pad[3]; ///< Padding.
|
||||
Result is_connected_result; ///< IsConnectedResult
|
||||
u8 is_enabled; ///< Flag indicating whether a device is enabled (\ref hidbusEnableExternalDevice).
|
||||
u8 is_in_focus; ///< Flag indicating whether this entry is valid.
|
||||
u8 is_polling_mode; ///< Flag indicating whether polling is enabled (\ref hidbusEnableJoyPollingReceiveMode).
|
||||
u8 reserved; ///< Reserved
|
||||
u32 polling_mode; ///< \ref HidbusJoyPollingMode
|
||||
} HidbusStatusManagerEntryCommon;
|
||||
|
||||
/// HidbusStatusManagerEntry on 5.x.
|
||||
typedef struct {
|
||||
HidbusStatusManagerEntryCommon common; ///< \ref HidbusStatusManagerEntryCommon
|
||||
u8 unk_x10[0xf0]; ///< Ignored by official sw.
|
||||
} HidbusStatusManagerEntryV5;
|
||||
|
||||
/// HidbusStatusManagerEntry
|
||||
typedef struct {
|
||||
HidbusStatusManagerEntryCommon common; ///< \ref HidbusStatusManagerEntryCommon
|
||||
u8 unk_x10[0x70]; ///< Ignored by official sw.
|
||||
} HidbusStatusManagerEntry;
|
||||
|
||||
/// StatusManager on 5.x.
|
||||
typedef struct {
|
||||
HidbusStatusManagerEntryV5 entries[0x10]; ///< \ref HidbusStatusManagerEntryV5
|
||||
} HidbusStatusManagerV5;
|
||||
|
||||
/// StatusManager
|
||||
typedef struct {
|
||||
HidbusStatusManagerEntry entries[0x13]; ///< \ref HidbusStatusManagerEntry
|
||||
u8 unused[0x680]; ///< Unused.
|
||||
} HidbusStatusManager;
|
||||
|
||||
/// Gets the Service object for the actual hidbus service session. This object must be closed by the user once finished using cmds with this.
|
||||
Result hidbusGetServiceSession(Service* srv_out);
|
||||
|
||||
/// Gets the SharedMemory addr (\ref HidbusStatusManagerV5 on 5.x, otherwise \ref HidbusStatusManager). Only valid when at least one BusHandle is currently initialized (\ref hidbusInitialize).
|
||||
void* hidbusGetSharedmemAddr(void);
|
||||
|
||||
/**
|
||||
* @brief GetBusHandle
|
||||
* @param[out] handle \ref HidbusBusHandle
|
||||
* @param[out] flag Output flag indicating whether the handle is valid.
|
||||
* @param[in] id \ref HidNpadIdType
|
||||
* @param[in] bus_type \ref HidbusBusType
|
||||
*/
|
||||
Result hidbusGetBusHandle(HidbusBusHandle *handle, bool *flag, HidNpadIdType id, HidbusBusType bus_type);
|
||||
|
||||
/**
|
||||
* @brief Initialize
|
||||
* @param[in] handle \ref HidbusBusHandle
|
||||
*/
|
||||
Result hidbusInitialize(HidbusBusHandle handle);
|
||||
|
||||
/**
|
||||
* @brief Finalize
|
||||
* @param[in] handle \ref HidbusBusHandle
|
||||
*/
|
||||
Result hidbusFinalize(HidbusBusHandle handle);
|
||||
|
||||
/**
|
||||
* @brief EnableExternalDevice
|
||||
* @note This uses \ref hidLaShowControllerFirmwareUpdate if needed.
|
||||
* @param[in] handle \ref HidbusBusHandle
|
||||
* @param[in] flag Whether to enable the device (true = enable, false = disable). When false, this will internally use \ref hidbusDisableJoyPollingReceiveMode if needed.
|
||||
* @param[in] device_id ExternalDeviceId which must match the connected device. Only used when flag is set.
|
||||
*/
|
||||
Result hidbusEnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_id);
|
||||
|
||||
/**
|
||||
* @brief SendAndReceive
|
||||
* @param[in] handle \ref HidbusBusHandle
|
||||
* @param[in] inbuf Input buffer, containing the command data.
|
||||
* @param[in] inbuf_size Input buffer size, must be <0x26.
|
||||
* @param[out] outbuf Output buffer, containing the command reply data.
|
||||
* @param[in] outbuf_size Output buffer max size.
|
||||
* @param[out] out_size Actual output size.
|
||||
*/
|
||||
Result hidbusSendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* outbuf, size_t outbuf_size, u64 *out_size);
|
||||
|
||||
/**
|
||||
* @brief EnableJoyPollingReceiveMode
|
||||
* @param[in] handle \ref HidbusBusHandle
|
||||
* @param[in] inbuf Input buffer, containing the command data.
|
||||
* @param[in] inbuf_size Input buffer size, must be <0x26.
|
||||
* @param[out] workbuf TransferMemory buffer, must be 0x1000-byte aligned. This buffer must not be written to until after \ref hidbusDisableJoyPollingReceiveMode is used.
|
||||
* @param[in] workbuf_size TransferMemory buffer size, must be 0x1000-byte aligned.
|
||||
* @param[in] polling_mode \ref HidbusJoyPollingMode
|
||||
*/
|
||||
Result hidbusEnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode);
|
||||
|
||||
/**
|
||||
* @brief DisableJoyPollingReceiveMode
|
||||
* @note This can also be used via \ref hidbusEnableExternalDevice with flag=false.
|
||||
* @param[in] handle \ref HidbusBusHandle
|
||||
*/
|
||||
Result hidbusDisableJoyPollingReceiveMode(HidbusBusHandle handle);
|
||||
|
||||
/**
|
||||
* @brief GetJoyPollingReceivedData
|
||||
* @param[in] handle \ref HidbusBusHandle
|
||||
* @param[out] recv_data Output array of \ref HidbusJoyPollingReceivedData.
|
||||
* @param[in] count Total entries for the recv_data array. The maximum is 0xa. Official apps use range 0x1-0x9.
|
||||
*/
|
||||
Result hidbusGetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingReceivedData *recv_data, s32 count);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user