Compare commits
434 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99c74469e6 | ||
|
|
a3d9efb18c | ||
|
|
3fe072a1d0 | ||
|
|
ab81ed2795 | ||
|
|
56bfbb02ec | ||
|
|
006f8022c0 | ||
|
|
296d049257 | ||
|
|
155f158197 | ||
|
|
3dc51e164f | ||
|
|
801f784fae | ||
|
|
ed295c4cb5 | ||
|
|
790f7498c1 | ||
|
|
7cdfa68dd5 | ||
|
|
90732ff311 | ||
|
|
f6fb5f2c8d | ||
|
|
ce7dd55257 | ||
|
|
481ce12b7b | ||
|
|
2f2c36b22b | ||
|
|
2c4bd44d7e | ||
|
|
2b91956051 | ||
|
|
4c73c461f1 | ||
|
|
8b49cea4a9 | ||
|
|
fdf008108c | ||
|
|
252486913b | ||
|
|
44d10da7b8 | ||
|
|
cb28150912 | ||
|
|
29cc3d1c09 | ||
|
|
e6a6fe6f38 | ||
|
|
d80ad222cc | ||
|
|
572cbd8619 | ||
|
|
183243bf16 | ||
|
|
6407786059 | ||
|
|
6cbfaaf835 | ||
|
|
b6b09d6944 | ||
|
|
c1c07af99a | ||
|
|
05b54c4c2a | ||
|
|
619a7b2074 | ||
|
|
a941e4be03 | ||
|
|
e2a74a9e38 | ||
|
|
89541c8042 | ||
|
|
ae54ec5981 | ||
|
|
75d5e2aef0 | ||
|
|
bd240b23d8 | ||
|
|
568a3b62eb | ||
|
|
04cbc06bc1 | ||
|
|
385f00c375 | ||
|
|
23a1cee2e3 | ||
|
|
fedd684a1c | ||
|
|
cb299d9260 | ||
|
|
724bd2b4d2 | ||
|
|
50c1b628a8 | ||
|
|
f2da92184b | ||
|
|
a595091be0 | ||
|
|
0ec23e74b5 | ||
|
|
8acf0a4fa9 | ||
|
|
ebb0bd2b41 | ||
|
|
c10265676f | ||
|
|
9e7b56b33c | ||
|
|
05ea0c53d7 | ||
|
|
4075d24e0c | ||
|
|
904ab19823 | ||
|
|
534c2c76f5 | ||
|
|
d216a77187 | ||
|
|
1401f3520e | ||
|
|
c6fad1b0ee | ||
|
|
9f1f0c7cbd | ||
|
|
649a0052d0 | ||
|
|
a7f9729f63 | ||
|
|
f85df27875 | ||
|
|
db7268de2e | ||
|
|
a2c0cc924b | ||
|
|
206516411f | ||
|
|
b61797224d | ||
|
|
899efec302 | ||
|
|
1a1b1355ba | ||
|
|
aa2dce7316 | ||
|
|
e9849c74cf | ||
|
|
a1fb8a91c8 | ||
|
|
bfeba7c1e8 | ||
|
|
31d44d821f | ||
|
|
44beeecc9e | ||
|
|
844e88bdfe | ||
|
|
a1af1af74d | ||
|
|
5e64460bb9 | ||
|
|
960161741d | ||
|
|
443271de35 | ||
|
|
4ad300c33c | ||
|
|
715eacbf8e | ||
|
|
dda7ea6ac2 | ||
|
|
005aac5a2b | ||
|
|
1e4356cdb9 | ||
|
|
e0f45d54f1 | ||
|
|
8da223468f | ||
|
|
045f9b2f15 | ||
|
|
b7521465ee | ||
|
|
a8f898b591 | ||
|
|
158da95b9f | ||
|
|
36c470ad11 | ||
|
|
62f8408a2e | ||
|
|
a6ea490615 | ||
|
|
da208f8001 | ||
|
|
320f0bbcfd | ||
|
|
2247f97cdc | ||
|
|
0ef9f7ccc8 | ||
|
|
596f5c3f52 | ||
|
|
e5106ffa2c | ||
|
|
968ced677e | ||
|
|
5950ff5b5e | ||
|
|
b520f5c53b | ||
|
|
c5d021c172 | ||
|
|
07779b787a | ||
|
|
cefdda77e5 | ||
|
|
622650623c | ||
|
|
7ea9b533d9 | ||
|
|
c2a930965a | ||
|
|
c4fee796ea | ||
|
|
598edc0a46 | ||
|
|
40e2d4bbe6 | ||
|
|
648ad51056 | ||
|
|
e0a41e9d33 | ||
|
|
1dd0297db3 | ||
|
|
4355a2b036 | ||
|
|
dbad464323 | ||
|
|
565282d06e | ||
|
|
2f7012cbc6 | ||
|
|
8560713a60 | ||
|
|
6c5f2804ab | ||
|
|
51cf28339b | ||
|
|
80999988d4 | ||
|
|
ecbf13e45d | ||
|
|
237b11892e | ||
|
|
d7192343d8 | ||
|
|
d2f3b806d6 | ||
|
|
3bcdd0c3c8 | ||
|
|
4480e7a8a5 | ||
|
|
1a8f886a6e | ||
|
|
ee1d1ea527 | ||
|
|
e7d7d8adfb | ||
|
|
5cff5e629b | ||
|
|
49d0a51d6b | ||
|
|
25cd3d17de | ||
|
|
3b460e94d4 | ||
|
|
349a16ce39 | ||
|
|
f2a1c60218 | ||
|
|
c91f95e8f6 | ||
|
|
53ede217a5 | ||
|
|
669564b022 | ||
|
|
c9bd97192f | ||
|
|
c333a84b6b | ||
|
|
3e81796db7 | ||
|
|
5f60bc7186 | ||
|
|
165c926135 | ||
|
|
d43bc68d0b | ||
|
|
c5edb031fa | ||
|
|
1f065e3bac | ||
|
|
9296a56303 | ||
|
|
481b209ae8 | ||
|
|
17ca463c3f | ||
|
|
f175802136 | ||
|
|
fe79bc253a | ||
|
|
81bf8c577a | ||
|
|
aee89db748 | ||
|
|
f5704d25f8 | ||
|
|
73afa042f1 | ||
|
|
2da31b122f | ||
|
|
43bbfd29bb | ||
|
|
4cb4707f34 | ||
|
|
389c3b6baa | ||
|
|
0c596e682f | ||
|
|
4d430a4c61 | ||
|
|
0c41489f01 | ||
|
|
bd6155bcb4 | ||
|
|
3bedf56512 | ||
|
|
1be74ea6e2 | ||
|
|
14d458522d | ||
|
|
12bf9612cb | ||
|
|
ea7b6e14f9 | ||
|
|
5e3339e866 | ||
|
|
a7c14e03b9 | ||
|
|
9df13781c2 | ||
|
|
283736878d | ||
|
|
f863164648 | ||
|
|
3eb76fcd16 | ||
|
|
2088c5a34a | ||
|
|
846cde52e0 | ||
|
|
a3dd445b32 | ||
|
|
c362838e11 | ||
|
|
e086022b77 | ||
|
|
70c1bad08b | ||
|
|
38f9a76ba0 | ||
|
|
4892ffae15 | ||
|
|
25305257d6 | ||
|
|
e423aef033 | ||
|
|
8a6afe7909 | ||
|
|
c02f32f1bf | ||
|
|
2ab01ad33c | ||
|
|
3dbc79dd5c | ||
|
|
90b54c03b3 | ||
|
|
7821241356 | ||
|
|
8fea8d9b2e | ||
|
|
dcdf46f576 | ||
|
|
df5537b748 | ||
|
|
0f2855ada8 | ||
|
|
c790d03693 | ||
|
|
25be7c5b1b | ||
|
|
7e05e12b83 | ||
|
|
99d7f72c51 | ||
|
|
691a453d77 | ||
|
|
88246f475c | ||
|
|
269d4496b2 | ||
|
|
bb4c7a390b | ||
|
|
b846628362 | ||
|
|
26fb201518 | ||
|
|
01ce7cef14 | ||
|
|
3f3aaa01fa | ||
|
|
bf8de39e69 | ||
|
|
6bb4253df5 | ||
|
|
cfd7121574 | ||
|
|
972681c57e | ||
|
|
0a11cbc2d6 | ||
|
|
32f487abfb | ||
|
|
7d61cab01c | ||
|
|
14ed4e4057 | ||
|
|
e8ba632606 | ||
|
|
dbcb1e1564 | ||
|
|
15381409dc | ||
|
|
10ad6934ac | ||
|
|
03e66efd85 | ||
|
|
7040e8976d | ||
|
|
296a6af058 | ||
|
|
2c332d1cf8 | ||
|
|
243d7dc777 | ||
|
|
355010ad84 | ||
|
|
ef0c15b764 | ||
|
|
0dc308d92a | ||
|
|
eb5542963f | ||
|
|
18673d96cb | ||
|
|
36f6bdc3a0 | ||
|
|
d6fff49845 | ||
|
|
d05e8fb23a | ||
|
|
0767d9f8da | ||
|
|
21f3d29df7 | ||
|
|
4f16106702 | ||
|
|
19be54ff95 | ||
|
|
ed80d6ec8c | ||
|
|
57b6c71c1c | ||
|
|
0a11d341b7 | ||
|
|
8010290472 | ||
|
|
fbc526d163 | ||
|
|
5bb790e4a7 | ||
|
|
0a6219e6e0 | ||
|
|
037b04ac60 | ||
|
|
9e563d590b | ||
|
|
bdcf02a3ef | ||
|
|
88ac85c423 | ||
|
|
2e1a93f1d1 | ||
|
|
997e4dd665 | ||
|
|
aa2d03d8e1 | ||
|
|
274c1deae4 | ||
|
|
d5bbf32a26 | ||
|
|
97a251b4b2 | ||
|
|
9d30917f4e | ||
|
|
c67c29ebd5 | ||
|
|
88dd414721 | ||
|
|
0f6f13a1ac | ||
|
|
b24784f5c1 | ||
|
|
3b3082cf58 | ||
|
|
38a2fdcd76 | ||
|
|
0ca2f962de | ||
|
|
03a98635d8 | ||
|
|
461e2ced6f | ||
|
|
b2d2f65b87 | ||
|
|
b2b0c50802 | ||
|
|
1118421fa6 | ||
|
|
b1b3914ccf | ||
|
|
9be8b32311 | ||
|
|
57c8bc432d | ||
|
|
58776f5ba8 | ||
|
|
affeeb2724 | ||
|
|
822875ecf5 | ||
|
|
e3a65b1405 | ||
|
|
20a7fa1588 | ||
|
|
315b7bdf22 | ||
|
|
ec988c5a99 | ||
|
|
21b883a75c | ||
|
|
e93d71d932 | ||
|
|
dc6a0d7562 | ||
|
|
1d2be0a2eb | ||
|
|
96937a611d | ||
|
|
dc7862882f | ||
|
|
6faa3534bf | ||
|
|
afb1d68d06 | ||
|
|
911e431d65 | ||
|
|
ee91063bbb | ||
|
|
cbdf33260e | ||
|
|
c62a7381f8 | ||
|
|
b4498734e4 | ||
|
|
4407237f5b | ||
|
|
15956fcf9a | ||
|
|
6a368d3d1a | ||
|
|
8e4be9aef9 | ||
|
|
0f8b7be2d2 | ||
|
|
a1e137cc1c | ||
|
|
504472af4e | ||
|
|
19b253fd17 | ||
|
|
01f5c89902 | ||
|
|
44ccbc2a7b | ||
|
|
6e4664ee05 | ||
|
|
85f9355184 | ||
|
|
60b5bd73b7 | ||
|
|
53e7aa0a20 | ||
|
|
561a16a348 | ||
|
|
1fce7b08b1 | ||
|
|
c216f92a91 | ||
|
|
2f930c2d5f | ||
|
|
256eb92f4c | ||
|
|
ec1d9c4c49 | ||
|
|
3356eddcba | ||
|
|
f67d1b7026 | ||
|
|
e64fef109c | ||
|
|
1b2cf173b3 | ||
|
|
2fb258ca7e | ||
|
|
962cf97150 | ||
|
|
b3bd443636 | ||
|
|
4b9e7c7d27 | ||
|
|
46612156f4 | ||
|
|
279bb863df | ||
|
|
252ea97ca5 | ||
|
|
f89cfe41da | ||
|
|
e3e3679cfe | ||
|
|
75a2052144 | ||
|
|
5666c59657 | ||
|
|
c99ce36d7d | ||
|
|
d84dcb653d | ||
|
|
aff0da9427 | ||
|
|
8d9174b227 | ||
|
|
c8404e8452 | ||
|
|
79e4c82d7e | ||
|
|
3afd9a737c | ||
|
|
a7564cf303 | ||
|
|
5362ee9450 | ||
|
|
021d4c88fa | ||
|
|
deb4aece9a | ||
|
|
a6729171d3 | ||
|
|
c9015581ca | ||
|
|
35c816d62f | ||
|
|
18031ae107 | ||
|
|
c7e4f963e8 | ||
|
|
97875c7d2f | ||
|
|
0da3b2b273 | ||
|
|
3cbd99a709 | ||
|
|
6ce2076d92 | ||
|
|
cee1ecd06f | ||
|
|
a739e3fb20 | ||
|
|
953246a175 | ||
|
|
d8faa37de0 | ||
|
|
64c7c6b2a5 | ||
|
|
1c974a387c | ||
|
|
b5ab491603 | ||
|
|
8b32b9eadf | ||
|
|
ce149f996c | ||
|
|
0ec54ed492 | ||
|
|
72de4d85f3 | ||
|
|
d0673aa2fb | ||
|
|
f7fcb54622 | ||
|
|
ec643789ab | ||
|
|
70caadafd5 | ||
|
|
7667104961 | ||
|
|
0c791f2279 | ||
|
|
f71943c03a | ||
|
|
536e3e99a8 | ||
|
|
abff428212 | ||
|
|
1541985222 | ||
|
|
61929d6e21 | ||
|
|
f0ef9fb918 | ||
|
|
7621bd4e13 | ||
|
|
d20bceff75 | ||
|
|
1961cb1034 | ||
|
|
9daec3a66a | ||
|
|
e79417c37c | ||
|
|
b371487525 | ||
|
|
5c97469348 | ||
|
|
99a38dce32 | ||
|
|
f28a410ba0 | ||
|
|
5fc1981061 | ||
|
|
1bd0094bee | ||
|
|
870b45f208 | ||
|
|
9fbbb9fadb | ||
|
|
dec06ff649 | ||
|
|
b898241112 | ||
|
|
10255f7f51 | ||
|
|
cb5a706659 | ||
|
|
4d86863f2c | ||
|
|
79a3f442d6 | ||
|
|
7485a1968a | ||
|
|
3be005b638 | ||
|
|
d60b1abed0 | ||
|
|
1867c31f63 | ||
|
|
82757cd1b4 | ||
|
|
f5e98de1a3 | ||
|
|
0880cebc4d | ||
|
|
1f03b11dbc | ||
|
|
b925344c3b | ||
|
|
42cf3f50d7 | ||
|
|
70aae4e27a | ||
|
|
87165e0f08 | ||
|
|
e20c2450ce | ||
|
|
968ce12492 | ||
|
|
00ab210e66 | ||
|
|
4cb6c63516 | ||
|
|
1963ae7ec0 | ||
|
|
889f144b27 | ||
|
|
4408ad6a47 | ||
|
|
4ed665bcd3 | ||
|
|
df3d62df84 | ||
|
|
0977ee72ca | ||
|
|
2cdfde6637 | ||
|
|
6fc24d8883 | ||
|
|
4e9bc617bb | ||
|
|
679fec2ddc | ||
|
|
8f85cc17dc | ||
|
|
e40eece74e | ||
|
|
2341f18edd | ||
|
|
c9c41e0e8d | ||
|
|
c59388caf1 | ||
|
|
c878123274 | ||
|
|
1687bf2e07 | ||
|
|
cf99f54a34 | ||
|
|
83c1c175ba | ||
|
|
fc060d3777 | ||
|
|
eb50e99748 | ||
|
|
287f4e6fa1 | ||
|
|
cbf3ba9b75 | ||
|
|
95a6b0828f |
13
.gitattributes
vendored
13
.gitattributes
vendored
@@ -1 +1,14 @@
|
|||||||
config_templates/hbl_html/accessible-urls/accessible-urls.txt text eol=lf
|
config_templates/hbl_html/accessible-urls/accessible-urls.txt text eol=lf
|
||||||
|
|
||||||
|
# Mark C++ "include" files as C++
|
||||||
|
*.inc linguist-language=C++
|
||||||
|
|
||||||
|
# Mark RapidJSON include as vendored
|
||||||
|
libraries/include/stratosphere/rapidjson/** linguist-vendored
|
||||||
|
|
||||||
|
# Mark emummc as vendored
|
||||||
|
emummc/** linguist-vendored
|
||||||
|
|
||||||
|
# Mark fatfs as vendored
|
||||||
|
exosphere/mariko_fatal/source/fatfs/** linguist-vendored
|
||||||
|
fusee/program/source/fatfs/** linguist-vendored
|
||||||
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -49,6 +49,8 @@ X.X.X</br>
|
|||||||
- [ Ex: Kosmos' distribution of Atmosphère ]
|
- [ Ex: Kosmos' distribution of Atmosphère ]
|
||||||
- Do you have additional kips or sysmodules you're loading:
|
- Do you have additional kips or sysmodules you're loading:
|
||||||
- Homebrew software installed: [ * ]
|
- Homebrew software installed: [ * ]
|
||||||
|
- EmuMMC or SysNAND:
|
||||||
|
- [ If using an EmuMMC, include whether it's partition-based or file-based. ]
|
||||||
|
|
||||||
### Additional context?
|
### Additional context?
|
||||||
|
|
||||||
|
|||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -79,9 +79,8 @@ dkms.conf
|
|||||||
*.nam
|
*.nam
|
||||||
*.til
|
*.til
|
||||||
|
|
||||||
# KEYS file for sept-secondary.
|
# Compiled python files.
|
||||||
*.pyc
|
*.pyc
|
||||||
sept/sept-secondary/KEYS.py
|
|
||||||
|
|
||||||
.**/
|
.**/
|
||||||
|
|
||||||
@@ -96,4 +95,6 @@ sept/sept-secondary/KEYS.py
|
|||||||
**/build_nintendo_nx_x64
|
**/build_nintendo_nx_x64
|
||||||
**/build_nintendo_nx_x86
|
**/build_nintendo_nx_x86
|
||||||
|
|
||||||
|
package3
|
||||||
|
|
||||||
stratosphere/test/
|
stratosphere/test/
|
||||||
|
|||||||
123
Makefile
123
Makefile
@@ -1,3 +1,9 @@
|
|||||||
|
ifeq ($(strip $(DEVKITPRO)),)
|
||||||
|
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
|
||||||
|
endif
|
||||||
|
|
||||||
|
include $(DEVKITPRO)/devkitA64/base_tools
|
||||||
|
|
||||||
TOPTARGETS := all clean dist-no-debug dist
|
TOPTARGETS := all clean dist-no-debug dist
|
||||||
AMSBRANCH := $(shell git symbolic-ref --short HEAD)
|
AMSBRANCH := $(shell git symbolic-ref --short HEAD)
|
||||||
AMSHASH := $(shell git rev-parse --short HEAD)
|
AMSHASH := $(shell git rev-parse --short HEAD)
|
||||||
@@ -7,9 +13,29 @@ ifneq (, $(strip $(shell git status --porcelain 2>/dev/null)))
|
|||||||
AMSREV := $(AMSREV)-dirty
|
AMSREV := $(AMSREV)-dirty
|
||||||
endif
|
endif
|
||||||
|
|
||||||
COMPONENTS := fusee stratosphere mesosphere exosphere thermosphere troposphere libraries
|
COMPONENTS := fusee stratosphere mesosphere exosphere emummc thermosphere troposphere libraries
|
||||||
|
|
||||||
all: $(COMPONENTS)
|
all: $(COMPONENTS)
|
||||||
|
$(eval MAJORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
|
| tr -s [:blank:] \
|
||||||
|
| cut -d' ' -f3))
|
||||||
|
$(eval MINORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MINOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
|
| tr -s [:blank:] \
|
||||||
|
| cut -d' ' -f3))
|
||||||
|
$(eval MICROVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MICRO\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
|
| tr -s [:blank:] \
|
||||||
|
| cut -d' ' -f3))
|
||||||
|
$(eval S_MAJORVER = $(shell grep 'define ATMOSPHERE_SUPPORTED_HOS_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
|
| tr -s [:blank:] \
|
||||||
|
| cut -d' ' -f3))
|
||||||
|
$(eval S_MINORVER = $(shell grep 'define ATMOSPHERE_SUPPORTED_HOS_VERSION_MINOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
|
| tr -s [:blank:] \
|
||||||
|
| cut -d' ' -f3))
|
||||||
|
$(eval S_MICROVER = $(shell grep 'define ATMOSPHERE_SUPPORTED_HOS_VERSION_MICRO\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
|
| tr -s [:blank:] \
|
||||||
|
| cut -d' ' -f3))
|
||||||
|
@python fusee/build_package3.py $(CURDIR) release $(AMSHASH) $(MAJORVER) $(MINORVER) $(MICROVER) 0 $(S_MAJORVER) $(S_MINORVER) $(S_MICROVER) 0
|
||||||
|
@echo "Built package3!"
|
||||||
|
|
||||||
thermosphere:
|
thermosphere:
|
||||||
$(MAKE) -C thermosphere all
|
$(MAKE) -C thermosphere all
|
||||||
@@ -26,10 +52,10 @@ mesosphere: exosphere libraries
|
|||||||
troposphere: stratosphere
|
troposphere: stratosphere
|
||||||
$(MAKE) -C troposphere all
|
$(MAKE) -C troposphere all
|
||||||
|
|
||||||
sept: exosphere
|
emummc:
|
||||||
$(MAKE) -C sept all
|
$(MAKE) -C emummc all
|
||||||
|
|
||||||
fusee: exosphere mesosphere stratosphere sept
|
fusee: exosphere mesosphere stratosphere
|
||||||
$(MAKE) -C $@ all
|
$(MAKE) -C $@ all
|
||||||
|
|
||||||
libraries:
|
libraries:
|
||||||
@@ -37,6 +63,12 @@ libraries:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -C fusee clean
|
$(MAKE) -C fusee clean
|
||||||
|
$(MAKE) -C emummc clean
|
||||||
|
$(MAKE) -C libraries clean
|
||||||
|
$(MAKE) -C exosphere clean
|
||||||
|
$(MAKE) -C thermosphere clean
|
||||||
|
$(MAKE) -C mesosphere clean
|
||||||
|
$(MAKE) -C stratosphere clean
|
||||||
rm -rf out
|
rm -rf out
|
||||||
|
|
||||||
dist-no-debug: all
|
dist-no-debug: all
|
||||||
@@ -54,60 +86,55 @@ dist-no-debug: all
|
|||||||
rm -rf out
|
rm -rf out
|
||||||
mkdir atmosphere-$(AMSVER)
|
mkdir atmosphere-$(AMSVER)
|
||||||
mkdir atmosphere-$(AMSVER)/atmosphere
|
mkdir atmosphere-$(AMSVER)/atmosphere
|
||||||
mkdir atmosphere-$(AMSVER)/sept
|
|
||||||
mkdir atmosphere-$(AMSVER)/switch
|
mkdir atmosphere-$(AMSVER)/switch
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000008
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/010000000000000D
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/010000000000002B
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000034
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000036
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/010000000000003C
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000042
|
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/fatal_errors
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/fatal_errors
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/config_templates
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/config_templates
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/config
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/config
|
||||||
cp fusee/fusee-primary/fusee-primary.bin atmosphere-$(AMSVER)/atmosphere/reboot_payload.bin
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/flags
|
||||||
cp fusee/fusee-mtc/fusee-mtc.bin atmosphere-$(AMSVER)/atmosphere/fusee-mtc.bin
|
cp fusee/fusee.bin atmosphere-$(AMSVER)/atmosphere/reboot_payload.bin
|
||||||
cp fusee/fusee-secondary/fusee-secondary-experimental.bin atmosphere-$(AMSVER)/atmosphere/fusee-secondary.bin
|
cp fusee/package3 atmosphere-$(AMSVER)/atmosphere/package3
|
||||||
cp fusee/fusee-secondary/fusee-secondary-experimental.bin atmosphere-$(AMSVER)/sept/payload.bin
|
cp config_templates/stratosphere.ini atmosphere-$(AMSVER)/atmosphere/config_templates/stratosphere.ini
|
||||||
cp sept/sept-primary/sept-primary.bin atmosphere-$(AMSVER)/sept/sept-primary.bin
|
|
||||||
cp sept/sept-secondary/sept-secondary.bin atmosphere-$(AMSVER)/sept/sept-secondary.bin
|
|
||||||
cp sept/sept-secondary/sept-secondary_00.enc atmosphere-$(AMSVER)/sept/sept-secondary_00.enc
|
|
||||||
cp sept/sept-secondary/sept-secondary_01.enc atmosphere-$(AMSVER)/sept/sept-secondary_01.enc
|
|
||||||
cp sept/sept-secondary/sept-secondary_dev_00.enc atmosphere-$(AMSVER)/sept/sept-secondary_dev_00.enc
|
|
||||||
cp sept/sept-secondary/sept-secondary_dev_01.enc atmosphere-$(AMSVER)/sept/sept-secondary_dev_01.enc
|
|
||||||
cp config_templates/BCT.ini atmosphere-$(AMSVER)/atmosphere/config_templates/BCT.ini
|
|
||||||
cp config_templates/override_config.ini atmosphere-$(AMSVER)/atmosphere/config_templates/override_config.ini
|
cp config_templates/override_config.ini atmosphere-$(AMSVER)/atmosphere/config_templates/override_config.ini
|
||||||
cp config_templates/system_settings.ini atmosphere-$(AMSVER)/atmosphere/config_templates/system_settings.ini
|
cp config_templates/system_settings.ini atmosphere-$(AMSVER)/atmosphere/config_templates/system_settings.ini
|
||||||
cp config_templates/exosphere.ini atmosphere-$(AMSVER)/atmosphere/config_templates/exosphere.ini
|
cp config_templates/exosphere.ini atmosphere-$(AMSVER)/atmosphere/config_templates/exosphere.ini
|
||||||
|
mkdir -p config_templates/kip_patches
|
||||||
cp -r config_templates/kip_patches atmosphere-$(AMSVER)/atmosphere/kip_patches
|
cp -r config_templates/kip_patches atmosphere-$(AMSVER)/atmosphere/kip_patches
|
||||||
cp -r config_templates/hbl_html atmosphere-$(AMSVER)/atmosphere/hbl_html
|
cp -r config_templates/hbl_html atmosphere-$(AMSVER)/atmosphere/hbl_html
|
||||||
cp stratosphere/boot2/boot2.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000008/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000008
|
||||||
cp stratosphere/dmnt/dmnt.nsp atmosphere-$(AMSVER)/atmosphere/contents/010000000000000D/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000000D
|
||||||
cp stratosphere/erpt/erpt.nsp atmosphere-$(AMSVER)/atmosphere/contents/010000000000002B/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000017
|
||||||
cp stratosphere/eclct.stub/eclct.stub.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000002B
|
||||||
cp stratosphere/fatal/fatal.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000034/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000032
|
||||||
cp stratosphere/creport/creport.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000036/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000034
|
||||||
cp stratosphere/ro/ro.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000036
|
||||||
cp stratosphere/jpegdec/jpegdec.nsp atmosphere-$(AMSVER)/atmosphere/contents/010000000000003C/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000037
|
||||||
cp stratosphere/pgl/pgl.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000042/exefs.nsp
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000003C
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032/flags
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000042
|
||||||
touch atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032/flags/boot2.flag
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000420
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037/flags
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000B240
|
||||||
touch atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037/flags/boot2.flag
|
mkdir -p atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000D623
|
||||||
|
cp stratosphere/boot2/boot2.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000008/exefs.nsp
|
||||||
|
cp stratosphere/dmnt/dmnt.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000000D/exefs.nsp
|
||||||
|
cp stratosphere/cs/cs.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000017/exefs.nsp
|
||||||
|
cp stratosphere/erpt/erpt.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000002B/exefs.nsp
|
||||||
|
cp stratosphere/eclct.stub/eclct.stub.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000032/exefs.nsp
|
||||||
|
cp stratosphere/fatal/fatal.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000034/exefs.nsp
|
||||||
|
cp stratosphere/creport/creport.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000036/exefs.nsp
|
||||||
|
cp stratosphere/ro/ro.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000037/exefs.nsp
|
||||||
|
cp stratosphere/jpegdec/jpegdec.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000003C/exefs.nsp
|
||||||
|
cp stratosphere/pgl/pgl.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000042/exefs.nsp
|
||||||
|
cp stratosphere/LogManager/LogManager.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/0100000000000420/exefs.nsp
|
||||||
|
cp stratosphere/htc/htc.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000B240/exefs.nsp
|
||||||
|
cp stratosphere/TioServer/TioServer.nsp atmosphere-$(AMSVER)/stratosphere_romfs/atmosphere/contents/010000000000D623/exefs.nsp
|
||||||
|
@build_romfs atmosphere-$(AMSVER)/stratosphere_romfs atmosphere-$(AMSVER)/atmosphere/stratosphere.romfs
|
||||||
|
rm -r atmosphere-$(AMSVER)/stratosphere_romfs
|
||||||
cp troposphere/reboot_to_payload/reboot_to_payload.nro atmosphere-$(AMSVER)/switch/reboot_to_payload.nro
|
cp troposphere/reboot_to_payload/reboot_to_payload.nro atmosphere-$(AMSVER)/switch/reboot_to_payload.nro
|
||||||
cp troposphere/daybreak/daybreak.nro atmosphere-$(AMSVER)/switch/daybreak.nro
|
cp troposphere/daybreak/daybreak.nro atmosphere-$(AMSVER)/switch/daybreak.nro
|
||||||
cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER).zip ./*; cd ../;
|
cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER).zip ./*; cd ../;
|
||||||
cp fusee/fusee-secondary/fusee-secondary.bin atmosphere-$(AMSVER)/atmosphere/fusee-secondary.bin
|
rm -rf atmosphere-$(AMSVER)
|
||||||
cp fusee/fusee-secondary/fusee-secondary.bin atmosphere-$(AMSVER)/sept/payload.bin
|
|
||||||
cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER)-WITHOUT_MESOSPHERE.zip ./*; cd ../;
|
|
||||||
rm -r atmosphere-$(AMSVER)
|
|
||||||
mkdir out
|
mkdir out
|
||||||
mv atmosphere-$(AMSVER).zip out/atmosphere-$(AMSVER).zip
|
mv atmosphere-$(AMSVER).zip out/atmosphere-$(AMSVER).zip
|
||||||
mv atmosphere-$(AMSVER)-WITHOUT_MESOSPHERE.zip out/atmosphere-$(AMSVER)-WITHOUT_MESOSPHERE.zip
|
cp fusee/fusee.bin out/fusee.bin
|
||||||
cp fusee/fusee-primary/fusee-primary.bin out/fusee-primary.bin
|
|
||||||
|
|
||||||
dist: dist-no-debug
|
dist: dist-no-debug
|
||||||
$(eval MAJORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
$(eval MAJORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
@@ -122,12 +149,8 @@ dist: dist-no-debug
|
|||||||
$(eval AMSVER = $(MAJORVER).$(MINORVER).$(MICROVER)-$(AMSREV))
|
$(eval AMSVER = $(MAJORVER).$(MINORVER).$(MICROVER)-$(AMSREV))
|
||||||
rm -rf atmosphere-$(AMSVER)-debug
|
rm -rf atmosphere-$(AMSVER)-debug
|
||||||
mkdir atmosphere-$(AMSVER)-debug
|
mkdir atmosphere-$(AMSVER)-debug
|
||||||
cp fusee/fusee-primary/fusee-primary.elf atmosphere-$(AMSVER)-debug/fusee-primary.elf
|
cp fusee/loader_stub/loader_stub.elf atmosphere-$(AMSVER)-debug/fusee-loader-stub.elf
|
||||||
cp fusee/fusee-mtc/fusee-mtc.elf atmosphere-$(AMSVER)-debug/fusee-mtc.elf
|
cp fusee/program/program.elf atmosphere-$(AMSVER)-debug/fusee-program.elf
|
||||||
cp fusee/fusee-secondary/fusee-secondary-experimental.elf atmosphere-$(AMSVER)-debug/fusee-secondary.elf
|
|
||||||
cp sept/sept-primary/sept-primary.elf atmosphere-$(AMSVER)-debug/sept-primary.elf
|
|
||||||
cp sept/sept-secondary/sept-secondary.elf atmosphere-$(AMSVER)-debug/sept-secondary.elf
|
|
||||||
cp sept/sept-secondary/key_derivation/key_derivation.elf atmosphere-$(AMSVER)-debug/sept-secondary-key-derivation.elf
|
|
||||||
cp exosphere/loader_stub/loader_stub.elf atmosphere-$(AMSVER)-debug/exosphere-loader-stub.elf
|
cp exosphere/loader_stub/loader_stub.elf atmosphere-$(AMSVER)-debug/exosphere-loader-stub.elf
|
||||||
cp exosphere/program/program.elf atmosphere-$(AMSVER)-debug/exosphere-program.elf
|
cp exosphere/program/program.elf atmosphere-$(AMSVER)-debug/exosphere-program.elf
|
||||||
cp exosphere/warmboot/warmboot.elf atmosphere-$(AMSVER)-debug/exosphere-warmboot.elf
|
cp exosphere/warmboot/warmboot.elf atmosphere-$(AMSVER)-debug/exosphere-warmboot.elf
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
BCT0
|
|
||||||
[stage1]
|
|
||||||
stage2_path = atmosphere/fusee-secondary.bin
|
|
||||||
stage2_mtc_path = atmosphere/fusee-mtc.bin
|
|
||||||
stage2_addr = 0xF0000000
|
|
||||||
stage2_entrypoint = 0xF0000000
|
|
||||||
|
|
||||||
[stratosphere]
|
|
||||||
; To force-enable nogc, add nogc = 1
|
|
||||||
; To force-disable nogc, add nogc = 0
|
|
||||||
|
|
||||||
; To opt out of using Atmosphere's NCM reimplementation, add disable_ncm = 1
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
4
config_templates/stratosphere.ini
Normal file
4
config_templates/stratosphere.ini
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
[stratosphere]
|
||||||
|
; To force-enable nogc, add nogc = 1
|
||||||
|
; To force-disable nogc, add nogc = 0
|
||||||
|
|
||||||
@@ -1,10 +1,21 @@
|
|||||||
; Disable uploading error reports to Nintendo
|
|
||||||
[eupld]
|
[eupld]
|
||||||
|
; Disable uploading error reports to Nintendo
|
||||||
; upload_enabled = u8!0x0
|
; upload_enabled = u8!0x0
|
||||||
|
[usb]
|
||||||
|
; Enable USB 3.0 superspeed for homebrew
|
||||||
|
; 0 = USB 3.0 support is system default (usually disabled), 1 = USB 3.0 support is enabled.
|
||||||
|
; usb30_force_enabled = u8!0x0
|
||||||
|
[ro]
|
||||||
; Control whether RO should ease its validation of NROs.
|
; Control whether RO should ease its validation of NROs.
|
||||||
; (note: this is normally not necessary, and ips patches can be used.)
|
; (note: this is normally not necessary, and ips patches can be used.)
|
||||||
[ro]
|
|
||||||
; ease_nro_restriction = u8!0x1
|
; ease_nro_restriction = u8!0x1
|
||||||
|
[lm]
|
||||||
|
; Control whether lm should log to the SD card.
|
||||||
|
; Note that this setting does nothing when log manager is not enabled.
|
||||||
|
; enable_sd_card_logging = u8!0x1
|
||||||
|
; Control the output directory for SD card logs.
|
||||||
|
; Note that this setting does nothing when log manager is not enabled/sd card logging is not enabled.
|
||||||
|
; sd_card_log_output_directory = str!atmosphere/binlogs
|
||||||
; Atmosphere custom settings
|
; Atmosphere custom settings
|
||||||
[atmosphere]
|
[atmosphere]
|
||||||
; Reboot from fatal automatically after some number of milliseconds.
|
; Reboot from fatal automatically after some number of milliseconds.
|
||||||
@@ -32,12 +43,6 @@
|
|||||||
; NOTE: EXPERIMENTAL
|
; NOTE: EXPERIMENTAL
|
||||||
; If you do not know what you are doing, do not touch this yet.
|
; If you do not know what you are doing, do not touch this yet.
|
||||||
; fsmitm_redirect_saves_to_sd = u8!0x0
|
; fsmitm_redirect_saves_to_sd = u8!0x0
|
||||||
; Controls whether to enable the deprecated hid mitm
|
|
||||||
; to fix compatibility with old homebrew.
|
|
||||||
; 0 = Do not enable, 1 = Enable.
|
|
||||||
; Please note this setting may be removed in a
|
|
||||||
; future release of Atmosphere.
|
|
||||||
; enable_deprecated_hid_mitm = u8!0x0
|
|
||||||
; Controls whether am sees system settings "DebugModeFlag" as
|
; Controls whether am sees system settings "DebugModeFlag" as
|
||||||
; enabled or disabled.
|
; enabled or disabled.
|
||||||
; 0 = Disabled (not debug mode), 1 = Enabled (debug mode)
|
; 0 = Disabled (not debug mode), 1 = Enabled (debug mode)
|
||||||
@@ -52,6 +57,13 @@
|
|||||||
; Controls whether dns.mitm logs to the sd card for debugging
|
; Controls whether dns.mitm logs to the sd card for debugging
|
||||||
; 0 = Disabled, 1 = Enabled
|
; 0 = Disabled, 1 = Enabled
|
||||||
; enable_dns_mitm_debug_log = u8!0x0
|
; enable_dns_mitm_debug_log = u8!0x0
|
||||||
|
; Controls whether htc is enabled
|
||||||
|
; 0 = Disabled, 1 = Enabled
|
||||||
|
; enable_htc = u8!0x0
|
||||||
|
; Controls whether atmosphere's log manager is enabled
|
||||||
|
; Note that this setting is ignored (and treated as 1) when htc is enabled.
|
||||||
|
; 0 = Disabled, 1 = Enabled
|
||||||
|
; enable_log_manager = u8!0x0
|
||||||
[hbloader]
|
[hbloader]
|
||||||
; Controls the size of the homebrew heap when running as applet.
|
; Controls the size of the homebrew heap when running as applet.
|
||||||
; If set to zero, all available applet memory is used as heap.
|
; If set to zero, all available applet memory is used as heap.
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Building Atmosphère is a very straightforward process that relies almost exclus
|
|||||||
+ [PyCryptodome](https://pypi.org/project/pycryptodome) (optional)
|
+ [PyCryptodome](https://pypi.org/project/pycryptodome) (optional)
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
1. Follow the guide located [here](https://devkitpro.org/wiki/Getting_Started) to install and configure all the tools necessary for the build process.
|
1. Follow the guide located [here](https://devkitpro.org/wiki/Getting_Started) to install and configure all the tools necessary for the build process.
|
||||||
|
|
||||||
2. Install the following packages via (dkp-)pacman:
|
2. Install the following packages via (dkp-)pacman:
|
||||||
+ `switch-dev`
|
+ `switch-dev`
|
||||||
@@ -21,12 +21,4 @@ Building Atmosphère is a very straightforward process that relies almost exclus
|
|||||||
3. Install the following library via python's package manager `pip`, required by [exosphere](components/exosphere.md):
|
3. Install the following library via python's package manager `pip`, required by [exosphere](components/exosphere.md):
|
||||||
+ `lz4`
|
+ `lz4`
|
||||||
|
|
||||||
4. (Optional) In order to build [sept](components/sept.md) the pycryptodome PyPi package is required, which can be installed by running `pip install pycryptodome` under the installed Python environment of your choice or by installing the complete zip package to support the `make dist` recipe. This is an optional step included for advanced users who have the ability to provide the necessary encryption/signing keys themselves.
|
4. Finally, clone the Atmosphère repository and run `make` under its root directory.
|
||||||
|
|
||||||
5. It is, instead, possible to build [sept](components/sept.md) by providing previously encrypted/signed binaries distributed by official Atmosphère release packages. In order to do so, export the following variables in your current environment:
|
|
||||||
+ `SEPT_00_ENC_PATH` (must point to the `sept-secondary_00.enc` file)
|
|
||||||
+ `SEPT_01_ENC_PATH` (must point to the `sept-secondary_01.enc` file)
|
|
||||||
+ `SEPT_DEV_00_ENC_PATH` (must point to the `sept-secondary_dev_00.enc` file)
|
|
||||||
+ `SEPT_DEV_01_ENC_PATH` (must point to the `sept-secondary_dev_01.enc` file)
|
|
||||||
|
|
||||||
6. Finally, clone the Atmosphère repository and run `make` under its root directory.
|
|
||||||
|
|||||||
@@ -1,4 +1,157 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
## 1.1.1
|
||||||
|
+ A bug was fixed which caused some memory to leak when launching a game with mods enabled, eventually causing a crash after enough game launches without rebooting.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 1.1.0
|
||||||
|
+ Support was implemented for 13.0.0.
|
||||||
|
+ `mesosphère` was updated to reflect the latest official kernel behavior.
|
||||||
|
+ `ncm` was updated to reflect the latest official behaviors.
|
||||||
|
+ `erpt` was updated to reflect the latest official behaviors.
|
||||||
|
+ Two new services ("sprofile") were added to `erpt`, and have been fully reimplemented.
|
||||||
|
+ **Please Note**: These services provide a way for settings to be pushed to consoles over the internet without system update.
|
||||||
|
+ Because there appear to be no settings pushed out yet, this implementation fundamentally cannot be fully tested right now, but hopefully there are no issues once settings begin being distributed.
|
||||||
|
+ The `LogManager` system module was reimplemented.
|
||||||
|
+ This system module provides services that some games use for logging.
|
||||||
|
+ Atmosphere's reimplementation supports logging to the SD card (if `lm!enable_sd_card_logging` is true) and to ams.TMA.
|
||||||
|
+ To control the directory where logs are saved, modify the `lm!sd_card_log_output_directory` setting.
|
||||||
|
+ Atmosphere's reimplementation is disabled by default (in order to save memory), but can be enabled by setting `lm!enable_log_manager` to true.
|
||||||
|
+ This will allow reading over logs from games which use the services (or potentially logging from homebrew in the future), which can be useful to developers.
|
||||||
|
+ Please note that when TMA is fully implemented in the future, enabling TMA will forcibly enable `LogManager`.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 1.0.0
|
||||||
|
+ `fusee` was completely re-written in C++ to use the same atmosphere-libs APIs as the rest of atmosphere's code.
|
||||||
|
+ The rewrite was performed with a big emphasis on ensuring a good boot speed, and generally boot should be much faster than it was previously.
|
||||||
|
+ Depending on SD card/environment, boot speed may now be slightly faster than, roughly the same as, or slightly slower than when booting with hekate.
|
||||||
|
+ The obvious low-hanging fruit for performance improvements has been picked, so hopefully the improved performance is to everybody's liking.
|
||||||
|
+ SD card compatibility was improved: fusee should now have SD card compatibility identical to the official OS driver.
|
||||||
|
+ **Please Note**: various components were renamed (fusee-primary.bin -> fusee.bin, fusee-secondary.bin -> package3).
|
||||||
|
+ If you use another bootloader (like hekate), you may need to update your configuration to use the new layout.
|
||||||
|
+ **Please Note**: BCT.ini no longer exists, nogc configuration has been moved to `/atmosphere/stratosphere.ini`.
|
||||||
|
+ If you rely on custom nogc configuration, please be sure to update accordingly.
|
||||||
|
+ Custom splash screen BMP parsing is no longer supported (as it slows down boot for 99% of users).
|
||||||
|
+ To compensate for this, a script to insert a custom splash screen into a `package3` binary has been added to the `utilities` folder of the atmosphere repository.
|
||||||
|
+ The release build should be equivalent to running the following command from the root of the atmosphere repository: `python utilities/insert_splash_screen.py img/splash.png fusee/package3`
|
||||||
|
+ A number of pending changes were made, following the end of the relevant testing periods:
|
||||||
|
+ `mesosphere` is no longer opt-out, and stratosphere code will begin depending on its being present/in use.
|
||||||
|
+ `NCM` is no longer opt-out.
|
||||||
|
+ The cleanup to ease the transition from < 0.19.0 to 0.19.0 has been removed.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.20.1
|
||||||
|
+ An issue was fixed that caused severely degraded performance after wake-from-sleep on Mariko hardware.
|
||||||
|
+ This was due to Mariko MTC resulting in a frequency of 1599.999MHz instead of 1600MHz.
|
||||||
|
+ Due to this off-by-one, Nintendo's EMC management code failed to initialize/take over, and after wake from sleep RAM would be in a strange state.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.20.0
|
||||||
|
+ DRAM training (MTC) was implemented for Mariko hardware, increasing RAM speed from 204MHz to 1600MHz.
|
||||||
|
+ This significantly optimizes Mariko boot speed, cutting boot time roughly in half.
|
||||||
|
+ Typical boot time reductions (measured as "select fusee" to "home menu visible"):
|
||||||
|
+ Normal (Iowa): ~35 seconds -> ~18 seconds.
|
||||||
|
+ Lite (Hoag): ~65 seconds -> ~30 seconds.
|
||||||
|
+ NOTE: Work is being started on a re-written `fusee` component, with an eye specifically towards ensuring a good boot speed.
|
||||||
|
+ With any luck, boot will be much much faster on all units (Mariko and Erista) in an upcoming release.
|
||||||
|
+ Sept was replaced, and deleted from the repository.
|
||||||
|
+ Erista units now use a custom TSEC firmware to manage key derivation.
|
||||||
|
+ For more details, contact SciresM#0524 on discord.
|
||||||
|
+ This has a number of benefits, including:
|
||||||
|
+ This greatly simplifies key derivation logic by making it consistent on all firmwares.
|
||||||
|
+ Fusee no longer accesses/uses keyblobs at all, so units which have accidentally destroyed/lost keyblobs can boot without them.
|
||||||
|
+ This greatly increases stability (sept was the biggest source of boot failures).
|
||||||
|
+ This improves boot speed (sept rebooted multiple times, performed hardware init multiple times, and was generally very slow).
|
||||||
|
+ Atmosphère build process is now much saner.
|
||||||
|
+ A number of improvements were made to the dmnt cheat engine.
|
||||||
|
+ Cheats which take in a memory region operand may now use types "2" or "3" to perform accesses relative to the alias/aslr regions, respectively.
|
||||||
|
+ Support was added for an "else" opcode in the cheat engine, to make writing certain conditional logic more natural.
|
||||||
|
+ Support was added for a cheat orchestrator homebrew (like edizon) to detach from a cheat process/set the master cheat programmatically.
|
||||||
|
+ Daybreak now provides a warning when attempting to install a firmware newer than the highest version atmosphère knows it supports.
|
||||||
|
+ To facilitate this, exosphere now exposes the supported HOS version via an extension ConfigItem.
|
||||||
|
+ A number of minor issues were fixed, including:
|
||||||
|
+ Several mesosphere debug SVC implementations were updated to reflect the semantics of the latest kernel.
|
||||||
|
+ Support was fixed for deriving BIS encryption keys on certain prototype hardware.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.19.5
|
||||||
|
+ Support was added for 12.1.0.
|
||||||
|
+ LayeredFS support was added for OpenDataStorageWithProgramIndex commands.
|
||||||
|
+ Certain games using newer (7.0.0+ APIs) which include multiple programs under a single title previously could not be modified.
|
||||||
|
+ These are now supported as normal, and LayeredFS should have 100% compatibility again.
|
||||||
|
+ A number of minor issues were fixed, including:
|
||||||
|
+ The Reboot to Payload NRO was updated to allow the OS to save state prior to rebooting (thanks @AuroraWright)!
|
||||||
|
+ An issue was fixed that could cause dns.mitm to fail when games requested resolution of an empty string.
|
||||||
|
+ An issue was fixed that caused a memory leak in the erpt system module.
|
||||||
|
+ This would eventually cause a system crash after ~540 reports were generated without rebooting.
|
||||||
|
+ A number of minor improvements were made to improve mesosphere's accuracy.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.19.4
|
||||||
|
+ Support was added for 12.0.3.
|
||||||
|
+ A number of minor issues were fixed, including:
|
||||||
|
+ An issue was fixed that could cause heap memory corruption when allocation was highly contended.
|
||||||
|
+ An issue was fixed that could cause sleep to fail under certain conditions.
|
||||||
|
+ An issue was fixed that could cause a scheduler slow path to be taken more often than necessary.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.19.3
|
||||||
|
+ Support was added for 12.0.2.
|
||||||
|
+ A number of minor issues were fixed, including:
|
||||||
|
+ An issue was fixed in dns.mitm that caused a crash when games attempted to resolve the IP address of nullptr.
|
||||||
|
+ An issue was fixed in erpt that would cause an abort when booting without having ever booted stock previously.
|
||||||
|
+ An issue was fixed in (file-based) emummc that caused an error on system format/downloading certain games.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.19.2
|
||||||
|
+ Atmosphère's components were further updated to reflect latest official behaviors as of 12.0.0.
|
||||||
|
+ Notably, `erpt` was updated to implement the new forced shutdown detection feature.
|
||||||
|
+ When a forced-shutdown occurs, an erpt_report will be generated and saved to the SD card on the next boot.
|
||||||
|
+ Atmosphere-libs was updated to use GCC 11 (latest devkitA64/devkitARM releases).
|
||||||
|
+ Initial inspections show mild-to-moderate optimizer improvements in several important places (kernel is 0x3000 smaller).
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
+ A number of minor issues were fixed, including:
|
||||||
|
+ A bug was fixed that caused a black screen when attempting to boot firmware versions 2.0.0-4.1.0.
|
||||||
|
+ A bug was fixed that caused sm to abort when at the session limit, rather than returning error codes.
|
||||||
|
+ A bug was fixed that allowed for resource exhaustion on 12.0.0, under certain circumstances.
|
||||||
|
+ Several issues were fixed, and usability and stability were improved.
|
||||||
|
## 0.19.1
|
||||||
|
+ An issue was fixed that caused a fatal error when using official `migration` services to transfer data between consoles.
|
||||||
|
+ An issue was fixed in `ncm` that caused an error when the OS tried to enumerate installed SD card content.
|
||||||
|
+ Several issues were fixed, and usability and stability were improved.
|
||||||
|
## 0.19.0
|
||||||
|
+ Support was added for 12.0.0.
|
||||||
|
+ `mesosphère` was updated to reflect the latest official kernel behavior.
|
||||||
|
+ `sm`, `boot2`, `pgl` were updated to reflect the latest official behaviors.
|
||||||
|
+ **Please Note**: 12.0.0 added a new protocol for IPC ("tipc"), which has been freshly reimplemented in its entirety.
|
||||||
|
+ It is possible there may be as of yet unfound issues; if there are, please send the appropriate crash reports to SciresM (SciresM#0524 on discord).
|
||||||
|
+ Homebrew which uses atmosphere extensions (including the mitm API) will need to be re-compiled in order to function on 0.19.0.
|
||||||
|
+ I apologize for this, but it's unavoidable for technical reasons. If you're affected by this and mad about it, please contact SciresM to complain.
|
||||||
|
+ `erpt` was partially updated to reflect the latest official behaviors.
|
||||||
|
+ New features were added to erpt to track the activity of running applets, and to detect when a forced shutdown occurs.
|
||||||
|
+ These behaviors have been temporarily stubbed, as they are not necessary for 12.0.0 to run (and their outputs won't be saved anywhere).
|
||||||
|
+ A future atmosphère update will implement these behaviors, in the interest of reflecting official logic as faithfully as we can.
|
||||||
|
+ Atmosphère no longer uses the /contents/ folder for its own programs.
|
||||||
|
+ Atmosphère's system modules are now bundled together in the single file "stratosphere.romfs".
|
||||||
|
+ For those working on developing for atmosphère, executables inside the /contents/ directory will be preferred to those in "stratosphere.romfs".
|
||||||
|
+ **Please Note**: In order to facilitate this change (and the desired behavior), the first time you boot after extracting a release zip, atmosphère system modules inside /contents/ will be deleted.
|
||||||
|
+ This will have no impact on user programs (it only removes programs with specific program ids).
|
||||||
|
+ Improvements were made to mesosphere, including:
|
||||||
|
+ An extension InfoType was added for getting the current process handle, without having to spawn a thread and do IPC with oneself.
|
||||||
|
+ An issue was fixed in SvcSetDebugThreadContext.
|
||||||
|
+ An issue was fixed when doing IPC with user buffers.
|
||||||
|
+ Support was fixed for toggling the custom setting `usb!usb30_force_enabled` on 9.0.0+.
|
||||||
|
+ This was broken by Nintendo's introducing a dependency that made USB a requirement to launch before custom settings are parsed.
|
||||||
|
+ Since the fix, you can now toggle the setting (as you could prior to atmosphère 0.9.4), and it will work as expected.
|
||||||
|
+ **Please Note**: Enabling USB 3.0 often severely impacts wireless communications.
|
||||||
|
+ Because of this, the setting will default to off. If you experience issues with it enabled, consider disabling it.
|
||||||
|
+ A warning was added to daybreak when resetting the console to factory settings.
|
||||||
|
+ Substantial work was completed towards atmosphere's upcoming implementation of the host target connection protocol.
|
||||||
|
+ Once completed, users will be able to interact with a Switch running atmosphère via a PC application ("Starlink") currently under development.
|
||||||
|
+ Planned eventual features for connected consoles include a gdbstub, interacting with memory (for cheat development), streaming gameplay audio and video, and accessing the Switch's SD card filesystem.
|
||||||
|
+ Switch homebrew will also have access to a (configurable and sandboxed) filesystem on the host PC, while connected.
|
||||||
|
+ Towards this end, the following was accomplished:
|
||||||
|
+ The "htc" system module was reimplemented completely.
|
||||||
|
+ The system module which provides remote access to the SD card was reimplemented completely.
|
||||||
|
+ This is currently the active focus of atmosphère's development.
|
||||||
|
+ **Please Note**: Support is not yet completed, and users are disadvised from interacting with the related settings for the time being, unless they particularly know what they're doing.
|
||||||
|
+ A number of minor issues were fixed, including:
|
||||||
|
+ A bug was fixed in `dmnt` that could cause a fatal when launching certain games with cheats active.
|
||||||
|
+ An issue was fixed that could cause an abort in `sm` when using a large number of custom system modules.
|
||||||
|
+ An issue was fixed that prevented launching gamecards on 1.0.0.
|
||||||
|
+ Minor issues were fixed in the cheat virtual machine's behavior.
|
||||||
|
+ Several issues were fixed, and usability and stability were improved.
|
||||||
## 0.18.1
|
## 0.18.1
|
||||||
+ A number of minor issues were fixed, including:
|
+ A number of minor issues were fixed, including:
|
||||||
+ The new `dns.mitm` module added in 0.18.0 no longer fatal errors when receiving port=nullptr.
|
+ The new `dns.mitm` module added in 0.18.0 no longer fatal errors when receiving port=nullptr.
|
||||||
@@ -41,7 +194,7 @@
|
|||||||
+ This also substantially improves power drain when the system is shut off; consoles powered off from Atmosphere should now drain battery at the same reduced rate as original firmware.
|
+ This also substantially improves power drain when the system is shut off; consoles powered off from Atmosphere should now drain battery at the same reduced rate as original firmware.
|
||||||
+ A number of minor changes were made, including:
|
+ A number of minor changes were made, including:
|
||||||
+ A number of inconsistencies in the build system were fixed.
|
+ A number of inconsistencies in the build system were fixed.
|
||||||
+ Fow those building atmosphère at home, the `boot` sysmodule will no longer rebuild every time make is invoked.
|
+ For those building atmosphère at home, the `boot` sysmodule will no longer rebuild every time make is invoked.
|
||||||
+ This substantially improves build times during development iteration.
|
+ This substantially improves build times during development iteration.
|
||||||
+ `sm` was updated to more accurately reflect how official code manages request deferral.
|
+ `sm` was updated to more accurately reflect how official code manages request deferral.
|
||||||
+ `mesosphère` was updated to more accurately reflect official kernel management of the trace buffer.
|
+ `mesosphère` was updated to more accurately reflect official kernel management of the trace buffer.
|
||||||
|
|||||||
@@ -1,22 +1,8 @@
|
|||||||
# fusée
|
# fusée
|
||||||
fusée is a custom bootloader used to start the Atmosphère environment.
|
fusée is a custom bootloader used to start the Atmosphère environment.
|
||||||
It is divided into three sub-components: fusée-primary, fusée-mtc and fusée-secondary.
|
|
||||||
|
|
||||||
fusée is also capable of chainloading other payloads (e.g.: Android).
|
## fusée
|
||||||
|
fusée is the first piece of Atmosphère's code that runs on the hardware.
|
||||||
fusée's behavior can be configured via the [BCT.ini](../features/configurations.md) file located on the SD card.
|
|
||||||
|
|
||||||
## fusée-primary
|
|
||||||
fusée-primary is the first piece of Atmosphère's code that runs on the hardware.
|
|
||||||
It is distributed as a standalone payload designed to be launched via RCM by abusing the CVE-2018-6242 vulnerability.
|
It is distributed as a standalone payload designed to be launched via RCM by abusing the CVE-2018-6242 vulnerability.
|
||||||
|
|
||||||
This payload is responsible for all the low-level hardware initialization required by the Nintendo Switch, plus the extra task of initializing the SD card and reading the next fusée sub-components from it.
|
This payload is responsible for all the low-level hardware initialization required by the Nintendo Switch, setting up the cryptosystem, mounting/emulating the eMMC, injecting/patching system modules, and launching the exosphère component.
|
||||||
|
|
||||||
## fusée-mtc
|
|
||||||
fusée-mtc is an optional, but heavily recommended sub-component that performs DRAM memory training.
|
|
||||||
This ensures a proper environment for running the final fusée sub-component.
|
|
||||||
|
|
||||||
## fusée-secondary
|
|
||||||
fusée-secondary is the last fusée sub-component that runs on the system.
|
|
||||||
It is responsible for configuring and bootstrapping the Atmosphère environment by mimicking the Horizon OS's design.
|
|
||||||
This includes setting up the cryptosystem, mounting or emulating the eMMC, injecting or patching system modules and launching the exosphère component.
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
# sept
|
|
||||||
Sept is a payload that facilitates booting Atmosphère when targeting firmware version 7.0.0+.
|
|
||||||
|
|
||||||
It consists of a primary and a secondary payload.
|
|
||||||
|
|
||||||
## sept-primary
|
|
||||||
sept-primary is essentially a stand-in for Nintendo's package1ldr, on 7.0.0+. To use it, the caller (normally fusée-secondary) loads the sept-primary binary to `0x4003F000`, loads the 7.0.0+ TSEC firmware to `0x40010F00`, and loads a signed, encrypted payload to `0x40016FE0`.
|
|
||||||
|
|
||||||
This signed, encrypted payload is normally sept-secondary.
|
|
||||||
|
|
||||||
## sept-secondary
|
|
||||||
sept-secondary is a payload that performs 7.0.0+ key derivation, and then chainloads to `sept/payload.bin`.
|
|
||||||
|
|
||||||
It is normally stored encrypted/signed. Therefore, if one wishes to build sept-secondary instead of using release builds, one must bring their own keys.
|
|
||||||
@@ -19,6 +19,8 @@ This behavior ensures that cheat codes are only loaded when the user would want
|
|||||||
|
|
||||||
In cases where `dmnt` has not activated the cheat manager, but the user wants to make it do so anyway, the cheat manager's service API provides a `ForceOpenCheatProcess` command that homebrew can use. This command will cause the cheat manager to try to force itself to attach to the process.
|
In cases where `dmnt` has not activated the cheat manager, but the user wants to make it do so anyway, the cheat manager's service API provides a `ForceOpenCheatProcess` command that homebrew can use. This command will cause the cheat manager to try to force itself to attach to the process.
|
||||||
|
|
||||||
|
In cases where `dmnt` has activated the cheat manager, but the user wants to use an alternate debugger, the cheat manager's service API provides a `ForceCloseCheatProcess` command that homebrew can use. This command will cause the cheat manager to detach itself from the process.
|
||||||
|
|
||||||
By default, all cheat codes listed in the loaded .txt file will be toggled on. This is configurable by the user by editing the `atmosphere!dmnt_cheats_enabled_by_default` [system setting](configurations.md).
|
By default, all cheat codes listed in the loaded .txt file will be toggled on. This is configurable by the user by editing the `atmosphere!dmnt_cheats_enabled_by_default` [system setting](configurations.md).
|
||||||
|
|
||||||
Users may use homebrew programs to toggle cheats on and off at runtime via the cheat manager's service API.
|
Users may use homebrew programs to toggle cheats on and off at runtime via the cheat manager's service API.
|
||||||
@@ -40,30 +42,30 @@ The following provides documentation of the instruction format for the virtual m
|
|||||||
|
|
||||||
Typically, instruction type is encoded in the upper nybble of the first instruction u32.
|
Typically, instruction type is encoded in the upper nybble of the first instruction u32.
|
||||||
|
|
||||||
### Code Type 0: Store Static Value to Memory
|
### Code Type 0x0: Store Static Value to Memory
|
||||||
Code type 0 allows writing a static value to a memory address.
|
Code type 0x0 allows writing a static value to a memory address.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`0TMR00AA AAAAAAAA VVVVVVVV (VVVVVVVV)`
|
`0TMR00AA AAAAAAAA VVVVVVVV (VVVVVVVV)`
|
||||||
|
|
||||||
+ T: Width of memory write (1, 2, 4, or 8 bytes).
|
+ T: Width of memory write (1, 2, 4, or 8 bytes).
|
||||||
+ M: Memory region to write to (0 = Main NSO, 1 = Heap).
|
+ M: Memory region to write to (0 = Main NSO, 1 = Heap, 2 = Alias, 3 = Aslr).
|
||||||
+ R: Register to use as an offset from memory region base.
|
+ R: Register to use as an offset from memory region base.
|
||||||
+ A: Immediate offset to use from memory region base.
|
+ A: Immediate offset to use from memory region base.
|
||||||
+ V: Value to write.
|
+ V: Value to write.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 1: Begin Conditional Block
|
### Code Type 0x1: Begin Conditional Block
|
||||||
Code type 1 performs a comparison of the contents of memory to a static value.
|
Code type 0x1 performs a comparison of the contents of memory to a static value.
|
||||||
|
|
||||||
If the condition is not met, all instructions until the appropriate conditional block terminator are skipped.
|
If the condition is not met, all instructions until the appropriate End or Else conditional block terminator are skipped.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`1TMC00AA AAAAAAAA VVVVVVVV (VVVVVVVV)`
|
`1TMC00AA AAAAAAAA VVVVVVVV (VVVVVVVV)`
|
||||||
|
|
||||||
+ T: Width of memory write (1, 2, 4, or 8 bytes).
|
+ T: Width of memory write (1, 2, 4, or 8 bytes).
|
||||||
+ M: Memory region to write to (0 = Main NSO, 1 = Heap).
|
+ M: Memory region to write to (0 = Main NSO, 1 = Heap, 2 = Alias, 3 = Aslr).
|
||||||
+ C: Condition to use, see below.
|
+ C: Condition to use, see below.
|
||||||
+ A: Immediate offset to use from memory region base.
|
+ A: Immediate offset to use from memory region base.
|
||||||
+ V: Value to compare to.
|
+ V: Value to compare to.
|
||||||
@@ -78,16 +80,20 @@ If the condition is not met, all instructions until the appropriate conditional
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 2: End Conditional Block
|
### Code Type 0x2: End Conditional Block
|
||||||
Code type 2 marks the end of a conditional block (started by Code Type 1 or Code Type 8).
|
Code type 0x2 marks the end of a conditional block (started by Code Type 0x1 or Code Type 0x8).
|
||||||
|
|
||||||
|
When an Else is executed, all instructions until the appropriate End conditional block terminator are skipped.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`20000000`
|
`2X000000`
|
||||||
|
|
||||||
|
+ X: End type (0 = End, 1 = Else).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 3: Start/End Loop
|
### Code Type 0x3: Start/End Loop
|
||||||
Code type 3 allows for iterating in a loop a fixed number of times.
|
Code type 0x3 allows for iterating in a loop a fixed number of times.
|
||||||
|
|
||||||
#### Start Loop Encoding
|
#### Start Loop Encoding
|
||||||
`300R0000 VVVVVVVV`
|
`300R0000 VVVVVVVV`
|
||||||
@@ -102,8 +108,8 @@ Code type 3 allows for iterating in a loop a fixed number of times.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 4: Load Register with Static Value
|
### Code Type 0x4: Load Register with Static Value
|
||||||
Code type 4 allows setting a register to a constant value.
|
Code type 0x4 allows setting a register to a constant value.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`400R0000 VVVVVVVV VVVVVVVV`
|
`400R0000 VVVVVVVV VVVVVVVV`
|
||||||
@@ -113,29 +119,28 @@ Code type 4 allows setting a register to a constant value.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 5: Load Register with Memory Value
|
### Code Type 0x5: Load Register with Memory Value
|
||||||
Code type 5 allows loading a value from memory into a register, either using a fixed address or by dereferencing the destination register.
|
Code type 0x5 allows loading a value from memory into a register, either using a fixed address or by dereferencing the destination register.
|
||||||
|
|
||||||
#### Load From Fixed Address Encoding
|
#### Load From Fixed Address Encoding
|
||||||
`5TMR00AA AAAAAAAA`
|
`5TMR00AA AAAAAAAA`
|
||||||
|
|
||||||
+ T: Width of memory read (1, 2, 4, or 8 bytes).
|
+ T: Width of memory read (1, 2, 4, or 8 bytes).
|
||||||
+ M: Memory region to write to (0 = Main NSO, 1 = Heap).
|
+ M: Memory region to write to (0 = Main NSO, 1 = Heap, 2 = Alias, 3 = Aslr).
|
||||||
+ R: Register to load value into.
|
+ R: Register to load value into.
|
||||||
+ A: Immediate offset to use from memory region base.
|
+ A: Immediate offset to use from memory region base.
|
||||||
|
|
||||||
#### Load from Register Address Encoding
|
#### Load from Register Address Encoding
|
||||||
`5TMR10AA AAAAAAAA`
|
`5T0R10AA AAAAAAAA`
|
||||||
|
|
||||||
+ T: Width of memory read (1, 2, 4, or 8 bytes).
|
+ T: Width of memory read (1, 2, 4, or 8 bytes).
|
||||||
+ M: Memory region to write to (0 = Main NSO, 1 = Heap).
|
+ R: Register to load value into. (This register is also used as the base memory address).
|
||||||
+ R: Register to load value into.
|
|
||||||
+ A: Immediate offset to use from register R.
|
+ A: Immediate offset to use from register R.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 6: Store Static Value to Register Memory Address
|
### Code Type 0x6: Store Static Value to Register Memory Address
|
||||||
Code type 6 allows writing a fixed value to a memory address specified by a register.
|
Code type 0x6 allows writing a fixed value to a memory address specified by a register.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`6T0RIor0 VVVVVVVV VVVVVVVV`
|
`6T0RIor0 VVVVVVVV VVVVVVVV`
|
||||||
@@ -149,10 +154,10 @@ Code type 6 allows writing a fixed value to a memory address specified by a regi
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 7: Legacy Arithmetic
|
### Code Type 0x7: Legacy Arithmetic
|
||||||
Code type 7 allows performing arithmetic on registers.
|
Code type 0x7 allows performing arithmetic on registers.
|
||||||
|
|
||||||
However, it has been deprecated by Code type 9, and is only kept for backwards compatibility.
|
However, it has been deprecated by Code type 0x9, and is only kept for backwards compatibility.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`7T0RC000 VVVVVVVV`
|
`7T0RC000 VVVVVVVV`
|
||||||
@@ -171,8 +176,8 @@ However, it has been deprecated by Code type 9, and is only kept for backwards c
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 8: Begin Keypress Conditional Block
|
### Code Type 0x8: Begin Keypress Conditional Block
|
||||||
Code type 8 enters or skips a conditional block based on whether a key combination is pressed.
|
Code type 0x8 enters or skips a conditional block based on whether a key combination is pressed.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`8kkkkkkk`
|
`8kkkkkkk`
|
||||||
@@ -213,8 +218,8 @@ Note: This is the direct output of `hidKeysDown()`.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 9: Perform Arithmetic
|
### Code Type 0x9: Perform Arithmetic
|
||||||
Code type 9 allows performing arithmetic on registers.
|
Code type 0x9 allows performing arithmetic on registers.
|
||||||
|
|
||||||
#### Register Arithmetic Encoding
|
#### Register Arithmetic Encoding
|
||||||
`9TCRS0s0`
|
`9TCRS0s0`
|
||||||
@@ -248,8 +253,8 @@ Code type 9 allows performing arithmetic on registers.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 10: Store Register to Memory Address
|
### Code Type 0xA: Store Register to Memory Address
|
||||||
Code type 10 allows writing a register to memory.
|
Code type 0xA allows writing a register to memory.
|
||||||
|
|
||||||
#### Encoding
|
#### Encoding
|
||||||
`ATSRIOxa (aaaaaaaa)`
|
`ATSRIOxa (aaaaaaaa)`
|
||||||
@@ -272,13 +277,13 @@ Code type 10 allows writing a register to memory.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 11: Reserved
|
### Code Type 0xB: Reserved
|
||||||
Code Type 11 is currently reserved for future use.
|
Code Type 0xB is currently reserved for future use.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Code Type 12-15: Extended-Width Instruction
|
### Code Type 0xC-0xF: Extended-Width Instruction
|
||||||
Code Types 12-15 signal to the VM to treat the upper two nybbles of the first dword as instruction type, instead of just the upper nybble.
|
Code Types 0xC-0xF signal to the VM to treat the upper two nybbles of the first dword as instruction type, instead of just the upper nybble.
|
||||||
|
|
||||||
This reserves an additional 64 opcodes for future use.
|
This reserves an additional 64 opcodes for future use.
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,10 @@
|
|||||||
# Configurations
|
# Configurations
|
||||||
Atmosphère provides a variety of customizable configurations to better adjust to users' needs.
|
Atmosphère provides a variety of customizable configurations to better adjust to users' needs.
|
||||||
|
|
||||||
## BCT.ini
|
## stratosphere.ini
|
||||||
This is the configuration file used by fusée.
|
This is the configuration file used by fusée for configuring user-space system modules.
|
||||||
This file is located under the `/atmosphere/config/` folder on your SD card and a default template can be found inside the `/atmosphere/config_templates/` folder.
|
This file is located under the `/atmosphere/config/` folder on your SD card and a default template can be found inside the `/atmosphere/config_templates/` folder.
|
||||||
|
|
||||||
### Adding a Custom Boot Splashscreen
|
|
||||||
Atmosphère provides its own default splashscreen which is displayed at boot time. However, this can be replaced at will.
|
|
||||||
|
|
||||||
The boot splashscreen must be a BMP file, it must be 720x1280 (1280x720 rotated 90 degrees left/counterclockwise/anti-clockwise) resolution, and be in 32-bit ARGB format. You can use image editing software such as GIMP or Photoshop to export the image in this format.
|
|
||||||
|
|
||||||
Add the following lines to BCT.ini and change the value of `custom_splash` to the actual path and filename of your boot splashscreen:
|
|
||||||
```
|
|
||||||
[stage2]
|
|
||||||
custom_splash = /path/to/your/bootlogo.bmp
|
|
||||||
```
|
|
||||||
|
|
||||||
### Configuring "nogc" Protection
|
### Configuring "nogc" Protection
|
||||||
"nogc" is a feature provided by fusée-secondary which disables the Nintendo Switch's Game Card reader. Its purpose is to prevent the reader from being updated when the console has been updated, without burning fuses, from a lower firmware version. More specifically, from firmware versions 4.0.0 or 9.0.0 which introduced updates to the Game Card reader's firmware. By default, Atmosphère will protect the Game Card reader automatically, but you are free to change it.
|
"nogc" is a feature provided by fusée-secondary which disables the Nintendo Switch's Game Card reader. Its purpose is to prevent the reader from being updated when the console has been updated, without burning fuses, from a lower firmware version. More specifically, from firmware versions 4.0.0 or 9.0.0 which introduced updates to the Game Card reader's firmware. By default, Atmosphère will protect the Game Card reader automatically, but you are free to change it.
|
||||||
|
|
||||||
@@ -29,32 +18,15 @@ nogc = X
|
|||||||
0 = force-disable nogc, so Atmosphère will always enable the Game Card reader.
|
0 = force-disable nogc, so Atmosphère will always enable the Game Card reader.
|
||||||
```
|
```
|
||||||
|
|
||||||
### NCM opt-out
|
## Adding a Custom Boot Splashscreen
|
||||||
Atmosphère provides a reimplementation of the [ncm](../components/modules/ncm.md) system module. If you wish to disable this reimplementation add the following line to the `stratosphere` section:
|
Atmosphère provides its own default splashscreen which is displayed at boot time. However, this can be replaced at will.
|
||||||
```
|
|
||||||
[stratosphere]
|
|
||||||
disable_ncm = 1
|
|
||||||
```
|
|
||||||
|
|
||||||
### Logging
|
Boot splash screens must be 1280x720 resolution.
|
||||||
This is an advanced feature aimed at developers trying to debug boot time issues. It enables logging of the fusée stages to be displayed on screen.
|
|
||||||
|
|
||||||
Add the following lines to BCT.ini and change the value of `X` according to the following list:
|
A script can be found inside the source tree (`/utilities/insert_splash_screen.py`) for inserting a custom splash screen into a release binary.
|
||||||
```
|
|
||||||
[config]
|
|
||||||
log_level = X
|
|
||||||
```
|
|
||||||
```
|
|
||||||
0 = NONE
|
|
||||||
1 = ERROR
|
|
||||||
2 = WARNING
|
|
||||||
3 = MANDATORY
|
|
||||||
4 = INFO
|
|
||||||
5 = DEBUG
|
|
||||||
```
|
|
||||||
|
|
||||||
A special level is also provided to prevent prefix creation. To use it, do a bitwise OR with this mask:
|
To do so, execute the following command on the script:
|
||||||
`0x100 = NO_PREFIX`
|
`python insert_splash_screen.py <path to your splash screen image> <path to /atmosphere/package3 on your SD card>`
|
||||||
|
|
||||||
## emummc.ini
|
## emummc.ini
|
||||||
This is the configuration file used for the [emummc](../components/emummc.md) component.
|
This is the configuration file used for the [emummc](../components/emummc.md) component.
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ Atmosphère provides six core components, mimicking to some degree the various l
|
|||||||
|
|
||||||
Additionally, Atmosphère also provides the following secondary components:
|
Additionally, Atmosphère also provides the following secondary components:
|
||||||
+ [emummc](components/emummc.md)
|
+ [emummc](components/emummc.md)
|
||||||
+ [sept](components/sept.md)
|
|
||||||
+ [libraries](components/libraries.md)
|
+ [libraries](components/libraries.md)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|||||||
4
emummc/.gitrepo
vendored
4
emummc/.gitrepo
vendored
@@ -6,7 +6,7 @@
|
|||||||
[subrepo]
|
[subrepo]
|
||||||
remote = https://github.com/m4xw/emuMMC
|
remote = https://github.com/m4xw/emuMMC
|
||||||
branch = develop
|
branch = develop
|
||||||
commit = 5eed18eb527bbaa63aee5323c26de5b0cca6d28e
|
commit = f66087313546161a000ee196a788f0626caf80fa
|
||||||
parent = 021b29d2dbc8ed0469bc822393e58c9f0d174d57
|
parent = 38f9a76ba028995ed3274da3a45b0254f09d1f59
|
||||||
method = rebase
|
method = rebase
|
||||||
cmdver = 0.4.1
|
cmdver = 0.4.1
|
||||||
|
|||||||
7
emummc/Makefile
vendored
7
emummc/Makefile
vendored
@@ -32,7 +32,7 @@ CFLAGS += $(INCLUDE) -D__SWITCH__
|
|||||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
|
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
|
||||||
|
|
||||||
ASFLAGS := -g $(ARCH)
|
ASFLAGS := -g $(ARCH)
|
||||||
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
LDFLAGS = -specs=$(EMUMMCDIR)/emummc.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||||
|
|
||||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||||
|
|
||||||
@@ -98,7 +98,10 @@ else
|
|||||||
|
|
||||||
DEPENDS := $(OFILES:.o=.d)
|
DEPENDS := $(OFILES:.o=.d)
|
||||||
|
|
||||||
all : $(OUTPUT).kip
|
all : $(OUTPUT)_unpacked.kip
|
||||||
|
|
||||||
|
$(OUTPUT)_unpacked.kip : $(OUTPUT).kip
|
||||||
|
@hactool -t kip --uncompressed=$(OUTPUT)_unpacked.kip $(OUTPUT).kip
|
||||||
|
|
||||||
$(OUTPUT).kip : $(OUTPUT).elf
|
$(OUTPUT).kip : $(OUTPUT).elf
|
||||||
|
|
||||||
|
|||||||
16
emummc/README.md
vendored
16
emummc/README.md
vendored
@@ -1,21 +1,21 @@
|
|||||||
# emuMMC
|
# emuMMC
|
||||||
*A SDMMC driver replacement for Nintendo's Filesystem Services, by **m4xw***
|
*A SDMMC driver replacement for Nintendo's Filesystem Services, by **m4xw***
|
||||||
|
|
||||||
### Supported Horizon Versions
|
### Supported Horizon Versions
|
||||||
**1.0.0 - 11.0.0**
|
**1.0.0 - 13.0.0**
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
* Arbitrary SDMMC backend selection
|
* Arbitrary SDMMC backend selection
|
||||||
**This allows loading eMMC from SD or even SD from eMMC**
|
**This allows loading eMMC from SD or even SD from eMMC**
|
||||||
* On the fly hooking / patching, fully self-infesting
|
* On the fly hooking / patching, fully self-infesting
|
||||||
**Only one payload required for all versions!**
|
**Only one payload required for all versions!**
|
||||||
* File-based SDMMC backend support (from SD)
|
* File-based SDMMC backend support (from SD)
|
||||||
**This allows loading eMMC images from hekate-backups (split or not)**
|
**This allows loading eMMC images from hekate-backups (split or not)**
|
||||||
* SDMMC device based sector offset (*currently eMMC only*)
|
* SDMMC device based sector offset (*currently eMMC only*)
|
||||||
**Raw partition support for eMMC from SD with less performance overhead**
|
**Raw partition support for eMMC from SD with less performance overhead**
|
||||||
* Full support for `/Nintendo` folder redirection to a arbitrary path
|
* Full support for `/Nintendo` folder redirection to a arbitrary path
|
||||||
**No 8 char length restriction!**
|
**No 8 char length restriction!**
|
||||||
* exosphere based context configuration
|
* exosphere based context configuration
|
||||||
**This includes full support for multiple emuMMC images**
|
**This includes full support for multiple emuMMC images**
|
||||||
|
|
||||||
## Compiling
|
## Compiling
|
||||||
|
|||||||
201
emummc/emummc.ld
vendored
Normal file
201
emummc/emummc.ld
vendored
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
OUTPUT_ARCH(aarch64)
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
PHDRS
|
||||||
|
{
|
||||||
|
code PT_LOAD FLAGS(5) /* Read | Execute */;
|
||||||
|
rodata PT_LOAD FLAGS(4) /* Read */;
|
||||||
|
data PT_LOAD FLAGS(6) /* Read | Write */;
|
||||||
|
dyn PT_DYNAMIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* =========== CODE section =========== */
|
||||||
|
PROVIDE(__start__ = 0x0);
|
||||||
|
. = __start__;
|
||||||
|
__code_start = . ;
|
||||||
|
|
||||||
|
.crt0 :
|
||||||
|
{
|
||||||
|
KEEP (*(.crt0))
|
||||||
|
. = ALIGN(8);
|
||||||
|
} :code
|
||||||
|
|
||||||
|
.init :
|
||||||
|
{
|
||||||
|
KEEP( *(.init) )
|
||||||
|
. = ALIGN(8);
|
||||||
|
} :code
|
||||||
|
|
||||||
|
.plt :
|
||||||
|
{
|
||||||
|
*(.plt)
|
||||||
|
*(.iplt)
|
||||||
|
. = ALIGN(8);
|
||||||
|
} :code
|
||||||
|
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
||||||
|
*(.text.exit .text.exit.*)
|
||||||
|
*(.text.startup .text.startup.*)
|
||||||
|
*(.text.hot .text.hot.*)
|
||||||
|
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
} :code
|
||||||
|
|
||||||
|
.fini :
|
||||||
|
{
|
||||||
|
KEEP( *(.fini) )
|
||||||
|
. = ALIGN(8);
|
||||||
|
} :code
|
||||||
|
|
||||||
|
/* =========== RODATA section =========== */
|
||||||
|
. = ALIGN(0x1000);
|
||||||
|
__rodata_start = . ;
|
||||||
|
|
||||||
|
.nx-module-name : { KEEP (*(.nx-module-name)) } :rodata
|
||||||
|
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
} :rodata
|
||||||
|
|
||||||
|
.eh_frame_hdr : { __eh_frame_hdr_start = .; *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) __eh_frame_hdr_end = .; } :rodata
|
||||||
|
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } :rodata
|
||||||
|
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } :rodata
|
||||||
|
.gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } : rodata
|
||||||
|
|
||||||
|
.dynamic : { *(.dynamic) } :rodata :dyn
|
||||||
|
.dynsym : { *(.dynsym) } :rodata
|
||||||
|
.dynstr : { *(.dynstr) } :rodata
|
||||||
|
.rela.dyn : { *(.rela.*) } :rodata
|
||||||
|
.interp : { *(.interp) } :rodata
|
||||||
|
.hash : { *(.hash) } :rodata
|
||||||
|
.gnu.hash : { *(.gnu.hash) } :rodata
|
||||||
|
.gnu.version : { *(.gnu.version) } :rodata
|
||||||
|
.gnu.version_d : { *(.gnu.version_d) } :rodata
|
||||||
|
.gnu.version_r : { *(.gnu.version_r) } :rodata
|
||||||
|
.note.gnu.build-id : { *(.note.gnu.build-id) } :rodata
|
||||||
|
|
||||||
|
/* =========== DATA section =========== */
|
||||||
|
. = ALIGN(0x1000);
|
||||||
|
__data_start = . ;
|
||||||
|
|
||||||
|
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } :data
|
||||||
|
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } :data
|
||||||
|
.gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } : data
|
||||||
|
.exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } :data
|
||||||
|
|
||||||
|
.tdata ALIGN(8) :
|
||||||
|
{
|
||||||
|
__tdata_lma = .;
|
||||||
|
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
__tdata_lma_end = .;
|
||||||
|
} :data
|
||||||
|
|
||||||
|
.tbss ALIGN(8) :
|
||||||
|
{
|
||||||
|
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
|
||||||
|
. = ALIGN(8);
|
||||||
|
} :data
|
||||||
|
|
||||||
|
.preinit_array ALIGN(8) :
|
||||||
|
{
|
||||||
|
PROVIDE (__preinit_array_start = .);
|
||||||
|
KEEP (*(.preinit_array))
|
||||||
|
PROVIDE (__preinit_array_end = .);
|
||||||
|
} :data
|
||||||
|
|
||||||
|
.init_array ALIGN(8) :
|
||||||
|
{
|
||||||
|
PROVIDE (__init_array_start = .);
|
||||||
|
KEEP( *(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)) )
|
||||||
|
KEEP( *(.init_array .ctors) )
|
||||||
|
PROVIDE (__init_array_end = .);
|
||||||
|
} :data
|
||||||
|
|
||||||
|
.fini_array ALIGN(8) :
|
||||||
|
{
|
||||||
|
PROVIDE (__fini_array_start = .);
|
||||||
|
KEEP( *(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)) )
|
||||||
|
KEEP( *(.fini_array .dtors) )
|
||||||
|
PROVIDE (__fini_array_end = .);
|
||||||
|
} :data
|
||||||
|
|
||||||
|
__got_start__ = .;
|
||||||
|
|
||||||
|
.got : { *(.got) *(.igot) } :data
|
||||||
|
.got.plt : { *(.got.plt) *(.igot.plt) } :data
|
||||||
|
|
||||||
|
__got_end__ = .;
|
||||||
|
|
||||||
|
.data ALIGN(8) :
|
||||||
|
{
|
||||||
|
*(.data .data.* .gnu.linkonce.d.*)
|
||||||
|
SORT(CONSTRUCTORS)
|
||||||
|
} :data
|
||||||
|
|
||||||
|
__bss_start__ = .;
|
||||||
|
.bss ALIGN(8) :
|
||||||
|
{
|
||||||
|
*(.dynbss)
|
||||||
|
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(8);
|
||||||
|
|
||||||
|
/* Reserve space for the TLS segment of the main thread */
|
||||||
|
__tls_start = .;
|
||||||
|
. += + SIZEOF(.tdata) + SIZEOF(.tbss);
|
||||||
|
__tls_end = .;
|
||||||
|
} : data
|
||||||
|
__bss_end__ = .;
|
||||||
|
|
||||||
|
__end__ = ABSOLUTE(.) ;
|
||||||
|
|
||||||
|
. = ALIGN(0x1000);
|
||||||
|
__argdata__ = ABSOLUTE(.) ;
|
||||||
|
|
||||||
|
/* ==================
|
||||||
|
==== Metadata ====
|
||||||
|
================== */
|
||||||
|
|
||||||
|
/* Discard sections that difficult post-processing */
|
||||||
|
/DISCARD/ : { *(.group .comment .note) }
|
||||||
|
|
||||||
|
/* Stabs debugging sections. */
|
||||||
|
.stab 0 : { *(.stab) }
|
||||||
|
.stabstr 0 : { *(.stabstr) }
|
||||||
|
.stab.excl 0 : { *(.stab.excl) }
|
||||||
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||||
|
.stab.index 0 : { *(.stab.index) }
|
||||||
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||||
|
|
||||||
|
/* DWARF debug sections.
|
||||||
|
Symbols in the DWARF debugging sections are relative to the beginning
|
||||||
|
of the section so we begin them at 0. */
|
||||||
|
|
||||||
|
/* DWARF 1 */
|
||||||
|
.debug 0 : { *(.debug) }
|
||||||
|
.line 0 : { *(.line) }
|
||||||
|
|
||||||
|
/* GNU DWARF 1 extensions */
|
||||||
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||||
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||||
|
|
||||||
|
/* DWARF 1.1 and DWARF 2 */
|
||||||
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
|
|
||||||
|
/* DWARF 2 */
|
||||||
|
.debug_info 0 : { *(.debug_info) }
|
||||||
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
|
.debug_line 0 : { *(.debug_line) }
|
||||||
|
.debug_frame 0 : { *(.debug_frame) }
|
||||||
|
.debug_str 0 : { *(.debug_str) }
|
||||||
|
.debug_loc 0 : { *(.debug_loc) }
|
||||||
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||||
|
}
|
||||||
8
emummc/emummc.specs
vendored
Normal file
8
emummc/emummc.specs
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
%rename link old_link
|
||||||
|
|
||||||
|
*link:
|
||||||
|
%(old_link) -T %:getenv(TOPDIR /emummc.ld) -pie --no-dynamic-linker --spare-dynamic-tags=0 --gc-sections -z text -z nodynamic-undefined-weak --build-id=sha1 --nx-module-name
|
||||||
|
|
||||||
|
*startfile:
|
||||||
|
crti%O%s crtbegin%O%s
|
||||||
|
|
||||||
11
emummc/source/FS/FS.h
vendored
11
emummc/source/FS/FS.h
vendored
@@ -37,4 +37,15 @@
|
|||||||
#define BOOT_PARTITION_SIZE 0x2000
|
#define BOOT_PARTITION_SIZE 0x2000
|
||||||
#define FS_READ_WRITE_ERROR 1048
|
#define FS_READ_WRITE_ERROR 1048
|
||||||
|
|
||||||
|
#define NAND_PATROL_SECTOR 0xC20
|
||||||
|
#define NAND_PATROL_OFFSET 0x184000
|
||||||
|
|
||||||
|
typedef struct _fs_nand_patrol_t
|
||||||
|
{
|
||||||
|
uint8_t hmac[0x20];
|
||||||
|
unsigned int offset;
|
||||||
|
unsigned int count;
|
||||||
|
uint8_t rsvd[0x1D8];
|
||||||
|
} fs_nand_patrol_t;
|
||||||
|
|
||||||
#endif /* __FS_H__ */
|
#endif /* __FS_H__ */
|
||||||
|
|||||||
24
emummc/source/FS/FS_offsets.c
vendored
24
emummc/source/FS/FS_offsets.c
vendored
@@ -51,6 +51,12 @@
|
|||||||
#include "offsets/1020_exfat.h"
|
#include "offsets/1020_exfat.h"
|
||||||
#include "offsets/1100.h"
|
#include "offsets/1100.h"
|
||||||
#include "offsets/1100_exfat.h"
|
#include "offsets/1100_exfat.h"
|
||||||
|
#include "offsets/1200.h"
|
||||||
|
#include "offsets/1200_exfat.h"
|
||||||
|
#include "offsets/1203.h"
|
||||||
|
#include "offsets/1203_exfat.h"
|
||||||
|
#include "offsets/1300.h"
|
||||||
|
#include "offsets/1300_exfat.h"
|
||||||
#include "../utils/fatal.h"
|
#include "../utils/fatal.h"
|
||||||
|
|
||||||
#define GET_OFFSET_STRUCT_NAME(vers) g_offsets##vers
|
#define GET_OFFSET_STRUCT_NAME(vers) g_offsets##vers
|
||||||
@@ -113,6 +119,12 @@ DEFINE_OFFSET_STRUCT(_1020);
|
|||||||
DEFINE_OFFSET_STRUCT(_1020_EXFAT);
|
DEFINE_OFFSET_STRUCT(_1020_EXFAT);
|
||||||
DEFINE_OFFSET_STRUCT(_1100);
|
DEFINE_OFFSET_STRUCT(_1100);
|
||||||
DEFINE_OFFSET_STRUCT(_1100_EXFAT);
|
DEFINE_OFFSET_STRUCT(_1100_EXFAT);
|
||||||
|
DEFINE_OFFSET_STRUCT(_1200);
|
||||||
|
DEFINE_OFFSET_STRUCT(_1200_EXFAT);
|
||||||
|
DEFINE_OFFSET_STRUCT(_1203);
|
||||||
|
DEFINE_OFFSET_STRUCT(_1203_EXFAT);
|
||||||
|
DEFINE_OFFSET_STRUCT(_1300);
|
||||||
|
DEFINE_OFFSET_STRUCT(_1300_EXFAT);
|
||||||
|
|
||||||
const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
|
const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
|
||||||
switch (version) {
|
switch (version) {
|
||||||
@@ -186,6 +198,18 @@ const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
|
|||||||
return &(GET_OFFSET_STRUCT_NAME(_1100));
|
return &(GET_OFFSET_STRUCT_NAME(_1100));
|
||||||
case FS_VER_11_0_0_EXFAT:
|
case FS_VER_11_0_0_EXFAT:
|
||||||
return &(GET_OFFSET_STRUCT_NAME(_1100_EXFAT));
|
return &(GET_OFFSET_STRUCT_NAME(_1100_EXFAT));
|
||||||
|
case FS_VER_12_0_0:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_1200));
|
||||||
|
case FS_VER_12_0_0_EXFAT:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_1200_EXFAT));
|
||||||
|
case FS_VER_12_0_3:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_1203));
|
||||||
|
case FS_VER_12_0_3_EXFAT:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_1203_EXFAT));
|
||||||
|
case FS_VER_13_0_0:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_1300));
|
||||||
|
case FS_VER_13_0_0_EXFAT:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_1300_EXFAT));
|
||||||
default:
|
default:
|
||||||
fatal_abort(Fatal_UnknownVersion);
|
fatal_abort(Fatal_UnknownVersion);
|
||||||
}
|
}
|
||||||
|
|||||||
9
emummc/source/FS/FS_versions.h
vendored
9
emummc/source/FS/FS_versions.h
vendored
@@ -74,6 +74,15 @@ enum FS_VER
|
|||||||
FS_VER_11_0_0,
|
FS_VER_11_0_0,
|
||||||
FS_VER_11_0_0_EXFAT,
|
FS_VER_11_0_0_EXFAT,
|
||||||
|
|
||||||
|
FS_VER_12_0_0,
|
||||||
|
FS_VER_12_0_0_EXFAT,
|
||||||
|
|
||||||
|
FS_VER_12_0_3,
|
||||||
|
FS_VER_12_0_3_EXFAT,
|
||||||
|
|
||||||
|
FS_VER_13_0_0,
|
||||||
|
FS_VER_13_0_0_EXFAT,
|
||||||
|
|
||||||
FS_VER_MAX,
|
FS_VER_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
59
emummc/source/FS/offsets/1200.h
vendored
Normal file
59
emummc/source/FS/offsets/1200.h
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_1200_H__
|
||||||
|
#define __FS_1200_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_1200_SDMMC_ACCESSOR_GC 0x154FD0
|
||||||
|
#define FS_OFFSET_1200_SDMMC_ACCESSOR_SD 0x156DE0
|
||||||
|
#define FS_OFFSET_1200_SDMMC_ACCESSOR_NAND 0x155500
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_1200_SDMMC_WRAPPER_READ 0x150970
|
||||||
|
#define FS_OFFSET_1200_SDMMC_WRAPPER_WRITE 0x150A30
|
||||||
|
#define FS_OFFSET_1200_RTLD 0x688
|
||||||
|
#define FS_OFFSET_1200_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x3C)))
|
||||||
|
|
||||||
|
#define FS_OFFSET_1200_CLKRST_SET_MIN_V_CLK_RATE 0x14FCC0
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_1200_LOCK_MUTEX 0x29350
|
||||||
|
#define FS_OFFSET_1200_UNLOCK_MUTEX 0x293A0
|
||||||
|
|
||||||
|
#define FS_OFFSET_1200_SDMMC_WRAPPER_CONTROLLER_OPEN 0x150850
|
||||||
|
#define FS_OFFSET_1200_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1508E0
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_1200_SD_MUTEX 0xE3D3E8
|
||||||
|
#define FS_OFFSET_1200_NAND_MUTEX 0xE38768
|
||||||
|
#define FS_OFFSET_1200_ACTIVE_PARTITION 0xE387A8
|
||||||
|
#define FS_OFFSET_1200_SDMMC_DAS_HANDLE 0xE20DB0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_1200_SD_DAS_INIT 0x27244
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_1200_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0006E810, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0007AEC0, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00081254, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00092850, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_1200_H__
|
||||||
59
emummc/source/FS/offsets/1200_exfat.h
vendored
Normal file
59
emummc/source/FS/offsets/1200_exfat.h
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_1200_EXFAT_H__
|
||||||
|
#define __FS_1200_EXFAT_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_ACCESSOR_GC 0x154FD0
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_ACCESSOR_SD 0x156DE0
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_ACCESSOR_NAND 0x155500
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_WRAPPER_READ 0x150970
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_WRAPPER_WRITE 0x150A30
|
||||||
|
#define FS_OFFSET_1200_EXFAT_RTLD 0x688
|
||||||
|
#define FS_OFFSET_1200_EXFAT_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x3C)))
|
||||||
|
|
||||||
|
#define FS_OFFSET_1200_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x14FCC0
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_1200_EXFAT_LOCK_MUTEX 0x29350
|
||||||
|
#define FS_OFFSET_1200_EXFAT_UNLOCK_MUTEX 0x293A0
|
||||||
|
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0x150850
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1508E0
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SD_MUTEX 0xE4B3E8
|
||||||
|
#define FS_OFFSET_1200_EXFAT_NAND_MUTEX 0xE46768
|
||||||
|
#define FS_OFFSET_1200_EXFAT_ACTIVE_PARTITION 0xE467A8
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SDMMC_DAS_HANDLE 0xE2EDB0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_1200_EXFAT_SD_DAS_INIT 0x27244
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_1200_EXFAT_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0006E810, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0007AEC0, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00081254, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00092850, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_1200_EXFAT_H__
|
||||||
60
emummc/source/FS/offsets/1203.h
vendored
Normal file
60
emummc/source/FS/offsets/1203.h
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-NX
|
||||||
|
* Copyright (c) 2021 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_1203_H__
|
||||||
|
#define __FS_1203_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_1203_SDMMC_ACCESSOR_GC 0x1550E0
|
||||||
|
#define FS_OFFSET_1203_SDMMC_ACCESSOR_SD 0x156EF0
|
||||||
|
#define FS_OFFSET_1203_SDMMC_ACCESSOR_NAND 0x155610
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_1203_SDMMC_WRAPPER_READ 0x150A80
|
||||||
|
#define FS_OFFSET_1203_SDMMC_WRAPPER_WRITE 0x150B40
|
||||||
|
#define FS_OFFSET_1203_RTLD 0x688
|
||||||
|
#define FS_OFFSET_1203_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x3C)))
|
||||||
|
|
||||||
|
#define FS_OFFSET_1203_CLKRST_SET_MIN_V_CLK_RATE 0x14FDD0
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_1203_LOCK_MUTEX 0x29350
|
||||||
|
#define FS_OFFSET_1203_UNLOCK_MUTEX 0x293A0
|
||||||
|
|
||||||
|
#define FS_OFFSET_1203_SDMMC_WRAPPER_CONTROLLER_OPEN 0x150960
|
||||||
|
#define FS_OFFSET_1203_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1509F0
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_1203_SD_MUTEX 0xE3D3E8
|
||||||
|
#define FS_OFFSET_1203_NAND_MUTEX 0xE38768
|
||||||
|
#define FS_OFFSET_1203_ACTIVE_PARTITION 0xE387A8
|
||||||
|
#define FS_OFFSET_1203_SDMMC_DAS_HANDLE 0xE20DB0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_1203_SD_DAS_INIT 0x27244
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_1203_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0006E920, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0007AFD0, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00081364, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00092960, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_1203_H__
|
||||||
60
emummc/source/FS/offsets/1203_exfat.h
vendored
Normal file
60
emummc/source/FS/offsets/1203_exfat.h
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-NX
|
||||||
|
* Copyright (c) 2021 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_1203_EXFAT_H__
|
||||||
|
#define __FS_1203_EXFAT_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_ACCESSOR_GC 0x1550E0
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_ACCESSOR_SD 0x156EF0
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_ACCESSOR_NAND 0x155610
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_WRAPPER_READ 0x150A80
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_WRAPPER_WRITE 0x150B40
|
||||||
|
#define FS_OFFSET_1203_EXFAT_RTLD 0x688
|
||||||
|
#define FS_OFFSET_1203_EXFAT_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x3C)))
|
||||||
|
|
||||||
|
#define FS_OFFSET_1203_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x14FDD0
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_1203_EXFAT_LOCK_MUTEX 0x29350
|
||||||
|
#define FS_OFFSET_1203_EXFAT_UNLOCK_MUTEX 0x293A0
|
||||||
|
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0x150960
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1509F0
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SD_MUTEX 0xE4B3E8
|
||||||
|
#define FS_OFFSET_1203_EXFAT_NAND_MUTEX 0xE46768
|
||||||
|
#define FS_OFFSET_1203_EXFAT_ACTIVE_PARTITION 0xE467A8
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SDMMC_DAS_HANDLE 0xE2EDB0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_1203_EXFAT_SD_DAS_INIT 0x27244
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_1203_EXFAT_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0006E920, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0007AFD0, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00081364, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00092960, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_1203_EXFAT_H__
|
||||||
59
emummc/source/FS/offsets/1300.h
vendored
Normal file
59
emummc/source/FS/offsets/1300.h
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_1300_H__
|
||||||
|
#define __FS_1300_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_1300_SDMMC_ACCESSOR_GC 0x158C80
|
||||||
|
#define FS_OFFSET_1300_SDMMC_ACCESSOR_SD 0x15AA90
|
||||||
|
#define FS_OFFSET_1300_SDMMC_ACCESSOR_NAND 0x1591B0
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_1300_SDMMC_WRAPPER_READ 0x154620
|
||||||
|
#define FS_OFFSET_1300_SDMMC_WRAPPER_WRITE 0x1546E0
|
||||||
|
#define FS_OFFSET_1300_RTLD 0x688
|
||||||
|
#define FS_OFFSET_1300_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x3C)))
|
||||||
|
|
||||||
|
#define FS_OFFSET_1300_CLKRST_SET_MIN_V_CLK_RATE 0x153820
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_1300_LOCK_MUTEX 0x29690
|
||||||
|
#define FS_OFFSET_1300_UNLOCK_MUTEX 0x296E0
|
||||||
|
|
||||||
|
#define FS_OFFSET_1300_SDMMC_WRAPPER_CONTROLLER_OPEN 0x154500
|
||||||
|
#define FS_OFFSET_1300_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x154590
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_1300_SD_MUTEX 0xE133E8
|
||||||
|
#define FS_OFFSET_1300_NAND_MUTEX 0xE0E768
|
||||||
|
#define FS_OFFSET_1300_ACTIVE_PARTITION 0xE0E7A8
|
||||||
|
#define FS_OFFSET_1300_SDMMC_DAS_HANDLE 0xDF6E18
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_1300_SD_DAS_INIT 0x27744
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_1300_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0006EBE0, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0007BEEC, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00082294, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x0009422C, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_1300_H__
|
||||||
59
emummc/source/FS/offsets/1300_exfat.h
vendored
Normal file
59
emummc/source/FS/offsets/1300_exfat.h
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_1300_EXFAT_H__
|
||||||
|
#define __FS_1300_EXFAT_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_ACCESSOR_GC 0x158C80
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_ACCESSOR_SD 0x15AA90
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_ACCESSOR_NAND 0x1591B0
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_WRAPPER_READ 0x154620
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_WRAPPER_WRITE 0x1546E0
|
||||||
|
#define FS_OFFSET_1300_EXFAT_RTLD 0x688
|
||||||
|
#define FS_OFFSET_1300_EXFAT_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x3C)))
|
||||||
|
|
||||||
|
#define FS_OFFSET_1300_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x153820
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_1300_EXFAT_LOCK_MUTEX 0x29690
|
||||||
|
#define FS_OFFSET_1300_EXFAT_UNLOCK_MUTEX 0x296E0
|
||||||
|
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0x154500
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x154590
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SD_MUTEX 0xE203E8
|
||||||
|
#define FS_OFFSET_1300_EXFAT_NAND_MUTEX 0xE1B768
|
||||||
|
#define FS_OFFSET_1300_EXFAT_ACTIVE_PARTITION 0xE1B7A8
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SDMMC_DAS_HANDLE 0xE03E18
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_1300_EXFAT_SD_DAS_INIT 0x27744
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_1300_EXFAT_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0006EBE0, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0007BEEC, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00082294, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x0009422C, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_1300_EXFAT_H__
|
||||||
150
emummc/source/emuMMC/emummc.c
vendored
150
emummc/source/emuMMC/emummc.c
vendored
@@ -89,7 +89,7 @@ static void _sdmmc_ensure_initialized(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _file_based_update_filename(char *outFilename, u32 sd_path_len, u32 part_idx)
|
static void _file_based_update_filename(char *outFilename, unsigned int sd_path_len, unsigned int part_idx)
|
||||||
{
|
{
|
||||||
snprintf(outFilename + sd_path_len, 3, "%02d", part_idx);
|
snprintf(outFilename + sd_path_len, 3, "%02d", part_idx);
|
||||||
}
|
}
|
||||||
@@ -103,9 +103,7 @@ static void _file_based_emmc_finalize(void)
|
|||||||
f_close(&f_emu.fp_boot1);
|
f_close(&f_emu.fp_boot1);
|
||||||
|
|
||||||
for (int i = 0; i < f_emu.parts; i++)
|
for (int i = 0; i < f_emu.parts; i++)
|
||||||
{
|
|
||||||
f_close(&f_emu.fp_gpp[i]);
|
f_close(&f_emu.fp_gpp[i]);
|
||||||
}
|
|
||||||
|
|
||||||
// Force unmount FAT volume.
|
// Force unmount FAT volume.
|
||||||
f_mount(NULL, "", 1);
|
f_mount(NULL, "", 1);
|
||||||
@@ -114,12 +112,59 @@ static void _file_based_emmc_finalize(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _nand_patrol_ensure_integrity(void)
|
||||||
|
{
|
||||||
|
fs_nand_patrol_t nand_patrol;
|
||||||
|
static bool nand_patrol_checked = false;
|
||||||
|
|
||||||
|
if (!nand_patrol_checked)
|
||||||
|
{
|
||||||
|
if (emuMMC_ctx.EMMC_Type == emuMMC_SD_Raw)
|
||||||
|
{
|
||||||
|
unsigned int nand_patrol_sector = emuMMC_ctx.EMMC_StoragePartitionOffset + NAND_PATROL_SECTOR;
|
||||||
|
if (!sdmmc_storage_read(&sd_storage, nand_patrol_sector, 1, &nand_patrol))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
// Clear nand patrol if last offset exceeds storage.
|
||||||
|
if (nand_patrol.offset > sd_storage.sec_cnt)
|
||||||
|
{
|
||||||
|
memset(&nand_patrol, 0, sizeof(fs_nand_patrol_t));
|
||||||
|
sdmmc_storage_write(&sd_storage, nand_patrol_sector, 1, &nand_patrol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (emuMMC_ctx.EMMC_Type == emuMMC_SD_File && fat_mounted)
|
||||||
|
{
|
||||||
|
FIL *fp = &f_emu.fp_boot0;
|
||||||
|
if (f_lseek(fp, NAND_PATROL_OFFSET) != FR_OK)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (f_read_fast(fp, &nand_patrol, sizeof(fs_nand_patrol_t)) != FR_OK)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
// Clear nand patrol if last offset exceeds total file based size.
|
||||||
|
if (nand_patrol.offset > f_emu.total_sect)
|
||||||
|
{
|
||||||
|
memset(&nand_patrol, 0, sizeof(fs_nand_patrol_t));
|
||||||
|
|
||||||
|
if (f_lseek(fp, NAND_PATROL_OFFSET) != FR_OK)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (f_write_fast(fp, &nand_patrol, sizeof(fs_nand_patrol_t)) != FR_OK)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
f_sync(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
nand_patrol_checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void sdmmc_finalize(void)
|
void sdmmc_finalize(void)
|
||||||
{
|
{
|
||||||
if (!sdmmc_storage_end(&sd_storage))
|
if (!sdmmc_storage_end(&sd_storage))
|
||||||
{
|
|
||||||
fatal_abort(Fatal_InitSD);
|
fatal_abort(Fatal_InitSD);
|
||||||
}
|
|
||||||
|
|
||||||
storageSDinitialized = false;
|
storageSDinitialized = false;
|
||||||
}
|
}
|
||||||
@@ -137,14 +182,14 @@ static void _file_based_emmc_initialize(void)
|
|||||||
memcpy(path + path_len, "BOOT0", 6);
|
memcpy(path + path_len, "BOOT0", 6);
|
||||||
if (f_open(&f_emu.fp_boot0, path, FA_READ | FA_WRITE) != FR_OK)
|
if (f_open(&f_emu.fp_boot0, path, FA_READ | FA_WRITE) != FR_OK)
|
||||||
fatal_abort(Fatal_FatfsFileOpen);
|
fatal_abort(Fatal_FatfsFileOpen);
|
||||||
if (!f_expand_cltbl(&f_emu.fp_boot0, 0x400, f_emu.clmt_boot0, f_size(&f_emu.fp_boot0)))
|
if (!f_expand_cltbl(&f_emu.fp_boot0, EMUMMC_FP_CLMT_COUNT, f_emu.clmt_boot0, f_size(&f_emu.fp_boot0)))
|
||||||
fatal_abort(Fatal_FatfsMemExhaustion);
|
fatal_abort(Fatal_FatfsMemExhaustion);
|
||||||
|
|
||||||
// Open BOOT1 physical partition.
|
// Open BOOT1 physical partition.
|
||||||
memcpy(path + path_len, "BOOT1", 6);
|
memcpy(path + path_len, "BOOT1", 6);
|
||||||
if (f_open(&f_emu.fp_boot1, path, FA_READ | FA_WRITE) != FR_OK)
|
if (f_open(&f_emu.fp_boot1, path, FA_READ | FA_WRITE) != FR_OK)
|
||||||
fatal_abort(Fatal_FatfsFileOpen);
|
fatal_abort(Fatal_FatfsFileOpen);
|
||||||
if (!f_expand_cltbl(&f_emu.fp_boot1, 0x400, f_emu.clmt_boot1, f_size(&f_emu.fp_boot1)))
|
if (!f_expand_cltbl(&f_emu.fp_boot1, EMUMMC_FP_CLMT_COUNT, f_emu.clmt_boot1, f_size(&f_emu.fp_boot1)))
|
||||||
fatal_abort(Fatal_FatfsMemExhaustion);
|
fatal_abort(Fatal_FatfsMemExhaustion);
|
||||||
|
|
||||||
// Open handles for GPP physical partition files.
|
// Open handles for GPP physical partition files.
|
||||||
@@ -152,15 +197,14 @@ static void _file_based_emmc_initialize(void)
|
|||||||
|
|
||||||
if (f_open(&f_emu.fp_gpp[0], path, FA_READ | FA_WRITE) != FR_OK)
|
if (f_open(&f_emu.fp_gpp[0], path, FA_READ | FA_WRITE) != FR_OK)
|
||||||
fatal_abort(Fatal_FatfsFileOpen);
|
fatal_abort(Fatal_FatfsFileOpen);
|
||||||
if (!f_expand_cltbl(&f_emu.fp_gpp[0], 0x400, &f_emu.clmt_gpp[0], f_size(&f_emu.fp_gpp[0])))
|
if (!f_expand_cltbl(&f_emu.fp_gpp[0], EMUMMC_FP_CLMT_COUNT, &f_emu.clmt_gpp[0], f_size(&f_emu.fp_gpp[0])))
|
||||||
fatal_abort(Fatal_FatfsMemExhaustion);
|
fatal_abort(Fatal_FatfsMemExhaustion);
|
||||||
|
|
||||||
f_emu.part_size = f_size(&f_emu.fp_gpp[0]) >> 9;
|
f_emu.part_size = (uint64_t)f_size(&f_emu.fp_gpp[0]) >> 9;
|
||||||
|
f_emu.total_sect = f_emu.part_size;
|
||||||
|
|
||||||
// Iterate folder for split parts and stop if next doesn't exist.
|
// Iterate folder for split parts and stop if next doesn't exist.
|
||||||
// Supports up to 32 parts of any size.
|
for (f_emu.parts = 1; f_emu.parts < EMUMMC_FILE_MAX_PARTS; f_emu.parts++)
|
||||||
// TODO: decide on max parts and define them. (hekate produces up to 30 parts on 1GB mode.)
|
|
||||||
for (f_emu.parts = 1; f_emu.parts < 32; f_emu.parts++)
|
|
||||||
{
|
{
|
||||||
_file_based_update_filename(path, path_len, f_emu.parts);
|
_file_based_update_filename(path, path_len, f_emu.parts);
|
||||||
|
|
||||||
@@ -173,8 +217,13 @@ static void _file_based_emmc_initialize(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!f_expand_cltbl(&f_emu.fp_gpp[f_emu.parts], 0x400, &f_emu.clmt_gpp[f_emu.parts * 0x400], f_size(&f_emu.fp_gpp[f_emu.parts])))
|
if (!f_expand_cltbl(&f_emu.fp_gpp[f_emu.parts], EMUMMC_FP_CLMT_COUNT,
|
||||||
|
&f_emu.clmt_gpp[f_emu.parts * EMUMMC_FP_CLMT_COUNT], f_size(&f_emu.fp_gpp[f_emu.parts])))
|
||||||
|
{
|
||||||
fatal_abort(Fatal_FatfsMemExhaustion);
|
fatal_abort(Fatal_FatfsMemExhaustion);
|
||||||
|
}
|
||||||
|
|
||||||
|
f_emu.total_sect += (uint64_t)f_size(&f_emu.fp_gpp[f_emu.parts]) >> 9;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,7 +238,7 @@ bool sdmmc_initialize(void)
|
|||||||
{
|
{
|
||||||
storageSDinitialized = true;
|
storageSDinitialized = true;
|
||||||
|
|
||||||
// File based emummc.
|
// Init file based emummc.
|
||||||
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_File) && !fat_mounted)
|
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_File) && !fat_mounted)
|
||||||
{
|
{
|
||||||
if (f_mount(&f_emu.sd_fs, "", 1) != FR_OK)
|
if (f_mount(&f_emu.sd_fs, "", 1) != FR_OK)
|
||||||
@@ -200,6 +249,9 @@ bool sdmmc_initialize(void)
|
|||||||
_file_based_emmc_initialize();
|
_file_based_emmc_initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if nand patrol offset is inside limits.
|
||||||
|
_nand_patrol_ensure_integrity();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,9 +259,7 @@ bool sdmmc_initialize(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!storageSDinitialized)
|
if (!storageSDinitialized)
|
||||||
{
|
|
||||||
fatal_abort(Fatal_InitSD);
|
fatal_abort(Fatal_InitSD);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return storageSDinitialized;
|
return storageSDinitialized;
|
||||||
@@ -239,19 +289,17 @@ sdmmc_accessor_t *sdmmc_accessor_get(int mmc_id)
|
|||||||
void mutex_lock_handler(int mmc_id)
|
void mutex_lock_handler(int mmc_id)
|
||||||
{
|
{
|
||||||
if (custom_driver)
|
if (custom_driver)
|
||||||
{
|
|
||||||
lock_mutex(sd_mutex);
|
lock_mutex(sd_mutex);
|
||||||
}
|
|
||||||
lock_mutex(nand_mutex);
|
lock_mutex(nand_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mutex_unlock_handler(int mmc_id)
|
void mutex_unlock_handler(int mmc_id)
|
||||||
{
|
{
|
||||||
unlock_mutex(nand_mutex);
|
unlock_mutex(nand_mutex);
|
||||||
|
|
||||||
if (custom_driver)
|
if (custom_driver)
|
||||||
{
|
|
||||||
unlock_mutex(sd_mutex);
|
unlock_mutex(sd_mutex);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdmmc_nand_get_active_partition_index()
|
int sdmmc_nand_get_active_partition_index()
|
||||||
@@ -271,12 +319,16 @@ int sdmmc_nand_get_active_partition_index()
|
|||||||
|
|
||||||
static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned int num_sectors, bool is_write)
|
static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned int num_sectors, bool is_write)
|
||||||
{
|
{
|
||||||
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_Raw))
|
if (emuMMC_ctx.EMMC_Type == emuMMC_SD_Raw)
|
||||||
{
|
{
|
||||||
// raw partition sector offset: emuMMC_ctx.EMMC_StoragePartitionOffset.
|
// raw partition sector offset: emuMMC_ctx.EMMC_StoragePartitionOffset.
|
||||||
sector += emuMMC_ctx.EMMC_StoragePartitionOffset;
|
sector += emuMMC_ctx.EMMC_StoragePartitionOffset;
|
||||||
// Set physical partition offset.
|
// Set physical partition offset.
|
||||||
sector += (sdmmc_nand_get_active_partition_index() * BOOT_PARTITION_SIZE);
|
sector += (sdmmc_nand_get_active_partition_index() * BOOT_PARTITION_SIZE);
|
||||||
|
|
||||||
|
if (__builtin_expect(sector + num_sectors > sd_storage.sec_cnt, 0))
|
||||||
|
return 0; // Out of bounds. Can only happen with Nand Patrol if resized.
|
||||||
|
|
||||||
if (!is_write)
|
if (!is_write)
|
||||||
return sdmmc_storage_read(&sd_storage, sector, num_sectors, buf);
|
return sdmmc_storage_read(&sd_storage, sector, num_sectors, buf);
|
||||||
else
|
else
|
||||||
@@ -290,32 +342,62 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned
|
|||||||
case FS_EMMC_PARTITION_GPP:
|
case FS_EMMC_PARTITION_GPP:
|
||||||
if (f_emu.parts)
|
if (f_emu.parts)
|
||||||
{
|
{
|
||||||
|
if (__builtin_expect(sector + num_sectors > f_emu.total_sect, 0))
|
||||||
|
return 0; // Out of bounds. Can only happen with Nand Patrol if resized.
|
||||||
|
|
||||||
fp = &f_emu.fp_gpp[sector / f_emu.part_size];
|
fp = &f_emu.fp_gpp[sector / f_emu.part_size];
|
||||||
sector = sector % f_emu.part_size;
|
sector = sector % f_emu.part_size;
|
||||||
|
|
||||||
|
// Special handling for reads/writes which cross file-boundaries.
|
||||||
|
if (__builtin_expect(sector + num_sectors > f_emu.part_size, 0))
|
||||||
|
{
|
||||||
|
unsigned int remaining = num_sectors;
|
||||||
|
while (remaining > 0) {
|
||||||
|
const unsigned int cur_sectors = MIN(remaining, f_emu.part_size - sector);
|
||||||
|
|
||||||
|
if (f_lseek(fp, (uint64_t)sector << 9) != FR_OK)
|
||||||
|
return 0; // Out of bounds.
|
||||||
|
|
||||||
|
if (!is_write)
|
||||||
|
{
|
||||||
|
if (f_read_fast(fp, buf, (uint64_t)cur_sectors << 9) != FR_OK)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (f_write_fast(fp, buf, (uint64_t)cur_sectors << 9) != FR_OK)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = (char *)buf + ((uint64_t)cur_sectors << 9);
|
||||||
|
remaining -= cur_sectors;
|
||||||
|
sector = 0;
|
||||||
|
++fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
fp = &f_emu.fp_gpp[0];
|
fp = &f_emu.fp_gpp[0];
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FS_EMMC_PARTITION_BOOT1:
|
case FS_EMMC_PARTITION_BOOT1:
|
||||||
fp = &f_emu.fp_boot1;
|
fp = &f_emu.fp_boot1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FS_EMMC_PARTITION_BOOT0:
|
case FS_EMMC_PARTITION_BOOT0:
|
||||||
fp = &f_emu.fp_boot0;
|
fp = &f_emu.fp_boot0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f_lseek(fp, sector << 9) != FR_OK)
|
if (f_lseek(fp, (uint64_t)sector << 9) != FR_OK)
|
||||||
return 0; // Out of bounds.
|
return 0; // Out of bounds. Can only happen with Nand Patrol if resized.
|
||||||
|
|
||||||
uint64_t res = 0;
|
|
||||||
if (!is_write)
|
if (!is_write)
|
||||||
res = !f_read_fast(fp, buf, num_sectors << 9);
|
return !f_read_fast(fp, buf, (uint64_t)num_sectors << 9);
|
||||||
else
|
else
|
||||||
res = !f_write_fast(fp, buf, num_sectors << 9);
|
return !f_write_fast(fp, buf, (uint64_t)num_sectors << 9);
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Controller open wrapper
|
// Controller open wrapper
|
||||||
@@ -328,13 +410,13 @@ uint64_t sdmmc_wrapper_controller_open(int mmc_id)
|
|||||||
if (_this != NULL)
|
if (_this != NULL)
|
||||||
{
|
{
|
||||||
// Lock eMMC xfer while SD card is being initialized by FS.
|
// Lock eMMC xfer while SD card is being initialized by FS.
|
||||||
if (_this == sdmmc_accessor_get(FS_SDMMC_SD))
|
if (mmc_id == FS_SDMMC_SD)
|
||||||
mutex_lock_handler(FS_SDMMC_EMMC); // Recursive Mutex, handler will lock SD as well if custom_driver
|
mutex_lock_handler(FS_SDMMC_EMMC); // Recursive Mutex, handler will lock SD as well if custom_driver
|
||||||
|
|
||||||
result = _this->vtab->sdmmc_accessor_controller_open(_this);
|
result = _this->vtab->sdmmc_accessor_controller_open(_this);
|
||||||
|
|
||||||
// Unlock eMMC.
|
// Unlock eMMC.
|
||||||
if (_this == sdmmc_accessor_get(FS_SDMMC_SD))
|
if (mmc_id == FS_SDMMC_SD)
|
||||||
mutex_unlock_handler(FS_SDMMC_EMMC);
|
mutex_unlock_handler(FS_SDMMC_EMMC);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -352,9 +434,7 @@ uint64_t sdmmc_wrapper_controller_close(int mmc_id)
|
|||||||
if (_this != NULL)
|
if (_this != NULL)
|
||||||
{
|
{
|
||||||
if (mmc_id == FS_SDMMC_SD)
|
if (mmc_id == FS_SDMMC_SD)
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
if (mmc_id == FS_SDMMC_EMMC)
|
if (mmc_id == FS_SDMMC_EMMC)
|
||||||
{
|
{
|
||||||
@@ -474,8 +554,6 @@ uint64_t sdmmc_wrapper_write(int mmc_id, unsigned int sector, unsigned int num_s
|
|||||||
mutex_lock_handler(mmc_id);
|
mutex_lock_handler(mmc_id);
|
||||||
_current_accessor = _this;
|
_current_accessor = _this;
|
||||||
|
|
||||||
sector += 0;
|
|
||||||
|
|
||||||
// Call hekates driver.
|
// Call hekates driver.
|
||||||
if (sdmmc_storage_write(&sd_storage, sector, num_sectors, buf))
|
if (sdmmc_storage_write(&sd_storage, sector, num_sectors, buf))
|
||||||
{
|
{
|
||||||
|
|||||||
12
emummc/source/emuMMC/emummc.h
vendored
12
emummc/source/emuMMC/emummc.h
vendored
@@ -36,6 +36,9 @@ extern "C" {
|
|||||||
#include "../FS/FS.h"
|
#include "../FS/FS.h"
|
||||||
#include "../libs/fatfs/ff.h"
|
#include "../libs/fatfs/ff.h"
|
||||||
|
|
||||||
|
#define EMUMMC_FILE_MAX_PARTS 32
|
||||||
|
#define EMUMMC_FP_CLMT_COUNT 1024
|
||||||
|
|
||||||
// FS typedefs
|
// FS typedefs
|
||||||
typedef sdmmc_accessor_t *(*_sdmmc_accessor_gc)();
|
typedef sdmmc_accessor_t *(*_sdmmc_accessor_gc)();
|
||||||
typedef sdmmc_accessor_t *(*_sdmmc_accessor_sd)();
|
typedef sdmmc_accessor_t *(*_sdmmc_accessor_sd)();
|
||||||
@@ -63,11 +66,12 @@ typedef struct _file_based_ctxt
|
|||||||
uint64_t parts;
|
uint64_t parts;
|
||||||
uint64_t part_size;
|
uint64_t part_size;
|
||||||
FIL fp_boot0;
|
FIL fp_boot0;
|
||||||
DWORD clmt_boot0[0x400];
|
DWORD clmt_boot0[EMUMMC_FP_CLMT_COUNT];
|
||||||
FIL fp_boot1;
|
FIL fp_boot1;
|
||||||
DWORD clmt_boot1[0x400];
|
DWORD clmt_boot1[EMUMMC_FP_CLMT_COUNT];
|
||||||
FIL fp_gpp[32];
|
FIL fp_gpp[EMUMMC_FILE_MAX_PARTS];
|
||||||
DWORD clmt_gpp[0x8000];
|
DWORD clmt_gpp[EMUMMC_FILE_MAX_PARTS * EMUMMC_FP_CLMT_COUNT];
|
||||||
|
uint64_t total_sect;
|
||||||
} file_based_ctxt;
|
} file_based_ctxt;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
%rename link old_link
|
%rename link old_link
|
||||||
|
|
||||||
*link:
|
*link:
|
||||||
%(old_link) -T %:getenv(TOPDIR /loader_stub.ld) --gc-sections --nmagic -nostdlib -nostartfiles
|
%(old_link) -T %:getenv(TOPDIR /loader_stub.ld) --gc-sections --nmagic
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
@@ -20,13 +20,13 @@
|
|||||||
|
|
||||||
namespace ams::secmon::loader {
|
namespace ams::secmon::loader {
|
||||||
|
|
||||||
NORETURN void UncompressAndExecute() {
|
NORETURN void UncompressAndExecute(const void *program, const void *boot_code) {
|
||||||
/* Uncompress the program image. */
|
/* Uncompress the program image. */
|
||||||
Uncompress(secmon::MemoryRegionPhysicalTzramFullProgramImage.GetPointer(), secmon::MemoryRegionPhysicalTzramFullProgramImage.GetSize(), program_lz4, program_lz4_size);
|
Uncompress(secmon::MemoryRegionPhysicalTzramFullProgramImage.GetPointer(), secmon::MemoryRegionPhysicalTzramFullProgramImage.GetSize(), program, program_lz4_size);
|
||||||
|
|
||||||
/* Copy the boot image to the end of IRAM */
|
/* Copy the boot image to the end of IRAM */
|
||||||
u8 *relocated_boot_code = secmon::MemoryRegionPhysicalIramBootCodeImage.GetEndPointer<u8>() - boot_code_lz4_size;
|
u8 *relocated_boot_code = secmon::MemoryRegionPhysicalIramBootCodeImage.GetEndPointer<u8>() - boot_code_lz4_size;
|
||||||
std::memcpy(relocated_boot_code, boot_code_lz4, boot_code_lz4_size);
|
std::memcpy(relocated_boot_code, boot_code, boot_code_lz4_size);
|
||||||
|
|
||||||
/* Uncompress the boot image. */
|
/* Uncompress the boot image. */
|
||||||
Uncompress(secmon::MemoryRegionPhysicalIramBootCodeImage.GetPointer(), secmon::MemoryRegionPhysicalIramBootCodeImage.GetSize(), relocated_boot_code, boot_code_lz4_size);
|
Uncompress(secmon::MemoryRegionPhysicalIramBootCodeImage.GetPointer(), secmon::MemoryRegionPhysicalIramBootCodeImage.GetSize(), relocated_boot_code, boot_code_lz4_size);
|
||||||
|
|||||||
@@ -98,8 +98,8 @@ _start:
|
|||||||
ldr x20, =0x7C020000
|
ldr x20, =0x7C020000
|
||||||
mov sp, x20
|
mov sp, x20
|
||||||
|
|
||||||
/* Call our init array functions. */
|
adr x0, program_lz4
|
||||||
bl __libc_init_array
|
adr x1, boot_code_lz4
|
||||||
|
|
||||||
/* Uncompress the program and iram boot code images. */
|
/* Uncompress the program and iram boot code images. */
|
||||||
b _ZN3ams6secmon6loader20UncompressAndExecuteEv
|
b _ZN3ams6secmon6loader20UncompressAndExecuteEPKvS3_
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
%rename link old_link
|
%rename link old_link
|
||||||
|
|
||||||
*link:
|
*link:
|
||||||
%(old_link) -T %:getenv(TOPDIR /mariko_fatal.ld) --gc-sections --nmagic -nostdlib -nostartfiles
|
%(old_link) -T %:getenv(TOPDIR /mariko_fatal.ld) --gc-sections --nmagic
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
@@ -23,6 +23,7 @@ namespace ams::secmon::fatal {
|
|||||||
constexpr inline size_t FrameBufferSize = FrameBufferHeight * FrameBufferWidth * sizeof(u32);
|
constexpr inline size_t FrameBufferSize = FrameBufferHeight * FrameBufferWidth * sizeof(u32);
|
||||||
|
|
||||||
void InitializeDisplay();
|
void InitializeDisplay();
|
||||||
|
void ShowDisplay();
|
||||||
void ShowDisplay(const ams::impl::FatalErrorContext *f_ctx, const Result save_result);
|
void ShowDisplay(const ams::impl::FatalErrorContext *f_ctx, const Result save_result);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,13 +104,13 @@ namespace ams::fs {
|
|||||||
|
|
||||||
bool MountSdCard() {
|
bool MountSdCard() {
|
||||||
AMS_ASSERT(!g_is_sd_mounted);
|
AMS_ASSERT(!g_is_sd_mounted);
|
||||||
g_is_sd_mounted = f_mount(std::addressof(g_sd_fs), "", 1) == FR_OK;
|
g_is_sd_mounted = f_mount(std::addressof(g_sd_fs), "sdmc", 1) == FR_OK;
|
||||||
return g_is_sd_mounted;
|
return g_is_sd_mounted;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnmountSdCard() {
|
void UnmountSdCard() {
|
||||||
AMS_ASSERT(g_is_sd_mounted);
|
AMS_ASSERT(g_is_sd_mounted);
|
||||||
f_unmount("");
|
f_unmount("sdmc");
|
||||||
g_is_sd_mounted = false;
|
g_is_sd_mounted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -176,13 +176,11 @@ SECTIONS
|
|||||||
KEEP (*(.warmboot.text.start)) /* Should be first */
|
KEEP (*(.warmboot.text.start)) /* Should be first */
|
||||||
KEEP (*(.warmboot.text*))
|
KEEP (*(.warmboot.text*))
|
||||||
KEEP(secmon_setup_warm.o(.text*))
|
KEEP(secmon_setup_warm.o(.text*))
|
||||||
KEEP(tsec_*.o(.text*))
|
KEEP(*(.text._ZN3ams4tsec4LockEv))
|
||||||
KEEP (*(.warmboot.rodata*))
|
KEEP (*(.warmboot.rodata*))
|
||||||
KEEP(secmon_setup_warm.o(.rodata*))
|
KEEP(secmon_setup_warm.o(.rodata*))
|
||||||
KEEP(tsec_*.o(.rodata*))
|
|
||||||
KEEP (*(.warmboot.data*))
|
KEEP (*(.warmboot.data*))
|
||||||
KEEP(secmon_setup_warm.o(.data*))
|
KEEP(secmon_setup_warm.o(.data*))
|
||||||
KEEP(tsec_*.o(.data*))
|
|
||||||
} >warmboot_text AT>glob
|
} >warmboot_text AT>glob
|
||||||
|
|
||||||
.text ORIGIN(main) + SIZEOF(.vectors) + SIZEOF(.warmboot) :
|
.text ORIGIN(main) + SIZEOF(.vectors) + SIZEOF(.warmboot) :
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
%rename link old_link
|
%rename link old_link
|
||||||
|
|
||||||
*link:
|
*link:
|
||||||
%(old_link) -T %:getenv(TOPDIR /program.ld) --gc-sections --nmagic -nostdlib -nostartfiles
|
%(old_link) -T %:getenv(TOPDIR /program.ld) --gc-sections --nmagic
|
||||||
@@ -1,7 +1,4 @@
|
|||||||
%rename link old_link
|
%rename link old_link
|
||||||
|
|
||||||
*link:
|
*link:
|
||||||
%(old_link) -T %:getenv(TOPDIR /rebootstub.ld) --gc-sections --nmagic -nostdlib -nostartfiles
|
%(old_link) -T %:getenv(TOPDIR /rebootstub.ld) --gc-sections --nmagic
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
@@ -1,7 +1,4 @@
|
|||||||
%rename link old_link
|
%rename link old_link
|
||||||
|
|
||||||
*link:
|
*link:
|
||||||
%(old_link) -T %:getenv(TOPDIR /sc7fw.ld) --gc-sections --nmagic -nostdlib -nostartfiles
|
%(old_link) -T %:getenv(TOPDIR /sc7fw.ld) --gc-sections --nmagic
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
@@ -58,8 +58,8 @@ namespace ams::sc7fw {
|
|||||||
|
|
||||||
void EnterSc7() {
|
void EnterSc7() {
|
||||||
/* Disable read buffering and write buffering in the BPMP cache. */
|
/* Disable read buffering and write buffering in the BPMP cache. */
|
||||||
reg::ReadWrite(AVP_CACHE_ADDRESS(AVP_CACHE_CONFIG), AVP_CACHE_REG_BITS_ENUM(DISABLE_WB, TRUE),
|
reg::ReadWrite(AVP_CACHE_ADDR(AVP_CACHE_CONFIG), AVP_CACHE_REG_BITS_ENUM(CONFIG_DISABLE_WB, TRUE),
|
||||||
AVP_CACHE_REG_BITS_ENUM(DISABLE_RB, TRUE));
|
AVP_CACHE_REG_BITS_ENUM(CONFIG_DISABLE_RB, TRUE));
|
||||||
|
|
||||||
/* Ensure the CPU Rail is turned off. */
|
/* Ensure the CPU Rail is turned off. */
|
||||||
DisableCrail();
|
DisableCrail();
|
||||||
|
|||||||
@@ -85,10 +85,10 @@ _ZN3ams6secmon4boot15VolatileKeyDataE:
|
|||||||
/* We can get away with only including latest because exosphere supports newer-than-expected master key in engine. */
|
/* We can get away with only including latest because exosphere supports newer-than-expected master key in engine. */
|
||||||
/* TODO: Update on next change of keys. */
|
/* TODO: Update on next change of keys. */
|
||||||
/* Mariko Development Master Kek Source. */
|
/* Mariko Development Master Kek Source. */
|
||||||
.byte 0xF9, 0x37, 0xCF, 0x9A, 0xBD, 0x86, 0xBB, 0xA9, 0x9C, 0x9E, 0x03, 0xC4, 0xFC, 0xBC, 0x3B, 0xCE
|
.byte 0x4D, 0x5A, 0xB2, 0xC9, 0xE9, 0xE4, 0x4E, 0xA4, 0xD3, 0xBF, 0x94, 0x12, 0x36, 0x30, 0xD0, 0x7F
|
||||||
|
|
||||||
/* Mariko Production Master Kek Source. */
|
/* Mariko Production Master Kek Source. */
|
||||||
.byte 0x0E, 0x44, 0x0C, 0xED, 0xB4, 0x36, 0xC0, 0x3F, 0xAA, 0x1D, 0xAE, 0xBF, 0x62, 0xB1, 0x09, 0x82
|
.byte 0x52, 0x71, 0x9B, 0xDF, 0xA7, 0x8B, 0x61, 0xD8, 0xD5, 0x85, 0x11, 0xE4, 0x8E, 0x4F, 0x74, 0xC6
|
||||||
|
|
||||||
/* Development Master Key Vectors. */
|
/* Development Master Key Vectors. */
|
||||||
.byte 0x46, 0x22, 0xB4, 0x51, 0x9A, 0x7E, 0xA7, 0x7F, 0x62, 0xA1, 0x1F, 0x8F, 0xC5, 0x3A, 0xDB, 0xFE /* Zeroes encrypted with Master Key 00. */
|
.byte 0x46, 0x22, 0xB4, 0x51, 0x9A, 0x7E, 0xA7, 0x7F, 0x62, 0xA1, 0x1F, 0x8F, 0xC5, 0x3A, 0xDB, 0xFE /* Zeroes encrypted with Master Key 00. */
|
||||||
@@ -102,6 +102,8 @@ _ZN3ams6secmon4boot15VolatileKeyDataE:
|
|||||||
.byte 0xEC, 0xE1, 0x46, 0x89, 0x37, 0xFD, 0xD2, 0x15, 0x8C, 0x3F, 0x24, 0x82, 0xEF, 0x49, 0x68, 0x04 /* Master key 07 encrypted with Master key 08. */
|
.byte 0xEC, 0xE1, 0x46, 0x89, 0x37, 0xFD, 0xD2, 0x15, 0x8C, 0x3F, 0x24, 0x82, 0xEF, 0x49, 0x68, 0x04 /* Master key 07 encrypted with Master key 08. */
|
||||||
.byte 0x43, 0x3D, 0xC5, 0x3B, 0xEF, 0x91, 0x02, 0x21, 0x61, 0x54, 0x63, 0x8A, 0x35, 0xE7, 0xCA, 0xEE /* Master key 08 encrypted with Master key 09. */
|
.byte 0x43, 0x3D, 0xC5, 0x3B, 0xEF, 0x91, 0x02, 0x21, 0x61, 0x54, 0x63, 0x8A, 0x35, 0xE7, 0xCA, 0xEE /* Master key 08 encrypted with Master key 09. */
|
||||||
.byte 0x6C, 0x2E, 0xCD, 0xB3, 0x34, 0x61, 0x77, 0xF5, 0xF9, 0xB1, 0xDD, 0x61, 0x98, 0x19, 0x3E, 0xD4 /* Master key 09 encrypted with Master key 0A. */
|
.byte 0x6C, 0x2E, 0xCD, 0xB3, 0x34, 0x61, 0x77, 0xF5, 0xF9, 0xB1, 0xDD, 0x61, 0x98, 0x19, 0x3E, 0xD4 /* Master key 09 encrypted with Master key 0A. */
|
||||||
|
.byte 0x21, 0x88, 0x6B, 0x10, 0x9E, 0x83, 0xD6, 0x52, 0xAB, 0x08, 0xDB, 0x6D, 0x39, 0xFF, 0x1C, 0x9C /* Master key 0A encrypted with Master key 0B. */
|
||||||
|
.byte 0x8A, 0xCE, 0xC4, 0x7F, 0xBE, 0x08, 0x61, 0x88, 0xD3, 0x73, 0x64, 0x51, 0xE2, 0xB6, 0x53, 0x15 /* Master key 0B encrypted with Master key 0C. */
|
||||||
|
|
||||||
/* Production Master Key Vectors. */
|
/* Production Master Key Vectors. */
|
||||||
.byte 0x0C, 0xF0, 0x59, 0xAC, 0x85, 0xF6, 0x26, 0x65, 0xE1, 0xE9, 0x19, 0x55, 0xE6, 0xF2, 0x67, 0x3D /* Zeroes encrypted with Master Key 00. */
|
.byte 0x0C, 0xF0, 0x59, 0xAC, 0x85, 0xF6, 0x26, 0x65, 0xE1, 0xE9, 0x19, 0x55, 0xE6, 0xF2, 0x67, 0x3D /* Zeroes encrypted with Master Key 00. */
|
||||||
@@ -115,33 +117,41 @@ _ZN3ams6secmon4boot15VolatileKeyDataE:
|
|||||||
.byte 0xEA, 0x60, 0xB3, 0xEA, 0xCE, 0x8F, 0x24, 0x46, 0x7D, 0x33, 0x9C, 0xD1, 0xBC, 0x24, 0x98, 0x29 /* Master key 07 encrypted with Master key 08. */
|
.byte 0xEA, 0x60, 0xB3, 0xEA, 0xCE, 0x8F, 0x24, 0x46, 0x7D, 0x33, 0x9C, 0xD1, 0xBC, 0x24, 0x98, 0x29 /* Master key 07 encrypted with Master key 08. */
|
||||||
.byte 0x4D, 0xD9, 0x98, 0x42, 0x45, 0x0D, 0xB1, 0x3C, 0x52, 0x0C, 0x9A, 0x44, 0xBB, 0xAD, 0xAF, 0x80 /* Master key 08 encrypted with Master key 09. */
|
.byte 0x4D, 0xD9, 0x98, 0x42, 0x45, 0x0D, 0xB1, 0x3C, 0x52, 0x0C, 0x9A, 0x44, 0xBB, 0xAD, 0xAF, 0x80 /* Master key 08 encrypted with Master key 09. */
|
||||||
.byte 0xB8, 0x96, 0x9E, 0x4A, 0x00, 0x0D, 0xD6, 0x28, 0xB3, 0xD1, 0xDB, 0x68, 0x5F, 0xFB, 0xE1, 0x2A /* Master key 09 encrypted with Master key 0A. */
|
.byte 0xB8, 0x96, 0x9E, 0x4A, 0x00, 0x0D, 0xD6, 0x28, 0xB3, 0xD1, 0xDB, 0x68, 0x5F, 0xFB, 0xE1, 0x2A /* Master key 09 encrypted with Master key 0A. */
|
||||||
|
.byte 0xC1, 0x8D, 0x16, 0xBB, 0x2A, 0xE4, 0x1D, 0xD4, 0xC2, 0xC1, 0xB6, 0x40, 0x94, 0x35, 0x63, 0x98 /* Master key 0A encrypted with Master key 0B. */
|
||||||
|
.byte 0xA3, 0x24, 0x65, 0x75, 0xEA, 0xCC, 0x6E, 0x8D, 0xFB, 0x5A, 0x16, 0x50, 0x74, 0xD2, 0x15, 0x06 /* Master key 0B encrypted with Master key 0C. */
|
||||||
|
|
||||||
/* Device Master Key Source Sources. */
|
/* Device Master Key Source Sources. */
|
||||||
.byte 0x8B, 0x4E, 0x1C, 0x22, 0x42, 0x07, 0xC8, 0x73, 0x56, 0x94, 0x08, 0x8B, 0xCC, 0x47, 0x0F, 0x5D /* 4.0.0 Device Master Key Source Source. */
|
.byte 0x8B, 0x4E, 0x1C, 0x22, 0x42, 0x07, 0xC8, 0x73, 0x56, 0x94, 0x08, 0x8B, 0xCC, 0x47, 0x0F, 0x5D /* 4.0.0 Device Master Key Source Source. */
|
||||||
.byte 0x6C, 0xEF, 0xC6, 0x27, 0x8B, 0xEC, 0x8A, 0x91, 0x99, 0xAB, 0x24, 0xAC, 0x4F, 0x1C, 0x8F, 0x1C /* 5.0.0 Device Master Key Source Source. */
|
.byte 0x6C, 0xEF, 0xC6, 0x27, 0x8B, 0xEC, 0x8A, 0x91, 0x99, 0xAB, 0x24, 0xAC, 0x4F, 0x1C, 0x8F, 0x1C /* 5.0.0 Device Master Key Source Source. */
|
||||||
.byte 0x70, 0x08, 0x1B, 0x97, 0x44, 0x64, 0xF8, 0x91, 0x54, 0x9D, 0xC6, 0x84, 0x8F, 0x1A, 0xB2, 0xE4 /* 6.0.0 Device Master Key Source Source. */
|
.byte 0x70, 0x08, 0x1B, 0x97, 0x44, 0x64, 0xF8, 0x91, 0x54, 0x9D, 0xC6, 0x84, 0x8F, 0x1A, 0xB2, 0xE4 /* 6.0.0 Device Master Key Source Source. */
|
||||||
.byte 0x8E, 0x09, 0x1F, 0x7A, 0xBB, 0xCA, 0x6A, 0xFB, 0xB8, 0x9B, 0xD5, 0xC1, 0x25, 0x9C, 0xA9, 0x17 /* 6.2.0 Device Master Key Source Source. */
|
.byte 0x8E, 0x09, 0x1F, 0x7A, 0xBB, 0xCA, 0x6A, 0xFB, 0xB8, 0x9B, 0xD5, 0xC1, 0x25, 0x9C, 0xA9, 0x17 /* 6.2.0 Device Master Key Source Source. */
|
||||||
.byte 0x8F, 0x77, 0x5A, 0x96, 0xB0, 0x94, 0xFD, 0x8D, 0x28, 0xE4, 0x19, 0xC8, 0x16, 0x1C, 0xDB, 0x3D /* 7.0.0 Device Master Key Source Source. */
|
.byte 0x8F, 0x77, 0x5A, 0x96, 0xB0, 0x94, 0xFD, 0x8D, 0x28, 0xE4, 0x19, 0xC8, 0x16, 0x1C, 0xDB, 0x3D /* 7.0.0 Device Master Key Source Source. */
|
||||||
.byte 0x67, 0x62, 0xD4, 0x8E, 0x55, 0xCF, 0xFF, 0x41, 0x31, 0x15, 0x3B, 0x24, 0x0C, 0x7C, 0x07, 0xAE /* 8.1.0 Device Master Key Source Source. */
|
.byte 0x67, 0x62, 0xD4, 0x8E, 0x55, 0xCF, 0xFF, 0x41, 0x31, 0x15, 0x3B, 0x24, 0x0C, 0x7C, 0x07, 0xAE /* 8.1.0 Device Master Key Source Source. */
|
||||||
.byte 0x4A, 0xC3, 0x4E, 0x14, 0x8B, 0x96, 0x4A, 0xD5, 0xD4, 0x99, 0x73, 0xC4, 0x45, 0xAB, 0x8B, 0x49 /* 9.0.0 Device Master Key Source Source. */
|
.byte 0x4A, 0xC3, 0x4E, 0x14, 0x8B, 0x96, 0x4A, 0xD5, 0xD4, 0x99, 0x73, 0xC4, 0x45, 0xAB, 0x8B, 0x49 /* 9.0.0 Device Master Key Source Source. */
|
||||||
.byte 0x14, 0xB8, 0x74, 0x12, 0xCB, 0xBD, 0x0B, 0x8F, 0x20, 0xFB, 0x30, 0xDA, 0x27, 0xE4, 0x58, 0x94 /* 9.1.0 Device Master Key Source Source. */
|
.byte 0x14, 0xB8, 0x74, 0x12, 0xCB, 0xBD, 0x0B, 0x8F, 0x20, 0xFB, 0x30, 0xDA, 0x27, 0xE4, 0x58, 0x94 /* 9.1.0 Device Master Key Source Source. */
|
||||||
|
.byte 0xAA, 0xFD, 0xBC, 0xBB, 0x25, 0xC3, 0xA4, 0xEF, 0xE3, 0xEE, 0x58, 0x53, 0xB7, 0xF8, 0xDD, 0xD6 /* 12.1.0 Device Master Key Source Source. */
|
||||||
|
.byte 0xE4, 0xF3, 0x45, 0x6F, 0x18, 0xA1, 0x89, 0xF8, 0xDA, 0x4C, 0x64, 0x75, 0x68, 0xE6, 0xBD, 0x4F /* 13.0.0 Device Master Key Source Source. */
|
||||||
|
|
||||||
/* Development Device Master Kek Sources. */
|
/* Development Device Master Kek Sources. */
|
||||||
.byte 0xD6, 0xBD, 0x9F, 0xC6, 0x18, 0x09, 0xE1, 0x96, 0x20, 0x39, 0x60, 0xD2, 0x89, 0x83, 0x31, 0x34 /* 4.0.0 Device Master Kek Source. */
|
.byte 0xD6, 0xBD, 0x9F, 0xC6, 0x18, 0x09, 0xE1, 0x96, 0x20, 0x39, 0x60, 0xD2, 0x89, 0x83, 0x31, 0x34 /* 4.0.0 Device Master Kek Source. */
|
||||||
.byte 0x59, 0x2D, 0x20, 0x69, 0x33, 0xB5, 0x17, 0xBA, 0xCF, 0xB1, 0x4E, 0xFD, 0xE4, 0xC2, 0x7B, 0xA8 /* 5.0.0 Device Master Kek Source. */
|
.byte 0x59, 0x2D, 0x20, 0x69, 0x33, 0xB5, 0x17, 0xBA, 0xCF, 0xB1, 0x4E, 0xFD, 0xE4, 0xC2, 0x7B, 0xA8 /* 5.0.0 Device Master Kek Source. */
|
||||||
.byte 0xF6, 0xD8, 0x59, 0x63, 0x8F, 0x47, 0xCB, 0x4A, 0xD8, 0x74, 0x05, 0x7F, 0x88, 0x92, 0x33, 0xA5 /* 6.0.0 Device Master Kek Source. */
|
.byte 0xF6, 0xD8, 0x59, 0x63, 0x8F, 0x47, 0xCB, 0x4A, 0xD8, 0x74, 0x05, 0x7F, 0x88, 0x92, 0x33, 0xA5 /* 6.0.0 Device Master Kek Source. */
|
||||||
.byte 0x20, 0xAB, 0xF2, 0x0F, 0x05, 0xE3, 0xDE, 0x2E, 0xA1, 0xFB, 0x37, 0x5E, 0x8B, 0x22, 0x1A, 0x38 /* 6.2.0 Device Master Kek Source. */
|
.byte 0x20, 0xAB, 0xF2, 0x0F, 0x05, 0xE3, 0xDE, 0x2E, 0xA1, 0xFB, 0x37, 0x5E, 0x8B, 0x22, 0x1A, 0x38 /* 6.2.0 Device Master Kek Source. */
|
||||||
.byte 0x60, 0xAE, 0x56, 0x68, 0x11, 0xE2, 0x0C, 0x99, 0xDE, 0x05, 0xAE, 0x68, 0x78, 0x85, 0x04, 0xAE /* 7.0.0 Device Master Kek Source. */
|
.byte 0x60, 0xAE, 0x56, 0x68, 0x11, 0xE2, 0x0C, 0x99, 0xDE, 0x05, 0xAE, 0x68, 0x78, 0x85, 0x04, 0xAE /* 7.0.0 Device Master Kek Source. */
|
||||||
.byte 0x94, 0xD6, 0xA8, 0xC0, 0x95, 0xAF, 0xD0, 0xA6, 0x27, 0x53, 0x5E, 0xE5, 0x8E, 0x70, 0x1F, 0x87 /* 8.1.0 Device Master Kek Source. */
|
.byte 0x94, 0xD6, 0xA8, 0xC0, 0x95, 0xAF, 0xD0, 0xA6, 0x27, 0x53, 0x5E, 0xE5, 0x8E, 0x70, 0x1F, 0x87 /* 8.1.0 Device Master Kek Source. */
|
||||||
.byte 0x61, 0x6A, 0x88, 0x21, 0xA3, 0x52, 0xB0, 0x19, 0x16, 0x25, 0xA4, 0xE3, 0x4C, 0x54, 0x02, 0x0F /* 9.0.0 Device Master Kek Source. */
|
.byte 0x61, 0x6A, 0x88, 0x21, 0xA3, 0x52, 0xB0, 0x19, 0x16, 0x25, 0xA4, 0xE3, 0x4C, 0x54, 0x02, 0x0F /* 9.0.0 Device Master Kek Source. */
|
||||||
.byte 0x9D, 0xB1, 0xAE, 0xCB, 0xF6, 0xF6, 0xE3, 0xFE, 0xAB, 0x6F, 0xCB, 0xAF, 0x38, 0x03, 0xFC, 0x7B /* 9.1.0 Device Master Kek Source. */
|
.byte 0x9D, 0xB1, 0xAE, 0xCB, 0xF6, 0xF6, 0xE3, 0xFE, 0xAB, 0x6F, 0xCB, 0xAF, 0x38, 0x03, 0xFC, 0x7B /* 9.1.0 Device Master Kek Source. */
|
||||||
|
.byte 0xC4, 0xBB, 0xF3, 0x9F, 0xA3, 0xAA, 0x00, 0x99, 0x7C, 0x97, 0xAD, 0x91, 0x8F, 0xE8, 0x45, 0xCB /* 12.1.0 Device Master Kek Source. */
|
||||||
|
.byte 0x20, 0x20, 0xAA, 0xFB, 0x89, 0xC2, 0xF0, 0x70, 0xB5, 0xE0, 0xA3, 0x11, 0x8A, 0x29, 0x8D, 0x0F /* 13.0.0 Device Master Kek Source. */
|
||||||
|
|
||||||
/* Production Device Master Kek Sources. */
|
/* Production Device Master Kek Sources. */
|
||||||
.byte 0x88, 0x62, 0x34, 0x6E, 0xFA, 0xF7, 0xD8, 0x3F, 0xE1, 0x30, 0x39, 0x50, 0xF0, 0xB7, 0x5D, 0x5D /* 4.0.0 Device Master Kek Source. */
|
.byte 0x88, 0x62, 0x34, 0x6E, 0xFA, 0xF7, 0xD8, 0x3F, 0xE1, 0x30, 0x39, 0x50, 0xF0, 0xB7, 0x5D, 0x5D /* 4.0.0 Device Master Kek Source. */
|
||||||
.byte 0x06, 0x1E, 0x7B, 0xE9, 0x6D, 0x47, 0x8C, 0x77, 0xC5, 0xC8, 0xE7, 0x94, 0x9A, 0xA8, 0x5F, 0x2E /* 5.0.0 Device Master Kek Source. */
|
.byte 0x06, 0x1E, 0x7B, 0xE9, 0x6D, 0x47, 0x8C, 0x77, 0xC5, 0xC8, 0xE7, 0x94, 0x9A, 0xA8, 0x5F, 0x2E /* 5.0.0 Device Master Kek Source. */
|
||||||
.byte 0x99, 0xFA, 0x98, 0xBD, 0x15, 0x1C, 0x72, 0xFD, 0x7D, 0x9A, 0xD5, 0x41, 0x00, 0xFD, 0xB2, 0xEF /* 6.0.0 Device Master Kek Source. */
|
.byte 0x99, 0xFA, 0x98, 0xBD, 0x15, 0x1C, 0x72, 0xFD, 0x7D, 0x9A, 0xD5, 0x41, 0x00, 0xFD, 0xB2, 0xEF /* 6.0.0 Device Master Kek Source. */
|
||||||
.byte 0x81, 0x3C, 0x6C, 0xBF, 0x5D, 0x21, 0xDE, 0x77, 0x20, 0xD9, 0x6C, 0xE3, 0x22, 0x06, 0xAE, 0xBB /* 6.2.0 Device Master Kek Source. */
|
.byte 0x81, 0x3C, 0x6C, 0xBF, 0x5D, 0x21, 0xDE, 0x77, 0x20, 0xD9, 0x6C, 0xE3, 0x22, 0x06, 0xAE, 0xBB /* 6.2.0 Device Master Kek Source. */
|
||||||
.byte 0x86, 0x61, 0xB0, 0x16, 0xFA, 0x7A, 0x9A, 0xEA, 0xF6, 0xF5, 0xBE, 0x1A, 0x13, 0x5B, 0x6D, 0x9E /* 7.0.0 Device Master Kek Source. */
|
.byte 0x86, 0x61, 0xB0, 0x16, 0xFA, 0x7A, 0x9A, 0xEA, 0xF6, 0xF5, 0xBE, 0x1A, 0x13, 0x5B, 0x6D, 0x9E /* 7.0.0 Device Master Kek Source. */
|
||||||
.byte 0xA6, 0x81, 0x71, 0xE7, 0xB5, 0x23, 0x74, 0xB0, 0x39, 0x8C, 0xB7, 0xFF, 0xA0, 0x62, 0x9F, 0x8D /* 8.1.0 Device Master Kek Source. */
|
.byte 0xA6, 0x81, 0x71, 0xE7, 0xB5, 0x23, 0x74, 0xB0, 0x39, 0x8C, 0xB7, 0xFF, 0xA0, 0x62, 0x9F, 0x8D /* 8.1.0 Device Master Kek Source. */
|
||||||
.byte 0x03, 0xE7, 0xEB, 0x43, 0x1B, 0xCF, 0x5F, 0xB5, 0xED, 0xDC, 0x97, 0xAE, 0x21, 0x8D, 0x19, 0xED /* 9.0.0 Device Master Kek Source. */
|
.byte 0x03, 0xE7, 0xEB, 0x43, 0x1B, 0xCF, 0x5F, 0xB5, 0xED, 0xDC, 0x97, 0xAE, 0x21, 0x8D, 0x19, 0xED /* 9.0.0 Device Master Kek Source. */
|
||||||
.byte 0xCE, 0xFE, 0x41, 0x0F, 0x46, 0x9A, 0x30, 0xD6, 0xF2, 0xE9, 0x0C, 0x6B, 0xB7, 0x15, 0x91, 0x36 /* 9.1.0 Device Master Kek Source. */
|
.byte 0xCE, 0xFE, 0x41, 0x0F, 0x46, 0x9A, 0x30, 0xD6, 0xF2, 0xE9, 0x0C, 0x6B, 0xB7, 0x15, 0x91, 0x36 /* 9.1.0 Device Master Kek Source. */
|
||||||
|
.byte 0xC2, 0x65, 0x34, 0x6E, 0xC7, 0xC6, 0x5D, 0x97, 0x3E, 0x34, 0x5C, 0x6B, 0xB3, 0x7E, 0xC6, 0xE3 /* 12.1.0 Device Master Kek Source. */
|
||||||
|
.byte 0x77, 0x52, 0x92, 0xF0, 0xAA, 0xE3, 0xFB, 0xE0, 0x60, 0x16, 0xB3, 0x78, 0x68, 0x53, 0xF7, 0xA8 /* 13.0.0 Device Master Kek Source. */
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ namespace ams::secmon {
|
|||||||
|
|
||||||
/* Alert the bootloader that we're initialized. */
|
/* Alert the bootloader that we're initialized. */
|
||||||
secmon_params.secmon_state = pkg1::SecureMonitorState_Initialized;
|
secmon_params.secmon_state = pkg1::SecureMonitorState_Initialized;
|
||||||
|
hw::FlushDataCache(std::addressof(secmon_params.secmon_state), sizeof(secmon_params.secmon_state));
|
||||||
|
hw::DataSynchronizationBarrierInnerShareable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for NX Bootloader to finish loading the BootConfig. */
|
/* Wait for NX Bootloader to finish loading the BootConfig. */
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ namespace ams::secmon::boot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check that the key generation is one that we can use. */
|
/* Check that the key generation is one that we can use. */
|
||||||
static_assert(pkg1::KeyGeneration_Count == 11);
|
static_assert(pkg1::KeyGeneration_Count == 13);
|
||||||
if (key_generation >= pkg1::KeyGeneration_Count) {
|
if (key_generation >= pkg1::KeyGeneration_Count) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -154,8 +154,11 @@ namespace ams::secmon::boot {
|
|||||||
bool VerifyPackage2Payloads(const pkg2::Package2Meta &meta, uintptr_t payload_address) {
|
bool VerifyPackage2Payloads(const pkg2::Package2Meta &meta, uintptr_t payload_address) {
|
||||||
/* Verify hashes match for all payloads. */
|
/* Verify hashes match for all payloads. */
|
||||||
for (int i = 0; i < pkg2::PayloadCount; ++i) {
|
for (int i = 0; i < pkg2::PayloadCount; ++i) {
|
||||||
if (!VerifyHash(meta.payload_hashes[i], payload_address, meta.payload_sizes[i])) {
|
/* Allow all-zero bytes to match any payload. */
|
||||||
return false;
|
if (!(meta.payload_hashes[i][0] == 0 && std::memcmp(meta.payload_hashes[i] + 0, meta.payload_hashes[i] + 1, sizeof(meta.payload_hashes[i]) - 1) == 0)) {
|
||||||
|
if (!VerifyHash(meta.payload_hashes[i], payload_address, meta.payload_sizes[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
payload_address += meta.payload_sizes[i];
|
payload_address += meta.payload_sizes[i];
|
||||||
|
|||||||
@@ -475,8 +475,8 @@ namespace ams::secmon {
|
|||||||
|
|
||||||
/* Lock cluster switching, to prevent usage of the A53 cores. */
|
/* Lock cluster switching, to prevent usage of the A53 cores. */
|
||||||
reg::Write(FLOW_CTLR + FLOW_CTLR_BPMP_CLUSTER_CONTROL, FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_ACTIVE_CLUSTER_LOCK, ENABLE),
|
reg::Write(FLOW_CTLR + FLOW_CTLR_BPMP_CLUSTER_CONTROL, FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_ACTIVE_CLUSTER_LOCK, ENABLE),
|
||||||
FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_CLUSTER_SWITCH_ENABLE, DISABLE),
|
FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_CLUSTER_SWITCH_ENABLE, DISABLE),
|
||||||
FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_ACTIVE_CLUSTER, FAST));
|
FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_ACTIVE_CLUSTER, FAST));
|
||||||
|
|
||||||
/* Enable flow controller debug qualifier for legacy FIQs. */
|
/* Enable flow controller debug qualifier for legacy FIQs. */
|
||||||
reg::Write(FLOW_CTLR + FLOW_CTLR_FLOW_DBG_QUAL, FLOW_REG_BITS_ENUM(FLOW_DBG_QUAL_FIQ2CCPLEX_ENABLE, ENABLE));
|
reg::Write(FLOW_CTLR + FLOW_CTLR_FLOW_DBG_QUAL, FLOW_REG_BITS_ENUM(FLOW_DBG_QUAL_FIQ2CCPLEX_ENABLE, ENABLE));
|
||||||
@@ -600,8 +600,8 @@ namespace ams::secmon {
|
|||||||
g_kernel_carveouts[0].size = 200 * 128_KB;
|
g_kernel_carveouts[0].size = 200 * 128_KB;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Configure the two kernel carveouts. */
|
/* NOTE: Here Nintendo configures the two kernel carveouts; we will do this later, to allow fusee to continue using AVP_CACHE. */
|
||||||
SetupKernelCarveouts();
|
/* SetupKernelCarveouts(); */
|
||||||
|
|
||||||
/* Configure slave register security. */
|
/* Configure slave register security. */
|
||||||
ConfigureSlaveSecurity();
|
ConfigureSlaveSecurity();
|
||||||
@@ -833,7 +833,7 @@ namespace ams::secmon {
|
|||||||
#define MC_ENABLE_CLIENT_ACCESS(INDEX, WHICH) MC_REG_BITS_ENUM(CLIENT_ACCESS##INDEX##_##WHICH, ENABLE)
|
#define MC_ENABLE_CLIENT_ACCESS(INDEX, WHICH) MC_REG_BITS_ENUM(CLIENT_ACCESS##INDEX##_##WHICH, ENABLE)
|
||||||
|
|
||||||
constexpr u32 WarmbootCarveoutClientAccess0 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(0, AVPCARM7R),
|
constexpr u32 WarmbootCarveoutClientAccess0 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(0, AVPCARM7R),
|
||||||
MC_ENABLE_CLIENT_ACCESS(0, PPCSAHBSLVR));
|
MC_ENABLE_CLIENT_ACCESS(0, PPCSAHBSLVR));
|
||||||
|
|
||||||
constexpr u32 WarmbootCarveoutClientAccess1 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(1, AVPCARM7W));
|
constexpr u32 WarmbootCarveoutClientAccess1 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(1, AVPCARM7W));
|
||||||
|
|
||||||
@@ -1164,6 +1164,9 @@ namespace ams::secmon {
|
|||||||
/* Setup the GPU carveout. */
|
/* Setup the GPU carveout. */
|
||||||
SetupGpuCarveout();
|
SetupGpuCarveout();
|
||||||
|
|
||||||
|
/* Configure the two kernel carveouts. */
|
||||||
|
SetupKernelCarveouts();
|
||||||
|
|
||||||
/* Disable the ARC. */
|
/* Disable the ARC. */
|
||||||
DisableArc();
|
DisableArc();
|
||||||
|
|
||||||
|
|||||||
@@ -272,7 +272,19 @@ namespace ams::secmon::smc {
|
|||||||
|
|
||||||
void GetSecureDataImpl(u8 *dst, SecureData which, bool tweak) {
|
void GetSecureDataImpl(u8 *dst, SecureData which, bool tweak) {
|
||||||
/* Compute the appropriate AES-CTR. */
|
/* Compute the appropriate AES-CTR. */
|
||||||
se::ComputeAes128Ctr(dst, AesKeySize, pkg1::AesKeySlot_Device, SecureDataSource, AesKeySize, GetSecureDataCounter(which), AesKeySize);
|
{
|
||||||
|
/* Ensure that the SE sees consistent data. */
|
||||||
|
hw::FlushDataCache(dst, AesKeySize);
|
||||||
|
hw::DataSynchronizationBarrierInnerShareable();
|
||||||
|
|
||||||
|
/* Perform the appropriate AES operation. */
|
||||||
|
se::ComputeAes128Ctr(dst, AesKeySize, pkg1::AesKeySlot_Device, SecureDataSource, AesKeySize, GetSecureDataCounter(which), AesKeySize);
|
||||||
|
hw::DataSynchronizationBarrierInnerShareable();
|
||||||
|
|
||||||
|
/* Ensure the CPU sees consistent data. */
|
||||||
|
hw::FlushDataCache(dst, AesKeySize);
|
||||||
|
hw::DataSynchronizationBarrierInnerShareable();
|
||||||
|
}
|
||||||
|
|
||||||
/* Tweak, if we should. */
|
/* Tweak, if we should. */
|
||||||
if (tweak) {
|
if (tweak) {
|
||||||
|
|||||||
@@ -33,24 +33,25 @@ namespace ams::secmon::smc {
|
|||||||
using PhysicalMemorySize = util::BitPack32::Field<16, 2>;
|
using PhysicalMemorySize = util::BitPack32::Field<16, 2>;
|
||||||
|
|
||||||
/* Kernel view, from libmesosphere. */
|
/* Kernel view, from libmesosphere. */
|
||||||
using DebugFillMemory = util::BitPack32::Field<0, 1, bool>;
|
using DebugFillMemory = util::BitPack32::Field<0, 1, bool>;
|
||||||
using EnableUserExceptionHandlers = util::BitPack32::Field<DebugFillMemory::Next, 1, bool>;
|
using EnableUserExceptionHandlers = util::BitPack32::Field<DebugFillMemory::Next, 1, bool>;
|
||||||
using EnableUserPmuAccess = util::BitPack32::Field<EnableUserExceptionHandlers::Next, 1, bool>;
|
using EnableUserPmuAccess = util::BitPack32::Field<EnableUserExceptionHandlers::Next, 1, bool>;
|
||||||
using IncreaseThreadResourceLimit = util::BitPack32::Field<EnableUserPmuAccess::Next, 1, bool>;
|
using IncreaseThreadResourceLimit = util::BitPack32::Field<EnableUserPmuAccess::Next, 1, bool>;
|
||||||
using Reserved4 = util::BitPack32::Field<IncreaseThreadResourceLimit::Next, 4, u32>;
|
using DisableDynamicResourceLimits = util::BitPack32::Field<IncreaseThreadResourceLimit::Next, 1, bool>;
|
||||||
using UseSecureMonitorPanicCall = util::BitPack32::Field<Reserved4::Next, 1, bool>;
|
using Reserved5 = util::BitPack32::Field<DisableDynamicResourceLimits::Next, 3, u32>;
|
||||||
using Reserved9 = util::BitPack32::Field<UseSecureMonitorPanicCall::Next, 7, u32>;
|
using UseSecureMonitorPanicCall = util::BitPack32::Field<Reserved5::Next, 1, bool>;
|
||||||
using MemorySize = util::BitPack32::Field<Reserved9::Next, 2, u32>; /* smc::MemorySize = pkg1::MemorySize */
|
using Reserved9 = util::BitPack32::Field<UseSecureMonitorPanicCall::Next, 7, u32>;
|
||||||
|
using MemorySize = util::BitPack32::Field<Reserved9::Next, 2, u32>; /* smc::MemorySize = pkg1::MemorySize */
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr const pkg1::MemorySize DramIdToMemorySize[fuse::DramId_Count] = {
|
constexpr const pkg1::MemorySize DramIdToMemorySize[fuse::DramId_Count] = {
|
||||||
[fuse::DramId_IcosaSamsung4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IcosaSamsung4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IcosaHynix4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IcosaHynix4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IcosaMicron4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IcosaMicron4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_AulaHynix1y4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IowaHynix1y4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IcosaSamsung6GB] = pkg1::MemorySize_6GB,
|
[fuse::DramId_IcosaSamsung6GB] = pkg1::MemorySize_6GB,
|
||||||
[fuse::DramId_CopperHynix4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_HoagHynix1y4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_CopperMicron4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_AulaHynix1y4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IowaX1X2Samsung4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IowaX1X2Samsung4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IowaSansung4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IowaSansung4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IowaSamsung8GB] = pkg1::MemorySize_8GB,
|
[fuse::DramId_IowaSamsung8GB] = pkg1::MemorySize_8GB,
|
||||||
@@ -243,7 +244,7 @@ namespace ams::secmon::smc {
|
|||||||
(static_cast<u64>(ATMOSPHERE_RELEASE_VERSION_MINOR & 0xFF) << 48) |
|
(static_cast<u64>(ATMOSPHERE_RELEASE_VERSION_MINOR & 0xFF) << 48) |
|
||||||
(static_cast<u64>(ATMOSPHERE_RELEASE_VERSION_MICRO & 0xFF) << 40) |
|
(static_cast<u64>(ATMOSPHERE_RELEASE_VERSION_MICRO & 0xFF) << 40) |
|
||||||
(static_cast<u64>(GetKeyGeneration()) << 32) |
|
(static_cast<u64>(GetKeyGeneration()) << 32) |
|
||||||
(static_cast<u64>(GetTargetFirmware()) << 00);
|
(static_cast<u64>(GetTargetFirmware()) << 0);
|
||||||
break;
|
break;
|
||||||
case ConfigItem::ExosphereNeedsReboot:
|
case ConfigItem::ExosphereNeedsReboot:
|
||||||
/* We are executing, so we aren't in the process of rebooting. */
|
/* We are executing, so we aren't in the process of rebooting. */
|
||||||
@@ -286,6 +287,16 @@ namespace ams::secmon::smc {
|
|||||||
/* Get the log configuration. */
|
/* Get the log configuration. */
|
||||||
args.r[1] = (static_cast<u64>(static_cast<u8>(secmon::GetLogPort())) << 32) | static_cast<u64>(secmon::GetLogBaudRate());
|
args.r[1] = (static_cast<u64>(static_cast<u8>(secmon::GetLogPort())) << 32) | static_cast<u64>(secmon::GetLogBaudRate());
|
||||||
break;
|
break;
|
||||||
|
case ConfigItem::ExosphereForceEnableUsb30:
|
||||||
|
/* Get whether usb 3.0 should be force-enabled. */
|
||||||
|
args.r[1] = GetSecmonConfiguration().IsUsb30ForceEnabled();
|
||||||
|
break;
|
||||||
|
case ConfigItem::ExosphereSupportedHosVersion:
|
||||||
|
/* Get information about the supported hos version. */
|
||||||
|
args.r[1] = (static_cast<u64>(ATMOSPHERE_SUPPORTED_HOS_VERSION_MAJOR & 0xFF) << 24) |
|
||||||
|
(static_cast<u64>(ATMOSPHERE_SUPPORTED_HOS_VERSION_MINOR & 0xFF) << 16) |
|
||||||
|
(static_cast<u64>(ATMOSPHERE_SUPPORTED_HOS_VERSION_MICRO & 0xFF) << 8);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return SmcResult::InvalidArgument;
|
return SmcResult::InvalidArgument;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,16 +40,18 @@ namespace ams::secmon::smc {
|
|||||||
Package2Hash = 17,
|
Package2Hash = 17,
|
||||||
|
|
||||||
/* Extension config items for exosphere. */
|
/* Extension config items for exosphere. */
|
||||||
ExosphereApiVersion = 65000,
|
ExosphereApiVersion = 65000,
|
||||||
ExosphereNeedsReboot = 65001,
|
ExosphereNeedsReboot = 65001,
|
||||||
ExosphereNeedsShutdown = 65002,
|
ExosphereNeedsShutdown = 65002,
|
||||||
ExosphereGitCommitHash = 65003,
|
ExosphereGitCommitHash = 65003,
|
||||||
ExosphereHasRcmBugPatch = 65004,
|
ExosphereHasRcmBugPatch = 65004,
|
||||||
ExosphereBlankProdInfo = 65005,
|
ExosphereBlankProdInfo = 65005,
|
||||||
ExosphereAllowCalWrites = 65006,
|
ExosphereAllowCalWrites = 65006,
|
||||||
ExosphereEmummcType = 65007,
|
ExosphereEmummcType = 65007,
|
||||||
ExospherePayloadAddress = 65008,
|
ExospherePayloadAddress = 65008,
|
||||||
ExosphereLogConfiguration = 65009,
|
ExosphereLogConfiguration = 65009,
|
||||||
|
ExosphereForceEnableUsb30 = 65010,
|
||||||
|
ExosphereSupportedHosVersion = 65011,
|
||||||
};
|
};
|
||||||
|
|
||||||
SmcResult SmcGetConfigUser(SmcArguments &args);
|
SmcResult SmcGetConfigUser(SmcArguments &args);
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
%rename link old_link
|
%rename link old_link
|
||||||
|
|
||||||
*link:
|
*link:
|
||||||
%(old_link) -T %:getenv(TOPDIR /sdmmc_test.ld) --gc-sections --nmagic -nostdlib -nostartfiles
|
%(old_link) -T %:getenv(TOPDIR /sdmmc_test.ld) --gc-sections --nmagic
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
@@ -36,7 +36,6 @@ namespace ams::warmboot {
|
|||||||
void Main(const Metadata *metadata) {
|
void Main(const Metadata *metadata) {
|
||||||
/* Ensure that we're running under vaguely sane conditions. */
|
/* Ensure that we're running under vaguely sane conditions. */
|
||||||
AMS_ABORT_UNLESS(metadata->magic == Metadata::Magic);
|
AMS_ABORT_UNLESS(metadata->magic == Metadata::Magic);
|
||||||
AMS_ABORT_UNLESS(metadata->target_firmware <= ams::TargetFirmware_Max);
|
|
||||||
|
|
||||||
/* Restrict the bpmp's access to dram. */
|
/* Restrict the bpmp's access to dram. */
|
||||||
if (metadata->target_firmware >= TargetFirmware_4_0_0) {
|
if (metadata->target_firmware >= TargetFirmware_4_0_0) {
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
%rename link old_link
|
%rename link old_link
|
||||||
|
|
||||||
*link:
|
*link:
|
||||||
%(old_link) -T %:getenv(TOPDIR /warmboot.ld) --gc-sections --nmagic -nostdlib -nostartfiles
|
%(old_link) -T %:getenv(TOPDIR /warmboot.ld) --gc-sections --nmagic
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
@@ -1,10 +1,44 @@
|
|||||||
SUBFOLDERS := fusee-primary fusee-mtc fusee-secondary
|
ATMOSPHERE_BUILD_CONFIGS :=
|
||||||
|
all: release
|
||||||
|
|
||||||
TOPTARGETS := all clean
|
define ATMOSPHERE_ADD_TARGET
|
||||||
|
|
||||||
$(TOPTARGETS): $(SUBFOLDERS)
|
ATMOSPHERE_BUILD_CONFIGS += $(strip $1)
|
||||||
|
|
||||||
$(SUBFOLDERS):
|
$(strip $1): fusee$(strip $2).bin
|
||||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
|
||||||
|
|
||||||
.PHONY: $(TOPTARGETS) $(SUBFOLDERS)
|
fusee$(strip $2).bin: loader_stub/loader_stub$(strip $2).bin
|
||||||
|
@cp loader_stub/loader_stub$(strip $2).bin fusee$(strip $2).bin
|
||||||
|
@echo "Built fusee$(strip $2).bin..."
|
||||||
|
|
||||||
|
check_program_$(strip $1):
|
||||||
|
@$$(MAKE) -C program $(strip $1)
|
||||||
|
|
||||||
|
loader_stub/loader_stub$(strip $2).bin: check_program_$(strip $1)
|
||||||
|
@$$(MAKE) -C loader_stub $(strip $1)
|
||||||
|
|
||||||
|
clean-$(strip $1): clean-program-$(strip $1) clean-loader_stub-$(strip $1)
|
||||||
|
@rm -rf fusee$(strip $2).bin
|
||||||
|
|
||||||
|
clean-program-$(strip $1):
|
||||||
|
@$$(MAKE) -C program clean-$(strip $1)
|
||||||
|
|
||||||
|
clean-loader_stub-$(strip $1):
|
||||||
|
@$$(MAKE) -C loader_stub clean-$(strip $1)
|
||||||
|
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call ATMOSPHERE_ADD_TARGET, release, ))
|
||||||
|
$(eval $(call ATMOSPHERE_ADD_TARGET, debug, _debug))
|
||||||
|
$(eval $(call ATMOSPHERE_ADD_TARGET, audit, _audit))
|
||||||
|
|
||||||
|
clean: clean-program clean-loader_stub
|
||||||
|
@rm -rf fusee*.bin package3*
|
||||||
|
|
||||||
|
clean-program:
|
||||||
|
@$(MAKE) -C program clean
|
||||||
|
|
||||||
|
clean-loader_stub:
|
||||||
|
@$(MAKE) -C loader_stub clean
|
||||||
|
|
||||||
|
.PHONY: all clean clean-program clean-loader_stub $(foreach config,$(ATMOSPHERE_BUILD_CONFIGS),check_program_$(config) check_warmboot_$(strip $1) clean-$(config) clean-program-$(config) clean-loader_stub-$(config) clean-warmboot-$(config))
|
||||||
|
|||||||
201
fusee/build_package3.py
Normal file
201
fusee/build_package3.py
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
import sys, lz4, hashlib, os
|
||||||
|
from struct import unpack as up, pack as pk
|
||||||
|
|
||||||
|
def lz4_compress(data):
|
||||||
|
try:
|
||||||
|
import lz4.block as block
|
||||||
|
except ImportError:
|
||||||
|
block = lz4.LZ4_compress
|
||||||
|
return block.compress(data, 'high_compression', store_size=False)
|
||||||
|
|
||||||
|
def read_file(fn):
|
||||||
|
with open(fn, 'rb') as f:
|
||||||
|
return f.read()
|
||||||
|
|
||||||
|
def pad(data, size):
|
||||||
|
assert len(data) <= size
|
||||||
|
return (data + b'\x00' * size)[:size]
|
||||||
|
|
||||||
|
def get_overlay(program, i):
|
||||||
|
return program[0x2B000 + 0x14000 * i:0x2B000 + 0x14000 * (i+1)]
|
||||||
|
|
||||||
|
KIP_NAMES = [b'Loader', b'NCM', b'ProcessManager', b'sm', b'boot', b'spl', b'ams_mitm']
|
||||||
|
|
||||||
|
def get_kips(ams_dir):
|
||||||
|
emummc = read_file(os.path.join(ams_dir, 'emummc/emummc_unpacked.kip'))
|
||||||
|
loader = read_file(os.path.join(ams_dir, 'stratosphere/loader/loader.kip'))
|
||||||
|
ncm = read_file(os.path.join(ams_dir, 'stratosphere/ncm/ncm.kip'))
|
||||||
|
pm = read_file(os.path.join(ams_dir, 'stratosphere/pm/pm.kip'))
|
||||||
|
sm = read_file(os.path.join(ams_dir, 'stratosphere/sm/sm.kip'))
|
||||||
|
boot = read_file(os.path.join(ams_dir, 'stratosphere/boot/boot.kip'))
|
||||||
|
spl = read_file(os.path.join(ams_dir, 'stratosphere/spl/spl.kip'))
|
||||||
|
ams_mitm = read_file(os.path.join(ams_dir, 'stratosphere/ams_mitm/ams_mitm.kip'))
|
||||||
|
return (emummc, {
|
||||||
|
b'Loader' : loader,
|
||||||
|
b'NCM' : ncm,
|
||||||
|
b'ProcessManager' : pm,
|
||||||
|
b'sm' : sm,
|
||||||
|
b'boot' : boot,
|
||||||
|
b'spl' : spl,
|
||||||
|
b'ams_mitm' : ams_mitm,
|
||||||
|
})
|
||||||
|
|
||||||
|
def write_kip_meta(f, kip, ofs):
|
||||||
|
# Write program id
|
||||||
|
f.write(kip[0x10:0x18])
|
||||||
|
# Write offset, size
|
||||||
|
f.write(pk('<II', ofs - 0x100000, len(kip)))
|
||||||
|
# Write hash
|
||||||
|
f.write(hashlib.sha256(kip).digest())
|
||||||
|
|
||||||
|
def write_header(f, all_kips, wb_size, tk_size, xf_size, ex_size, ms_size, fs_size, rb_size, git_revision, major, minor, micro, relstep, s_major, s_minor, s_micro, s_relstep):
|
||||||
|
# Unpack kips
|
||||||
|
emummc, kips = all_kips
|
||||||
|
# Write magic as PK31 magic.
|
||||||
|
f.write(b'PK31')
|
||||||
|
# Write metadata offset = 0x10
|
||||||
|
f.write(pk('<I', 0x20))
|
||||||
|
# Write flags
|
||||||
|
f.write(pk('<I', 0x00000000))
|
||||||
|
# Write meso_size
|
||||||
|
f.write(pk('<I', ms_size))
|
||||||
|
# Write num_kips
|
||||||
|
f.write(pk('<I', len(KIP_NAMES)))
|
||||||
|
# Write reserved1
|
||||||
|
f.write(b'\xCC' * 0xC)
|
||||||
|
# Write legacy magic
|
||||||
|
f.write(b'FSS0')
|
||||||
|
# Write total size
|
||||||
|
f.write(pk('<I', 0x800000))
|
||||||
|
# Write reserved2
|
||||||
|
f.write(pk('<I', 0xCCCCCCCC))
|
||||||
|
# Write content_header_offset
|
||||||
|
f.write(pk('<I', 0x40))
|
||||||
|
# Write num_content_headers;
|
||||||
|
f.write(pk('<I', 8 + len(KIP_NAMES)))
|
||||||
|
# Write supported_hos_version;
|
||||||
|
f.write(pk('<BBBB', s_relstep, s_micro, s_minor, s_major))
|
||||||
|
# Write release_version;
|
||||||
|
f.write(pk('<BBBB', relstep, micro, minor, major))
|
||||||
|
# Write git_revision;
|
||||||
|
f.write(pk('<I', git_revision))
|
||||||
|
# Write content metas
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x000800, wb_size, 2, 0, 0, 0, 0xCCCCCCCC, b'warmboot'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x002000, tk_size, 12, 0, 0, 0, 0xCCCCCCCC, b'tsec_keygen'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x004000, xf_size, 11, 0, 0, 0, 0xCCCCCCCC, b'exosphere_fatal'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x048000, ex_size, 1, 0, 0, 0, 0xCCCCCCCC, b'exosphere'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x056000, ms_size, 10, 0, 0, 0, 0xCCCCCCCC, b'mesosphere'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x7C0000, fs_size, 0, 0, 0, 0, 0xCCCCCCCC, b'fusee'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x7E0000, rb_size, 3, 0, 0, 0, 0xCCCCCCCC, b'rebootstub'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x100000, len(emummc), 8, 0, 0, 0, 0xCCCCCCCC, b'emummc'))
|
||||||
|
ofs = (0x100000 + len(emummc) + 0xF) & ~0xF
|
||||||
|
for kip_name in KIP_NAMES:
|
||||||
|
kip_data = kips[kip_name]
|
||||||
|
f.write(pk('<IIBBBBI16s', ofs, len(kip_data), 6, 0, 0, 0, 0xCCCCCCCC, kip_name))
|
||||||
|
ofs += len(kip_data)
|
||||||
|
ofs += 0xF
|
||||||
|
ofs &= ~0xF
|
||||||
|
# Pad to kip metas.
|
||||||
|
f.write(b'\xCC' * (0x400 - 0x40 - (0x20 * (8 + len(KIP_NAMES)))))
|
||||||
|
# Write emummc_meta. */
|
||||||
|
write_kip_meta(f, emummc, 0x100000)
|
||||||
|
# Write kip metas
|
||||||
|
ofs = (0x100000 + len(emummc) + 0xF) & ~0xF
|
||||||
|
for kip_name in KIP_NAMES:
|
||||||
|
kip_data = kips[kip_name]
|
||||||
|
write_kip_meta(f, kip_data, ofs)
|
||||||
|
ofs += len(kip_data)
|
||||||
|
ofs += 0xF
|
||||||
|
ofs &= ~0xF
|
||||||
|
# Pad to end of header
|
||||||
|
f.write(b'\xCC' * (0x800 - (0x400 + (1 + len(KIP_NAMES)) * 0x30)))
|
||||||
|
|
||||||
|
def write_kips(f, all_kips):
|
||||||
|
# Unpack kips
|
||||||
|
emummc, kips = all_kips
|
||||||
|
# Write emummc
|
||||||
|
f.write(emummc)
|
||||||
|
# Write kips
|
||||||
|
tot = len(emummc)
|
||||||
|
if (tot & 0xF):
|
||||||
|
f.write(b'\xCC' * (0x10 - (tot & 0xF)))
|
||||||
|
tot += 0xF
|
||||||
|
tot &= ~0xF
|
||||||
|
for kip_name in KIP_NAMES:
|
||||||
|
kip_data = kips[kip_name]
|
||||||
|
f.write(kip_data)
|
||||||
|
tot += len(kip_data)
|
||||||
|
if (tot & 0xF):
|
||||||
|
f.write(b'\xCC' * (0x10 - (tot & 0xF)))
|
||||||
|
tot += 0xF
|
||||||
|
tot &= ~0xF
|
||||||
|
# Pad to 3 MB
|
||||||
|
f.write(b'\xCC' * (0x300000 - tot))
|
||||||
|
|
||||||
|
def main(argc, argv):
|
||||||
|
if argc != 12:
|
||||||
|
print('Usage: %s ams_dir target revision major minor micro relstep s_major s_minor s_micro s_relstep' % argv[0])
|
||||||
|
return 1
|
||||||
|
# Parse arguments
|
||||||
|
ams_dir = argv[1]
|
||||||
|
target = '' if argv[2] == 'release' else ('_%s' % argv[2])
|
||||||
|
revision = int(argv[3][:8], 16)
|
||||||
|
major = int(argv[4])
|
||||||
|
minor = int(argv[5])
|
||||||
|
micro = int(argv[6])
|
||||||
|
relstep = int(argv[7])
|
||||||
|
s_major = int(argv[8])
|
||||||
|
s_minor = int(argv[9])
|
||||||
|
s_micro = int(argv[10])
|
||||||
|
s_relstep = int(argv[11])
|
||||||
|
# Read/parse fusee
|
||||||
|
fusee_program = read_file(os.path.join(ams_dir, 'fusee/program/program%s.bin' % target))
|
||||||
|
fusee_bin = read_file(os.path.join(ams_dir, 'fusee/fusee%s.bin' % target))
|
||||||
|
erista_mtc = get_overlay(fusee_program, 1)
|
||||||
|
mariko_mtc = get_overlay(fusee_program, 2)
|
||||||
|
erista_hsh = hashlib.sha256(erista_mtc[:-4]).digest()[:4]
|
||||||
|
mariko_hsh = hashlib.sha256(mariko_mtc[:-4]).digest()[:4]
|
||||||
|
# Read other files
|
||||||
|
exosphere = read_file(os.path.join(ams_dir, 'exosphere/exosphere%s.bin' % target))
|
||||||
|
warmboot = read_file(os.path.join(ams_dir, 'exosphere/warmboot%s.bin' % target))
|
||||||
|
mariko_fatal = read_file(os.path.join(ams_dir, 'exosphere/mariko_fatal%s.bin' % target))
|
||||||
|
rebootstub = read_file(os.path.join(ams_dir, 'exosphere/program/rebootstub/rebootstub%s.bin' % target))
|
||||||
|
mesosphere = read_file(os.path.join(ams_dir, 'mesosphere/mesosphere%s.bin' % target))
|
||||||
|
all_kips = get_kips(ams_dir)
|
||||||
|
tsec_keygen = read_file(os.path.join(ams_dir, 'fusee/program/tsec_keygen/tsec_keygen.bin'))
|
||||||
|
splash_bin = read_file(os.path.join(ams_dir, 'img/splash.bin'))
|
||||||
|
assert len(splash_bin) == 0x3C0000
|
||||||
|
with open(os.path.join(ams_dir, 'fusee/package3%s' % target), 'wb') as f:
|
||||||
|
# Write header
|
||||||
|
write_header(f, all_kips, len(warmboot), len(tsec_keygen), len(mariko_fatal), len(exosphere), len(mesosphere), len(fusee_bin), len(rebootstub), revision, major, minor, micro, relstep, s_major, s_minor, s_micro, s_relstep)
|
||||||
|
# Write warmboot
|
||||||
|
f.write(pad(warmboot, 0x1800))
|
||||||
|
# Write TSEC Keygen
|
||||||
|
f.write(pad(tsec_keygen, 0x2000))
|
||||||
|
# Write Mariko Fatal
|
||||||
|
f.write(pad(mariko_fatal, 0x1C000))
|
||||||
|
# Write Erista MTC
|
||||||
|
f.write(erista_mtc[:-4] + erista_hsh)
|
||||||
|
# Write Mariko MTC
|
||||||
|
f.write(mariko_mtc[:-4] + mariko_hsh)
|
||||||
|
# Write exosphere
|
||||||
|
f.write(pad(exosphere, 0xE000))
|
||||||
|
# Write mesosphere
|
||||||
|
f.write(pad(mesosphere, 0xAA000))
|
||||||
|
# Write kips
|
||||||
|
write_kips(f, all_kips)
|
||||||
|
# Write Splash Screen
|
||||||
|
f.write(splash_bin)
|
||||||
|
# Write fusee
|
||||||
|
f.write(pad(fusee_bin, 0x20000))
|
||||||
|
# Write rebootstub
|
||||||
|
f.write(pad(rebootstub, 0x1000))
|
||||||
|
# Pad to 8 MB
|
||||||
|
f.write(b'\xCC' * (0x800000 - 0x7E1000))
|
||||||
|
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(len(sys.argv), sys.argv))
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
* (C) Copyright 1997-2002 ELTEC Elektronik AG
|
|
||||||
* Frank Gottschling <fgottschling@eltec.de>
|
|
||||||
*
|
|
||||||
* See file CREDITS for list of people who contributed to this
|
|
||||||
* project.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of
|
|
||||||
* the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
||||||
* MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _VIDEO_FB_H_
|
|
||||||
#define _VIDEO_FB_H_
|
|
||||||
|
|
||||||
#define CONSOLE_BG_COL 0x00
|
|
||||||
#define CONSOLE_FG_COL 0xa0
|
|
||||||
|
|
||||||
/* Try using the small font */
|
|
||||||
#define CONFIG_VIDEO_FONT_SMALL
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Graphic Data Format (GDF) bits for VIDEO_DATA_FORMAT
|
|
||||||
*/
|
|
||||||
#define GDF__8BIT_INDEX 0
|
|
||||||
#define GDF_15BIT_555RGB 1
|
|
||||||
#define GDF_16BIT_565RGB 2
|
|
||||||
#define GDF_32BIT_X888RGB 3
|
|
||||||
#define GDF_24BIT_888RGB 4
|
|
||||||
#define GDF__8BIT_332RGB 5
|
|
||||||
|
|
||||||
#define CONFIG_VIDEO_FB_LITTLE_ENDIAN
|
|
||||||
#define CONFIG_VIDEO_VISIBLE_COLS 720
|
|
||||||
#define CONFIG_VIDEO_VISIBLE_ROWS 1280
|
|
||||||
#define CONFIG_VIDEO_COLS 768
|
|
||||||
#define CONFIG_VIDEO_PIXEL_SIZE 4
|
|
||||||
#define CONFIG_VIDEO_DATA_FORMAT GDF_32BIT_X888RGB /* BGR actually, but w/e */
|
|
||||||
|
|
||||||
int video_get_col(void);
|
|
||||||
int video_get_row(void);
|
|
||||||
|
|
||||||
int video_init(void *fb);
|
|
||||||
int video_resume(void *fb, int row, int col);
|
|
||||||
void video_putc(char c);
|
|
||||||
void video_puts(const char *s);
|
|
||||||
|
|
||||||
#endif /*_VIDEO_FB_H_ */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,340 +0,0 @@
|
|||||||
----------------------------------------------------------------------------
|
|
||||||
Revision history of FatFs module
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
R0.00 (February 26, 2006)
|
|
||||||
|
|
||||||
Prototype.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.01 (April 29, 2006)
|
|
||||||
|
|
||||||
The first release.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.02 (June 01, 2006)
|
|
||||||
|
|
||||||
Added FAT12 support.
|
|
||||||
Removed unbuffered mode.
|
|
||||||
Fixed a problem on small (<32M) partition.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.02a (June 10, 2006)
|
|
||||||
|
|
||||||
Added a configuration option (_FS_MINIMUM).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.03 (September 22, 2006)
|
|
||||||
|
|
||||||
Added f_rename().
|
|
||||||
Changed option _FS_MINIMUM to _FS_MINIMIZE.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.03a (December 11, 2006)
|
|
||||||
|
|
||||||
Improved cluster scan algorithm to write files fast.
|
|
||||||
Fixed f_mkdir() creates incorrect directory on FAT32.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.04 (February 04, 2007)
|
|
||||||
|
|
||||||
Added f_mkfs().
|
|
||||||
Supported multiple drive system.
|
|
||||||
Changed some interfaces for multiple drive system.
|
|
||||||
Changed f_mountdrv() to f_mount().
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.04a (April 01, 2007)
|
|
||||||
|
|
||||||
Supported multiple partitions on a physical drive.
|
|
||||||
Added a capability of extending file size to f_lseek().
|
|
||||||
Added minimization level 3.
|
|
||||||
Fixed an endian sensitive code in f_mkfs().
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.04b (May 05, 2007)
|
|
||||||
|
|
||||||
Added a configuration option _USE_NTFLAG.
|
|
||||||
Added FSINFO support.
|
|
||||||
Fixed DBCS name can result FR_INVALID_NAME.
|
|
||||||
Fixed short seek (<= csize) collapses the file object.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.05 (August 25, 2007)
|
|
||||||
|
|
||||||
Changed arguments of f_read(), f_write() and f_mkfs().
|
|
||||||
Fixed f_mkfs() on FAT32 creates incorrect FSINFO.
|
|
||||||
Fixed f_mkdir() on FAT32 creates incorrect directory.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.05a (February 03, 2008)
|
|
||||||
|
|
||||||
Added f_truncate() and f_utime().
|
|
||||||
Fixed off by one error at FAT sub-type determination.
|
|
||||||
Fixed btr in f_read() can be mistruncated.
|
|
||||||
Fixed cached sector is not flushed when create and close without write.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.06 (April 01, 2008)
|
|
||||||
|
|
||||||
Added fputc(), fputs(), fprintf() and fgets().
|
|
||||||
Improved performance of f_lseek() on moving to the same or following cluster.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.07 (April 01, 2009)
|
|
||||||
|
|
||||||
Merged Tiny-FatFs as a configuration option. (_FS_TINY)
|
|
||||||
Added long file name feature. (_USE_LFN)
|
|
||||||
Added multiple code page feature. (_CODE_PAGE)
|
|
||||||
Added re-entrancy for multitask operation. (_FS_REENTRANT)
|
|
||||||
Added auto cluster size selection to f_mkfs().
|
|
||||||
Added rewind option to f_readdir().
|
|
||||||
Changed result code of critical errors.
|
|
||||||
Renamed string functions to avoid name collision.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.07a (April 14, 2009)
|
|
||||||
|
|
||||||
Septemberarated out OS dependent code on reentrant cfg.
|
|
||||||
Added multiple sector size feature.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.07c (June 21, 2009)
|
|
||||||
|
|
||||||
Fixed f_unlink() can return FR_OK on error.
|
|
||||||
Fixed wrong cache control in f_lseek().
|
|
||||||
Added relative path feature.
|
|
||||||
Added f_chdir() and f_chdrive().
|
|
||||||
Added proper case conversion to extended character.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.07e (November 03, 2009)
|
|
||||||
|
|
||||||
Septemberarated out configuration options from ff.h to ffconf.h.
|
|
||||||
Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH.
|
|
||||||
Fixed name matching error on the 13 character boundary.
|
|
||||||
Added a configuration option, _LFN_UNICODE.
|
|
||||||
Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.08 (May 15, 2010)
|
|
||||||
|
|
||||||
Added a memory configuration option. (_USE_LFN = 3)
|
|
||||||
Added file lock feature. (_FS_SHARE)
|
|
||||||
Added fast seek feature. (_USE_FASTSEEK)
|
|
||||||
Changed some types on the API, XCHAR->TCHAR.
|
|
||||||
Changed .fname in the FILINFO structure on Unicode cfg.
|
|
||||||
String functions support UTF-8 encoding files on Unicode cfg.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.08a (August 16, 2010)
|
|
||||||
|
|
||||||
Added f_getcwd(). (_FS_RPATH = 2)
|
|
||||||
Added sector erase feature. (_USE_ERASE)
|
|
||||||
Moved file lock semaphore table from fs object to the bss.
|
|
||||||
Fixed f_mkfs() creates wrong FAT32 volume.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.08b (January 15, 2011)
|
|
||||||
|
|
||||||
Fast seek feature is also applied to f_read() and f_write().
|
|
||||||
f_lseek() reports required table size on creating CLMP.
|
|
||||||
Extended format syntax of f_printf().
|
|
||||||
Ignores duplicated directory separators in given path name.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.09 (September 06, 2011)
|
|
||||||
|
|
||||||
f_mkfs() supports multiple partition to complete the multiple partition feature.
|
|
||||||
Added f_fdisk().
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.09a (August 27, 2012)
|
|
||||||
|
|
||||||
Changed f_open() and f_opendir() reject null object pointer to avoid crash.
|
|
||||||
Changed option name _FS_SHARE to _FS_LOCK.
|
|
||||||
Fixed assertion failure due to OS/2 EA on FAT12/16 volume.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.09b (January 24, 2013)
|
|
||||||
|
|
||||||
Added f_setlabel() and f_getlabel().
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.10 (October 02, 2013)
|
|
||||||
|
|
||||||
Added selection of character encoding on the file. (_STRF_ENCODE)
|
|
||||||
Added f_closedir().
|
|
||||||
Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)
|
|
||||||
Added forced mount feature with changes of f_mount().
|
|
||||||
Improved behavior of volume auto detection.
|
|
||||||
Improved write throughput of f_puts() and f_printf().
|
|
||||||
Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().
|
|
||||||
Fixed f_write() can be truncated when the file size is close to 4GB.
|
|
||||||
Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.10a (January 15, 2014)
|
|
||||||
|
|
||||||
Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID)
|
|
||||||
Added a configuration option of minimum sector size. (_MIN_SS)
|
|
||||||
2nd argument of f_rename() can have a drive number and it will be ignored.
|
|
||||||
Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10)
|
|
||||||
Fixed f_close() invalidates the file object without volume lock.
|
|
||||||
Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10)
|
|
||||||
Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.10b (May 19, 2014)
|
|
||||||
|
|
||||||
Fixed a hard error in the disk I/O layer can collapse the directory entry.
|
|
||||||
Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.10c (November 09, 2014)
|
|
||||||
|
|
||||||
Added a configuration option for the platforms without RTC. (_FS_NORTC)
|
|
||||||
Changed option name _USE_ERASE to _USE_TRIM.
|
|
||||||
Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b)
|
|
||||||
Fixed a potential problem of FAT access that can appear on disk error.
|
|
||||||
Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.11 (February 09, 2015)
|
|
||||||
|
|
||||||
Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND)
|
|
||||||
Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c)
|
|
||||||
Fixed _FS_NORTC option does not work properly. (appeared at R0.10c)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.11a (September 05, 2015)
|
|
||||||
|
|
||||||
Fixed wrong media change can lead a deadlock at thread-safe configuration.
|
|
||||||
Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE)
|
|
||||||
Removed some code pages actually not exist on the standard systems. (_CODE_PAGE)
|
|
||||||
Fixed errors in the case conversion teble of code page 437 and 850 (ff.c).
|
|
||||||
Fixed errors in the case conversion teble of Unicode (cc*.c).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.12 (April 12, 2016)
|
|
||||||
|
|
||||||
Added support for exFAT file system. (_FS_EXFAT)
|
|
||||||
Added f_expand(). (_USE_EXPAND)
|
|
||||||
Changed some members in FINFO structure and behavior of f_readdir().
|
|
||||||
Added an option _USE_CHMOD.
|
|
||||||
Removed an option _WORD_ACCESS.
|
|
||||||
Fixed errors in the case conversion table of Unicode (cc*.c).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.12a (July 10, 2016)
|
|
||||||
|
|
||||||
Added support for creating exFAT volume with some changes of f_mkfs().
|
|
||||||
Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed.
|
|
||||||
f_forward() is available regardless of _FS_TINY.
|
|
||||||
Fixed f_mkfs() creates wrong volume. (appeared at R0.12)
|
|
||||||
Fixed wrong memory read in create_name(). (appeared at R0.12)
|
|
||||||
Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.12b (September 04, 2016)
|
|
||||||
|
|
||||||
Made f_rename() be able to rename objects with the same name but case.
|
|
||||||
Fixed an error in the case conversion teble of code page 866. (ff.c)
|
|
||||||
Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12)
|
|
||||||
Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12)
|
|
||||||
Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12)
|
|
||||||
Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12)
|
|
||||||
Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12)
|
|
||||||
Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.12c (March 04, 2017)
|
|
||||||
|
|
||||||
Improved write throughput at the fragmented file on the exFAT volume.
|
|
||||||
Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN.
|
|
||||||
Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12)
|
|
||||||
Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.13 (May 21, 2017)
|
|
||||||
|
|
||||||
Changed heading character of configuration keywords "_" to "FF_".
|
|
||||||
Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead.
|
|
||||||
Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0)
|
|
||||||
Improved cluster allocation time on stretch a deep buried cluster chain.
|
|
||||||
Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3.
|
|
||||||
Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous.
|
|
||||||
Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12)
|
|
||||||
Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c)
|
|
||||||
Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.13a (October 14, 2017)
|
|
||||||
|
|
||||||
Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2)
|
|
||||||
Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF).
|
|
||||||
Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk().
|
|
||||||
Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09)
|
|
||||||
Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c)
|
|
||||||
Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.13b (April 07, 2018)
|
|
||||||
|
|
||||||
Added support for UTF-32 encoding on the API. (FF_LFN_UNICODE = 3)
|
|
||||||
Added support for Unix style volume ID. (FF_STR_VOLUME_ID = 2)
|
|
||||||
Fixed accesing any object on the exFAT root directory beyond the cluster boundary can fail. (appeared at R0.12c)
|
|
||||||
Fixed f_setlabel() does not reject some invalid characters. (appeared at R0.09b)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.13c (October 14, 2018)
|
|
||||||
Supported stdint.h for C99 and later. (integer.h was included in ff.h)
|
|
||||||
Fixed reading a directory gets infinite loop when the last directory entry is not empty. (appeared at R0.12)
|
|
||||||
Fixed creating a sub-directory in the fragmented sub-directory on the exFAT volume collapses FAT chain of the parent directory. (appeared at R0.12)
|
|
||||||
Fixed f_getcwd() cause output buffer overrun when the buffer has a valid drive number. (appeared at R0.13b)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
R0.14 (October 14, 2019)
|
|
||||||
Added support for 64-bit LBA and GUID partition table (FF_LBA64 = 1)
|
|
||||||
Changed some API functions, f_mkfs() and f_fdisk().
|
|
||||||
Fixed f_open() function cannot find the file with file name in length of FF_MAX_LFN characters.
|
|
||||||
Fixed f_readdir() function cannot retrieve long file names in length of FF_MAX_LFN - 1 characters.
|
|
||||||
Fixed f_readdir() function returns file names with wrong case conversion. (appeared at R0.12)
|
|
||||||
Fixed f_mkfs() function can fail to create exFAT volume in the second partition. (appeared at R0.12)
|
|
||||||
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
FatFs Module Source Files R0.14
|
|
||||||
|
|
||||||
|
|
||||||
FILES
|
|
||||||
|
|
||||||
00readme.txt This file.
|
|
||||||
00history.txt Revision history.
|
|
||||||
ff.c FatFs module.
|
|
||||||
ffconf.h Configuration file of FatFs module.
|
|
||||||
ff.h Common include file for FatFs and application module.
|
|
||||||
diskio.h Common include file for FatFs and disk I/O module.
|
|
||||||
diskio.c An example of glue function to attach existing disk I/O module to FatFs.
|
|
||||||
ffunicode.c Optional Unicode utility functions.
|
|
||||||
ffsystem.c An example of optional O/S related functions.
|
|
||||||
|
|
||||||
|
|
||||||
Low level disk I/O module is not included in this archive because the FatFs
|
|
||||||
module is only a generic file system layer and it does not depend on any specific
|
|
||||||
storage device. You need to provide a low level disk I/O module written to
|
|
||||||
control the storage device that attached to the target system.
|
|
||||||
|
|
||||||
@@ -1,272 +0,0 @@
|
|||||||
/* inih -- simple .INI file parser
|
|
||||||
|
|
||||||
inih is released under the New BSD license (see LICENSE.txt). Go to the project
|
|
||||||
home page for more info:
|
|
||||||
|
|
||||||
https://github.com/benhoyt/inih
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
|
|
||||||
#define _CRT_SECURE_NO_WARNINGS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "ini.h"
|
|
||||||
|
|
||||||
#if !INI_USE_STACK
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAX_SECTION 50
|
|
||||||
#define MAX_NAME 50
|
|
||||||
|
|
||||||
/* Used by ini_parse_string() to keep track of string parsing state. */
|
|
||||||
typedef struct {
|
|
||||||
const char* ptr;
|
|
||||||
size_t num_left;
|
|
||||||
} ini_parse_string_ctx;
|
|
||||||
|
|
||||||
/* Strip whitespace chars off end of given string, in place. Return s. */
|
|
||||||
static char* rstrip(char* s)
|
|
||||||
{
|
|
||||||
char* p = s + strlen(s);
|
|
||||||
while (p > s && isspace((unsigned char)(*--p)))
|
|
||||||
*p = '\0';
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return pointer to first non-whitespace char in given string. */
|
|
||||||
static char* lskip(const char* s)
|
|
||||||
{
|
|
||||||
while (*s && isspace((unsigned char)(*s)))
|
|
||||||
s++;
|
|
||||||
return (char*)s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return pointer to first char (of chars) or inline comment in given string,
|
|
||||||
or pointer to null at end of string if neither found. Inline comment must
|
|
||||||
be prefixed by a whitespace character to register as a comment. */
|
|
||||||
static char* find_chars_or_comment(const char* s, const char* chars)
|
|
||||||
{
|
|
||||||
#if INI_ALLOW_INLINE_COMMENTS
|
|
||||||
int was_space = 0;
|
|
||||||
while (*s && (!chars || !strchr(chars, *s)) &&
|
|
||||||
!(was_space && strchr(INI_INLINE_COMMENT_PREFIXES, *s))) {
|
|
||||||
was_space = isspace((unsigned char)(*s));
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
while (*s && (!chars || !strchr(chars, *s))) {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return (char*)s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Version of strncpy that ensures dest (size bytes) is null-terminated. */
|
|
||||||
static char* strncpy0(char* dest, const char* src, size_t size)
|
|
||||||
{
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wstringop-truncation"
|
|
||||||
strncpy(dest, src, size - 1);
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
dest[size - 1] = '\0';
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See documentation in header file. */
|
|
||||||
int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
|
|
||||||
void* user)
|
|
||||||
{
|
|
||||||
/* Uses a fair bit of stack (use heap instead if you need to) */
|
|
||||||
#if INI_USE_STACK
|
|
||||||
char line[INI_MAX_LINE];
|
|
||||||
int max_line = INI_MAX_LINE;
|
|
||||||
#else
|
|
||||||
char* line;
|
|
||||||
int max_line = INI_INITIAL_ALLOC;
|
|
||||||
#endif
|
|
||||||
#if INI_ALLOW_REALLOC
|
|
||||||
char* new_line;
|
|
||||||
int offset;
|
|
||||||
#endif
|
|
||||||
char section[MAX_SECTION] = "";
|
|
||||||
char prev_name[MAX_NAME] = "";
|
|
||||||
|
|
||||||
char* start;
|
|
||||||
char* end;
|
|
||||||
char* name;
|
|
||||||
char* value;
|
|
||||||
int lineno = 0;
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
#if !INI_USE_STACK
|
|
||||||
line = (char*)malloc(INI_INITIAL_ALLOC);
|
|
||||||
if (!line) {
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if INI_HANDLER_LINENO
|
|
||||||
#define HANDLER(u, s, n, v) handler(u, s, n, v, lineno)
|
|
||||||
#else
|
|
||||||
#define HANDLER(u, s, n, v) handler(u, s, n, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Scan through stream line by line */
|
|
||||||
while (reader(line, max_line, stream) != NULL) {
|
|
||||||
#if INI_ALLOW_REALLOC
|
|
||||||
offset = strlen(line);
|
|
||||||
while (offset == max_line - 1 && line[offset - 1] != '\n') {
|
|
||||||
max_line *= 2;
|
|
||||||
if (max_line > INI_MAX_LINE)
|
|
||||||
max_line = INI_MAX_LINE;
|
|
||||||
new_line = realloc(line, max_line);
|
|
||||||
if (!new_line) {
|
|
||||||
free(line);
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
line = new_line;
|
|
||||||
if (reader(line + offset, max_line - offset, stream) == NULL)
|
|
||||||
break;
|
|
||||||
if (max_line >= INI_MAX_LINE)
|
|
||||||
break;
|
|
||||||
offset += strlen(line + offset);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
lineno++;
|
|
||||||
|
|
||||||
start = line;
|
|
||||||
#if INI_ALLOW_BOM
|
|
||||||
if (lineno == 1 && (unsigned char)start[0] == 0xEF &&
|
|
||||||
(unsigned char)start[1] == 0xBB &&
|
|
||||||
(unsigned char)start[2] == 0xBF) {
|
|
||||||
start += 3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
start = lskip(rstrip(start));
|
|
||||||
|
|
||||||
if (strchr(INI_START_COMMENT_PREFIXES, *start)) {
|
|
||||||
/* Start-of-line comment */
|
|
||||||
}
|
|
||||||
#if INI_ALLOW_MULTILINE
|
|
||||||
else if (*prev_name && *start && start > line) {
|
|
||||||
/* Non-blank line with leading whitespace, treat as continuation
|
|
||||||
of previous name's value (as per Python configparser). */
|
|
||||||
if (!HANDLER(user, section, prev_name, start) && !error)
|
|
||||||
error = lineno;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else if (*start == '[') {
|
|
||||||
/* A "[section]" line */
|
|
||||||
end = find_chars_or_comment(start + 1, "]");
|
|
||||||
if (*end == ']') {
|
|
||||||
*end = '\0';
|
|
||||||
strncpy0(section, start + 1, sizeof(section));
|
|
||||||
*prev_name = '\0';
|
|
||||||
}
|
|
||||||
else if (!error) {
|
|
||||||
/* No ']' found on section line */
|
|
||||||
error = lineno;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (*start) {
|
|
||||||
/* Not a comment, must be a name[=:]value pair */
|
|
||||||
end = find_chars_or_comment(start, "=:");
|
|
||||||
if (*end == '=' || *end == ':') {
|
|
||||||
*end = '\0';
|
|
||||||
name = rstrip(start);
|
|
||||||
value = end + 1;
|
|
||||||
#if INI_ALLOW_INLINE_COMMENTS
|
|
||||||
end = find_chars_or_comment(value, NULL);
|
|
||||||
if (*end)
|
|
||||||
*end = '\0';
|
|
||||||
#endif
|
|
||||||
value = lskip(value);
|
|
||||||
rstrip(value);
|
|
||||||
|
|
||||||
/* Valid name[=:]value pair found, call handler */
|
|
||||||
strncpy0(prev_name, name, sizeof(prev_name));
|
|
||||||
if (!HANDLER(user, section, name, value) && !error)
|
|
||||||
error = lineno;
|
|
||||||
}
|
|
||||||
else if (!error) {
|
|
||||||
/* No '=' or ':' found on name[=:]value line */
|
|
||||||
error = lineno;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if INI_STOP_ON_FIRST_ERROR
|
|
||||||
if (error)
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !INI_USE_STACK
|
|
||||||
free(line);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See documentation in header file. */
|
|
||||||
int ini_parse_file(FILE* file, ini_handler handler, void* user)
|
|
||||||
{
|
|
||||||
return ini_parse_stream((ini_reader)fgets, file, handler, user);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See documentation in header file. */
|
|
||||||
int ini_parse(const char* filename, ini_handler handler, void* user)
|
|
||||||
{
|
|
||||||
FILE* file;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
file = fopen(filename, "r");
|
|
||||||
if (!file)
|
|
||||||
return -1;
|
|
||||||
error = ini_parse_file(file, handler, user);
|
|
||||||
fclose(file);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An ini_reader function to read the next line from a string buffer. This
|
|
||||||
is the fgets() equivalent used by ini_parse_string(). */
|
|
||||||
static char* ini_reader_string(char* str, int num, void* stream) {
|
|
||||||
ini_parse_string_ctx* ctx = (ini_parse_string_ctx*)stream;
|
|
||||||
const char* ctx_ptr = ctx->ptr;
|
|
||||||
size_t ctx_num_left = ctx->num_left;
|
|
||||||
char* strp = str;
|
|
||||||
char c;
|
|
||||||
|
|
||||||
if (ctx_num_left == 0 || num < 2)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
while (num > 1 && ctx_num_left != 0) {
|
|
||||||
c = *ctx_ptr++;
|
|
||||||
ctx_num_left--;
|
|
||||||
*strp++ = c;
|
|
||||||
if (c == '\n')
|
|
||||||
break;
|
|
||||||
num--;
|
|
||||||
}
|
|
||||||
|
|
||||||
*strp = '\0';
|
|
||||||
ctx->ptr = ctx_ptr;
|
|
||||||
ctx->num_left = ctx_num_left;
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See documentation in header file. */
|
|
||||||
int ini_parse_string(const char* string, ini_handler handler, void* user) {
|
|
||||||
ini_parse_string_ctx ctx;
|
|
||||||
|
|
||||||
ctx.ptr = string;
|
|
||||||
ctx.num_left = strlen(string);
|
|
||||||
return ini_parse_stream((ini_reader)ini_reader_string, &ctx, handler,
|
|
||||||
user);
|
|
||||||
}
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
/* inih -- simple .INI file parser
|
|
||||||
|
|
||||||
inih is released under the New BSD license (see LICENSE.txt). Go to the project
|
|
||||||
home page for more info:
|
|
||||||
|
|
||||||
https://github.com/benhoyt/inih
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __INI_H__
|
|
||||||
#define __INI_H__
|
|
||||||
|
|
||||||
/* Make this header file easier to include in C++ code */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* Nonzero if ini_handler callback should accept lineno parameter. */
|
|
||||||
#ifndef INI_HANDLER_LINENO
|
|
||||||
#define INI_HANDLER_LINENO 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Typedef for prototype of handler function. */
|
|
||||||
#if INI_HANDLER_LINENO
|
|
||||||
typedef int (*ini_handler)(void* user, const char* section,
|
|
||||||
const char* name, const char* value,
|
|
||||||
int lineno);
|
|
||||||
#else
|
|
||||||
typedef int (*ini_handler)(void* user, const char* section,
|
|
||||||
const char* name, const char* value);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Typedef for prototype of fgets-style reader function. */
|
|
||||||
typedef char* (*ini_reader)(char* str, int num, void* stream);
|
|
||||||
|
|
||||||
/* Parse given INI-style file. May have [section]s, name=value pairs
|
|
||||||
(whitespace stripped), and comments starting with ';' (semicolon). Section
|
|
||||||
is "" if name=value pair parsed before any section heading. name:value
|
|
||||||
pairs are also supported as a concession to Python's configparser.
|
|
||||||
|
|
||||||
For each name=value pair parsed, call handler function with given user
|
|
||||||
pointer as well as section, name, and value (data only valid for duration
|
|
||||||
of handler call). Handler should return nonzero on success, zero on error.
|
|
||||||
|
|
||||||
Returns 0 on success, line number of first error on parse error (doesn't
|
|
||||||
stop on first error), -1 on file open error, or -2 on memory allocation
|
|
||||||
error (only when INI_USE_STACK is zero).
|
|
||||||
*/
|
|
||||||
int ini_parse(const char* filename, ini_handler handler, void* user);
|
|
||||||
|
|
||||||
/* Same as ini_parse(), but takes a FILE* instead of filename. This doesn't
|
|
||||||
close the file when it's finished -- the caller must do that. */
|
|
||||||
int ini_parse_file(FILE* file, ini_handler handler, void* user);
|
|
||||||
|
|
||||||
/* Same as ini_parse(), but takes an ini_reader function pointer instead of
|
|
||||||
filename. Used for implementing custom or string-based I/O (see also
|
|
||||||
ini_parse_string). */
|
|
||||||
int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
|
|
||||||
void* user);
|
|
||||||
|
|
||||||
/* Same as ini_parse(), but takes a zero-terminated string with the INI data
|
|
||||||
instead of a file. Useful for parsing INI data from a network socket or
|
|
||||||
already in memory. */
|
|
||||||
int ini_parse_string(const char* string, ini_handler handler, void* user);
|
|
||||||
|
|
||||||
/* Nonzero to allow multi-line value parsing, in the style of Python's
|
|
||||||
configparser. If allowed, ini_parse() will call the handler with the same
|
|
||||||
name for each subsequent line parsed. */
|
|
||||||
#ifndef INI_ALLOW_MULTILINE
|
|
||||||
#define INI_ALLOW_MULTILINE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Nonzero to allow a UTF-8 BOM sequence (0xEF 0xBB 0xBF) at the start of
|
|
||||||
the file. See http://code.google.com/p/inih/issues/detail?id=21 */
|
|
||||||
#ifndef INI_ALLOW_BOM
|
|
||||||
#define INI_ALLOW_BOM 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Chars that begin a start-of-line comment. Per Python configparser, allow
|
|
||||||
both ; and # comments at the start of a line by default. */
|
|
||||||
#ifndef INI_START_COMMENT_PREFIXES
|
|
||||||
#define INI_START_COMMENT_PREFIXES ";#"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Nonzero to allow inline comments (with valid inline comment characters
|
|
||||||
specified by INI_INLINE_COMMENT_PREFIXES). Set to 0 to turn off and match
|
|
||||||
Python 3.2+ configparser behaviour. */
|
|
||||||
#ifndef INI_ALLOW_INLINE_COMMENTS
|
|
||||||
#define INI_ALLOW_INLINE_COMMENTS 1
|
|
||||||
#endif
|
|
||||||
#ifndef INI_INLINE_COMMENT_PREFIXES
|
|
||||||
#define INI_INLINE_COMMENT_PREFIXES ";"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Nonzero to use stack for line buffer, zero to use heap (malloc/free). */
|
|
||||||
#ifndef INI_USE_STACK
|
|
||||||
#define INI_USE_STACK 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Maximum line length for any line in INI file (stack or heap). Note that
|
|
||||||
this must be 3 more than the longest line (due to '\r', '\n', and '\0'). */
|
|
||||||
#ifndef INI_MAX_LINE
|
|
||||||
#define INI_MAX_LINE 200
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Nonzero to allow heap line buffer to grow via realloc(), zero for a
|
|
||||||
fixed-size buffer of INI_MAX_LINE bytes. Only applies if INI_USE_STACK is
|
|
||||||
zero. */
|
|
||||||
#ifndef INI_ALLOW_REALLOC
|
|
||||||
#define INI_ALLOW_REALLOC 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initial size in bytes for heap line buffer. Only applies if INI_USE_STACK
|
|
||||||
is zero. */
|
|
||||||
#ifndef INI_INITIAL_ALLOC
|
|
||||||
#define INI_INITIAL_ALLOC 200
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Stop parsing on first error (default is to keep parsing). */
|
|
||||||
#ifndef INI_STOP_ON_FIRST_ERROR
|
|
||||||
#define INI_STOP_ON_FIRST_ERROR 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __INI_H__ */
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "log.h"
|
|
||||||
|
|
||||||
#ifdef FUSEE_STAGE2_SRC
|
|
||||||
#include "../../../fusee/fusee-secondary/src/console.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#else
|
|
||||||
#include "display/video_fb.h"
|
|
||||||
#include "vsprintf.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Default log level for screen output. */
|
|
||||||
ScreenLogLevel g_screen_log_level = SCREEN_LOG_LEVEL_NONE;
|
|
||||||
|
|
||||||
void log_set_log_level(ScreenLogLevel log_level) {
|
|
||||||
g_screen_log_level = log_level;
|
|
||||||
}
|
|
||||||
|
|
||||||
ScreenLogLevel log_get_log_level() {
|
|
||||||
return g_screen_log_level;
|
|
||||||
}
|
|
||||||
|
|
||||||
void log_to_uart(const char *message) {
|
|
||||||
/* TODO: Add UART logging. */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_to_screen(ScreenLogLevel screen_log_level, char *message) {
|
|
||||||
/* Don't print to screen if below log level */
|
|
||||||
if(screen_log_level > g_screen_log_level) return;
|
|
||||||
|
|
||||||
#ifdef FUSEE_STAGE2_SRC
|
|
||||||
printf(message);
|
|
||||||
#else
|
|
||||||
video_puts(message);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* vprintk - logs a message and prints it to screen based on its screen_log_level
|
|
||||||
*
|
|
||||||
* If the level is below g_screen_log_level it will not be shown but logged to UART
|
|
||||||
* This text will not be colored or prefixed
|
|
||||||
* UART is TODO
|
|
||||||
*/
|
|
||||||
void vprint(ScreenLogLevel screen_log_level, const char *fmt, va_list args)
|
|
||||||
{
|
|
||||||
char buf[PRINT_MESSAGE_MAX_LENGTH];
|
|
||||||
vsnprintf(buf, PRINT_MESSAGE_MAX_LENGTH, fmt, args);
|
|
||||||
|
|
||||||
/* We don't need that flag here, but if it gets used, strip it so we print correctly. */
|
|
||||||
screen_log_level &= ~SCREEN_LOG_LEVEL_NO_PREFIX;
|
|
||||||
|
|
||||||
/* Log to UART. */
|
|
||||||
log_to_uart(buf);
|
|
||||||
|
|
||||||
print_to_screen(screen_log_level, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void add_prefix(ScreenLogLevel screen_log_level, const char *fmt, char *buf) {
|
|
||||||
char typebuf[] = "[%s] %s";
|
|
||||||
|
|
||||||
/* Apply prefix and append message format. */
|
|
||||||
/* TODO: Add coloring to the output. */
|
|
||||||
switch(screen_log_level)
|
|
||||||
{
|
|
||||||
case SCREEN_LOG_LEVEL_ERROR:
|
|
||||||
snprintf(buf, PRINT_MESSAGE_MAX_LENGTH, typebuf, "ERROR", fmt);
|
|
||||||
break;
|
|
||||||
case SCREEN_LOG_LEVEL_WARNING:
|
|
||||||
snprintf(buf, PRINT_MESSAGE_MAX_LENGTH, typebuf, "WARNING", fmt);
|
|
||||||
break;
|
|
||||||
case SCREEN_LOG_LEVEL_MANDATORY:
|
|
||||||
snprintf(buf, PRINT_MESSAGE_MAX_LENGTH, "%s", fmt);
|
|
||||||
break;
|
|
||||||
case SCREEN_LOG_LEVEL_INFO:
|
|
||||||
snprintf(buf, PRINT_MESSAGE_MAX_LENGTH, typebuf, "INFO", fmt);
|
|
||||||
break;
|
|
||||||
case SCREEN_LOG_LEVEL_DEBUG:
|
|
||||||
snprintf(buf, PRINT_MESSAGE_MAX_LENGTH, typebuf, "DEBUG", fmt);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* print - logs a message and prints it to screen based on its screen_log_level
|
|
||||||
*
|
|
||||||
* If the level is below g_screen_log_level it will not be shown but logged to UART
|
|
||||||
* Use SCREEN_LOG_LEVEL_NO_PREFIX if you don't want a prefix to be added
|
|
||||||
* UART is TODO
|
|
||||||
*/
|
|
||||||
void print(ScreenLogLevel screen_log_level, const char * fmt, ...)
|
|
||||||
{
|
|
||||||
char buf[PRINT_MESSAGE_MAX_LENGTH] = {};
|
|
||||||
char message[PRINT_MESSAGE_MAX_LENGTH] = {};
|
|
||||||
|
|
||||||
/* Make splash disappear if level is ERROR or WARNING. */
|
|
||||||
#ifdef FUSEE_STAGE2_SRC
|
|
||||||
if (screen_log_level < SCREEN_LOG_LEVEL_MANDATORY) {
|
|
||||||
console_resume();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Make prefix free messages with log_level possible. */
|
|
||||||
if(screen_log_level & SCREEN_LOG_LEVEL_NO_PREFIX) {
|
|
||||||
/* Remove the NO_PREFIX flag so the enum can be recognized later on. */
|
|
||||||
screen_log_level &= ~SCREEN_LOG_LEVEL_NO_PREFIX;
|
|
||||||
|
|
||||||
snprintf(buf, PRINT_MESSAGE_MAX_LENGTH, "%s", fmt);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
add_prefix(screen_log_level, fmt, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Input arguments. */
|
|
||||||
va_list args;
|
|
||||||
va_start(args, fmt);
|
|
||||||
vsnprintf(message, PRINT_MESSAGE_MAX_LENGTH, buf, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
/* Log to UART. */
|
|
||||||
log_to_uart(message);
|
|
||||||
|
|
||||||
print_to_screen(screen_log_level, message);
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FUSEE_LOG_H
|
|
||||||
#define FUSEE_LOG_H
|
|
||||||
|
|
||||||
#define PRINT_MESSAGE_MAX_LENGTH 1024
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SCREEN_LOG_LEVEL_NONE = 0,
|
|
||||||
SCREEN_LOG_LEVEL_ERROR = 1,
|
|
||||||
SCREEN_LOG_LEVEL_WARNING = 2,
|
|
||||||
SCREEN_LOG_LEVEL_MANDATORY = 3, /* No log prefix. */
|
|
||||||
SCREEN_LOG_LEVEL_INFO = 4,
|
|
||||||
SCREEN_LOG_LEVEL_DEBUG = 5,
|
|
||||||
SCREEN_LOG_LEVEL_SD_DEBUG = 6,
|
|
||||||
|
|
||||||
SCREEN_LOG_LEVEL_NO_PREFIX = 0x100 /* OR this to your LOG_LEVEL to prevent prefix creation. */
|
|
||||||
} ScreenLogLevel;
|
|
||||||
|
|
||||||
extern ScreenLogLevel g_screen_log_level;
|
|
||||||
|
|
||||||
void log_set_log_level(ScreenLogLevel screen_log_level);
|
|
||||||
ScreenLogLevel log_get_log_level();
|
|
||||||
void log_to_uart(const char *message);
|
|
||||||
void vprint(ScreenLogLevel screen_log_level, const char *fmt, va_list args);
|
|
||||||
void print(ScreenLogLevel screen_log_level, const char* fmt, ...);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,377 +0,0 @@
|
|||||||
/*************************************************************************
|
|
||||||
* Name: lz.c
|
|
||||||
* Author: Marcus Geelnard
|
|
||||||
* Description: LZ77 coder/decoder implementation.
|
|
||||||
* Reentrant: Yes
|
|
||||||
*
|
|
||||||
* The LZ77 compression scheme is a substitutional compression scheme
|
|
||||||
* proposed by Abraham Lempel and Jakob Ziv in 1977. It is very simple in
|
|
||||||
* its design, and uses no fancy bit level compression.
|
|
||||||
*
|
|
||||||
* This is my first attempt at an implementation of a LZ77 code/decoder.
|
|
||||||
*
|
|
||||||
* The principle of the LZ77 compression algorithm is to store repeated
|
|
||||||
* occurrences of strings as references to previous occurrences of the same
|
|
||||||
* string. The point is that the reference consumes less space than the
|
|
||||||
* string itself, provided that the string is long enough (in this
|
|
||||||
* implementation, the string has to be at least 4 bytes long, since the
|
|
||||||
* minimum coded reference is 3 bytes long). Also note that the term
|
|
||||||
* "string" refers to any kind of byte sequence (it does not have to be
|
|
||||||
* an ASCII string, for instance).
|
|
||||||
*
|
|
||||||
* The coder uses a brute force approach to finding string matches in the
|
|
||||||
* history buffer (or "sliding window", if you wish), which is very, very
|
|
||||||
* slow. I recon the complexity is somewhere between O(n^2) and O(n^3),
|
|
||||||
* depending on the input data.
|
|
||||||
*
|
|
||||||
* There is also a faster implementation that uses a large working buffer
|
|
||||||
* in which a "jump table" is stored, which is used to quickly find
|
|
||||||
* possible string matches (see the source code for LZ_CompressFast() for
|
|
||||||
* more information). The faster method is an order of magnitude faster,
|
|
||||||
* but still quite slow compared to other compression methods.
|
|
||||||
*
|
|
||||||
* The upside is that decompression is very fast, and the compression ratio
|
|
||||||
* is often very good.
|
|
||||||
*
|
|
||||||
* The reference to a string is coded as a (length,offset) pair, where the
|
|
||||||
* length indicates the length of the string, and the offset gives the
|
|
||||||
* offset from the current data position. To distinguish between string
|
|
||||||
* references and literal strings (uncompressed bytes), a string reference
|
|
||||||
* is preceded by a marker byte, which is chosen as the least common byte
|
|
||||||
* symbol in the input data stream (this marker byte is stored in the
|
|
||||||
* output stream as the first byte).
|
|
||||||
*
|
|
||||||
* Occurrences of the marker byte in the stream are encoded as the marker
|
|
||||||
* byte followed by a zero byte, which means that occurrences of the marker
|
|
||||||
* byte have to be coded with two bytes.
|
|
||||||
*
|
|
||||||
* The lengths and offsets are coded in a variable length fashion, allowing
|
|
||||||
* values of any magnitude (up to 4294967295 in this implementation).
|
|
||||||
*
|
|
||||||
* With this compression scheme, the worst case compression result is
|
|
||||||
* (257/256)*insize + 1.
|
|
||||||
*
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
* Copyright (c) 2003-2006 Marcus Geelnard
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would
|
|
||||||
* be appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
* be misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*
|
|
||||||
* Marcus Geelnard
|
|
||||||
* marcus.geelnard at home.se
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Constants used for LZ77 coding
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
/* Maximum offset (can be any size < 2^31). Lower values give faster
|
|
||||||
compression, while higher values gives better compression. The default
|
|
||||||
value of 100000 is quite high. Experiment to see what works best for
|
|
||||||
you. */
|
|
||||||
#define LZ_MAX_OFFSET 100000
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* INTERNAL FUNCTIONS *
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* _LZ_StringCompare() - Return maximum length string match.
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
static unsigned int _LZ_StringCompare( const unsigned char * str1,
|
|
||||||
const unsigned char * str2, unsigned int minlen, unsigned int maxlen )
|
|
||||||
{
|
|
||||||
unsigned int len;
|
|
||||||
|
|
||||||
for( len = minlen; (len < maxlen) && (str1[len] == str2[len]); ++ len );
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* _LZ_WriteVarSize() - Write unsigned integer with variable number of
|
|
||||||
* bytes depending on value.
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
static int _LZ_WriteVarSize( unsigned int x, unsigned char * buf )
|
|
||||||
{
|
|
||||||
unsigned int y;
|
|
||||||
int num_bytes, i, b;
|
|
||||||
|
|
||||||
/* Determine number of bytes needed to store the number x */
|
|
||||||
y = x >> 3;
|
|
||||||
for( num_bytes = 5; num_bytes >= 2; -- num_bytes )
|
|
||||||
{
|
|
||||||
if( y & 0xfe000000 ) break;
|
|
||||||
y <<= 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write all bytes, seven bits in each, with 8:th bit set for all */
|
|
||||||
/* but the last byte. */
|
|
||||||
for( i = num_bytes-1; i >= 0; -- i )
|
|
||||||
{
|
|
||||||
b = (x >> (i*7)) & 0x0000007f;
|
|
||||||
if( i > 0 )
|
|
||||||
{
|
|
||||||
b |= 0x00000080;
|
|
||||||
}
|
|
||||||
*buf ++ = (unsigned char) b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return number of bytes written */
|
|
||||||
return num_bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* _LZ_ReadVarSize() - Read unsigned integer with variable number of
|
|
||||||
* bytes depending on value.
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
static int _LZ_ReadVarSize( unsigned int * x, const unsigned char * buf )
|
|
||||||
{
|
|
||||||
unsigned int y, b, num_bytes;
|
|
||||||
|
|
||||||
/* Read complete value (stop when byte contains zero in 8:th bit) */
|
|
||||||
y = 0;
|
|
||||||
num_bytes = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
b = (unsigned int) (*buf ++);
|
|
||||||
y = (y << 7) | (b & 0x0000007f);
|
|
||||||
++ num_bytes;
|
|
||||||
}
|
|
||||||
while( b & 0x00000080 );
|
|
||||||
|
|
||||||
/* Store value in x */
|
|
||||||
*x = y;
|
|
||||||
|
|
||||||
/* Return number of bytes read */
|
|
||||||
return num_bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* PUBLIC FUNCTIONS *
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* LZ_Compress() - Compress a block of data using an LZ77 coder.
|
|
||||||
* in - Input (uncompressed) buffer.
|
|
||||||
* out - Output (compressed) buffer. This buffer must be 0.4% larger
|
|
||||||
* than the input buffer, plus one byte.
|
|
||||||
* insize - Number of input bytes.
|
|
||||||
* The function returns the size of the compressed data.
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
int LZ_Compress( const unsigned char *in, unsigned char *out, unsigned int insize )
|
|
||||||
{
|
|
||||||
unsigned char marker, symbol;
|
|
||||||
unsigned int inpos, outpos, bytesleft, i;
|
|
||||||
unsigned int maxoffset, offset, bestoffset;
|
|
||||||
unsigned int maxlength, length, bestlength;
|
|
||||||
unsigned int histogram[ 256 ];
|
|
||||||
const unsigned char *ptr1, *ptr2;
|
|
||||||
|
|
||||||
/* Do we have anything to compress? */
|
|
||||||
if( insize < 1 )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create histogram */
|
|
||||||
for( i = 0; i < 256; ++ i )
|
|
||||||
{
|
|
||||||
histogram[ i ] = 0;
|
|
||||||
}
|
|
||||||
for( i = 0; i < insize; ++ i )
|
|
||||||
{
|
|
||||||
++ histogram[ in[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find the least common byte, and use it as the marker symbol */
|
|
||||||
marker = 0;
|
|
||||||
for( i = 1; i < 256; ++ i )
|
|
||||||
{
|
|
||||||
if( histogram[ i ] < histogram[ marker ] )
|
|
||||||
{
|
|
||||||
marker = (unsigned char) i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remember the marker symbol for the decoder */
|
|
||||||
out[ 0 ] = marker;
|
|
||||||
|
|
||||||
/* Start of compression */
|
|
||||||
inpos = 0;
|
|
||||||
outpos = 1;
|
|
||||||
|
|
||||||
/* Main compression loop */
|
|
||||||
bytesleft = insize;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
/* Determine most distant position */
|
|
||||||
if( inpos > LZ_MAX_OFFSET ) maxoffset = LZ_MAX_OFFSET;
|
|
||||||
else maxoffset = inpos;
|
|
||||||
|
|
||||||
/* Get pointer to current position */
|
|
||||||
ptr1 = &in[ inpos ];
|
|
||||||
|
|
||||||
/* Search history window for maximum length string match */
|
|
||||||
bestlength = 3;
|
|
||||||
bestoffset = 0;
|
|
||||||
for( offset = 3; offset <= maxoffset; ++ offset )
|
|
||||||
{
|
|
||||||
/* Get pointer to candidate string */
|
|
||||||
ptr2 = &ptr1[ -(int)offset ];
|
|
||||||
|
|
||||||
/* Quickly determine if this is a candidate (for speed) */
|
|
||||||
if( (ptr1[ 0 ] == ptr2[ 0 ]) &&
|
|
||||||
(ptr1[ bestlength ] == ptr2[ bestlength ]) )
|
|
||||||
{
|
|
||||||
/* Determine maximum length for this offset */
|
|
||||||
maxlength = (bytesleft < offset ? bytesleft : offset);
|
|
||||||
|
|
||||||
/* Count maximum length match at this offset */
|
|
||||||
length = _LZ_StringCompare( ptr1, ptr2, 0, maxlength );
|
|
||||||
|
|
||||||
/* Better match than any previous match? */
|
|
||||||
if( length > bestlength )
|
|
||||||
{
|
|
||||||
bestlength = length;
|
|
||||||
bestoffset = offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Was there a good enough match? */
|
|
||||||
if( (bestlength >= 8) ||
|
|
||||||
((bestlength == 4) && (bestoffset <= 0x0000007f)) ||
|
|
||||||
((bestlength == 5) && (bestoffset <= 0x00003fff)) ||
|
|
||||||
((bestlength == 6) && (bestoffset <= 0x001fffff)) ||
|
|
||||||
((bestlength == 7) && (bestoffset <= 0x0fffffff)) )
|
|
||||||
{
|
|
||||||
out[ outpos ++ ] = (unsigned char) marker;
|
|
||||||
outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] );
|
|
||||||
outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] );
|
|
||||||
inpos += bestlength;
|
|
||||||
bytesleft -= bestlength;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Output single byte (or two bytes if marker byte) */
|
|
||||||
symbol = in[ inpos ++ ];
|
|
||||||
out[ outpos ++ ] = symbol;
|
|
||||||
if( symbol == marker )
|
|
||||||
{
|
|
||||||
out[ outpos ++ ] = 0;
|
|
||||||
}
|
|
||||||
-- bytesleft;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while( bytesleft > 3 );
|
|
||||||
|
|
||||||
/* Dump remaining bytes, if any */
|
|
||||||
while( inpos < insize )
|
|
||||||
{
|
|
||||||
if( in[ inpos ] == marker )
|
|
||||||
{
|
|
||||||
out[ outpos ++ ] = marker;
|
|
||||||
out[ outpos ++ ] = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
out[ outpos ++ ] = in[ inpos ];
|
|
||||||
}
|
|
||||||
++ inpos;
|
|
||||||
}
|
|
||||||
|
|
||||||
return outpos;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* LZ_Uncompress() - Uncompress a block of data using an LZ77 decoder.
|
|
||||||
* in - Input (compressed) buffer.
|
|
||||||
* out - Output (uncompressed) buffer. This buffer must be large
|
|
||||||
* enough to hold the uncompressed data.
|
|
||||||
* insize - Number of input bytes.
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
int LZ_Uncompress( const unsigned char *in, unsigned char *out, unsigned int insize )
|
|
||||||
{
|
|
||||||
unsigned char marker, symbol;
|
|
||||||
unsigned int i, inpos, outpos, length, offset;
|
|
||||||
|
|
||||||
/* Do we have anything to uncompress? */
|
|
||||||
if( insize < 1 )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get marker symbol from input stream */
|
|
||||||
marker = in[ 0 ];
|
|
||||||
inpos = 1;
|
|
||||||
|
|
||||||
/* Main decompression loop */
|
|
||||||
outpos = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
symbol = in[ inpos ++ ];
|
|
||||||
if( symbol == marker )
|
|
||||||
{
|
|
||||||
/* We had a marker byte */
|
|
||||||
if( in[ inpos ] == 0 )
|
|
||||||
{
|
|
||||||
/* It was a single occurrence of the marker byte */
|
|
||||||
out[ outpos ++ ] = marker;
|
|
||||||
++ inpos;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Extract true length and offset */
|
|
||||||
inpos += _LZ_ReadVarSize( &length, &in[ inpos ] );
|
|
||||||
inpos += _LZ_ReadVarSize( &offset, &in[ inpos ] );
|
|
||||||
|
|
||||||
/* Copy corresponding data from history window */
|
|
||||||
for( i = 0; i < length; ++ i )
|
|
||||||
{
|
|
||||||
out[ outpos ] = out[ outpos - offset ];
|
|
||||||
++ outpos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* No marker, plain copy */
|
|
||||||
out[ outpos ++ ] = symbol;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while( inpos < insize );
|
|
||||||
|
|
||||||
return outpos;
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
/*************************************************************************
|
|
||||||
* Name: lz.h
|
|
||||||
* Author: Marcus Geelnard
|
|
||||||
* Description: LZ77 coder/decoder interface.
|
|
||||||
* Reentrant: Yes
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
* Copyright (c) 2003-2006 Marcus Geelnard
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would
|
|
||||||
* be appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
* be misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*
|
|
||||||
* Marcus Geelnard
|
|
||||||
* marcus.geelnard at home.se
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _lz_h_
|
|
||||||
#define _lz_h_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Function prototypes
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
int LZ_Compress(const unsigned char *in, unsigned char *out, unsigned int insize);
|
|
||||||
int LZ_Uncompress(const unsigned char *in, unsigned char *out, unsigned int insize);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _lz_h_ */
|
|
||||||
@@ -1,449 +0,0 @@
|
|||||||
/*
|
|
||||||
* Header for MultiMediaCard (MMC)
|
|
||||||
*
|
|
||||||
* Copyright 2002 Hewlett-Packard Company
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* Use consistent with the GNU GPL is permitted,
|
|
||||||
* provided that this copyright notice is
|
|
||||||
* preserved in its entirety in all copies and derived works.
|
|
||||||
*
|
|
||||||
* HEWLETT-PACKARD COMPANY MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
|
|
||||||
* AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
|
|
||||||
* FITNESS FOR ANY PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* Many thanks to Alessandro Rubini and Jonathan Corbet!
|
|
||||||
*
|
|
||||||
* Based strongly on code by:
|
|
||||||
*
|
|
||||||
* Author: Yong-iL Joh <tolkien@mizi.com>
|
|
||||||
*
|
|
||||||
* Author: Andrew Christian
|
|
||||||
* 15 May 2002
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef LINUX_MMC_MMC_H
|
|
||||||
#define LINUX_MMC_MMC_H
|
|
||||||
|
|
||||||
/* Standard MMC commands (4.1) type argument response */
|
|
||||||
/* class 1 */
|
|
||||||
#define MMC_GO_IDLE_STATE 0 /* bc */
|
|
||||||
#define MMC_SEND_OP_COND 1 /* bcr [31:0] OCR R3 */
|
|
||||||
#define MMC_ALL_SEND_CID 2 /* bcr R2 */
|
|
||||||
#define MMC_SET_RELATIVE_ADDR 3 /* ac [31:16] RCA R1 */
|
|
||||||
#define MMC_SET_DSR 4 /* bc [31:16] RCA */
|
|
||||||
#define MMC_SLEEP_AWAKE 5 /* ac [31:16] RCA 15:flg R1b */
|
|
||||||
#define MMC_SWITCH 6 /* ac [31:0] See below R1b */
|
|
||||||
#define MMC_SELECT_CARD 7 /* ac [31:16] RCA R1 */
|
|
||||||
#define MMC_SEND_EXT_CSD 8 /* adtc R1 */
|
|
||||||
#define MMC_SEND_CSD 9 /* ac [31:16] RCA R2 */
|
|
||||||
#define MMC_SEND_CID 10 /* ac [31:16] RCA R2 */
|
|
||||||
#define MMC_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */
|
|
||||||
#define MMC_STOP_TRANSMISSION 12 /* ac R1b */
|
|
||||||
#define MMC_SEND_STATUS 13 /* ac [31:16] RCA R1 */
|
|
||||||
#define MMC_BUS_TEST_R 14 /* adtc R1 */
|
|
||||||
#define MMC_GO_INACTIVE_STATE 15 /* ac [31:16] RCA */
|
|
||||||
#define MMC_BUS_TEST_W 19 /* adtc R1 */
|
|
||||||
#define MMC_SPI_READ_OCR 58 /* spi spi_R3 */
|
|
||||||
#define MMC_SPI_CRC_ON_OFF 59 /* spi [0:0] flag spi_R1 */
|
|
||||||
|
|
||||||
/* class 2 */
|
|
||||||
#define MMC_SET_BLOCKLEN 16 /* ac [31:0] block len R1 */
|
|
||||||
#define MMC_READ_SINGLE_BLOCK 17 /* adtc [31:0] data addr R1 */
|
|
||||||
#define MMC_READ_MULTIPLE_BLOCK 18 /* adtc [31:0] data addr R1 */
|
|
||||||
#define MMC_SEND_TUNING_BLOCK 19 /* adtc R1 */
|
|
||||||
#define MMC_SEND_TUNING_BLOCK_HS200 21 /* adtc R1 */
|
|
||||||
|
|
||||||
/* class 3 */
|
|
||||||
#define MMC_WRITE_DAT_UNTIL_STOP 20 /* adtc [31:0] data addr R1 */
|
|
||||||
|
|
||||||
/* class 4 */
|
|
||||||
#define MMC_SET_BLOCK_COUNT 23 /* adtc [31:0] data addr R1 */
|
|
||||||
#define MMC_WRITE_BLOCK 24 /* adtc [31:0] data addr R1 */
|
|
||||||
#define MMC_WRITE_MULTIPLE_BLOCK 25 /* adtc R1 */
|
|
||||||
#define MMC_PROGRAM_CID 26 /* adtc R1 */
|
|
||||||
#define MMC_PROGRAM_CSD 27 /* adtc R1 */
|
|
||||||
|
|
||||||
/* class 6 */
|
|
||||||
#define MMC_SET_WRITE_PROT 28 /* ac [31:0] data addr R1b */
|
|
||||||
#define MMC_CLR_WRITE_PROT 29 /* ac [31:0] data addr R1b */
|
|
||||||
#define MMC_SEND_WRITE_PROT 30 /* adtc [31:0] wpdata addr R1 */
|
|
||||||
|
|
||||||
/* class 5 */
|
|
||||||
#define MMC_ERASE_GROUP_START 35 /* ac [31:0] data addr R1 */
|
|
||||||
#define MMC_ERASE_GROUP_END 36 /* ac [31:0] data addr R1 */
|
|
||||||
#define MMC_ERASE 38 /* ac R1b */
|
|
||||||
|
|
||||||
/* class 9 */
|
|
||||||
#define MMC_FAST_IO 39 /* ac <Complex> R4 */
|
|
||||||
#define MMC_GO_IRQ_STATE 40 /* bcr R5 */
|
|
||||||
|
|
||||||
/* class 7 */
|
|
||||||
#define MMC_LOCK_UNLOCK 42 /* adtc R1b */
|
|
||||||
|
|
||||||
/* class 8 */
|
|
||||||
#define MMC_APP_CMD 55 /* ac [31:16] RCA R1 */
|
|
||||||
#define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1 */
|
|
||||||
|
|
||||||
/* class 11 */
|
|
||||||
#define MMC_QUE_TASK_PARAMS 44 /* ac [20:16] task id R1 */
|
|
||||||
#define MMC_QUE_TASK_ADDR 45 /* ac [31:0] data addr R1 */
|
|
||||||
#define MMC_EXECUTE_READ_TASK 46 /* adtc [20:16] task id R1 */
|
|
||||||
#define MMC_EXECUTE_WRITE_TASK 47 /* adtc [20:16] task id R1 */
|
|
||||||
#define MMC_CMDQ_TASK_MGMT 48 /* ac [20:16] task id R1b */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MMC_SWITCH argument format:
|
|
||||||
*
|
|
||||||
* [31:26] Always 0
|
|
||||||
* [25:24] Access Mode
|
|
||||||
* [23:16] Location of target Byte in EXT_CSD
|
|
||||||
* [15:08] Value Byte
|
|
||||||
* [07:03] Always 0
|
|
||||||
* [02:00] Command Set
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
MMC status in R1, for native mode (SPI bits are different)
|
|
||||||
Type
|
|
||||||
e : error bit
|
|
||||||
s : status bit
|
|
||||||
r : detected and set for the actual command response
|
|
||||||
x : detected and set during command execution. the host must poll
|
|
||||||
the card by sending status command in order to read these bits.
|
|
||||||
Clear condition
|
|
||||||
a : according to the card state
|
|
||||||
b : always related to the previous command. Reception of
|
|
||||||
a valid command will clear it (with a delay of one command)
|
|
||||||
c : clear by read
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
|
|
||||||
#define R1_ADDRESS_ERROR (1 << 30) /* erx, c */
|
|
||||||
#define R1_BLOCK_LEN_ERROR (1 << 29) /* er, c */
|
|
||||||
#define R1_ERASE_SEQ_ERROR (1 << 28) /* er, c */
|
|
||||||
#define R1_ERASE_PARAM (1 << 27) /* ex, c */
|
|
||||||
#define R1_WP_VIOLATION (1 << 26) /* erx, c */
|
|
||||||
#define R1_CARD_IS_LOCKED (1 << 25) /* sx, a */
|
|
||||||
#define R1_LOCK_UNLOCK_FAILED (1 << 24) /* erx, c */
|
|
||||||
#define R1_COM_CRC_ERROR (1 << 23) /* er, b */
|
|
||||||
#define R1_ILLEGAL_COMMAND (1 << 22) /* er, b */
|
|
||||||
#define R1_CARD_ECC_FAILED (1 << 21) /* ex, c */
|
|
||||||
#define R1_CC_ERROR (1 << 20) /* erx, c */
|
|
||||||
#define R1_ERROR (1 << 19) /* erx, c */
|
|
||||||
#define R1_UNDERRUN (1 << 18) /* ex, c */
|
|
||||||
#define R1_OVERRUN (1 << 17) /* ex, c */
|
|
||||||
#define R1_CID_CSD_OVERWRITE (1 << 16) /* erx, c, CID/CSD overwrite */
|
|
||||||
#define R1_WP_ERASE_SKIP (1 << 15) /* sx, c */
|
|
||||||
#define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */
|
|
||||||
#define R1_ERASE_RESET (1 << 13) /* sr, c */
|
|
||||||
#define R1_STATUS(x) (x & 0xFFFFE000)
|
|
||||||
#define R1_CURRENT_STATE(x) ((x & 0x00001E00) >> 9) /* sx, b (4 bits) */
|
|
||||||
#define R1_READY_FOR_DATA (1 << 8) /* sx, a */
|
|
||||||
#define R1_SWITCH_ERROR (1 << 7) /* sx, c */
|
|
||||||
#define R1_EXCEPTION_EVENT (1 << 6) /* sr, a */
|
|
||||||
#define R1_APP_CMD (1 << 5) /* sr, c */
|
|
||||||
|
|
||||||
#define R1_STATE_IDLE 0
|
|
||||||
#define R1_STATE_READY 1
|
|
||||||
#define R1_STATE_IDENT 2
|
|
||||||
#define R1_STATE_STBY 3
|
|
||||||
#define R1_STATE_TRAN 4
|
|
||||||
#define R1_STATE_DATA 5
|
|
||||||
#define R1_STATE_RCV 6
|
|
||||||
#define R1_STATE_PRG 7
|
|
||||||
#define R1_STATE_DIS 8
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MMC/SD in SPI mode reports R1 status always, and R2 for SEND_STATUS
|
|
||||||
* R1 is the low order byte; R2 is the next highest byte, when present.
|
|
||||||
*/
|
|
||||||
#define R1_SPI_IDLE (1 << 0)
|
|
||||||
#define R1_SPI_ERASE_RESET (1 << 1)
|
|
||||||
#define R1_SPI_ILLEGAL_COMMAND (1 << 2)
|
|
||||||
#define R1_SPI_COM_CRC (1 << 3)
|
|
||||||
#define R1_SPI_ERASE_SEQ (1 << 4)
|
|
||||||
#define R1_SPI_ADDRESS (1 << 5)
|
|
||||||
#define R1_SPI_PARAMETER (1 << 6)
|
|
||||||
/* R1 bit 7 is always zero */
|
|
||||||
#define R2_SPI_CARD_LOCKED (1 << 8)
|
|
||||||
#define R2_SPI_WP_ERASE_SKIP (1 << 9) /* or lock/unlock fail */
|
|
||||||
#define R2_SPI_LOCK_UNLOCK_FAIL R2_SPI_WP_ERASE_SKIP
|
|
||||||
#define R2_SPI_ERROR (1 << 10)
|
|
||||||
#define R2_SPI_CC_ERROR (1 << 11)
|
|
||||||
#define R2_SPI_CARD_ECC_ERROR (1 << 12)
|
|
||||||
#define R2_SPI_WP_VIOLATION (1 << 13)
|
|
||||||
#define R2_SPI_ERASE_PARAM (1 << 14)
|
|
||||||
#define R2_SPI_OUT_OF_RANGE (1 << 15) /* or CSD overwrite */
|
|
||||||
#define R2_SPI_CSD_OVERWRITE R2_SPI_OUT_OF_RANGE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* OCR bits are mostly in host.h
|
|
||||||
*/
|
|
||||||
#define MMC_CARD_BUSY 0x80000000 /* Card Power up status bit */
|
|
||||||
#define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */
|
|
||||||
#define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */
|
|
||||||
#define MMC_VDD_21_22 0x00000200 /* VDD voltage 2.1 ~ 2.2 */
|
|
||||||
#define MMC_VDD_22_23 0x00000400 /* VDD voltage 2.2 ~ 2.3 */
|
|
||||||
#define MMC_VDD_23_24 0x00000800 /* VDD voltage 2.3 ~ 2.4 */
|
|
||||||
#define MMC_VDD_24_25 0x00001000 /* VDD voltage 2.4 ~ 2.5 */
|
|
||||||
#define MMC_VDD_25_26 0x00002000 /* VDD voltage 2.5 ~ 2.6 */
|
|
||||||
#define MMC_VDD_26_27 0x00004000 /* VDD voltage 2.6 ~ 2.7 */
|
|
||||||
#define MMC_VDD_27_28 0x00008000 /* VDD voltage 2.7 ~ 2.8 */
|
|
||||||
#define MMC_VDD_28_29 0x00010000 /* VDD voltage 2.8 ~ 2.9 */
|
|
||||||
#define MMC_VDD_29_30 0x00020000 /* VDD voltage 2.9 ~ 3.0 */
|
|
||||||
#define MMC_VDD_30_31 0x00040000 /* VDD voltage 3.0 ~ 3.1 */
|
|
||||||
#define MMC_VDD_31_32 0x00080000 /* VDD voltage 3.1 ~ 3.2 */
|
|
||||||
#define MMC_VDD_32_33 0x00100000 /* VDD voltage 3.2 ~ 3.3 */
|
|
||||||
#define MMC_VDD_33_34 0x00200000 /* VDD voltage 3.3 ~ 3.4 */
|
|
||||||
#define MMC_VDD_34_35 0x00400000 /* VDD voltage 3.4 ~ 3.5 */
|
|
||||||
#define MMC_VDD_35_36 0x00800000 /* VDD voltage 3.5 ~ 3.6 */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Card Command Classes (CCC)
|
|
||||||
*/
|
|
||||||
#define CCC_BASIC (1<<0) /* (0) Basic protocol functions */
|
|
||||||
/* (CMD0,1,2,3,4,7,9,10,12,13,15) */
|
|
||||||
/* (and for SPI, CMD58,59) */
|
|
||||||
#define CCC_STREAM_READ (1<<1) /* (1) Stream read commands */
|
|
||||||
/* (CMD11) */
|
|
||||||
#define CCC_BLOCK_READ (1<<2) /* (2) Block read commands */
|
|
||||||
/* (CMD16,17,18) */
|
|
||||||
#define CCC_STREAM_WRITE (1<<3) /* (3) Stream write commands */
|
|
||||||
/* (CMD20) */
|
|
||||||
#define CCC_BLOCK_WRITE (1<<4) /* (4) Block write commands */
|
|
||||||
/* (CMD16,24,25,26,27) */
|
|
||||||
#define CCC_ERASE (1<<5) /* (5) Ability to erase blocks */
|
|
||||||
/* (CMD32,33,34,35,36,37,38,39) */
|
|
||||||
#define CCC_WRITE_PROT (1<<6) /* (6) Able to write protect blocks */
|
|
||||||
/* (CMD28,29,30) */
|
|
||||||
#define CCC_LOCK_CARD (1<<7) /* (7) Able to lock down card */
|
|
||||||
/* (CMD16,CMD42) */
|
|
||||||
#define CCC_APP_SPEC (1<<8) /* (8) Application specific */
|
|
||||||
/* (CMD55,56,57,ACMD*) */
|
|
||||||
#define CCC_IO_MODE (1<<9) /* (9) I/O mode */
|
|
||||||
/* (CMD5,39,40,52,53) */
|
|
||||||
#define CCC_SWITCH (1<<10) /* (10) High speed switch */
|
|
||||||
/* (CMD6,34,35,36,37,50) */
|
|
||||||
/* (11) Reserved */
|
|
||||||
/* (CMD?) */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* CSD field definitions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define CSD_STRUCT_VER_1_0 0 /* Valid for system specification 1.0 - 1.2 */
|
|
||||||
#define CSD_STRUCT_VER_1_1 1 /* Valid for system specification 1.4 - 2.2 */
|
|
||||||
#define CSD_STRUCT_VER_1_2 2 /* Valid for system specification 3.1 - 3.2 - 3.31 - 4.0 - 4.1 */
|
|
||||||
#define CSD_STRUCT_EXT_CSD 3 /* Version is coded in CSD_STRUCTURE in EXT_CSD */
|
|
||||||
|
|
||||||
#define CSD_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.2 */
|
|
||||||
#define CSD_SPEC_VER_1 1 /* Implements system specification 1.4 */
|
|
||||||
#define CSD_SPEC_VER_2 2 /* Implements system specification 2.0 - 2.2 */
|
|
||||||
#define CSD_SPEC_VER_3 3 /* Implements system specification 3.1 - 3.2 - 3.31 */
|
|
||||||
#define CSD_SPEC_VER_4 4 /* Implements system specification 4.0 - 4.1 */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXT_CSD fields
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define EXT_CSD_CMDQ_MODE_EN 15 /* R/W */
|
|
||||||
#define EXT_CSD_FLUSH_CACHE 32 /* W */
|
|
||||||
#define EXT_CSD_CACHE_CTRL 33 /* R/W */
|
|
||||||
#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
|
|
||||||
#define EXT_CSD_PACKED_FAILURE_INDEX 35 /* RO */
|
|
||||||
#define EXT_CSD_PACKED_CMD_STATUS 36 /* RO */
|
|
||||||
#define EXT_CSD_EXP_EVENTS_STATUS 54 /* RO, 2 bytes */
|
|
||||||
#define EXT_CSD_EXP_EVENTS_CTRL 56 /* R/W, 2 bytes */
|
|
||||||
#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
|
|
||||||
#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
|
|
||||||
#define EXT_CSD_PARTITION_SETTING_COMPLETED 155 /* R/W */
|
|
||||||
#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
|
|
||||||
#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
|
|
||||||
#define EXT_CSD_HPI_MGMT 161 /* R/W */
|
|
||||||
#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
|
|
||||||
#define EXT_CSD_BKOPS_EN 163 /* R/W */
|
|
||||||
#define EXT_CSD_BKOPS_START 164 /* W */
|
|
||||||
#define EXT_CSD_SANITIZE_START 165 /* W */
|
|
||||||
#define EXT_CSD_WR_REL_PARAM 166 /* RO */
|
|
||||||
#define EXT_CSD_RPMB_MULT 168 /* RO */
|
|
||||||
#define EXT_CSD_FW_CONFIG 169 /* R/W */
|
|
||||||
#define EXT_CSD_BOOT_WP 173 /* R/W */
|
|
||||||
#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
|
|
||||||
#define EXT_CSD_PART_CONFIG 179 /* R/W */
|
|
||||||
#define EXT_CSD_ERASED_MEM_CONT 181 /* RO */
|
|
||||||
#define EXT_CSD_BUS_WIDTH 183 /* R/W */
|
|
||||||
#define EXT_CSD_STROBE_SUPPORT 184 /* RO */
|
|
||||||
#define EXT_CSD_HS_TIMING 185 /* R/W */
|
|
||||||
#define EXT_CSD_POWER_CLASS 187 /* R/W */
|
|
||||||
#define EXT_CSD_REV 192 /* RO */
|
|
||||||
#define EXT_CSD_STRUCTURE 194 /* RO */
|
|
||||||
#define EXT_CSD_CARD_TYPE 196 /* RO */
|
|
||||||
#define EXT_CSD_DRIVER_STRENGTH 197 /* RO */
|
|
||||||
#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198 /* RO */
|
|
||||||
#define EXT_CSD_PART_SWITCH_TIME 199 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_52_195 200 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_26_195 201 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_52_360 202 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_26_360 203 /* RO */
|
|
||||||
#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
|
|
||||||
#define EXT_CSD_S_A_TIMEOUT 217 /* RO */
|
|
||||||
#define EXT_CSD_REL_WR_SEC_C 222 /* RO */
|
|
||||||
#define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
|
|
||||||
#define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */
|
|
||||||
#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
|
|
||||||
#define EXT_CSD_BOOT_MULT 226 /* RO */
|
|
||||||
#define EXT_CSD_SEC_TRIM_MULT 229 /* RO */
|
|
||||||
#define EXT_CSD_SEC_ERASE_MULT 230 /* RO */
|
|
||||||
#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
|
|
||||||
#define EXT_CSD_TRIM_MULT 232 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_200_195 236 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_200_360 237 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_DDR_52_195 238 /* RO */
|
|
||||||
#define EXT_CSD_PWR_CL_DDR_52_360 239 /* RO */
|
|
||||||
#define EXT_CSD_BKOPS_STATUS 246 /* RO */
|
|
||||||
#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
|
|
||||||
#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
|
|
||||||
#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
|
|
||||||
#define EXT_CSD_PWR_CL_DDR_200_360 253 /* RO */
|
|
||||||
#define EXT_CSD_FIRMWARE_VERSION 254 /* RO, 8 bytes */
|
|
||||||
#define EXT_CSD_PRE_EOL_INFO 267 /* RO */
|
|
||||||
#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A 268 /* RO */
|
|
||||||
#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B 269 /* RO */
|
|
||||||
#define EXT_CSD_CMDQ_DEPTH 307 /* RO */
|
|
||||||
#define EXT_CSD_CMDQ_SUPPORT 308 /* RO */
|
|
||||||
#define EXT_CSD_SUPPORTED_MODE 493 /* RO */
|
|
||||||
#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
|
|
||||||
#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
|
|
||||||
#define EXT_CSD_MAX_PACKED_WRITES 500 /* RO */
|
|
||||||
#define EXT_CSD_MAX_PACKED_READS 501 /* RO */
|
|
||||||
#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
|
|
||||||
#define EXT_CSD_HPI_FEATURES 503 /* RO */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXT_CSD field definitions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define EXT_CSD_WR_REL_PARAM_EN (1<<2)
|
|
||||||
|
|
||||||
#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40)
|
|
||||||
#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10)
|
|
||||||
#define EXT_CSD_BOOT_WP_B_PERM_WP_EN (0x04)
|
|
||||||
#define EXT_CSD_BOOT_WP_B_PWR_WP_EN (0x01)
|
|
||||||
|
|
||||||
#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7)
|
|
||||||
#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1)
|
|
||||||
#define EXT_CSD_PART_CONFIG_ACC_RPMB (0x3)
|
|
||||||
#define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4)
|
|
||||||
|
|
||||||
#define EXT_CSD_PART_SETTING_COMPLETED (0x1)
|
|
||||||
#define EXT_CSD_PART_SUPPORT_PART_EN (0x1)
|
|
||||||
|
|
||||||
#define EXT_CSD_CMD_SET_NORMAL (1<<0)
|
|
||||||
#define EXT_CSD_CMD_SET_SECURE (1<<1)
|
|
||||||
#define EXT_CSD_CMD_SET_CPSECURE (1<<2)
|
|
||||||
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS_26 (1<<0) /* Card can run at 26MHz */
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS_52 (1<<1) /* Card can run at 52MHz */
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS (EXT_CSD_CARD_TYPE_HS_26 | \
|
|
||||||
EXT_CSD_CARD_TYPE_HS_52)
|
|
||||||
#define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card can run at 52MHz */
|
|
||||||
/* DDR mode @1.8V or 3V I/O */
|
|
||||||
#define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card can run at 52MHz */
|
|
||||||
/* DDR mode @1.2V I/O */
|
|
||||||
#define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \
|
|
||||||
| EXT_CSD_CARD_TYPE_DDR_1_2V)
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS200_1_8V (1<<4) /* Card can run at 200MHz */
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS200_1_2V (1<<5) /* Card can run at 200MHz */
|
|
||||||
/* SDR mode @1.2V I/O */
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS200 (EXT_CSD_CARD_TYPE_HS200_1_8V | \
|
|
||||||
EXT_CSD_CARD_TYPE_HS200_1_2V)
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS400_1_8V (1<<6) /* Card can run at 200MHz DDR, 1.8V */
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS400_1_2V (1<<7) /* Card can run at 200MHz DDR, 1.2V */
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS400 (EXT_CSD_CARD_TYPE_HS400_1_8V | \
|
|
||||||
EXT_CSD_CARD_TYPE_HS400_1_2V)
|
|
||||||
#define EXT_CSD_CARD_TYPE_HS400ES (1<<8) /* Card can run at HS400ES */
|
|
||||||
|
|
||||||
#define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */
|
|
||||||
#define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */
|
|
||||||
#define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */
|
|
||||||
#define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */
|
|
||||||
#define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */
|
|
||||||
#define EXT_CSD_BUS_WIDTH_STROBE BIT(7) /* Enhanced strobe mode */
|
|
||||||
|
|
||||||
#define EXT_CSD_TIMING_BC 0 /* Backwards compatility */
|
|
||||||
#define EXT_CSD_TIMING_HS 1 /* High speed */
|
|
||||||
#define EXT_CSD_TIMING_HS200 2 /* HS200 */
|
|
||||||
#define EXT_CSD_TIMING_HS400 3 /* HS400 */
|
|
||||||
#define EXT_CSD_DRV_STR_SHIFT 4 /* Driver Strength shift */
|
|
||||||
|
|
||||||
#define EXT_CSD_SEC_ER_EN BIT(0)
|
|
||||||
#define EXT_CSD_SEC_BD_BLK_EN BIT(2)
|
|
||||||
#define EXT_CSD_SEC_GB_CL_EN BIT(4)
|
|
||||||
#define EXT_CSD_SEC_SANITIZE BIT(6) /* v4.5 only */
|
|
||||||
|
|
||||||
#define EXT_CSD_RST_N_EN_MASK 0x3
|
|
||||||
#define EXT_CSD_RST_N_ENABLED 1 /* RST_n is enabled on card */
|
|
||||||
|
|
||||||
#define EXT_CSD_NO_POWER_NOTIFICATION 0
|
|
||||||
#define EXT_CSD_POWER_ON 1
|
|
||||||
#define EXT_CSD_POWER_OFF_SHORT 2
|
|
||||||
#define EXT_CSD_POWER_OFF_LONG 3
|
|
||||||
|
|
||||||
#define EXT_CSD_PWR_CL_8BIT_MASK 0xF0 /* 8 bit PWR CLS */
|
|
||||||
#define EXT_CSD_PWR_CL_4BIT_MASK 0x0F /* 8 bit PWR CLS */
|
|
||||||
#define EXT_CSD_PWR_CL_8BIT_SHIFT 4
|
|
||||||
#define EXT_CSD_PWR_CL_4BIT_SHIFT 0
|
|
||||||
|
|
||||||
#define EXT_CSD_PACKED_EVENT_EN BIT(3)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXCEPTION_EVENT_STATUS field
|
|
||||||
*/
|
|
||||||
#define EXT_CSD_URGENT_BKOPS BIT(0)
|
|
||||||
#define EXT_CSD_DYNCAP_NEEDED BIT(1)
|
|
||||||
#define EXT_CSD_SYSPOOL_EXHAUSTED BIT(2)
|
|
||||||
#define EXT_CSD_PACKED_FAILURE BIT(3)
|
|
||||||
|
|
||||||
#define EXT_CSD_PACKED_GENERIC_ERROR BIT(0)
|
|
||||||
#define EXT_CSD_PACKED_INDEXED_ERROR BIT(1)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BKOPS status level
|
|
||||||
*/
|
|
||||||
#define EXT_CSD_BKOPS_LEVEL_2 0x2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BKOPS modes
|
|
||||||
*/
|
|
||||||
#define EXT_CSD_MANUAL_BKOPS_MASK 0x01
|
|
||||||
#define EXT_CSD_AUTO_BKOPS_MASK 0x02
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Command Queue
|
|
||||||
*/
|
|
||||||
#define EXT_CSD_CMDQ_MODE_ENABLED BIT(0)
|
|
||||||
#define EXT_CSD_CMDQ_DEPTH_MASK GENMASK(4, 0)
|
|
||||||
#define EXT_CSD_CMDQ_SUPPORTED BIT(0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MMC_SWITCH access modes
|
|
||||||
*/
|
|
||||||
#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */
|
|
||||||
#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits which are 1 in value */
|
|
||||||
#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits which are 1 in value */
|
|
||||||
#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Erase/trim/discard
|
|
||||||
*/
|
|
||||||
#define MMC_ERASE_ARG 0x00000000
|
|
||||||
#define MMC_SECURE_ERASE_ARG 0x80000000
|
|
||||||
#define MMC_TRIM_ARG 0x00000001
|
|
||||||
#define MMC_DISCARD_ARG 0x00000003
|
|
||||||
#define MMC_SECURE_TRIM1_ARG 0x80000001
|
|
||||||
#define MMC_SECURE_TRIM2_ARG 0x80008000
|
|
||||||
#define MMC_SECURE_ARGS 0x80000000
|
|
||||||
#define MMC_TRIM_ARGS 0x00008001
|
|
||||||
|
|
||||||
#endif /* LINUX_MMC_MMC_H */
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
/*
|
|
||||||
* include/linux/mmc/sd.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved.
|
|
||||||
* Copyright (C) 2018 CTCaer
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or (at
|
|
||||||
* your option) any later version.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef LINUX_MMC_SD_H
|
|
||||||
#define LINUX_MMC_SD_H
|
|
||||||
|
|
||||||
/* SD commands type argument response */
|
|
||||||
/* class 0 */
|
|
||||||
/* This is basically the same command as for MMC with some quirks. */
|
|
||||||
#define SD_SEND_RELATIVE_ADDR 3 /* bcr R6 */
|
|
||||||
#define SD_SEND_IF_COND 8 /* bcr [11:0] See below R7 */
|
|
||||||
#define SD_SWITCH_VOLTAGE 11 /* ac R1 */
|
|
||||||
|
|
||||||
/* class 10 */
|
|
||||||
#define SD_SWITCH 6 /* adtc [31:0] See below R1 */
|
|
||||||
|
|
||||||
/* class 5 */
|
|
||||||
#define SD_ERASE_WR_BLK_START 32 /* ac [31:0] data addr R1 */
|
|
||||||
#define SD_ERASE_WR_BLK_END 33 /* ac [31:0] data addr R1 */
|
|
||||||
|
|
||||||
/* Application commands */
|
|
||||||
#define SD_APP_SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */
|
|
||||||
#define SD_APP_SD_STATUS 13 /* adtc R1 */
|
|
||||||
#define SD_APP_SEND_NUM_WR_BLKS 22 /* adtc R1 */
|
|
||||||
#define SD_APP_OP_COND 41 /* bcr [31:0] OCR R3 */
|
|
||||||
#define SD_APP_SET_CLR_CARD_DETECT 42 /* ac [0] set cd R1 */
|
|
||||||
#define SD_APP_SEND_SCR 51 /* adtc R1 */
|
|
||||||
|
|
||||||
/* OCR bit definitions */
|
|
||||||
#define SD_OCR_S18R (1 << 24) /* 1.8V switching request */
|
|
||||||
#define SD_ROCR_S18A SD_OCR_S18R /* 1.8V switching accepted by card */
|
|
||||||
#define SD_OCR_XPC (1 << 28) /* SDXC power control */
|
|
||||||
#define SD_OCR_CCS (1 << 30) /* Card Capacity Status */
|
|
||||||
#define SD_OCR_VDD_LOW (1 << 7) /* SD: Reserved for Low Voltage Range */
|
|
||||||
#define SD_OCR_VDD_20_21 (1 << 8)
|
|
||||||
#define SD_OCR_VDD_21_22 (1 << 9)
|
|
||||||
#define SD_OCR_VDD_22_23 (1 << 10)
|
|
||||||
#define SD_OCR_VDD_23_24 (1 << 11)
|
|
||||||
#define SD_OCR_VDD_24_25 (1 << 12)
|
|
||||||
#define SD_OCR_VDD_25_26 (1 << 13)
|
|
||||||
#define SD_OCR_VDD_26_27 (1 << 14)
|
|
||||||
#define SD_OCR_VDD_27_28 (1 << 15)
|
|
||||||
#define SD_OCR_VDD_28_29 (1 << 16)
|
|
||||||
#define SD_OCR_VDD_29_30 (1 << 17)
|
|
||||||
#define SD_OCR_VDD_30_31 (1 << 18)
|
|
||||||
#define SD_OCR_VDD_31_32 (1 << 19)
|
|
||||||
#define SD_OCR_VDD_32_33 (1 << 20)
|
|
||||||
#define SD_OCR_VDD_33_34 (1 << 21)
|
|
||||||
#define SD_OCR_VDD_34_35 (1 << 22)
|
|
||||||
#define SD_OCR_VDD_35_36 (1 << 23)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH argument format:
|
|
||||||
*
|
|
||||||
* [31] Check (0) or switch (1)
|
|
||||||
* [30:24] Reserved (0)
|
|
||||||
* [23:20] Function group 6
|
|
||||||
* [19:16] Function group 5
|
|
||||||
* [15:12] Function group 4
|
|
||||||
* [11:8] Function group 3
|
|
||||||
* [7:4] Function group 2
|
|
||||||
* [3:0] Function group 1
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SEND_IF_COND argument format:
|
|
||||||
*
|
|
||||||
* [31:12] Reserved (0)
|
|
||||||
* [11:8] Host Voltage Supply Flags
|
|
||||||
* [7:0] Check Pattern (0xAA)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SCR field definitions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SD_SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
|
|
||||||
#define SD_SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
|
|
||||||
#define SD_SCR_SPEC_VER_2 2 /* Implements system specification 2.00-3.0X */
|
|
||||||
#define SD_SCR_BUS_WIDTH_1 1
|
|
||||||
#define SD_SCR_BUS_WIDTH_4 4
|
|
||||||
#define SD_SCR_CMD20_SUPPORT 1
|
|
||||||
#define SD_SCR_CMD23_SUPPORT 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD bus widths
|
|
||||||
*/
|
|
||||||
#define SD_BUS_WIDTH_1 0
|
|
||||||
#define SD_BUS_WIDTH_4 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD bus speed modes
|
|
||||||
*/
|
|
||||||
#define UHS_SDR12_BUS_SPEED 0
|
|
||||||
#define HIGH_SPEED_BUS_SPEED 1
|
|
||||||
#define UHS_SDR25_BUS_SPEED 1
|
|
||||||
#define UHS_SDR50_BUS_SPEED 2
|
|
||||||
#define UHS_SDR104_BUS_SPEED 3
|
|
||||||
#define UHS_DDR50_BUS_SPEED 4
|
|
||||||
#define SD_MODE_HIGH_SPEED (1 << HIGH_SPEED_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR12 (1 << UHS_SDR12_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR25 (1 << UHS_SDR25_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR50 (1 << UHS_SDR50_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR104 (1 << UHS_SDR104_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_DDR50 (1 << UHS_DDR50_BUS_SPEED)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD bus driver types
|
|
||||||
*/
|
|
||||||
#define SD_DRIVER_TYPE_B 0x01
|
|
||||||
#define SD_DRIVER_TYPE_A 0x02
|
|
||||||
#define SD_DRIVER_TYPE_C 0x04
|
|
||||||
#define SD_DRIVER_TYPE_D 0x08
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD bus current limits
|
|
||||||
*/
|
|
||||||
#define SD_SET_CURRENT_LIMIT_200 0
|
|
||||||
#define SD_SET_CURRENT_LIMIT_400 1
|
|
||||||
#define SD_SET_CURRENT_LIMIT_600 2
|
|
||||||
#define SD_SET_CURRENT_LIMIT_800 3
|
|
||||||
#define SD_SET_CURRENT_NO_CHANGE (-1)
|
|
||||||
#define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200)
|
|
||||||
#define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400)
|
|
||||||
#define SD_MAX_CURRENT_600 (1 << SD_SET_CURRENT_LIMIT_600)
|
|
||||||
#define SD_MAX_CURRENT_800 (1 << SD_SET_CURRENT_LIMIT_800)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH mode
|
|
||||||
*/
|
|
||||||
#define SD_SWITCH_CHECK 0
|
|
||||||
#define SD_SWITCH_SET 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH function groups
|
|
||||||
*/
|
|
||||||
#define SD_SWITCH_GRP_ACCESS 0
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH access modes
|
|
||||||
*/
|
|
||||||
#define SD_SWITCH_ACCESS_DEF 0
|
|
||||||
#define SD_SWITCH_ACCESS_HS 1
|
|
||||||
|
|
||||||
#endif /* LINUX_MMC_SD_H */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,179 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018 naehrwert
|
|
||||||
* Copyright (c) 2018 CTCaer
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FUSEE_SDMMC_H
|
|
||||||
#define FUSEE_SDMMC_H
|
|
||||||
|
|
||||||
#include "sdmmc_core.h"
|
|
||||||
|
|
||||||
/* Structure for storing the MMC CID (adapted from Linux headers) */
|
|
||||||
typedef struct {
|
|
||||||
uint32_t manfid;
|
|
||||||
uint8_t prod_name[8];
|
|
||||||
uint8_t prv;
|
|
||||||
uint32_t serial;
|
|
||||||
uint16_t oemid;
|
|
||||||
uint16_t year;
|
|
||||||
uint8_t hwrev;
|
|
||||||
uint8_t fwrev;
|
|
||||||
uint8_t month;
|
|
||||||
} mmc_cid_t;
|
|
||||||
|
|
||||||
/* Structure for storing the MMC CSD (adapted from Linux headers) */
|
|
||||||
typedef struct {
|
|
||||||
uint8_t structure;
|
|
||||||
uint8_t mmca_vsn;
|
|
||||||
uint16_t cmdclass;
|
|
||||||
uint16_t taac_clks;
|
|
||||||
uint32_t taac_ns;
|
|
||||||
uint32_t c_size;
|
|
||||||
uint32_t r2w_factor;
|
|
||||||
uint32_t max_dtr;
|
|
||||||
uint32_t erase_size; /* In sectors */
|
|
||||||
uint32_t read_blkbits;
|
|
||||||
uint32_t write_blkbits;
|
|
||||||
uint32_t capacity;
|
|
||||||
uint32_t read_partial:1,
|
|
||||||
read_misalign:1,
|
|
||||||
write_partial:1,
|
|
||||||
write_misalign:1,
|
|
||||||
dsr_imp:1;
|
|
||||||
} mmc_csd_t;
|
|
||||||
|
|
||||||
/* Structure for storing the MMC extended CSD (adapted from Linux headers) */
|
|
||||||
typedef struct {
|
|
||||||
uint8_t rev;
|
|
||||||
uint8_t erase_group_def;
|
|
||||||
uint8_t sec_feature_support;
|
|
||||||
uint8_t rel_sectors;
|
|
||||||
uint8_t rel_param;
|
|
||||||
uint8_t part_config;
|
|
||||||
uint8_t cache_ctrl;
|
|
||||||
uint8_t rst_n_function;
|
|
||||||
uint8_t max_packed_writes;
|
|
||||||
uint8_t max_packed_reads;
|
|
||||||
uint8_t packed_event_en;
|
|
||||||
uint32_t part_time; /* Units: ms */
|
|
||||||
uint32_t sa_timeout; /* Units: 100ns */
|
|
||||||
uint32_t generic_cmd6_time; /* Units: 10ms */
|
|
||||||
uint32_t power_off_longtime; /* Units: ms */
|
|
||||||
uint8_t power_off_notification; /* state */
|
|
||||||
uint32_t hs_max_dtr;
|
|
||||||
uint32_t hs200_max_dtr;
|
|
||||||
uint32_t sectors;
|
|
||||||
uint32_t hc_erase_size; /* In sectors */
|
|
||||||
uint32_t hc_erase_timeout; /* In milliseconds */
|
|
||||||
uint32_t sec_trim_mult; /* Secure trim multiplier */
|
|
||||||
uint32_t sec_erase_mult; /* Secure erase multiplier */
|
|
||||||
uint32_t trim_timeout; /* In milliseconds */
|
|
||||||
uint32_t partition_setting_completed; /* enable bit */
|
|
||||||
uint64_t enhanced_area_offset; /* Units: Byte */
|
|
||||||
uint32_t enhanced_area_size; /* Units: KB */
|
|
||||||
uint32_t cache_size; /* Units: KB */
|
|
||||||
uint32_t hpi_en; /* HPI enablebit */
|
|
||||||
uint32_t hpi; /* HPI support bit */
|
|
||||||
uint32_t hpi_cmd; /* cmd used as HPI */
|
|
||||||
uint32_t bkops; /* background support bit */
|
|
||||||
uint32_t man_bkops_en; /* manual bkops enable bit */
|
|
||||||
uint32_t auto_bkops_en; /* auto bkops enable bit */
|
|
||||||
uint32_t data_sector_size; /* 512 bytes or 4KB */
|
|
||||||
uint32_t data_tag_unit_size; /* DATA TAG UNIT size */
|
|
||||||
uint32_t boot_ro_lock; /* ro lock support */
|
|
||||||
uint32_t boot_ro_lockable;
|
|
||||||
uint32_t ffu_capable; /* Firmware upgrade support */
|
|
||||||
uint32_t cmdq_en; /* Command Queue enabled */
|
|
||||||
uint32_t cmdq_support; /* Command Queue supported */
|
|
||||||
uint32_t cmdq_depth; /* Command Queue depth */
|
|
||||||
uint8_t fwrev[8]; /* FW version */
|
|
||||||
uint8_t raw_exception_status; /* 54 */
|
|
||||||
uint8_t raw_partition_support; /* 160 */
|
|
||||||
uint8_t raw_rpmb_size_mult; /* 168 */
|
|
||||||
uint8_t raw_erased_mem_count; /* 181 */
|
|
||||||
uint8_t strobe_support; /* 184 */
|
|
||||||
uint8_t raw_ext_csd_structure; /* 194 */
|
|
||||||
uint8_t raw_card_type; /* 196 */
|
|
||||||
uint8_t raw_driver_strength; /* 197 */
|
|
||||||
uint8_t out_of_int_time; /* 198 */
|
|
||||||
uint8_t raw_pwr_cl_52_195; /* 200 */
|
|
||||||
uint8_t raw_pwr_cl_26_195; /* 201 */
|
|
||||||
uint8_t raw_pwr_cl_52_360; /* 202 */
|
|
||||||
uint8_t raw_pwr_cl_26_360; /* 203 */
|
|
||||||
uint8_t raw_s_a_timeout; /* 217 */
|
|
||||||
uint8_t raw_hc_erase_gap_size; /* 221 */
|
|
||||||
uint8_t raw_erase_timeout_mult; /* 223 */
|
|
||||||
uint8_t raw_hc_erase_grp_size; /* 224 */
|
|
||||||
uint8_t raw_sec_trim_mult; /* 229 */
|
|
||||||
uint8_t raw_sec_erase_mult; /* 230 */
|
|
||||||
uint8_t raw_sec_feature_support; /* 231 */
|
|
||||||
uint8_t raw_trim_mult; /* 232 */
|
|
||||||
uint8_t raw_pwr_cl_200_195; /* 236 */
|
|
||||||
uint8_t raw_pwr_cl_200_360; /* 237 */
|
|
||||||
uint8_t raw_pwr_cl_ddr_52_195; /* 238 */
|
|
||||||
uint8_t raw_pwr_cl_ddr_52_360; /* 239 */
|
|
||||||
uint8_t raw_pwr_cl_ddr_200_360; /* 253 */
|
|
||||||
uint8_t raw_bkops_status; /* 246 */
|
|
||||||
uint8_t raw_sectors[4]; /* 212 - 4 bytes */
|
|
||||||
uint8_t pre_eol_info; /* 267 */
|
|
||||||
uint8_t device_life_time_est_typ_a; /* 268 */
|
|
||||||
uint8_t device_life_time_est_typ_b; /* 269 */
|
|
||||||
uint32_t feature_support;
|
|
||||||
} mmc_ext_csd_t;
|
|
||||||
|
|
||||||
/* Structure for storing the SD SCR (adapted from Linux headers) */
|
|
||||||
typedef struct {
|
|
||||||
uint8_t sda_vsn;
|
|
||||||
uint8_t sda_spec3;
|
|
||||||
uint8_t bus_widths;
|
|
||||||
uint8_t cmds;
|
|
||||||
} sd_scr_t;
|
|
||||||
|
|
||||||
/* Structure for storing the SD SSR (adapted from Linux headers) */
|
|
||||||
typedef struct {
|
|
||||||
uint8_t dat_bus_width;
|
|
||||||
uint8_t secured_mode;
|
|
||||||
uint16_t sd_card_type;
|
|
||||||
uint8_t speed_class;
|
|
||||||
uint8_t uhs_speed_grade;
|
|
||||||
uint8_t uhs_au_size;
|
|
||||||
uint8_t video_speed_class;
|
|
||||||
uint8_t app_perf_class;
|
|
||||||
} sd_ssr_t;
|
|
||||||
|
|
||||||
/* Structure describing a SDMMC device's context. */
|
|
||||||
typedef struct {
|
|
||||||
/* Underlying driver context. */
|
|
||||||
sdmmc_t *sdmmc;
|
|
||||||
|
|
||||||
bool is_180v;
|
|
||||||
bool is_block_sdhc;
|
|
||||||
uint32_t rca;
|
|
||||||
mmc_cid_t cid;
|
|
||||||
mmc_csd_t csd;
|
|
||||||
mmc_ext_csd_t ext_csd;
|
|
||||||
sd_scr_t scr;
|
|
||||||
sd_ssr_t ssr;
|
|
||||||
} sdmmc_device_t;
|
|
||||||
|
|
||||||
int sdmmc_device_sd_init(sdmmc_device_t *device, sdmmc_t *sdmmc, SdmmcBusWidth bus_width, SdmmcBusSpeed bus_speed);
|
|
||||||
int sdmmc_device_mmc_init(sdmmc_device_t *device, sdmmc_t *sdmmc, SdmmcBusWidth bus_width, SdmmcBusSpeed bus_speed);
|
|
||||||
int sdmmc_device_read(sdmmc_device_t *device, uint32_t sector, uint32_t num_sectors, void *data);
|
|
||||||
int sdmmc_device_write(sdmmc_device_t *device, uint32_t sector, uint32_t num_sectors, void *data);
|
|
||||||
int sdmmc_device_finish(sdmmc_device_t *device);
|
|
||||||
int sdmmc_mmc_select_partition(sdmmc_device_t *device, SdmmcPartitionNum partition);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,312 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018 naehrwert
|
|
||||||
* Copyright (c) 2018 CTCaer
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FUSEE_SDMMC_CORE_H
|
|
||||||
#define FUSEE_SDMMC_CORE_H
|
|
||||||
|
|
||||||
#include "sdmmc_tegra.h"
|
|
||||||
|
|
||||||
/* Bounce buffer */
|
|
||||||
#define SDMMC_BOUNCE_BUFFER_ADDRESS 0x90000000
|
|
||||||
|
|
||||||
/* Present state */
|
|
||||||
#define SDHCI_CMD_INHIBIT 0x00000001
|
|
||||||
#define SDHCI_DATA_INHIBIT 0x00000002
|
|
||||||
#define SDHCI_DOING_WRITE 0x00000100
|
|
||||||
#define SDHCI_DOING_READ 0x00000200
|
|
||||||
#define SDHCI_SPACE_AVAILABLE 0x00000400
|
|
||||||
#define SDHCI_DATA_AVAILABLE 0x00000800
|
|
||||||
#define SDHCI_CARD_PRESENT 0x00010000
|
|
||||||
#define SDHCI_WRITE_PROTECT 0x00080000
|
|
||||||
#define SDHCI_DATA_LVL_MASK 0x00F00000
|
|
||||||
#define SDHCI_DATA_LVL_SHIFT 20
|
|
||||||
#define SDHCI_DATA_0_LVL_MASK 0x00100000
|
|
||||||
#define SDHCI_CMD_LVL 0x01000000
|
|
||||||
|
|
||||||
/* SDHCI clock control */
|
|
||||||
#define SDHCI_DIVIDER_SHIFT 8
|
|
||||||
#define SDHCI_DIVIDER_HI_SHIFT 6
|
|
||||||
#define SDHCI_DIV_MASK 0xFF
|
|
||||||
#define SDHCI_DIV_MASK_LEN 8
|
|
||||||
#define SDHCI_DIV_HI_MASK 0x300
|
|
||||||
#define SDHCI_PROG_CLOCK_MODE 0x0020
|
|
||||||
#define SDHCI_CLOCK_CARD_EN 0x0004
|
|
||||||
#define SDHCI_CLOCK_INT_STABLE 0x0002
|
|
||||||
#define SDHCI_CLOCK_INT_EN 0x0001
|
|
||||||
|
|
||||||
/* SDHCI host control */
|
|
||||||
#define SDHCI_CTRL_LED 0x01
|
|
||||||
#define SDHCI_CTRL_4BITBUS 0x02
|
|
||||||
#define SDHCI_CTRL_HISPD 0x04
|
|
||||||
#define SDHCI_CTRL_DMA_MASK 0x18
|
|
||||||
#define SDHCI_CTRL_SDMA 0x00
|
|
||||||
#define SDHCI_CTRL_ADMA1 0x08
|
|
||||||
#define SDHCI_CTRL_ADMA32 0x10
|
|
||||||
#define SDHCI_CTRL_ADMA64 0x18
|
|
||||||
#define SDHCI_CTRL_8BITBUS 0x20
|
|
||||||
#define SDHCI_CTRL_CDTEST_INS 0x40
|
|
||||||
#define SDHCI_CTRL_CDTEST_EN 0x80
|
|
||||||
|
|
||||||
/* SDHCI host control 2 */
|
|
||||||
#define SDHCI_CTRL_UHS_MASK 0x0007
|
|
||||||
#define SDHCI_CTRL_UHS_SDR12 0x0000
|
|
||||||
#define SDHCI_CTRL_UHS_SDR25 0x0001
|
|
||||||
#define SDHCI_CTRL_UHS_SDR50 0x0002
|
|
||||||
#define SDHCI_CTRL_UHS_SDR104 0x0003
|
|
||||||
#define SDHCI_CTRL_UHS_DDR50 0x0004
|
|
||||||
#define SDHCI_CTRL_HS400 0x0005
|
|
||||||
#define SDHCI_CTRL_VDD_180 0x0008
|
|
||||||
#define SDHCI_CTRL_DRV_TYPE_MASK 0x0030
|
|
||||||
#define SDHCI_CTRL_DRV_TYPE_B 0x0000
|
|
||||||
#define SDHCI_CTRL_DRV_TYPE_A 0x0010
|
|
||||||
#define SDHCI_CTRL_DRV_TYPE_C 0x0020
|
|
||||||
#define SDHCI_CTRL_DRV_TYPE_D 0x0030
|
|
||||||
#define SDHCI_CTRL_EXEC_TUNING 0x0040
|
|
||||||
#define SDHCI_CTRL_TUNED_CLK 0x0080
|
|
||||||
#define SDHCI_UHS2_IF_EN 0x0100
|
|
||||||
#define SDHCI_HOST_VERSION_4_EN 0x1000
|
|
||||||
#define SDHCI_ADDRESSING_64BIT_EN 0x2000
|
|
||||||
#define SDHCI_ASYNC_INTR_EN 0x4000
|
|
||||||
#define SDHCI_CTRL_PRESET_VAL_ENABLE 0x8000
|
|
||||||
|
|
||||||
/* SDHCI capabilities */
|
|
||||||
#define SDHCI_CAN_DO_8BIT 0x00040000
|
|
||||||
#define SDHCI_CAN_DO_ADMA2 0x00080000
|
|
||||||
#define SDHCI_CAN_DO_ADMA1 0x00100000
|
|
||||||
#define SDHCI_CAN_DO_HISPD 0x00200000
|
|
||||||
#define SDHCI_CAN_DO_SDMA 0x00400000
|
|
||||||
#define SDHCI_CAN_VDD_330 0x01000000
|
|
||||||
#define SDHCI_CAN_VDD_300 0x02000000
|
|
||||||
#define SDHCI_CAN_VDD_180 0x04000000
|
|
||||||
#define SDHCI_CAN_64BIT 0x10000000
|
|
||||||
#define SDHCI_ASYNC_INTR 0x20000000
|
|
||||||
|
|
||||||
/* Vendor clock control */
|
|
||||||
#define SDMMC_CLOCK_TAP_MASK (0xFF << 16)
|
|
||||||
#define SDMMC_CLOCK_TAP_SDMMC1 (0x04 << 16)
|
|
||||||
#define SDMMC_CLOCK_TAP_SDMMC2 (0x00 << 16)
|
|
||||||
#define SDMMC_CLOCK_TAP_SDMMC3 (0x03 << 16)
|
|
||||||
#define SDMMC_CLOCK_TAP_SDMMC4 (0x00 << 16)
|
|
||||||
#define SDMMC_CLOCK_TRIM_MASK (0xFF << 24)
|
|
||||||
#define SDMMC_CLOCK_TRIM_SDMMC1_ERISTA (0x02 << 24)
|
|
||||||
#define SDMMC_CLOCK_TRIM_SDMMC1_MARIKO (0x0E << 24)
|
|
||||||
#define SDMMC_CLOCK_TRIM_SDMMC2_ERISTA (0x08 << 24)
|
|
||||||
#define SDMMC_CLOCK_TRIM_SDMMC2_MARIKO (0x0D << 24)
|
|
||||||
#define SDMMC_CLOCK_TRIM_SDMMC3 (0x03 << 24)
|
|
||||||
#define SDMMC_CLOCK_TRIM_SDMMC4_ERISTA (0x08 << 24)
|
|
||||||
#define SDMMC_CLOCK_TRIM_SDMMC4_MARIKO (0x0D << 24)
|
|
||||||
#define SDMMC_CLOCK_SPI_MODE_CLKEN_OVERRIDE (1 << 2)
|
|
||||||
#define SDMMC_CLOCK_PADPIPE_CLKEN_OVERRIDE (1 << 3)
|
|
||||||
|
|
||||||
/* Autocal configuration */
|
|
||||||
#define SDMMC_AUTOCAL_PDPU_CONFIG_MASK 0x7F7F
|
|
||||||
#define SDMMC_AUTOCAL_PDPU_SDMMC1_1V8_ERISTA 0x7B7B
|
|
||||||
#define SDMMC_AUTOCAL_PDPU_SDMMC1_1V8_MARIKO 0x0606
|
|
||||||
#define SDMMC_AUTOCAL_PDPU_SDMMC1_3V3_ERISTA 0x7D00
|
|
||||||
#define SDMMC_AUTOCAL_PDPU_SDMMC1_3V3_MARIKO 0x0000
|
|
||||||
#define SDMMC_AUTOCAL_PDPU_SDMMC4_1V8 0x0505
|
|
||||||
#define SDMMC_AUTOCAL_START (1 << 31)
|
|
||||||
#define SDMMC_AUTOCAL_ENABLE (1 << 29)
|
|
||||||
|
|
||||||
/* Autocal status */
|
|
||||||
#define SDMMC_AUTOCAL_ACTIVE (1 << 31)
|
|
||||||
|
|
||||||
/* Vendor tuning control 0*/
|
|
||||||
#define SDMMC_VENDOR_TUNING_TRIES_MASK (0x7 << 13)
|
|
||||||
#define SDMMC_VENDOR_TUNING_TRIES_SHIFT 13
|
|
||||||
#define SDMMC_VENDOR_TUNING_MULTIPLIER_MASK (0x7F << 6)
|
|
||||||
#define SDMMC_VENDOR_TUNING_MULTIPLIER_UNITY (1 << 6)
|
|
||||||
#define SDMMC_VENDOR_TUNING_DIVIDER_MASK (0x7 << 3)
|
|
||||||
#define SDMMC_VENDOR_TUNING_SET_BY_HW (1 << 17)
|
|
||||||
|
|
||||||
/* Vendor tuning control 1*/
|
|
||||||
#define SDMMC_VENDOR_TUNING_STEP_SIZE_SDR50_DEFAULT (0 << 0)
|
|
||||||
#define SDMMC_VENDOR_TUNING_STEP_SIZE_SDR104_DEFAULT (0 << 4)
|
|
||||||
|
|
||||||
/* Vendor capability overrides */
|
|
||||||
#define SDMMC_VENDOR_CAPABILITY_DQS_TRIM_MASK (0x3F << 8)
|
|
||||||
#define SDMMC_VENDOR_CAPABILITY_DQS_TRIM_HS400 (0x11 << 8)
|
|
||||||
|
|
||||||
/* Timeouts */
|
|
||||||
#define SDMMC_AUTOCAL_TIMEOUT (10 * 1000)
|
|
||||||
#define SDMMC_TUNING_TIMEOUT (150 * 1000)
|
|
||||||
|
|
||||||
/* Command response flags */
|
|
||||||
#define SDMMC_RSP_PRESENT (1 << 0)
|
|
||||||
#define SDMMC_RSP_136 (1 << 1)
|
|
||||||
#define SDMMC_RSP_CRC (1 << 2)
|
|
||||||
#define SDMMC_RSP_BUSY (1 << 3)
|
|
||||||
#define SDMMC_RSP_OPCODE (1 << 4)
|
|
||||||
|
|
||||||
/* Command types */
|
|
||||||
#define SDMMC_CMD_MASK (3 << 5)
|
|
||||||
#define SDMMC_CMD_AC (0 << 5)
|
|
||||||
#define SDMMC_CMD_ADTC (1 << 5)
|
|
||||||
#define SDMMC_CMD_BC (2 << 5)
|
|
||||||
#define SDMMC_CMD_BCR (3 << 5)
|
|
||||||
|
|
||||||
/* SPI command response flags */
|
|
||||||
#define SDMMC_RSP_SPI_S1 (1 << 7)
|
|
||||||
#define SDMMC_RSP_SPI_S2 (1 << 8)
|
|
||||||
#define SDMMC_RSP_SPI_B4 (1 << 9)
|
|
||||||
#define SDMMC_RSP_SPI_BUSY (1 << 10)
|
|
||||||
|
|
||||||
/* Native response types for commands */
|
|
||||||
#define SDMMC_RSP_NONE (0)
|
|
||||||
#define SDMMC_RSP_R1 (SDMMC_RSP_PRESENT|SDMMC_RSP_CRC|SDMMC_RSP_OPCODE)
|
|
||||||
#define SDMMC_RSP_R1B (SDMMC_RSP_PRESENT|SDMMC_RSP_CRC|SDMMC_RSP_OPCODE|SDMMC_RSP_BUSY)
|
|
||||||
#define SDMMC_RSP_R2 (SDMMC_RSP_PRESENT|SDMMC_RSP_136|SDMMC_RSP_CRC)
|
|
||||||
#define SDMMC_RSP_R3 (SDMMC_RSP_PRESENT)
|
|
||||||
#define SDMMC_RSP_R4 (SDMMC_RSP_PRESENT)
|
|
||||||
#define SDMMC_RSP_R5 (SDMMC_RSP_PRESENT|SDMMC_RSP_CRC|SDMMC_RSP_OPCODE)
|
|
||||||
#define SDMMC_RSP_R6 (SDMMC_RSP_PRESENT|SDMMC_RSP_CRC|SDMMC_RSP_OPCODE)
|
|
||||||
#define SDMMC_RSP_R7 (SDMMC_RSP_PRESENT|SDMMC_RSP_CRC|SDMMC_RSP_OPCODE)
|
|
||||||
#define SDMMC_RSP_R1_NO_CRC (SDMMC_RSP_PRESENT|SDMMC_RSP_OPCODE)
|
|
||||||
|
|
||||||
/* SPI response types for commands */
|
|
||||||
#define SDMMC_RSP_SPI_R1 (SDMMC_RSP_SPI_S1)
|
|
||||||
#define SDMMC_RSP_SPI_R1B (SDMMC_RSP_SPI_S1|SDMMC_RSP_SPI_BUSY)
|
|
||||||
#define SDMMC_RSP_SPI_R2 (SDMMC_RSP_SPI_S1|SDMMC_RSP_SPI_S2)
|
|
||||||
#define SDMMC_RSP_SPI_R3 (SDMMC_RSP_SPI_S1|SDMMC_RSP_SPI_B4)
|
|
||||||
#define SDMMC_RSP_SPI_R4 (SDMMC_RSP_SPI_S1|SDMMC_RSP_SPI_B4)
|
|
||||||
#define SDMMC_RSP_SPI_R5 (SDMMC_RSP_SPI_S1|SDMMC_RSP_SPI_S2)
|
|
||||||
#define SDMMC_RSP_SPI_R7 (SDMMC_RSP_SPI_S1|SDMMC_RSP_SPI_B4)
|
|
||||||
|
|
||||||
/* SDMMC controllers */
|
|
||||||
typedef enum {
|
|
||||||
SDMMC_1 = 0,
|
|
||||||
SDMMC_2 = 1,
|
|
||||||
SDMMC_3 = 2,
|
|
||||||
SDMMC_4 = 3
|
|
||||||
} SdmmcControllerNum;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SDMMC_PARTITION_INVALID = -1,
|
|
||||||
SDMMC_PARTITION_USER = 0,
|
|
||||||
SDMMC_PARTITION_BOOT0 = 1,
|
|
||||||
SDMMC_PARTITION_BOOT1 = 2,
|
|
||||||
SDMMC_PARTITION_RPMB = 3
|
|
||||||
} SdmmcPartitionNum;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SDMMC_VOLTAGE_NONE = 0,
|
|
||||||
SDMMC_VOLTAGE_1V8 = 1,
|
|
||||||
SDMMC_VOLTAGE_3V3 = 2
|
|
||||||
} SdmmcBusVoltage;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SDMMC_BUS_WIDTH_1BIT = 0,
|
|
||||||
SDMMC_BUS_WIDTH_4BIT = 1,
|
|
||||||
SDMMC_BUS_WIDTH_8BIT = 2
|
|
||||||
} SdmmcBusWidth;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SDMMC_SPEED_MMC_IDENT = 0,
|
|
||||||
SDMMC_SPEED_MMC_LEGACY = 1,
|
|
||||||
SDMMC_SPEED_MMC_HS = 2,
|
|
||||||
SDMMC_SPEED_MMC_HS200 = 3,
|
|
||||||
SDMMC_SPEED_MMC_HS400 = 4,
|
|
||||||
SDMMC_SPEED_SD_IDENT = 5,
|
|
||||||
SDMMC_SPEED_SD_DS = 6,
|
|
||||||
SDMMC_SPEED_SD_HS = 7,
|
|
||||||
SDMMC_SPEED_SD_SDR12 = 8,
|
|
||||||
SDMMC_SPEED_SD_SDR25 = 9,
|
|
||||||
SDMMC_SPEED_SD_SDR50 = 10,
|
|
||||||
SDMMC_SPEED_SD_SDR104 = 11,
|
|
||||||
SDMMC_SPEED_SD_DDR50 = 12,
|
|
||||||
SDMMC_SPEED_GC_ASIC_FPGA = 13,
|
|
||||||
SDMMC_SPEED_GC_ASIC = 14,
|
|
||||||
SDMMC_SPEED_EMU_SDR104 = 255, /* Custom speed mode. Prevents low voltage switch in MMC emulation. */
|
|
||||||
} SdmmcBusSpeed;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SDMMC_CAR_DIVIDER_MMC_LEGACY = 30, /* (16 * 2) - 2 */
|
|
||||||
SDMMC_CAR_DIVIDER_MMC_HS = 14, /* (8 * 2) - 2 */
|
|
||||||
SDMMC_CAR_DIVIDER_MMC_HS200 = 3, /* (2.5 * 2) - 2 (for PLLP_OUT0, same as HS400) */
|
|
||||||
SDMMC_CAR_DIVIDER_SD_SDR12 = 31, /* (16.5 * 2) - 2 */
|
|
||||||
SDMMC_CAR_DIVIDER_SD_SDR25 = 15, /* (8.5 * 2) - 2 */
|
|
||||||
SDMMC_CAR_DIVIDER_SD_SDR50 = 7, /* (4.5 * 2) - 2 */
|
|
||||||
SDMMC_CAR_DIVIDER_SD_SDR104 = 2, /* (2 * 2) - 2 */
|
|
||||||
SDMMC_CAR_DIVIDER_GC_ASIC_FPGA = 18, /* (5 * 2 * 2) - 2 */
|
|
||||||
} SdmmcCarDivider;
|
|
||||||
|
|
||||||
/* Structure for describing a SDMMC device. */
|
|
||||||
typedef struct {
|
|
||||||
/* Controller number */
|
|
||||||
SdmmcControllerNum controller;
|
|
||||||
|
|
||||||
/* Backing register space */
|
|
||||||
volatile tegra_sdmmc_t *regs;
|
|
||||||
|
|
||||||
/* Controller properties */
|
|
||||||
const char *name;
|
|
||||||
bool has_sd;
|
|
||||||
bool is_clk_running;
|
|
||||||
bool is_sd_clk_enabled;
|
|
||||||
bool is_tuning_tap_val_set;
|
|
||||||
bool use_adma;
|
|
||||||
uint32_t tap_val;
|
|
||||||
uint32_t internal_divider;
|
|
||||||
uint32_t resp[4];
|
|
||||||
uint32_t resp_auto_cmd12;
|
|
||||||
uint32_t next_dma_addr;
|
|
||||||
uint8_t* dma_bounce_buf;
|
|
||||||
SdmmcBusVoltage bus_voltage;
|
|
||||||
SdmmcBusWidth bus_width;
|
|
||||||
|
|
||||||
/* Per-controller operations. */
|
|
||||||
int (*sdmmc_config)();
|
|
||||||
} sdmmc_t;
|
|
||||||
|
|
||||||
/* Structure for describing a SDMMC command. */
|
|
||||||
typedef struct {
|
|
||||||
uint32_t opcode;
|
|
||||||
uint32_t arg;
|
|
||||||
uint32_t resp[4];
|
|
||||||
uint32_t flags; /* Expected response type. */
|
|
||||||
} sdmmc_command_t;
|
|
||||||
|
|
||||||
/* Structure for describing a SDMMC request. */
|
|
||||||
typedef struct {
|
|
||||||
void* data;
|
|
||||||
uint32_t blksz;
|
|
||||||
uint32_t num_blocks;
|
|
||||||
bool is_multi_block;
|
|
||||||
bool is_read;
|
|
||||||
bool is_auto_cmd12;
|
|
||||||
} sdmmc_request_t;
|
|
||||||
|
|
||||||
int sdmmc_init(sdmmc_t *sdmmc, SdmmcControllerNum controller, SdmmcBusVoltage bus_voltage, SdmmcBusWidth bus_width, SdmmcBusSpeed bus_speed);
|
|
||||||
void sdmmc_finish(sdmmc_t *sdmmc);
|
|
||||||
int sdmmc_select_speed(sdmmc_t *sdmmc, SdmmcBusSpeed bus_speed);
|
|
||||||
void sdmmc_select_bus_width(sdmmc_t *sdmmc, SdmmcBusWidth width);
|
|
||||||
void sdmmc_select_voltage(sdmmc_t *sdmmc, SdmmcBusVoltage voltage);
|
|
||||||
void sdmmc_adjust_sd_clock(sdmmc_t *sdmmc);
|
|
||||||
int sdmmc_switch_voltage(sdmmc_t *sdmmc);
|
|
||||||
void sdmmc_set_tuning_tap_val(sdmmc_t *sdmmc);
|
|
||||||
int sdmmc_execute_tuning(sdmmc_t *sdmmc, SdmmcBusSpeed bus_speed, uint32_t opcode);
|
|
||||||
int sdmmc_send_cmd(sdmmc_t *sdmmc, sdmmc_command_t *cmd, sdmmc_request_t *req, uint32_t *num_blocks_out);
|
|
||||||
int sdmmc_load_response(sdmmc_t *sdmmc, uint32_t flags, uint32_t *resp);
|
|
||||||
int sdmmc_abort(sdmmc_t *sdmmc, uint32_t opcode);
|
|
||||||
void sdmmc_error(sdmmc_t *sdmmc, char *fmt, ...);
|
|
||||||
void sdmmc_warn(sdmmc_t *sdmmc, char *fmt, ...);
|
|
||||||
void sdmmc_info(sdmmc_t *sdmmc, char *fmt, ...);
|
|
||||||
void sdmmc_debug(sdmmc_t *sdmmc, char *fmt, ...);
|
|
||||||
void sdmmc_dump_regs(sdmmc_t *sdmmc);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018 naehrwert
|
|
||||||
* Copyright (c) 2018 CTCaer
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FUSEE_SDMMC_TEGRA_H
|
|
||||||
#define FUSEE_SDMMC_TEGRA_H
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#define TEGRA_MMC_PWRCTL_SD_BUS_POWER (1 << 0)
|
|
||||||
#define TEGRA_MMC_PWRCTL_SD_BUS_VOLTAGE_V1_8 (5 << 1)
|
|
||||||
#define TEGRA_MMC_PWRCTL_SD_BUS_VOLTAGE_V3_0 (6 << 1)
|
|
||||||
#define TEGRA_MMC_PWRCTL_SD_BUS_VOLTAGE_V3_3 (7 << 1)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_HOSTCTL_DMASEL_MASK (3 << 3)
|
|
||||||
#define TEGRA_MMC_HOSTCTL_DMASEL_SDMA (0 << 3)
|
|
||||||
#define TEGRA_MMC_HOSTCTL_DMASEL_ADMA2_32BIT (2 << 3)
|
|
||||||
#define TEGRA_MMC_HOSTCTL_DMASEL_ADMA2_64BIT (3 << 3)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_TRNMOD_DMA_ENABLE (1 << 0)
|
|
||||||
#define TEGRA_MMC_TRNMOD_BLOCK_COUNT_ENABLE (1 << 1)
|
|
||||||
#define TEGRA_MMC_TRNMOD_AUTO_CMD12 (1 << 2)
|
|
||||||
#define TEGRA_MMC_TRNMOD_AUTO_CMD23 (1 << 3)
|
|
||||||
#define TEGRA_MMC_TRNMOD_DATA_XFER_DIR_SEL_WRITE (0 << 4)
|
|
||||||
#define TEGRA_MMC_TRNMOD_DATA_XFER_DIR_SEL_READ (1 << 4)
|
|
||||||
#define TEGRA_MMC_TRNMOD_MULTI_BLOCK_SELECT (1 << 5)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_CMDREG_RESP_TYPE_SELECT_MASK (3 << 0)
|
|
||||||
#define TEGRA_MMC_CMDREG_RESP_TYPE_SELECT_NO_RESPONSE (0 << 0)
|
|
||||||
#define TEGRA_MMC_CMDREG_RESP_TYPE_SELECT_LENGTH_136 (1 << 0)
|
|
||||||
#define TEGRA_MMC_CMDREG_RESP_TYPE_SELECT_LENGTH_48 (2 << 0)
|
|
||||||
#define TEGRA_MMC_CMDREG_RESP_TYPE_SELECT_LENGTH_48_BUSY (3 << 0)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_TRNMOD_CMD_CRC_CHECK (1 << 3)
|
|
||||||
#define TEGRA_MMC_TRNMOD_CMD_INDEX_CHECK (1 << 4)
|
|
||||||
#define TEGRA_MMC_TRNMOD_DATA_PRESENT_SELECT_DATA_TRANSFER (1 << 5)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_PRNSTS_CMD_INHIBIT_CMD (1 << 0)
|
|
||||||
#define TEGRA_MMC_PRNSTS_CMD_INHIBIT_DAT (1 << 1)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_CLKCON_INTERNAL_CLOCK_ENABLE (1 << 0)
|
|
||||||
#define TEGRA_MMC_CLKCON_INTERNAL_CLOCK_STABLE (1 << 1)
|
|
||||||
#define TEGRA_MMC_CLKCON_SD_CLOCK_ENABLE (1 << 2)
|
|
||||||
#define TEGRA_MMC_CLKCON_PROG_CLOCK_MODE (1 << 5)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_CLKCON_SDCLK_FREQ_SEL_SHIFT 8
|
|
||||||
#define TEGRA_MMC_CLKCON_SDCLK_FREQ_SEL_MASK (0xff << 8)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_SWRST_SW_RESET_FOR_ALL (1 << 0)
|
|
||||||
#define TEGRA_MMC_SWRST_SW_RESET_FOR_CMD_LINE (1 << 1)
|
|
||||||
#define TEGRA_MMC_SWRST_SW_RESET_FOR_DAT_LINE (1 << 2)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_NORINTSTS_CMD_COMPLETE (1 << 0)
|
|
||||||
#define TEGRA_MMC_NORINTSTS_XFER_COMPLETE (1 << 1)
|
|
||||||
#define TEGRA_MMC_NORINTSTS_DMA_INTERRUPT (1 << 3)
|
|
||||||
#define TEGRA_MMC_NORINTSTS_ERR_INTERRUPT (1 << 15)
|
|
||||||
#define TEGRA_MMC_NORINTSTS_CMD_TIMEOUT (1 << 16)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_NORINTSTSEN_CMD_COMPLETE (1 << 0)
|
|
||||||
#define TEGRA_MMC_NORINTSTSEN_XFER_COMPLETE (1 << 1)
|
|
||||||
#define TEGRA_MMC_NORINTSTSEN_DMA_INTERRUPT (1 << 3)
|
|
||||||
#define TEGRA_MMC_NORINTSTSEN_BUFFER_WRITE_READY (1 << 4)
|
|
||||||
#define TEGRA_MMC_NORINTSTSEN_BUFFER_READ_READY (1 << 5)
|
|
||||||
|
|
||||||
#define TEGRA_MMC_NORINTSIGEN_XFER_COMPLETE (1 << 1)
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* SDHCI standard registers */
|
|
||||||
uint32_t dma_address;
|
|
||||||
uint16_t block_size;
|
|
||||||
uint16_t block_count;
|
|
||||||
uint32_t argument;
|
|
||||||
uint16_t transfer_mode;
|
|
||||||
uint16_t command;
|
|
||||||
uint32_t response[0x4];
|
|
||||||
uint32_t buffer;
|
|
||||||
uint32_t present_state;
|
|
||||||
uint8_t host_control;
|
|
||||||
uint8_t power_control;
|
|
||||||
uint8_t block_gap_control;
|
|
||||||
uint8_t wake_up_control;
|
|
||||||
uint16_t clock_control;
|
|
||||||
uint8_t timeout_control;
|
|
||||||
uint8_t software_reset;
|
|
||||||
uint32_t int_status;
|
|
||||||
uint32_t int_enable;
|
|
||||||
uint32_t signal_enable;
|
|
||||||
uint16_t acmd12_err;
|
|
||||||
uint16_t host_control2;
|
|
||||||
uint32_t capabilities;
|
|
||||||
uint32_t capabilities_1;
|
|
||||||
uint32_t max_current;
|
|
||||||
uint32_t _0x4c;
|
|
||||||
uint16_t set_acmd12_error;
|
|
||||||
uint16_t set_int_error;
|
|
||||||
uint8_t adma_error;
|
|
||||||
uint8_t _0x56[0x3];
|
|
||||||
uint32_t adma_address;
|
|
||||||
uint32_t upper_adma_address;
|
|
||||||
uint16_t preset_for_init;
|
|
||||||
uint16_t preset_for_default;
|
|
||||||
uint16_t preset_for_high;
|
|
||||||
uint16_t preset_for_sdr12;
|
|
||||||
uint16_t preset_for_sdr25;
|
|
||||||
uint16_t preset_for_sdr50;
|
|
||||||
uint16_t preset_for_sdr104;
|
|
||||||
uint16_t preset_for_ddr50;
|
|
||||||
uint32_t _0x70[0x23];
|
|
||||||
uint16_t slot_int_status;
|
|
||||||
uint16_t host_version;
|
|
||||||
|
|
||||||
/* Vendor specific registers */
|
|
||||||
uint32_t vendor_clock_cntrl;
|
|
||||||
uint32_t vendor_sys_sw_cntrl;
|
|
||||||
uint32_t vendor_err_intr_status;
|
|
||||||
uint32_t vendor_cap_overrides;
|
|
||||||
uint32_t vendor_boot_cntrl;
|
|
||||||
uint32_t vendor_boot_ack_timeout;
|
|
||||||
uint32_t vendor_boot_dat_timeout;
|
|
||||||
uint32_t vendor_debounce_count;
|
|
||||||
uint32_t vendor_misc_cntrl;
|
|
||||||
uint32_t max_current_override;
|
|
||||||
uint32_t max_current_override_hi;
|
|
||||||
uint32_t _0x12c[0x20];
|
|
||||||
uint32_t vendor_io_trim_cntrl;
|
|
||||||
|
|
||||||
/* Start of sdmmc2/sdmmc4 only */
|
|
||||||
uint32_t vendor_dllcal_cfg;
|
|
||||||
uint32_t vendor_dll_ctrl0;
|
|
||||||
uint32_t vendor_dll_ctrl1;
|
|
||||||
uint32_t vendor_dllcal_cfg_sta;
|
|
||||||
/* End of sdmmc2/sdmmc4 only */
|
|
||||||
|
|
||||||
uint32_t vendor_tuning_cntrl0;
|
|
||||||
uint32_t vendor_tuning_cntrl1;
|
|
||||||
uint32_t vendor_tuning_status0;
|
|
||||||
uint32_t vendor_tuning_status1;
|
|
||||||
uint32_t vendor_clk_gate_hysteresis_count;
|
|
||||||
uint32_t vendor_preset_val0;
|
|
||||||
uint32_t vendor_preset_val1;
|
|
||||||
uint32_t vendor_preset_val2;
|
|
||||||
uint32_t sdmemcomppadctrl;
|
|
||||||
uint32_t auto_cal_config;
|
|
||||||
uint32_t auto_cal_interval;
|
|
||||||
uint32_t auto_cal_status;
|
|
||||||
uint32_t io_spare;
|
|
||||||
uint32_t sdmmca_mccif_fifoctrl;
|
|
||||||
uint32_t timeout_wcoal_sdmmca;
|
|
||||||
uint32_t _0x1fc;
|
|
||||||
} tegra_sdmmc_t;
|
|
||||||
|
|
||||||
static inline volatile tegra_sdmmc_t *sdmmc_get_regs(uint32_t idx)
|
|
||||||
{
|
|
||||||
return (volatile tegra_sdmmc_t *)(0x700B0000 + (idx * 0x200));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 Andrei Warkentin <andrey.warkentin@gmail.com>
|
|
||||||
*
|
|
||||||
* This program is free software ; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#ifndef VSPRINTF_H
|
|
||||||
#define VSPRINTF_H
|
|
||||||
|
|
||||||
struct va_format {
|
|
||||||
const char *fmt;
|
|
||||||
va_list *va;
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base);
|
|
||||||
|
|
||||||
int sprintf(char *buf, const char *fmt, ...);
|
|
||||||
int scnprintf(char *buf, size_t size, const char *fmt, ...);
|
|
||||||
int snprintf(char *buf, size_t size, const char *fmt, ...);
|
|
||||||
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
|
|
||||||
int sscanf(const char *buf, const char *fmt, ...);
|
|
||||||
|
|
||||||
#endif /* VSPRINTF_H */
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(_start)
|
|
||||||
|
|
||||||
PHDRS
|
|
||||||
{
|
|
||||||
crt0 PT_LOAD;
|
|
||||||
main PT_LOAD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mostly copied from https://github.com/devkitPro/buildscripts/blob/master/dkarm-eabi/crtls/3dsx.ld */
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
NULL : ORIGIN = 0x00000000, LENGTH = 0x1000
|
|
||||||
main : ORIGIN = 0xF0000000, LENGTH = 0x10000000
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
PROVIDE(__start__ = 0xF0000000);
|
|
||||||
PROVIDE(__stack_bottom__ = 0x90010000);
|
|
||||||
PROVIDE(__stack_top__ = 0x90020000);
|
|
||||||
PROVIDE(__heap_start__ = 0x90020000);
|
|
||||||
PROVIDE(__heap_end__ = 0xA0020000);
|
|
||||||
|
|
||||||
. = __start__;
|
|
||||||
|
|
||||||
.crt0 :
|
|
||||||
{
|
|
||||||
KEEP( *(.text.start) )
|
|
||||||
KEEP( *(.init) )
|
|
||||||
. = ALIGN(32);
|
|
||||||
} >main :crt0
|
|
||||||
|
|
||||||
.text :
|
|
||||||
{
|
|
||||||
. = ALIGN(32);
|
|
||||||
/* .text */
|
|
||||||
*(.text)
|
|
||||||
*(.text.*)
|
|
||||||
*(.glue_7)
|
|
||||||
*(.glue_7t)
|
|
||||||
*(.stub)
|
|
||||||
*(.gnu.warning)
|
|
||||||
*(.gnu.linkonce.t*)
|
|
||||||
|
|
||||||
/* .fini */
|
|
||||||
KEEP( *(.fini) )
|
|
||||||
. = ALIGN(8);
|
|
||||||
} >main :main
|
|
||||||
|
|
||||||
.rodata :
|
|
||||||
{
|
|
||||||
*(.rodata)
|
|
||||||
*(.roda)
|
|
||||||
*(.rodata.*)
|
|
||||||
*all.rodata*(*)
|
|
||||||
*(.gnu.linkonce.r*)
|
|
||||||
SORT(CONSTRUCTORS)
|
|
||||||
. = ALIGN(8);
|
|
||||||
} >main
|
|
||||||
|
|
||||||
.preinit_array :
|
|
||||||
{
|
|
||||||
PROVIDE (__preinit_array_start = .);
|
|
||||||
KEEP (*(.preinit_array))
|
|
||||||
PROVIDE (__preinit_array_end = .);
|
|
||||||
} >main
|
|
||||||
|
|
||||||
.init_array ALIGN(4) :
|
|
||||||
{
|
|
||||||
PROVIDE (__init_array_start = .);
|
|
||||||
KEEP (*(SORT(.init_array.*)))
|
|
||||||
KEEP (*(.init_array))
|
|
||||||
PROVIDE (__init_array_end = .);
|
|
||||||
} >main
|
|
||||||
|
|
||||||
.fini_array ALIGN(4) :
|
|
||||||
{
|
|
||||||
PROVIDE (__fini_array_start = .);
|
|
||||||
KEEP (*(.fini_array))
|
|
||||||
KEEP (*(SORT(.fini_array.*)))
|
|
||||||
PROVIDE (__fini_array_end = .);
|
|
||||||
} >main
|
|
||||||
|
|
||||||
.ctors ALIGN(4) :
|
|
||||||
{
|
|
||||||
KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */
|
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
|
||||||
KEEP (*(SORT(.ctors.*)))
|
|
||||||
KEEP (*(.ctors))
|
|
||||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
|
||||||
} >main
|
|
||||||
|
|
||||||
.dtors ALIGN(4) :
|
|
||||||
{
|
|
||||||
KEEP (*crtbegin.o(.dtors))
|
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
|
||||||
KEEP (*(SORT(.dtors.*)))
|
|
||||||
KEEP (*(.dtors))
|
|
||||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
|
||||||
} >main
|
|
||||||
|
|
||||||
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) __exidx_start = ABSOLUTE(.);} >main
|
|
||||||
ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) __exidx_end = ABSOLUTE(.);} >main
|
|
||||||
|
|
||||||
.data :
|
|
||||||
{
|
|
||||||
*(.data)
|
|
||||||
*(.data.*)
|
|
||||||
*(.gnu.linkonce.d*)
|
|
||||||
CONSTRUCTORS
|
|
||||||
. = ALIGN(32);
|
|
||||||
} >main
|
|
||||||
|
|
||||||
.bss (NOLOAD) :
|
|
||||||
{
|
|
||||||
. = ALIGN(32);
|
|
||||||
PROVIDE (__bss_start__ = ABSOLUTE(.));
|
|
||||||
*(.dynbss)
|
|
||||||
*(.bss)
|
|
||||||
*(.bss.*)
|
|
||||||
*(.gnu.linkonce.b*)
|
|
||||||
*(COMMON)
|
|
||||||
. = ALIGN(32);
|
|
||||||
PROVIDE (__bss_end__ = ABSOLUTE(.));
|
|
||||||
} >main :NONE
|
|
||||||
__end__ = ABSOLUTE(.) ;
|
|
||||||
|
|
||||||
|
|
||||||
/* ==================
|
|
||||||
==== Metadata ====
|
|
||||||
================== */
|
|
||||||
|
|
||||||
/* Discard sections that difficult post-processing */
|
|
||||||
/DISCARD/ : { *(.group .comment .note) }
|
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
|
|
||||||
/* DWARF debug sections.
|
|
||||||
Symbols in the DWARF debugging sections are relative to the beginning
|
|
||||||
of the section so we begin them at 0. */
|
|
||||||
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user