Compare commits
398 Commits
experiment
...
tma2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fed1518fb5 | ||
|
|
a5e761ceca | ||
|
|
a4da7cc8bf | ||
|
|
fe8d031708 | ||
|
|
999318838f | ||
|
|
325ae30067 | ||
|
|
d7c93c44f4 | ||
|
|
6139b7d5ac | ||
|
|
ae91a32059 | ||
|
|
e34a9ba521 | ||
|
|
252b890a12 | ||
|
|
32818a7a99 | ||
|
|
eb6d18329e | ||
|
|
cf27c8a7a2 | ||
|
|
74ca199c94 | ||
|
|
22bce9f680 | ||
|
|
e5a0f0d3b0 | ||
|
|
6da88a436f | ||
|
|
e96d9950d2 | ||
|
|
49afbd8a63 | ||
|
|
2e0d197cbe | ||
|
|
e7187ace55 | ||
|
|
6794c147dd | ||
|
|
6ea5cf5f91 | ||
|
|
6c2f005a62 | ||
|
|
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 | ||
|
|
1545fa9d44 | ||
|
|
71add1add8 | ||
|
|
a96786fd2c | ||
|
|
74e4e70053 | ||
|
|
26b6216fa0 | ||
|
|
fe5c850e69 | ||
|
|
2b825d56dc | ||
|
|
13b17a5848 | ||
|
|
621520c30b | ||
|
|
846cc0b47a | ||
|
|
e82ad1cdc5 | ||
|
|
b40da8f445 | ||
|
|
a9c6476416 | ||
|
|
c1d93a9495 | ||
|
|
201b17f100 |
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?
|
||||||
|
|
||||||
|
|||||||
7
.gitignore
vendored
7
.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
|
|
||||||
|
|
||||||
.**/
|
.**/
|
||||||
|
|
||||||
@@ -95,3 +94,7 @@ sept/sept-secondary/KEYS.py
|
|||||||
**/build_nintendo_nx_arm
|
**/build_nintendo_nx_arm
|
||||||
**/build_nintendo_nx_x64
|
**/build_nintendo_nx_x64
|
||||||
**/build_nintendo_nx_x86
|
**/build_nintendo_nx_x86
|
||||||
|
|
||||||
|
package3
|
||||||
|
|
||||||
|
stratosphere/test/
|
||||||
|
|||||||
124
Makefile
124
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
|
||||||
@@ -135,6 +158,7 @@ dist: dist-no-debug
|
|||||||
cp exosphere/program/sc7fw/sc7fw.elf atmosphere-$(AMSVER)-debug/exosphere-sc7fw.elf
|
cp exosphere/program/sc7fw/sc7fw.elf atmosphere-$(AMSVER)-debug/exosphere-sc7fw.elf
|
||||||
cp exosphere/program/rebootstub/rebootstub.elf atmosphere-$(AMSVER)-debug/exosphere-rebootstub.elf
|
cp exosphere/program/rebootstub/rebootstub.elf atmosphere-$(AMSVER)-debug/exosphere-rebootstub.elf
|
||||||
cp mesosphere/kernel_ldr/kernel_ldr.elf atmosphere-$(AMSVER)-debug/kernel_ldr.elf
|
cp mesosphere/kernel_ldr/kernel_ldr.elf atmosphere-$(AMSVER)-debug/kernel_ldr.elf
|
||||||
|
cp mesosphere/kernel/kernel.elf atmosphere-$(AMSVER)-debug/kernel.elf
|
||||||
cp stratosphere/ams_mitm/ams_mitm.elf atmosphere-$(AMSVER)-debug/ams_mitm.elf
|
cp stratosphere/ams_mitm/ams_mitm.elf atmosphere-$(AMSVER)-debug/ams_mitm.elf
|
||||||
cp stratosphere/boot/boot.elf atmosphere-$(AMSVER)-debug/boot.elf
|
cp stratosphere/boot/boot.elf atmosphere-$(AMSVER)-debug/boot.elf
|
||||||
cp stratosphere/boot2/boot2.elf atmosphere-$(AMSVER)-debug/boot2.elf
|
cp stratosphere/boot2/boot2.elf atmosphere-$(AMSVER)-debug/boot2.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,149 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
## 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
|
||||||
|
+ 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.
|
||||||
|
+ This fixes youtube ad-blocking, and possibly other usecases.
|
||||||
|
+ A bug was fixed that caused ams.mitm to incorrectly cache data storages.
|
||||||
|
+ This potentially broke DLC when using romfs mods, and could have caused other issues (e.g. with custom themes, and maybe other cases).
|
||||||
|
+ A bug was fixed in power state control module registration.
|
||||||
|
+ This might fix a weird edge case with system module dependencies on sleep/wake, but probably nobody should notice any differences.
|
||||||
|
+ A bug was fixed where mesosphere sometimes treated virtual core IDs as though they were physical core IDs.
|
||||||
|
+ This had zero impact, because for Switch virtual core == physical core, but it could have affected future platforms if it had remained unresolved.
|
||||||
|
+ Several issues were fixed, and usability and stability were improved.
|
||||||
## 0.18.0
|
## 0.18.0
|
||||||
+ A new mitm module was added (`dns.mitm`).
|
+ A new mitm module was added (`dns.mitm`).
|
||||||
+ This provides a highly configurable mechanism for redirecting DNS resolution requests.
|
+ This provides a highly configurable mechanism for redirecting DNS resolution requests.
|
||||||
@@ -30,7 +175,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.
|
|
||||||
|
|||||||
@@ -25,12 +25,6 @@ set_mitm enables intercepting requests to the system settings service. It curren
|
|||||||
+ `ns` system module and games (to allow for overriding game locales)
|
+ `ns` system module and games (to allow for overriding game locales)
|
||||||
+ All firmware debug settings requests (to allow modification of system settings not directly exposed to the user)
|
+ All firmware debug settings requests (to allow modification of system settings not directly exposed to the user)
|
||||||
|
|
||||||
## dns_mitm
|
|
||||||
|
|
||||||
dns_mitm enables intercepting requests to dns resolution services, to enable redirecting requests for specified hostnames.
|
|
||||||
|
|
||||||
For documentation, see [here](../../features/dns_mitm.md).
|
|
||||||
|
|
||||||
### Firmware Version
|
### Firmware Version
|
||||||
set_mitm intercepts the `GetFirmwareVersion` command, if the requester is `qlaunch` or `maintenance`.
|
set_mitm intercepts the `GetFirmwareVersion` command, if the requester is `qlaunch` or `maintenance`.
|
||||||
It modifies the `display_version` field of the returned system version, causing the version to display
|
It modifies the `display_version` field of the returned system version, causing the version to display
|
||||||
@@ -39,3 +33,8 @@ in settings as `#.#.#|AMS #.#.#|?` with `? = S` when running under system eMMC o
|
|||||||
### System Settings
|
### System Settings
|
||||||
set_mitm intercepts the `GetSettingsItemValueSize` and `GetSettingsItemValue` commands for all requesters.
|
set_mitm intercepts the `GetSettingsItemValueSize` and `GetSettingsItemValue` commands for all requesters.
|
||||||
It does so in order to enable user configuration of system settings, which are parsed from `/atmosphere/system_settings.ini` on boot. See [here](../../features/configurations.md) for more information on the system settings format.
|
It does so in order to enable user configuration of system settings, which are parsed from `/atmosphere/system_settings.ini` on boot. See [here](../../features/configurations.md) for more information on the system settings format.
|
||||||
|
|
||||||
|
## dns_mitm
|
||||||
|
dns_mitm enables intercepting requests to dns resolution services, to enable redirecting requests for specified hostnames.
|
||||||
|
|
||||||
|
For documentation, see [here](../../features/dns_mitm.md).
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 = cbc294c390ed73bb281bc1028a8899c053427112
|
||||||
parent = 021b29d2dbc8ed0469bc822393e58c9f0d174d57
|
parent = 38f9a76ba028995ed3274da3a45b0254f09d1f59
|
||||||
method = rebase
|
method = rebase
|
||||||
cmdver = 0.4.1
|
cmdver = 0.4.1
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
201
emummc/emummc.ld
Normal file
201
emummc/emummc.ld
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
Normal file
8
emummc/emummc.specs
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
|
||||||
|
|
||||||
@@ -51,6 +51,10 @@
|
|||||||
#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 "../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 +117,10 @@ 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);
|
||||||
|
|
||||||
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 +194,14 @@ 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));
|
||||||
default:
|
default:
|
||||||
fatal_abort(Fatal_UnknownVersion);
|
fatal_abort(Fatal_UnknownVersion);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,12 @@ 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_MAX,
|
FS_VER_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
59
emummc/source/FS/offsets/1200.h
Normal file
59
emummc/source/FS/offsets/1200.h
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
Normal file
59
emummc/source/FS/offsets/1200_exfat.h
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
Normal file
60
emummc/source/FS/offsets/1203.h
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
Normal file
60
emummc/source/FS/offsets/1203_exfat.h
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__
|
||||||
@@ -292,6 +292,36 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned
|
|||||||
{
|
{
|
||||||
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, (u64)sector << 9) != FR_OK)
|
||||||
|
return 0; // Out of bounds.
|
||||||
|
|
||||||
|
if (is_write)
|
||||||
|
{
|
||||||
|
if (f_write_fast(fp, buf, (u64)cur_sectors << 9) != FR_OK)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (f_read_fast(fp, buf, (u64)cur_sectors << 9) != FR_OK)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = (char *)buf + ((u64)cur_sectors << 9);
|
||||||
|
remaining -= cur_sectors;
|
||||||
|
sector = 0;
|
||||||
|
++fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -306,14 +336,14 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f_lseek(fp, sector << 9) != FR_OK)
|
if (f_lseek(fp, (u64)sector << 9) != FR_OK)
|
||||||
return 0; // Out of bounds.
|
return 0; // Out of bounds.
|
||||||
|
|
||||||
uint64_t res = 0;
|
uint64_t res = 0;
|
||||||
if (!is_write)
|
if (!is_write)
|
||||||
res = !f_read_fast(fp, buf, num_sectors << 9);
|
res = !f_read_fast(fp, buf, (u64)num_sectors << 9);
|
||||||
else
|
else
|
||||||
res = !f_write_fast(fp, buf, num_sectors << 9);
|
res = !f_write_fast(fp, buf, (u64)num_sectors << 9);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -328,13 +358,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;
|
||||||
|
|||||||
@@ -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 0x75, 0x2D, 0x2E, 0xF3, 0x2F, 0x3F, 0xFE, 0x65, 0xF4, 0xA9, 0x83, 0xB4, 0xED, 0x42, 0x63, 0xBA
|
||||||
|
|
||||||
/* 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 0xE5, 0x41, 0xAC, 0xEC, 0xD1, 0xA7, 0xD1, 0xAB, 0xED, 0x03, 0x77, 0xF1, 0x27, 0xCA, 0xF8, 0xF1
|
||||||
|
|
||||||
/* 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,7 @@ _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. */
|
||||||
|
|
||||||
/* 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 +116,37 @@ _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. */
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
|||||||
@@ -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 == 12);
|
||||||
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) {
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ namespace ams::secmon::smc {
|
|||||||
[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_CopperMicron4GB] = 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,
|
||||||
@@ -243,7 +243,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 +286,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 + '\x00' * size)[:size]
|
||||||
|
|
||||||
|
def get_overlay(program, i):
|
||||||
|
return program[0x2B000 + 0x14000 * i:0x2B000 + 0x14000 * (i+1)]
|
||||||
|
|
||||||
|
KIP_NAMES = ['Loader', 'NCM', 'ProcessManager', 'sm', 'boot', 'spl', '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, {
|
||||||
|
'Loader' : loader,
|
||||||
|
'NCM' : ncm,
|
||||||
|
'ProcessManager' : pm,
|
||||||
|
'sm' : sm,
|
||||||
|
'boot' : boot,
|
||||||
|
'spl' : spl,
|
||||||
|
'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, 'warmboot'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x002000, tk_size, 12, 0, 0, 0, 0xCCCCCCCC, 'tsec_keygen'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x004000, xf_size, 11, 0, 0, 0, 0xCCCCCCCC, 'exosphere_fatal'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x048000, ex_size, 1, 0, 0, 0, 0xCCCCCCCC, 'exosphere'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x056000, ms_size, 10, 0, 0, 0, 0xCCCCCCCC, 'mesosphere'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x7C0000, fs_size, 0, 0, 0, 0, 0xCCCCCCCC, 'fusee'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x7E0000, rb_size, 3, 0, 0, 0, 0xCCCCCCCC, 'rebootstub'))
|
||||||
|
f.write(pk('<IIBBBBI16s', 0x100000, len(emummc), 8, 0, 0, 0, 0xCCCCCCCC, '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('\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('\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], 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) }
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
%rename link old_link
|
|
||||||
|
|
||||||
*link:
|
|
||||||
%(old_link) -T %:getenv(TOPDIR /linker.ld) --nmagic --gc-sections
|
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
@@ -1,142 +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 "car.h"
|
|
||||||
#include "timers.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
static inline uint32_t get_clk_source_reg(CarDevice dev) {
|
|
||||||
switch (dev) {
|
|
||||||
case CARDEVICE_UARTA: return 0x178;
|
|
||||||
case CARDEVICE_UARTB: return 0x17C;
|
|
||||||
case CARDEVICE_UARTC: return 0x1A0;
|
|
||||||
case CARDEVICE_I2C1: return 0x124;
|
|
||||||
case CARDEVICE_I2C5: return 0x128;
|
|
||||||
case CARDEVICE_TZRAM: return 0;
|
|
||||||
case CARDEVICE_SE: return 0x42C;
|
|
||||||
case CARDEVICE_HOST1X: return 0x180;
|
|
||||||
case CARDEVICE_TSEC: return 0x1F4;
|
|
||||||
case CARDEVICE_SOR_SAFE: return 0;
|
|
||||||
case CARDEVICE_SOR0: return 0;
|
|
||||||
case CARDEVICE_SOR1: return 0x410;
|
|
||||||
case CARDEVICE_KFUSE: return 0;
|
|
||||||
case CARDEVICE_CL_DVFS: return 0;
|
|
||||||
case CARDEVICE_CORESIGHT: return 0x1D4;
|
|
||||||
case CARDEVICE_MSELECT: return 0x3B4;
|
|
||||||
case CARDEVICE_ACTMON: return 0x3E8;
|
|
||||||
case CARDEVICE_BPMP: return 0;
|
|
||||||
default: generic_panic();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t get_clk_source_val(CarDevice dev) {
|
|
||||||
switch (dev) {
|
|
||||||
case CARDEVICE_UARTA: return 0;
|
|
||||||
case CARDEVICE_UARTB: return 0;
|
|
||||||
case CARDEVICE_UARTC: return 0;
|
|
||||||
case CARDEVICE_I2C1: return 6;
|
|
||||||
case CARDEVICE_I2C5: return 6;
|
|
||||||
case CARDEVICE_TZRAM: return 0;
|
|
||||||
case CARDEVICE_SE: return 0;
|
|
||||||
case CARDEVICE_HOST1X: return 4;
|
|
||||||
case CARDEVICE_TSEC: return 0;
|
|
||||||
case CARDEVICE_SOR_SAFE: return 0;
|
|
||||||
case CARDEVICE_SOR0: return 0;
|
|
||||||
case CARDEVICE_SOR1: return 0;
|
|
||||||
case CARDEVICE_KFUSE: return 0;
|
|
||||||
case CARDEVICE_CL_DVFS: return 0;
|
|
||||||
case CARDEVICE_CORESIGHT: return 0;
|
|
||||||
case CARDEVICE_MSELECT: return 0;
|
|
||||||
case CARDEVICE_ACTMON: return 6;
|
|
||||||
case CARDEVICE_BPMP: return 0;
|
|
||||||
default: generic_panic();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t get_clk_source_div(CarDevice dev) {
|
|
||||||
switch (dev) {
|
|
||||||
case CARDEVICE_UARTA: return 0;
|
|
||||||
case CARDEVICE_UARTB: return 0;
|
|
||||||
case CARDEVICE_UARTC: return 0;
|
|
||||||
case CARDEVICE_I2C1: return 0;
|
|
||||||
case CARDEVICE_I2C5: return 0;
|
|
||||||
case CARDEVICE_TZRAM: return 0;
|
|
||||||
case CARDEVICE_SE: return 0;
|
|
||||||
case CARDEVICE_HOST1X: return 3;
|
|
||||||
case CARDEVICE_TSEC: return 2;
|
|
||||||
case CARDEVICE_SOR_SAFE: return 0;
|
|
||||||
case CARDEVICE_SOR0: return 0;
|
|
||||||
case CARDEVICE_SOR1: return 2;
|
|
||||||
case CARDEVICE_KFUSE: return 0;
|
|
||||||
case CARDEVICE_CL_DVFS: return 0;
|
|
||||||
case CARDEVICE_CORESIGHT: return 4;
|
|
||||||
case CARDEVICE_MSELECT: return 6;
|
|
||||||
case CARDEVICE_ACTMON: return 0;
|
|
||||||
case CARDEVICE_BPMP: return 0;
|
|
||||||
default: generic_panic();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t g_clk_reg_offsets[NUM_CAR_BANKS] = {0x010, 0x014, 0x018, 0x360, 0x364, 0x280, 0x298};
|
|
||||||
static uint32_t g_rst_reg_offsets[NUM_CAR_BANKS] = {0x004, 0x008, 0x00C, 0x358, 0x35C, 0x28C, 0x2A4};
|
|
||||||
|
|
||||||
void clk_enable(CarDevice dev) {
|
|
||||||
uint32_t clk_source_reg;
|
|
||||||
if ((clk_source_reg = get_clk_source_reg(dev))) {
|
|
||||||
MAKE_CAR_REG(clk_source_reg) = (get_clk_source_val(dev) << 29) | get_clk_source_div(dev);
|
|
||||||
}
|
|
||||||
MAKE_CAR_REG(g_clk_reg_offsets[dev >> 5]) |= BIT(dev & 0x1F);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clk_disable(CarDevice dev) {
|
|
||||||
MAKE_CAR_REG(g_clk_reg_offsets[dev >> 5]) &= ~(BIT(dev & 0x1F));
|
|
||||||
}
|
|
||||||
|
|
||||||
void rst_enable(CarDevice dev) {
|
|
||||||
MAKE_CAR_REG(g_rst_reg_offsets[dev >> 5]) |= BIT(dev & 0x1F);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rst_disable(CarDevice dev) {
|
|
||||||
MAKE_CAR_REG(g_rst_reg_offsets[dev >> 5]) &= ~(BIT(dev & 0x1F));
|
|
||||||
}
|
|
||||||
|
|
||||||
void clkrst_enable(CarDevice dev) {
|
|
||||||
clk_enable(dev);
|
|
||||||
rst_disable(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clkrst_disable(CarDevice dev) {
|
|
||||||
rst_enable(dev);
|
|
||||||
clk_disable(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clkrst_reboot(CarDevice dev) {
|
|
||||||
clkrst_disable(dev);
|
|
||||||
if (dev == CARDEVICE_KFUSE) {
|
|
||||||
/* Workaround for KFUSE clock. */
|
|
||||||
clk_enable(dev);
|
|
||||||
udelay(100);
|
|
||||||
rst_disable(dev);
|
|
||||||
udelay(200);
|
|
||||||
} else {
|
|
||||||
clkrst_enable(dev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void clkrst_enable_fuse_regs(bool enable) {
|
|
||||||
volatile tegra_car_t *car = car_get_regs();
|
|
||||||
car->misc_clk_enb = ((car->misc_clk_enb & 0xEFFFFFFF) | ((enable & 1) << 28));
|
|
||||||
}
|
|
||||||
@@ -1,510 +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_CAR_H
|
|
||||||
#define FUSEE_CAR_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define CAR_BASE 0x60006000
|
|
||||||
#define MAKE_CAR_REG(n) MAKE_REG32(CAR_BASE + n)
|
|
||||||
|
|
||||||
#define CLK_L_SDMMC1 (1 << 14)
|
|
||||||
#define CLK_L_SDMMC2 (1 << 9)
|
|
||||||
#define CLK_U_SDMMC3 (1 << 5)
|
|
||||||
#define CLK_L_SDMMC4 (1 << 15)
|
|
||||||
|
|
||||||
#define CLK_SOURCE_MASK (0b111 << 29)
|
|
||||||
#define CLK_SOURCE_FIRST (0b000 << 29)
|
|
||||||
#define CLK_DIVIDER_MASK (0xff << 0)
|
|
||||||
#define CLK_DIVIDER_UNITY (0x00 << 0)
|
|
||||||
|
|
||||||
#define NUM_CAR_BANKS 7
|
|
||||||
|
|
||||||
/* Clock and reset devices. */
|
|
||||||
typedef enum {
|
|
||||||
CARDEVICE_BPMP = ((0 << 5) | 0x1),
|
|
||||||
CARDEVICE_UARTA = ((0 << 5) | 0x6),
|
|
||||||
CARDEVICE_UARTB = ((0 << 5) | 0x7),
|
|
||||||
CARDEVICE_I2C1 = ((0 << 5) | 0xC),
|
|
||||||
CARDEVICE_USBD = ((0 << 5) | 0x16),
|
|
||||||
CARDEVICE_HOST1X = ((0 << 5) | 0x1C),
|
|
||||||
CARDEVICE_AHBDMA = ((1 << 5) | 0x1),
|
|
||||||
CARDEVICE_APBDMA = ((1 << 5) | 0x2),
|
|
||||||
CARDEVICE_KFUSE = ((1 << 5) | 0x8),
|
|
||||||
CARDEVICE_I2C5 = ((1 << 5) | 0xF),
|
|
||||||
CARDEVICE_UARTC = ((1 << 5) | 0x17),
|
|
||||||
CARDEVICE_USB2 = ((1 << 5) | 0x1A),
|
|
||||||
CARDEVICE_CORESIGHT = ((2 << 5) | 0x9),
|
|
||||||
CARDEVICE_TSEC = ((2 << 5) | 0x13),
|
|
||||||
CARDEVICE_MSELECT = ((3 << 5) | 0x8),
|
|
||||||
CARDEVICE_ACTMON = ((3 << 5) | 0x17),
|
|
||||||
CARDEVICE_TZRAM = ((3 << 5) | 0x1E),
|
|
||||||
CARDEVICE_SE = ((3 << 5) | 0x1F),
|
|
||||||
CARDEVICE_CL_DVFS = ((4 << 5) | 0x1B),
|
|
||||||
CARDEVICE_SOR0 = ((5 << 5) | 0x16),
|
|
||||||
CARDEVICE_SOR1 = ((5 << 5) | 0x17),
|
|
||||||
CARDEVICE_SOR_SAFE = ((6 << 5) | 0x1E),
|
|
||||||
} CarDevice;
|
|
||||||
|
|
||||||
/* Clock/Reset Controller (CLK_RST_CONTROLLER_) regs */
|
|
||||||
typedef struct {
|
|
||||||
uint32_t rst_src; /* _RST_SOURCE_0, 0x00 */
|
|
||||||
|
|
||||||
/* _RST_DEVICES_L/H/U_0 0x4-0xc */
|
|
||||||
uint32_t rst_dev_l;
|
|
||||||
uint32_t rst_dev_h;
|
|
||||||
uint32_t rst_dev_u;
|
|
||||||
|
|
||||||
/* _CLK_OUT_ENB_L/H/U_0 0x10-0x18 */
|
|
||||||
uint32_t clk_out_enb_l;
|
|
||||||
uint32_t clk_out_enb_h;
|
|
||||||
uint32_t clk_out_enb_u;
|
|
||||||
|
|
||||||
uint32_t _0x1C;
|
|
||||||
uint32_t cclk_brst_pol; /* _CCLK_BURST_POLICY_0, 0x20 */
|
|
||||||
uint32_t super_cclk_div; /* _SUPER_CCLK_DIVIDER_0, 0x24 */
|
|
||||||
uint32_t sclk_brst_pol; /* _SCLK_BURST_POLICY_0, 0x28 */
|
|
||||||
uint32_t super_sclk_div; /* _SUPER_SCLK_DIVIDER_0, 0x2c */
|
|
||||||
uint32_t clk_sys_rate; /* _CLK_SYSTEM_RATE_0, 0x30 */
|
|
||||||
uint32_t prog_dly_clk; /* _PROG_DLY_CLK_0, 0x34 */
|
|
||||||
uint32_t aud_sync_clk_rate; /* _AUDIO_SYNC_CLK_RATE_0, 0x38 */
|
|
||||||
uint32_t _0x3C;
|
|
||||||
uint32_t cop_clk_skip_plcy; /* _COP_CLK_SKIP_POLICY_0, 0x40 */
|
|
||||||
uint32_t clk_mask_arm; /* _CLK_MASK_ARM_0, 0x44 */
|
|
||||||
uint32_t misc_clk_enb; /* _MISC_CLK_ENB_0, 0x48 */
|
|
||||||
uint32_t clk_cpu_cmplx; /* _CLK_CPU_CMPLX_0, 0x4c */
|
|
||||||
uint32_t osc_ctrl; /* _OSC_CTRL_0, 0x50 */
|
|
||||||
uint32_t pll_lfsr; /* _PLL_LFSR_0, 0x54 */
|
|
||||||
uint32_t osc_freq_det; /* _OSC_FREQ_DET_0, 0x58 */
|
|
||||||
uint32_t osc_freq_det_stat; /* _OSC_FREQ_DET_STATUS_0, 0x5c */
|
|
||||||
uint32_t _0x60[2];
|
|
||||||
uint32_t plle_ss_cntl; /* _PLLE_SS_CNTL_0, 0x68 */
|
|
||||||
uint32_t plle_misc1; /* _PLLE_MISC1_0, 0x6c */
|
|
||||||
uint32_t _0x70[4];
|
|
||||||
|
|
||||||
/* PLLC 0x80-0x8c */
|
|
||||||
uint32_t pllc_base;
|
|
||||||
uint32_t pllc_out;
|
|
||||||
uint32_t pllc_misc0;
|
|
||||||
uint32_t pllc_misc1;
|
|
||||||
|
|
||||||
/* PLLM 0x90-0x9c */
|
|
||||||
uint32_t pllm_base;
|
|
||||||
uint32_t pllm_out;
|
|
||||||
uint32_t pllm_misc1;
|
|
||||||
uint32_t pllm_misc2;
|
|
||||||
|
|
||||||
/* PLLP 0xa0-0xac */
|
|
||||||
uint32_t pllp_base;
|
|
||||||
uint32_t pllp_outa;
|
|
||||||
uint32_t pllp_outb;
|
|
||||||
uint32_t pllp_misc;
|
|
||||||
|
|
||||||
/* PLLA 0xb0-0xbc */
|
|
||||||
uint32_t plla_base;
|
|
||||||
uint32_t plla_out;
|
|
||||||
uint32_t plla_misc0;
|
|
||||||
uint32_t plla_misc1;
|
|
||||||
|
|
||||||
/* PLLU 0xc0-0xcc */
|
|
||||||
uint32_t pllu_base;
|
|
||||||
uint32_t pllu_out;
|
|
||||||
uint32_t pllu_misc1;
|
|
||||||
uint32_t pllu_misc2;
|
|
||||||
|
|
||||||
/* PLLD 0xd0-0xdc */
|
|
||||||
uint32_t plld_base;
|
|
||||||
uint32_t plld_out;
|
|
||||||
uint32_t plld_misc1;
|
|
||||||
uint32_t plld_misc2;
|
|
||||||
|
|
||||||
/* PLLX 0xe0-0xe4 */
|
|
||||||
uint32_t pllx_base;
|
|
||||||
uint32_t pllx_misc;
|
|
||||||
|
|
||||||
/* PLLE 0xe8-0xf4 */
|
|
||||||
uint32_t plle_base;
|
|
||||||
uint32_t plle_misc;
|
|
||||||
uint32_t plle_ss_cntl1;
|
|
||||||
uint32_t plle_ss_cntl2;
|
|
||||||
|
|
||||||
uint32_t lvl2_clk_gate_ovra; /* _LVL2_CLK_GATE_OVRA_0, 0xf8 */
|
|
||||||
uint32_t lvl2_clk_gate_ovrb; /* _LVL2_CLK_GATE_OVRB_0, 0xfc */
|
|
||||||
|
|
||||||
uint32_t clk_source_i2s2; /* _CLK_SOURCE_I2S2_0, 0x100 */
|
|
||||||
uint32_t clk_source_i2s3; /* _CLK_SOURCE_I2S3_0, 0x104 */
|
|
||||||
uint32_t clk_source_spdif_out; /* _CLK_SOURCE_SPDIF_OUT_0, 0x108 */
|
|
||||||
uint32_t clk_source_spdif_in; /* _CLK_SOURCE_SPDIF_IN_0, 0x10c */
|
|
||||||
uint32_t clk_source_pwm; /* _CLK_SOURCE_PWM_0, 0x110 */
|
|
||||||
uint32_t _0x114;
|
|
||||||
uint32_t clk_source_spi2; /* _CLK_SOURCE_SPI2_0, 0x118 */
|
|
||||||
uint32_t clk_source_spi3; /* _CLK_SOURCE_SPI3_0, 0x11c */
|
|
||||||
uint32_t _0x120;
|
|
||||||
uint32_t clk_source_i2c1; /* _CLK_SOURCE_I2C1_0, 0x124 */
|
|
||||||
uint32_t clk_source_i2c5; /* _CLK_SOURCE_I2C5_0, 0x128 */
|
|
||||||
uint32_t _0x12c[2];
|
|
||||||
uint32_t clk_source_spi1; /* _CLK_SOURCE_SPI1_0, 0x134 */
|
|
||||||
uint32_t clk_source_disp1; /* _CLK_SOURCE_DISP1_0, 0x138 */
|
|
||||||
uint32_t clk_source_disp2; /* _CLK_SOURCE_DISP2_0, 0x13c */
|
|
||||||
uint32_t _0x140;
|
|
||||||
uint32_t clk_source_isp; /* _CLK_SOURCE_ISP_0, 0x144 */
|
|
||||||
uint32_t clk_source_vi; /* _CLK_SOURCE_VI_0, 0x148 */
|
|
||||||
uint32_t _0x14c;
|
|
||||||
uint32_t clk_source_sdmmc1; /* _CLK_SOURCE_SDMMC1_0, 0x150 */
|
|
||||||
uint32_t clk_source_sdmmc2; /* _CLK_SOURCE_SDMMC2_0, 0x154 */
|
|
||||||
uint32_t _0x158[3];
|
|
||||||
uint32_t clk_source_sdmmc4; /* _CLK_SOURCE_SDMMC4_0, 0x164 */
|
|
||||||
uint32_t _0x168[4];
|
|
||||||
uint32_t clk_source_uarta; /* _CLK_SOURCE_UARTA_0, 0x178 */
|
|
||||||
uint32_t clk_source_uartb; /* _CLK_SOURCE_UARTB_0, 0x17c */
|
|
||||||
uint32_t clk_source_host1x; /* _CLK_SOURCE_HOST1X_0, 0x180 */
|
|
||||||
uint32_t _0x184[5];
|
|
||||||
uint32_t clk_source_i2c2; /* _CLK_SOURCE_I2C2_0, 0x198 */
|
|
||||||
uint32_t clk_source_emc; /* _CLK_SOURCE_EMC_0, 0x19c */
|
|
||||||
uint32_t clk_source_uartc; /* _CLK_SOURCE_UARTC_0, 0x1a0 */
|
|
||||||
uint32_t _0x1a4;
|
|
||||||
uint32_t clk_source_vi_sensor; /* _CLK_SOURCE_VI_SENSOR_0, 0x1a8 */
|
|
||||||
uint32_t _0x1ac[2];
|
|
||||||
uint32_t clk_source_spi4; /* _CLK_SOURCE_SPI4_0, 0x1b4 */
|
|
||||||
uint32_t clk_source_i2c3; /* _CLK_SOURCE_I2C3_0, 0x1b8 */
|
|
||||||
uint32_t clk_source_sdmmc3; /* _CLK_SOURCE_SDMMC3_0, 0x1bc */
|
|
||||||
uint32_t clk_source_uartd; /* _CLK_SOURCE_UARTD_0, 0x1c0 */
|
|
||||||
uint32_t _0x1c4[2];
|
|
||||||
uint32_t clk_source_owr; /* _CLK_SOURCE_OWR_0, 0x1cc */
|
|
||||||
uint32_t _0x1d0;
|
|
||||||
uint32_t clk_source_csite; /* _CLK_SOURCE_CSITE_0, 0x1d4 */
|
|
||||||
uint32_t clk_source_i2s1; /* _CLK_SOURCE_I2S1_0, 0x1d8 */
|
|
||||||
uint32_t clk_source_dtv; /* _CLK_SOURCE_DTV_0, 0x1dc */
|
|
||||||
uint32_t _0x1e0[5];
|
|
||||||
uint32_t clk_source_tsec; /* _CLK_SOURCE_TSEC_0, 0x1f4 */
|
|
||||||
uint32_t _0x1f8;
|
|
||||||
|
|
||||||
uint32_t clk_spare2; /* _CLK_SPARE2_0, 0x1fc */
|
|
||||||
uint32_t _0x200[32];
|
|
||||||
|
|
||||||
uint32_t clk_out_enb_x; /* _CLK_OUT_ENB_X_0, 0x280 */
|
|
||||||
uint32_t clk_enb_x_set; /* _CLK_ENB_X_SET_0, 0x284 */
|
|
||||||
uint32_t clk_enb_x_clr; /* _CLK_ENB_X_CLR_0, 0x288 */
|
|
||||||
|
|
||||||
uint32_t rst_devices_x; /* _RST_DEVICES_X_0, 0x28c */
|
|
||||||
uint32_t rst_dev_x_set; /* _RST_DEV_X_SET_0, 0x290 */
|
|
||||||
uint32_t rst_dev_x_clr; /* _RST_DEV_X_CLR_0, 0x294 */
|
|
||||||
|
|
||||||
uint32_t clk_out_enb_y; /* _CLK_OUT_ENB_Y_0, 0x298 */
|
|
||||||
uint32_t clk_enb_y_set; /* _CLK_ENB_Y_SET_0, 0x29c */
|
|
||||||
uint32_t clk_enb_y_clr; /* _CLK_ENB_Y_CLR_0, 0x2a0 */
|
|
||||||
|
|
||||||
uint32_t rst_devices_y; /* _RST_DEVICES_Y_0, 0x2a4 */
|
|
||||||
uint32_t rst_dev_y_set; /* _RST_DEV_Y_SET_0, 0x2a8 */
|
|
||||||
uint32_t rst_dev_y_clr; /* _RST_DEV_Y_CLR_0, 0x2ac */
|
|
||||||
|
|
||||||
uint32_t _0x2b0[17];
|
|
||||||
uint32_t dfll_base; /* _DFLL_BASE_0, 0x2f4 */
|
|
||||||
uint32_t _0x2f8[2];
|
|
||||||
|
|
||||||
/* _RST_DEV_L/H/U_SET_0 0x300-0x314 */
|
|
||||||
uint32_t rst_dev_l_set;
|
|
||||||
uint32_t rst_dev_l_clr;
|
|
||||||
uint32_t rst_dev_h_set;
|
|
||||||
uint32_t rst_dev_h_clr;
|
|
||||||
uint32_t rst_dev_u_set;
|
|
||||||
uint32_t rst_dev_u_clr;
|
|
||||||
|
|
||||||
uint32_t _0x318[2];
|
|
||||||
|
|
||||||
/* _CLK_ENB_L/H/U_CLR_0 0x320-0x334 */
|
|
||||||
uint32_t clk_enb_l_set;
|
|
||||||
uint32_t clk_enb_l_clr;
|
|
||||||
uint32_t clk_enb_h_set;
|
|
||||||
uint32_t clk_enb_h_clr;
|
|
||||||
uint32_t clk_enb_u_set;
|
|
||||||
uint32_t clk_enb_u_clr;
|
|
||||||
|
|
||||||
uint32_t _0x338;
|
|
||||||
uint32_t ccplex_pg_sm_ovrd; /* _CCPLEX_PG_SM_OVRD_0, 0x33c */
|
|
||||||
uint32_t rst_cpu_cmplx_set; /* _RST_CPU_CMPLX_SET_0, 0x340 */
|
|
||||||
uint32_t rst_cpu_cmplx_clr; /* _RST_CPU_CMPLX_CLR_0, 0x344 */
|
|
||||||
|
|
||||||
/* Additional (T30) registers */
|
|
||||||
uint32_t clk_cpu_cmplx_set; /* _CLK_CPU_CMPLX_SET_0, 0x348 */
|
|
||||||
uint32_t clk_cpu_cmplx_clr; /* _CLK_CPU_CMPLX_SET_0, 0x34c */
|
|
||||||
|
|
||||||
uint32_t _0x350[2];
|
|
||||||
uint32_t rst_dev_v; /* _RST_DEVICES_V_0, 0x358 */
|
|
||||||
uint32_t rst_dev_w; /* _RST_DEVICES_W_0, 0x35c */
|
|
||||||
uint32_t clk_out_enb_v; /* _CLK_OUT_ENB_V_0, 0x360 */
|
|
||||||
uint32_t clk_out_enb_w; /* _CLK_OUT_ENB_W_0, 0x364 */
|
|
||||||
uint32_t cclkg_brst_pol; /* _CCLKG_BURST_POLICY_0, 0x368 */
|
|
||||||
uint32_t super_cclkg_div; /* _SUPER_CCLKG_DIVIDER_0, 0x36c */
|
|
||||||
uint32_t cclklp_brst_pol; /* _CCLKLP_BURST_POLICY_0, 0x370 */
|
|
||||||
uint32_t super_cclkp_div; /* _SUPER_CCLKLP_DIVIDER_0, 0x374 */
|
|
||||||
uint32_t clk_cpug_cmplx; /* _CLK_CPUG_CMPLX_0, 0x378 */
|
|
||||||
uint32_t clk_cpulp_cmplx; /* _CLK_CPULP_CMPLX_0, 0x37c */
|
|
||||||
uint32_t cpu_softrst_ctrl; /* _CPU_SOFTRST_CTRL_0, 0x380 */
|
|
||||||
uint32_t cpu_softrst_ctrl1; /* _CPU_SOFTRST_CTRL1_0, 0x384 */
|
|
||||||
uint32_t cpu_softrst_ctrl2; /* _CPU_SOFTRST_CTRL2_0, 0x388 */
|
|
||||||
uint32_t _0x38c[5];
|
|
||||||
uint32_t lvl2_clk_gate_ovrc; /* _LVL2_CLK_GATE_OVRC, 0x3a0 */
|
|
||||||
uint32_t lvl2_clk_gate_ovrd; /* _LVL2_CLK_GATE_OVRD, 0x3a4 */
|
|
||||||
uint32_t _0x3a8[2];
|
|
||||||
|
|
||||||
uint32_t _0x3b0;
|
|
||||||
uint32_t clk_source_mselect; /* _CLK_SOURCE_MSELECT_0, 0x3b4 */
|
|
||||||
uint32_t clk_source_tsensor; /* _CLK_SOURCE_TSENSOR_0, 0x3b8 */
|
|
||||||
uint32_t clk_source_i2s4; /* _CLK_SOURCE_I2S4_0, 0x3bc */
|
|
||||||
uint32_t clk_source_i2s5; /* _CLK_SOURCE_I2S5_0, 0x3c0 */
|
|
||||||
uint32_t clk_source_i2c4; /* _CLK_SOURCE_I2C4_0, 0x3c4 */
|
|
||||||
uint32_t _0x3c8[2];
|
|
||||||
uint32_t clk_source_ahub; /* _CLK_SOURCE_AHUB_0, 0x3d0 */
|
|
||||||
uint32_t _0x3d4[4];
|
|
||||||
uint32_t clk_source_hda2codec_2x; /* _CLK_SOURCE_HDA2CODEC_2X_0, 0x3e4 */
|
|
||||||
uint32_t clk_source_actmon; /* _CLK_SOURCE_ACTMON_0, 0x3e8 */
|
|
||||||
uint32_t clk_source_extperiph1; /* _CLK_SOURCE_EXTPERIPH1_0, 0x3ec */
|
|
||||||
uint32_t clk_source_extperiph2; /* _CLK_SOURCE_EXTPERIPH2_0, 0x3f0 */
|
|
||||||
uint32_t clk_source_extperiph3; /* _CLK_SOURCE_EXTPERIPH3_0, 0x3f4 */
|
|
||||||
uint32_t _0x3f8;
|
|
||||||
uint32_t clk_source_i2c_slow; /* _CLK_SOURCE_I2C_SLOW_0, 0x3fc */
|
|
||||||
uint32_t clk_source_sys; /* _CLK_SOURCE_SYS_0, 0x400 */
|
|
||||||
uint32_t clk_source_ispb; /* _CLK_SOURCE_ISPB_0, 0x404 */
|
|
||||||
uint32_t _0x408[2];
|
|
||||||
uint32_t clk_source_sor1; /* _CLK_SOURCE_SOR1_0, 0x410 */
|
|
||||||
uint32_t clk_source_sor0; /* _CLK_SOURCE_SOR0_0, 0x414 */
|
|
||||||
uint32_t _0x418[2];
|
|
||||||
uint32_t clk_source_sata_oob; /* _CLK_SOURCE_SATA_OOB_0, 0x420 */
|
|
||||||
uint32_t clk_source_sata; /* _CLK_SOURCE_SATA_0, 0x424 */
|
|
||||||
uint32_t clk_source_hda; /* _CLK_SOURCE_HDA_0, 0x428 */
|
|
||||||
uint32_t clk_source_se; /* _CLK_SOURCE_SE_0, 0x42c */
|
|
||||||
|
|
||||||
/* _RST_DEV_V/W_SET_0 0x430-0x43c */
|
|
||||||
uint32_t rst_dev_v_set;
|
|
||||||
uint32_t rst_dev_v_clr;
|
|
||||||
uint32_t rst_dev_w_set;
|
|
||||||
uint32_t rst_dev_w_clr;
|
|
||||||
|
|
||||||
/* _CLK_ENB_V/W_CLR_0 0x440-0x44c */
|
|
||||||
uint32_t clk_enb_v_set;
|
|
||||||
uint32_t clk_enb_v_clr;
|
|
||||||
uint32_t clk_enb_w_set;
|
|
||||||
uint32_t clk_enb_w_clr;
|
|
||||||
|
|
||||||
/* Additional (T114+) registers */
|
|
||||||
uint32_t rst_cpug_cmplx_set; /* _RST_CPUG_CMPLX_SET_0, 0x450 */
|
|
||||||
uint32_t rst_cpug_cmplx_clr; /* _RST_CPUG_CMPLX_CLR_0, 0x454 */
|
|
||||||
uint32_t rst_cpulp_cmplx_set; /* _RST_CPULP_CMPLX_SET_0, 0x458 */
|
|
||||||
uint32_t rst_cpulp_cmplx_clr; /* _RST_CPULP_CMPLX_CLR_0, 0x45c */
|
|
||||||
uint32_t clk_cpug_cmplx_set; /* _CLK_CPUG_CMPLX_SET_0, 0x460 */
|
|
||||||
uint32_t clk_cpug_cmplx_clr; /* _CLK_CPUG_CMPLX_CLR_0, 0x464 */
|
|
||||||
uint32_t clk_cpulp_cmplx_set; /* _CLK_CPULP_CMPLX_SET_0, 0x468 */
|
|
||||||
uint32_t clk_cpulp_cmplx_clr; /* _CLK_CPULP_CMPLX_CLR_0, 0x46c */
|
|
||||||
uint32_t cpu_cmplx_status; /* _CPU_CMPLX_STATUS_0, 0x470 */
|
|
||||||
uint32_t _0x474;
|
|
||||||
uint32_t intstatus; /* _INTSTATUS_0, 0x478 */
|
|
||||||
uint32_t intmask; /* _INTMASK_0, 0x47c */
|
|
||||||
uint32_t utmip_pll_cfg0; /* _UTMIP_PLL_CFG0_0, 0x480 */
|
|
||||||
uint32_t utmip_pll_cfg1; /* _UTMIP_PLL_CFG1_0, 0x484 */
|
|
||||||
uint32_t utmip_pll_cfg2; /* _UTMIP_PLL_CFG2_0, 0x488 */
|
|
||||||
|
|
||||||
uint32_t plle_aux; /* _PLLE_AUX_0, 0x48c */
|
|
||||||
uint32_t sata_pll_cfg0; /* _SATA_PLL_CFG0_0, 0x490 */
|
|
||||||
uint32_t sata_pll_cfg1; /* _SATA_PLL_CFG1_0, 0x494 */
|
|
||||||
uint32_t pcie_pll_cfg0; /* _PCIE_PLL_CFG0_0, 0x498 */
|
|
||||||
|
|
||||||
uint32_t prog_audio_dly_clk; /* _PROG_AUDIO_DLY_CLK_0, 0x49c */
|
|
||||||
uint32_t audio_sync_clk_i2s0; /* _AUDIO_SYNC_CLK_I2S0_0, 0x4a0 */
|
|
||||||
uint32_t audio_sync_clk_i2s1; /* _AUDIO_SYNC_CLK_I2S1_0, 0x4a4 */
|
|
||||||
uint32_t audio_sync_clk_i2s2; /* _AUDIO_SYNC_CLK_I2S2_0, 0x4a8 */
|
|
||||||
uint32_t audio_sync_clk_i2s3; /* _AUDIO_SYNC_CLK_I2S3_0, 0x4ac */
|
|
||||||
uint32_t audio_sync_clk_i2s4; /* _AUDIO_SYNC_CLK_I2S4_0, 0x4b0 */
|
|
||||||
uint32_t audio_sync_clk_spdif; /* _AUDIO_SYNC_CLK_SPDIF_0, 0x4b4 */
|
|
||||||
|
|
||||||
uint32_t plld2_base; /* _PLLD2_BASE_0, 0x4b8 */
|
|
||||||
uint32_t plld2_misc; /* _PLLD2_MISC_0, 0x4bc */
|
|
||||||
uint32_t utmip_pll_cfg3; /* _UTMIP_PLL_CFG3_0, 0x4c0 */
|
|
||||||
uint32_t pllrefe_base; /* _PLLREFE_BASE_0, 0x4c4 */
|
|
||||||
uint32_t pllrefe_misc; /* _PLLREFE_MISC_0, 0x4c8 */
|
|
||||||
uint32_t pllrefe_out; /* _PLLREFE_OUT_0, 0x4cc */
|
|
||||||
uint32_t cpu_finetrim_byp; /* _CPU_FINETRIM_BYP_0, 0x4d0 */
|
|
||||||
uint32_t cpu_finetrim_select; /* _CPU_FINETRIM_SELECT_0, 0x4d4 */
|
|
||||||
uint32_t cpu_finetrim_dr; /* _CPU_FINETRIM_DR_0, 0x4d8 */
|
|
||||||
uint32_t cpu_finetrim_df; /* _CPU_FINETRIM_DF_0, 0x4dc */
|
|
||||||
uint32_t cpu_finetrim_f; /* _CPU_FINETRIM_F_0, 0x4e0 */
|
|
||||||
uint32_t cpu_finetrim_r; /* _CPU_FINETRIM_R_0, 0x4e4 */
|
|
||||||
uint32_t pllc2_base; /* _PLLC2_BASE_0, 0x4e8 */
|
|
||||||
uint32_t pllc2_misc0; /* _PLLC2_MISC_0_0, 0x4ec */
|
|
||||||
uint32_t pllc2_misc1; /* _PLLC2_MISC_1_0, 0x4f0 */
|
|
||||||
uint32_t pllc2_misc2; /* _PLLC2_MISC_2_0, 0x4f4 */
|
|
||||||
uint32_t pllc2_misc3; /* _PLLC2_MISC_3_0, 0x4f8 */
|
|
||||||
uint32_t pllc3_base; /* _PLLC3_BASE_0, 0x4fc */
|
|
||||||
uint32_t pllc3_misc0; /* _PLLC3_MISC_0_0, 0x500 */
|
|
||||||
uint32_t pllc3_misc1; /* _PLLC3_MISC_1_0, 0x504 */
|
|
||||||
uint32_t pllc3_misc2; /* _PLLC3_MISC_2_0, 0x508 */
|
|
||||||
uint32_t pllc3_misc3; /* _PLLC3_MISC_3_0, 0x50c */
|
|
||||||
uint32_t pllx_misc1; /* _PLLX_MISC_1_0, 0x510 */
|
|
||||||
uint32_t pllx_misc2; /* _PLLX_MISC_2_0, 0x514 */
|
|
||||||
uint32_t pllx_misc3; /* _PLLX_MISC_3_0, 0x518 */
|
|
||||||
uint32_t xusbio_pll_cfg0; /* _XUSBIO_PLL_CFG0_0, 0x51c */
|
|
||||||
uint32_t xusbio_pll_cfg1; /* _XUSBIO_PLL_CFG0_1, 0x520 */
|
|
||||||
uint32_t plle_aux1; /* _PLLE_AUX1_0, 0x524 */
|
|
||||||
uint32_t pllp_reshift; /* _PLLP_RESHIFT_0, 0x528 */
|
|
||||||
uint32_t utmipll_hw_pwrdn_cfg0; /* _UTMIPLL_HW_PWRDN_CFG0_0, 0x52c */
|
|
||||||
uint32_t pllu_hw_pwrdn_cfg0; /* _PLLU_HW_PWRDN_CFG0_0, 0x530 */
|
|
||||||
uint32_t xusb_pll_cfg0; /* _XUSB_PLL_CFG0_0, 0x534 */
|
|
||||||
uint32_t _0x538;
|
|
||||||
uint32_t clk_cpu_misc; /* _CLK_CPU_MISC_0, 0x53c */
|
|
||||||
uint32_t clk_cpug_misc; /* _CLK_CPUG_MISC_0, 0x540 */
|
|
||||||
uint32_t clk_cpulp_misc; /* _CLK_CPULP_MISC_0, 0x544 */
|
|
||||||
uint32_t pllx_hw_ctrl_cfg; /* _PLLX_HW_CTRL_CFG_0, 0x548 */
|
|
||||||
uint32_t pllx_sw_ramp_cfg; /* _PLLX_SW_RAMP_CFG_0, 0x54c */
|
|
||||||
uint32_t pllx_hw_ctrl_status; /* _PLLX_HW_CTRL_STATUS_0, 0x550 */
|
|
||||||
uint32_t lvl2_clk_gate_ovre; /* _LVL2_CLK_GATE_OVRE, 0x554 */
|
|
||||||
uint32_t super_gr3d_clk_div; /* _SUPER_GR3D_CLK_DIVIDER_0, 0x558 */
|
|
||||||
uint32_t spare_reg0; /* _SPARE_REG0_0, 0x55c */
|
|
||||||
uint32_t audio_sync_clk_dmic1; /* _AUDIO_SYNC_CLK_DMIC1_0, 0x560 */
|
|
||||||
uint32_t audio_sync_clk_dmic2; /* _AUDIO_SYNC_CLK_DMIC2_0, 0x564 */
|
|
||||||
|
|
||||||
uint32_t _0x568[2];
|
|
||||||
uint32_t plld2_ss_cfg; /* _PLLD2_SS_CFG, 0x570 */
|
|
||||||
uint32_t plld2_ss_ctrl1; /* _PLLD2_SS_CTRL1_0, 0x574 */
|
|
||||||
uint32_t plld2_ss_ctrl2; /* _PLLD2_SS_CTRL2_0, 0x578 */
|
|
||||||
uint32_t _0x57c[5];
|
|
||||||
|
|
||||||
uint32_t plldp_base; /* _PLLDP_BASE, 0x590*/
|
|
||||||
uint32_t plldp_misc; /* _PLLDP_MISC, 0x594 */
|
|
||||||
uint32_t plldp_ss_cfg; /* _PLLDP_SS_CFG, 0x598 */
|
|
||||||
uint32_t plldp_ss_ctrl1; /* _PLLDP_SS_CTRL1_0, 0x59c */
|
|
||||||
uint32_t plldp_ss_ctrl2; /* _PLLDP_SS_CTRL2_0, 0x5a0 */
|
|
||||||
uint32_t pllc4_base; /* _PLLC4_BASE_0, 0x5a4 */
|
|
||||||
uint32_t pllc4_misc; /* _PLLC4_MISC_0, 0x5a8 */
|
|
||||||
uint32_t _0x5ac[6];
|
|
||||||
uint32_t clk_spare0; /* _CLK_SPARE0_0, 0x5c4 */
|
|
||||||
uint32_t clk_spare1; /* _CLK_SPARE1_0, 0x5c8 */
|
|
||||||
uint32_t gpu_isob_ctrl; /* _GPU_ISOB_CTRL_0, 0x5cc */
|
|
||||||
uint32_t pllc_misc2; /* _PLLC_MISC_2_0, 0x5d0 */
|
|
||||||
uint32_t pllc_misc3; /* _PLLC_MISC_3_0, 0x5d4 */
|
|
||||||
uint32_t plla_misc2; /* _PLLA_MISC2_0, 0x5d8 */
|
|
||||||
uint32_t _0x5dc[2];
|
|
||||||
uint32_t pllc4_out; /* _PLLC4_OUT_0, 0x5e4 */
|
|
||||||
uint32_t pllmb_base; /* _PLLMB_BASE_0, 0x5e8 */
|
|
||||||
uint32_t pllmb_misc1; /* _PLLMB_MISC1_0, 0x5ec */
|
|
||||||
uint32_t pllx_misc4; /* _PLLX_MISC_4_0, 0x5f0 */
|
|
||||||
uint32_t pllx_misc5; /* _PLLX_MISC_5_0, 0x5f4 */
|
|
||||||
uint32_t _0x5f8[2];
|
|
||||||
|
|
||||||
uint32_t clk_source_xusb_core_host; /* _CLK_SOURCE_XUSB_CORE_HOST_0, 0x600 */
|
|
||||||
uint32_t clk_source_xusb_falcon; /* _CLK_SOURCE_XUSB_FALCON_0, 0x604 */
|
|
||||||
uint32_t clk_source_xusb_fs; /* _CLK_SOURCE_XUSB_FS_0, 0x608 */
|
|
||||||
uint32_t clk_source_xusb_core_dev; /* _CLK_SOURCE_XUSB_CORE_DEV_0, 0x60c */
|
|
||||||
uint32_t clk_source_xusb_ss; /* _CLK_SOURCE_XUSB_SS_0, 0x610 */
|
|
||||||
uint32_t clk_source_cilab; /* _CLK_SOURCE_CILAB_0, 0x614 */
|
|
||||||
uint32_t clk_source_cilcd; /* _CLK_SOURCE_CILCD_0, 0x618 */
|
|
||||||
uint32_t clk_source_cilef; /* _CLK_SOURCE_CILEF_0, 0x61c */
|
|
||||||
uint32_t clk_source_dsia_lp; /* _CLK_SOURCE_DSIA_LP_0, 0x620 */
|
|
||||||
uint32_t clk_source_dsib_lp; /* _CLK_SOURCE_DSIB_LP_0, 0x624 */
|
|
||||||
uint32_t clk_source_entropy; /* _CLK_SOURCE_ENTROPY_0, 0x628 */
|
|
||||||
uint32_t clk_source_dvfs_ref; /* _CLK_SOURCE_DVFS_REF_0, 0x62c */
|
|
||||||
uint32_t clk_source_dvfs_soc; /* _CLK_SOURCE_DVFS_SOC_0, 0x630 */
|
|
||||||
uint32_t _0x634[3];
|
|
||||||
uint32_t clk_source_emc_latency; /* _CLK_SOURCE_EMC_LATENCY_0, 0x640 */
|
|
||||||
uint32_t clk_source_soc_therm; /* _CLK_SOURCE_SOC_THERM_0, 0x644 */
|
|
||||||
uint32_t _0x648;
|
|
||||||
uint32_t clk_source_dmic1; /* _CLK_SOURCE_DMIC1_0, 0x64c */
|
|
||||||
uint32_t clk_source_dmic2; /* _CLK_SOURCE_DMIC2_0, 0x650 */
|
|
||||||
uint32_t _0x654;
|
|
||||||
uint32_t clk_source_vi_sensor2; /* _CLK_SOURCE_VI_SENSOR2_0, 0x658 */
|
|
||||||
uint32_t clk_source_i2c6; /* _CLK_SOURCE_I2C6_0, 0x65c */
|
|
||||||
uint32_t clk_source_mipibif; /* _CLK_SOURCE_MIPIBIF_0, 0x660 */
|
|
||||||
uint32_t clk_source_emc_dll; /* _CLK_SOURCE_EMC_DLL_0, 0x664 */
|
|
||||||
uint32_t _0x668;
|
|
||||||
uint32_t clk_source_uart_fst_mipi_cal; /* _CLK_SOURCE_UART_FST_MIPI_CAL_0, 0x66c */
|
|
||||||
uint32_t _0x670[2];
|
|
||||||
uint32_t clk_source_vic; /* _CLK_SOURCE_VIC_0, 0x678 */
|
|
||||||
|
|
||||||
uint32_t pllp_outc; /* _PLLP_OUTC_0, 0x67c */
|
|
||||||
uint32_t pllp_misc1; /* _PLLP_MISC1_0, 0x680 */
|
|
||||||
uint32_t _0x684[2];
|
|
||||||
uint32_t emc_div_clk_shaper_ctrl; /* _EMC_DIV_CLK_SHAPER_CTRL_0, 0x68c */
|
|
||||||
uint32_t emc_pllc_shaper_ctrl; /* _EMC_PLLC_SHAPER_CTRL_0, 0x690 */
|
|
||||||
|
|
||||||
uint32_t clk_source_sdmmc_legacy_tm; /* _CLK_SOURCE_SDMMC_LEGACY_TM_0, 0x694 */
|
|
||||||
uint32_t clk_source_nvdec; /* _CLK_SOURCE_NVDEC_0, 0x698 */
|
|
||||||
uint32_t clk_source_nvjpg; /* _CLK_SOURCE_NVJPG_0, 0x69c */
|
|
||||||
uint32_t clk_source_nvenc; /* _CLK_SOURCE_NVENC_0, 0x6a0 */
|
|
||||||
|
|
||||||
uint32_t plla1_base; /* _PLLA1_BASE_0, 0x6a4 */
|
|
||||||
uint32_t plla1_misc0; /* _PLLA1_MISC_0_0, 0x6a8 */
|
|
||||||
uint32_t plla1_misc1; /* _PLLA1_MISC_1_0, 0x6ac */
|
|
||||||
uint32_t plla1_misc2; /* _PLLA1_MISC_2_0, 0x6b0 */
|
|
||||||
uint32_t plla1_misc3; /* _PLLA1_MISC_3_0, 0x6b4 */
|
|
||||||
uint32_t audio_sync_clk_dmic3; /* _AUDIO_SYNC_CLK_DMIC3_0, 0x6b8 */
|
|
||||||
|
|
||||||
uint32_t clk_source_dmic3; /* _CLK_SOURCE_DMIC3_0, 0x6bc */
|
|
||||||
uint32_t clk_source_ape; /* _CLK_SOURCE_APE_0, 0x6c0 */
|
|
||||||
uint32_t clk_source_qspi; /* _CLK_SOURCE_QSPI_0, 0x6c4 */
|
|
||||||
uint32_t clk_source_vi_i2c; /* _CLK_SOURCE_VI_I2C_0, 0x6c8 */
|
|
||||||
uint32_t clk_source_usb2_hsic_trk; /* _CLK_SOURCE_USB2_HSIC_TRK_0, 0x6cc */
|
|
||||||
uint32_t clk_source_pex_sata_usb_rx_byp; /* _CLK_SOURCE_PEX_SATA_USB_RX_BYP_0, 0x6d0 */
|
|
||||||
uint32_t clk_source_maud; /* _CLK_SOURCE_MAUD_0, 0x6d4 */
|
|
||||||
uint32_t clk_source_tsecb; /* _CLK_SOURCE_TSECB_0, 0x6d8 */
|
|
||||||
|
|
||||||
uint32_t clk_cpug_misc1; /* _CLK_CPUG_MISC1_0, 0x6dc */
|
|
||||||
uint32_t aclk_burst_policy; /* _ACLK_BURST_POLICY_0, 0x6e0 */
|
|
||||||
uint32_t super_aclk_divider; /* _SUPER_ACLK_DIVIDER_0, 0x6e4 */
|
|
||||||
|
|
||||||
uint32_t nvenc_super_clk_divider; /* _NVENC_SUPER_CLK_DIVIDER_0, 0x6e8 */
|
|
||||||
uint32_t vi_super_clk_divider; /* _VI_SUPER_CLK_DIVIDER_0, 0x6ec */
|
|
||||||
uint32_t vic_super_clk_divider; /* _VIC_SUPER_CLK_DIVIDER_0, 0x6f0 */
|
|
||||||
uint32_t nvdec_super_clk_divider; /* _NVDEC_SUPER_CLK_DIVIDER_0, 0x6f4 */
|
|
||||||
uint32_t isp_super_clk_divider; /* _ISP_SUPER_CLK_DIVIDER_0, 0x6f8 */
|
|
||||||
uint32_t ispb_super_clk_divider; /* _ISPB_SUPER_CLK_DIVIDER_0, 0x6fc */
|
|
||||||
uint32_t nvjpg_super_clk_divider; /* _NVJPG_SUPER_CLK_DIVIDER_0, 0x700 */
|
|
||||||
uint32_t se_super_clk_divider; /* _SE_SUPER_CLK_DIVIDER_0, 0x704 */
|
|
||||||
uint32_t tsec_super_clk_divider; /* _TSEC_SUPER_CLK_DIVIDER_0, 0x708 */
|
|
||||||
uint32_t tsecb_super_clk_divider; /* _TSECB_SUPER_CLK_DIVIDER_0, 0x70c */
|
|
||||||
|
|
||||||
uint32_t clk_source_uartape; /* _CLK_SOURCE_UARTAPE_0, 0x710 */
|
|
||||||
uint32_t clk_cpug_misc2; /* _CLK_CPUG_MISC2_0, 0x714 */
|
|
||||||
uint32_t clk_source_dbgapb; /* _CLK_SOURCE_DBGAPB_0, 0x718 */
|
|
||||||
uint32_t clk_ccplex_cc4_ret_clk_enb; /* _CLK_CCPLEX_CC4_RET_CLK_ENB_0, 0x71c */
|
|
||||||
uint32_t actmon_cpu_clk; /* _ACTMON_CPU_CLK_0, 0x720 */
|
|
||||||
uint32_t clk_source_emc_safe; /* _CLK_SOURCE_EMC_SAFE_0, 0x724 */
|
|
||||||
uint32_t sdmmc2_pllc4_out0_shaper_ctrl; /* _SDMMC2_PLLC4_OUT0_SHAPER_CTRL_0, 0x728 */
|
|
||||||
uint32_t sdmmc2_pllc4_out1_shaper_ctrl; /* _SDMMC2_PLLC4_OUT1_SHAPER_CTRL_0, 0x72c */
|
|
||||||
uint32_t sdmmc2_pllc4_out2_shaper_ctrl; /* _SDMMC2_PLLC4_OUT2_SHAPER_CTRL_0, 0x730 */
|
|
||||||
uint32_t sdmmc2_div_clk_shaper_ctrl; /* _SDMMC2_DIV_CLK_SHAPER_CTRL_0, 0x734 */
|
|
||||||
uint32_t sdmmc4_pllc4_out0_shaper_ctrl; /* _SDMMC4_PLLC4_OUT0_SHAPER_CTRL_0, 0x738 */
|
|
||||||
uint32_t sdmmc4_pllc4_out1_shaper_ctrl; /* _SDMMC4_PLLC4_OUT1_SHAPER_CTRL_0, 0x73c */
|
|
||||||
uint32_t sdmmc4_pllc4_out2_shaper_ctrl; /* _SDMMC4_PLLC4_OUT2_SHAPER_CTRL_0, 0x740 */
|
|
||||||
uint32_t sdmmc4_div_clk_shaper_ctrl; /* _SDMMC4_DIV_CLK_SHAPER_CTRL_0, 0x744 */
|
|
||||||
} tegra_car_t;
|
|
||||||
|
|
||||||
static inline volatile tegra_car_t *car_get_regs(void) {
|
|
||||||
return (volatile tegra_car_t *)CAR_BASE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clk_enable(CarDevice dev);
|
|
||||||
void clk_disable(CarDevice dev);
|
|
||||||
void rst_enable(CarDevice dev);
|
|
||||||
void rst_disable(CarDevice dev);
|
|
||||||
|
|
||||||
void clkrst_enable(CarDevice dev);
|
|
||||||
void clkrst_disable(CarDevice dev);
|
|
||||||
void clkrst_reboot(CarDevice dev);
|
|
||||||
|
|
||||||
void clkrst_enable_fuse_regs(bool enable);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,346 +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 <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <vapours/ams_version.h>
|
|
||||||
|
|
||||||
#include "car.h"
|
|
||||||
#include "fuse.h"
|
|
||||||
#include "pmc.h"
|
|
||||||
#include "timers.h"
|
|
||||||
|
|
||||||
/* Initialize the fuse driver */
|
|
||||||
void fuse_init(void) {
|
|
||||||
/* Make all fuse registers visible, disable the private key and disable programming. */
|
|
||||||
clkrst_enable_fuse_regs(true);
|
|
||||||
fuse_disable_private_key();
|
|
||||||
fuse_disable_programming();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable access to the private key and set the TZ sticky bit. */
|
|
||||||
void fuse_disable_private_key(void) {
|
|
||||||
volatile tegra_fuse_t *fuse = fuse_get_regs();
|
|
||||||
fuse->FUSE_PRIVATEKEYDISABLE = 0x10;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable all fuse programming. */
|
|
||||||
void fuse_disable_programming(void) {
|
|
||||||
volatile tegra_fuse_t *fuse = fuse_get_regs();
|
|
||||||
fuse->FUSE_DISABLEREGPROGRAM = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable power to the fuse hardware array. */
|
|
||||||
void fuse_enable_power(void) {
|
|
||||||
volatile tegra_pmc_t *pmc = pmc_get_regs();
|
|
||||||
pmc->fuse_control &= ~(0x200); /* Clear PMC_FUSE_CTRL_PS18_LATCH_CLEAR. */
|
|
||||||
mdelay(1);
|
|
||||||
pmc->fuse_control |= 0x100; /* Set PMC_FUSE_CTRL_PS18_LATCH_SET. */
|
|
||||||
mdelay(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable power to the fuse hardware array. */
|
|
||||||
void fuse_disable_power(void) {
|
|
||||||
volatile tegra_pmc_t *pmc = pmc_get_regs();
|
|
||||||
pmc->fuse_control &= ~(0x100); /* Clear PMC_FUSE_CTRL_PS18_LATCH_SET. */
|
|
||||||
mdelay(1);
|
|
||||||
pmc->fuse_control |= 0x200; /* Set PMC_FUSE_CTRL_PS18_LATCH_CLEAR. */
|
|
||||||
mdelay(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wait for the fuse driver to go idle. */
|
|
||||||
static void fuse_wait_idle(void) {
|
|
||||||
volatile tegra_fuse_t *fuse = fuse_get_regs();
|
|
||||||
uint32_t ctrl_val = 0;
|
|
||||||
|
|
||||||
/* Wait for STATE_IDLE */
|
|
||||||
while ((ctrl_val & (0xF0000)) != 0x40000) {
|
|
||||||
ctrl_val = fuse->FUSE_FUSECTRL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read a fuse from the hardware array. */
|
|
||||||
uint32_t fuse_hw_read(uint32_t addr) {
|
|
||||||
volatile tegra_fuse_t *fuse = fuse_get_regs();
|
|
||||||
|
|
||||||
/* Wait for idle state. */
|
|
||||||
fuse_wait_idle();
|
|
||||||
|
|
||||||
/* Program the target address. */
|
|
||||||
fuse->FUSE_FUSEADDR = addr;
|
|
||||||
|
|
||||||
/* Enable read operation in control register. */
|
|
||||||
uint32_t ctrl_val = fuse->FUSE_FUSECTRL;
|
|
||||||
ctrl_val &= ~0x3;
|
|
||||||
ctrl_val |= 0x1; /* Set READ command. */
|
|
||||||
fuse->FUSE_FUSECTRL = ctrl_val;
|
|
||||||
|
|
||||||
/* Wait for idle state. */
|
|
||||||
fuse_wait_idle();
|
|
||||||
|
|
||||||
return fuse->FUSE_FUSERDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write a fuse in the hardware array. */
|
|
||||||
void fuse_hw_write(uint32_t value, uint32_t addr) {
|
|
||||||
volatile tegra_fuse_t *fuse = fuse_get_regs();
|
|
||||||
|
|
||||||
/* Wait for idle state. */
|
|
||||||
fuse_wait_idle();
|
|
||||||
|
|
||||||
/* Program the target address and value. */
|
|
||||||
fuse->FUSE_FUSEADDR = addr;
|
|
||||||
fuse->FUSE_FUSEWDATA = value;
|
|
||||||
|
|
||||||
/* Enable write operation in control register. */
|
|
||||||
uint32_t ctrl_val = fuse->FUSE_FUSECTRL;
|
|
||||||
ctrl_val &= ~0x3;
|
|
||||||
ctrl_val |= 0x2; /* Set WRITE command. */
|
|
||||||
fuse->FUSE_FUSECTRL = ctrl_val;
|
|
||||||
|
|
||||||
/* Wait for idle state. */
|
|
||||||
fuse_wait_idle();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sense the fuse hardware array into the fuse cache. */
|
|
||||||
void fuse_hw_sense(void) {
|
|
||||||
volatile tegra_fuse_t *fuse = fuse_get_regs();
|
|
||||||
|
|
||||||
/* Wait for idle state. */
|
|
||||||
fuse_wait_idle();
|
|
||||||
|
|
||||||
/* Enable sense operation in control register */
|
|
||||||
uint32_t ctrl_val = fuse->FUSE_FUSECTRL;
|
|
||||||
ctrl_val &= ~0x3;
|
|
||||||
ctrl_val |= 0x3; /* Set SENSE_CTRL command */
|
|
||||||
fuse->FUSE_FUSECTRL = ctrl_val;
|
|
||||||
|
|
||||||
/* Wait for idle state. */
|
|
||||||
fuse_wait_idle();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read the SKU info register. */
|
|
||||||
uint32_t fuse_get_sku_info(void) {
|
|
||||||
volatile tegra_fuse_chip_common_t *fuse_chip = fuse_chip_common_get_regs();
|
|
||||||
return fuse_chip->FUSE_SKU_INFO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read the bootrom patch version. */
|
|
||||||
uint32_t fuse_get_bootrom_patch_version(void) {
|
|
||||||
volatile tegra_fuse_chip_common_t *fuse_chip = fuse_chip_common_get_regs();
|
|
||||||
return fuse_chip->FUSE_SOC_SPEEDO_1_CALIB;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read a spare bit register. */
|
|
||||||
uint32_t fuse_get_spare_bit(uint32_t index) {
|
|
||||||
uint32_t soc_type = fuse_get_soc_type();
|
|
||||||
if (soc_type == 0) {
|
|
||||||
if (index < 32) {
|
|
||||||
volatile tegra_fuse_chip_erista_t *fuse_chip = fuse_chip_erista_get_regs();
|
|
||||||
return fuse_chip->FUSE_SPARE_BIT[index];
|
|
||||||
}
|
|
||||||
} else if (soc_type == 1) {
|
|
||||||
if (index < 30) {
|
|
||||||
volatile tegra_fuse_chip_mariko_t *fuse_chip = fuse_chip_mariko_get_regs();
|
|
||||||
return fuse_chip->FUSE_SPARE_BIT[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read a reserved ODM register. */
|
|
||||||
uint32_t fuse_get_reserved_odm(uint32_t index) {
|
|
||||||
if (index < 8) {
|
|
||||||
volatile tegra_fuse_chip_common_t *fuse_chip = fuse_chip_common_get_regs();
|
|
||||||
return fuse_chip->FUSE_RESERVED_ODM0[index];
|
|
||||||
} else {
|
|
||||||
uint32_t soc_type = fuse_get_soc_type();
|
|
||||||
if (soc_type == 1) {
|
|
||||||
volatile tegra_fuse_chip_mariko_t *fuse_chip = fuse_chip_mariko_get_regs();
|
|
||||||
if (index < 22) {
|
|
||||||
return fuse_chip->FUSE_RESERVED_ODM8[index - 8];
|
|
||||||
} else if (index < 25) {
|
|
||||||
return fuse_chip->FUSE_RESERVED_ODM22[index - 22];
|
|
||||||
} else if (index < 26) {
|
|
||||||
return fuse_chip->FUSE_RESERVED_ODM25;
|
|
||||||
} else if (index < 29) {
|
|
||||||
return fuse_chip->FUSE_RESERVED_ODM26[index - 26];
|
|
||||||
} else if (index < 30) {
|
|
||||||
return fuse_chip->FUSE_RESERVED_ODM29;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the DramId. */
|
|
||||||
uint32_t fuse_get_dram_id(void) {
|
|
||||||
return ((fuse_get_reserved_odm(4) >> 3) & 0x1F);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Derive the DeviceId. */
|
|
||||||
uint64_t fuse_get_device_id(void) {
|
|
||||||
volatile tegra_fuse_chip_common_t *fuse_chip = fuse_chip_common_get_regs();
|
|
||||||
|
|
||||||
uint64_t device_id = 0;
|
|
||||||
uint64_t y_coord = fuse_chip->FUSE_OPT_Y_COORDINATE & 0x1FF;
|
|
||||||
uint64_t x_coord = fuse_chip->FUSE_OPT_X_COORDINATE & 0x1FF;
|
|
||||||
uint64_t wafer_id = fuse_chip->FUSE_OPT_WAFER_ID & 0x3F;
|
|
||||||
uint32_t lot_code = fuse_chip->FUSE_OPT_LOT_CODE_0;
|
|
||||||
uint64_t fab_code = fuse_chip->FUSE_OPT_FAB_CODE & 0x3F;
|
|
||||||
|
|
||||||
uint64_t derived_lot_code = 0;
|
|
||||||
for (unsigned int i = 0; i < 5; i++) {
|
|
||||||
derived_lot_code = (derived_lot_code * 0x24) + ((lot_code >> (24 - 6*i)) & 0x3F);
|
|
||||||
}
|
|
||||||
derived_lot_code &= 0x03FFFFFF;
|
|
||||||
|
|
||||||
device_id |= y_coord << 0;
|
|
||||||
device_id |= x_coord << 9;
|
|
||||||
device_id |= wafer_id << 18;
|
|
||||||
device_id |= derived_lot_code << 24;
|
|
||||||
device_id |= fab_code << 50;
|
|
||||||
|
|
||||||
return device_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Derive the HardwareType with firmware specific checks. */
|
|
||||||
uint32_t fuse_get_hardware_type_with_firmware_check(uint32_t target_firmware) {
|
|
||||||
uint32_t fuse_reserved_odm4 = fuse_get_reserved_odm(4);
|
|
||||||
uint32_t hardware_type = (((fuse_reserved_odm4 >> 7) & 2) | ((fuse_reserved_odm4 >> 2) & 1));
|
|
||||||
|
|
||||||
if (target_firmware < ATMOSPHERE_TARGET_FIRMWARE_4_0_0) {
|
|
||||||
volatile tegra_fuse_chip_common_t *fuse_chip = fuse_chip_common_get_regs();
|
|
||||||
uint32_t fuse_spare_bit9 = (fuse_chip->FUSE_SPARE_BIT[9] & 1);
|
|
||||||
|
|
||||||
switch (hardware_type) {
|
|
||||||
case 0x00: return (fuse_spare_bit9 == 0) ? 0 : 3;
|
|
||||||
case 0x01: return 0; /* HardwareType_Icosa */
|
|
||||||
case 0x02: return 1; /* HardwareType_Copper */
|
|
||||||
default: return 3; /* HardwareType_Undefined */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
hardware_type |= ((fuse_reserved_odm4 >> 14) & 0x3C);
|
|
||||||
|
|
||||||
if (target_firmware < ATMOSPHERE_TARGET_FIRMWARE_7_0_0) {
|
|
||||||
switch (hardware_type) {
|
|
||||||
case 0x01: return 0; /* HardwareType_Icosa */
|
|
||||||
case 0x02: return 1; /* HardwareType_Copper */
|
|
||||||
case 0x04: return 3; /* HardwareType_Iowa */
|
|
||||||
default: return 4; /* HardwareType_Undefined */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (target_firmware < ATMOSPHERE_TARGET_FIRMWARE_10_0_0) {
|
|
||||||
switch (hardware_type) {
|
|
||||||
case 0x01: return 0; /* HardwareType_Icosa */
|
|
||||||
case 0x02: return 4; /* HardwareType_Calcio */
|
|
||||||
case 0x04: return 3; /* HardwareType_Iowa */
|
|
||||||
case 0x08: return 2; /* HardwareType_Hoag */
|
|
||||||
default: return 0xF; /* HardwareType_Undefined */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (hardware_type) {
|
|
||||||
case 0x01: return 0; /* HardwareType_Icosa */
|
|
||||||
case 0x02: return 4; /* HardwareType_Calcio */
|
|
||||||
case 0x04: return 3; /* HardwareType_Iowa */
|
|
||||||
case 0x08: return 2; /* HardwareType_Hoag */
|
|
||||||
case 0x10: return 5; /* HardwareType_Five */
|
|
||||||
default: return 0xF; /* HardwareType_Undefined */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Derive the HardwareType. */
|
|
||||||
uint32_t fuse_get_hardware_type(void) {
|
|
||||||
return fuse_get_hardware_type_with_firmware_check(ATMOSPHERE_TARGET_FIRMWARE_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Derive the HardwareState. */
|
|
||||||
uint32_t fuse_get_hardware_state(void) {
|
|
||||||
uint32_t fuse_reserved_odm4 = fuse_get_reserved_odm(4);
|
|
||||||
uint32_t hardware_state = (((fuse_reserved_odm4 >> 7) & 4) | (fuse_reserved_odm4 & 3));
|
|
||||||
|
|
||||||
switch (hardware_state) {
|
|
||||||
case 0x03: return 0; /* HardwareState_Development */
|
|
||||||
case 0x04: return 1; /* HardwareState_Production */
|
|
||||||
default: return 2; /* HardwareState_Undefined */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Derive the 16-byte HardwareInfo and copy to output buffer. */
|
|
||||||
void fuse_get_hardware_info(void *dst) {
|
|
||||||
volatile tegra_fuse_chip_common_t *fuse_chip = fuse_chip_common_get_regs();
|
|
||||||
uint32_t hw_info[0x4];
|
|
||||||
|
|
||||||
uint32_t ops_reserved = fuse_chip->FUSE_OPT_OPS_RESERVED & 0x3F;
|
|
||||||
uint32_t y_coord = fuse_chip->FUSE_OPT_Y_COORDINATE & 0x1FF;
|
|
||||||
uint32_t x_coord = fuse_chip->FUSE_OPT_X_COORDINATE & 0x1FF;
|
|
||||||
uint32_t wafer_id = fuse_chip->FUSE_OPT_WAFER_ID & 0x3F;
|
|
||||||
uint32_t lot_code_0 = fuse_chip->FUSE_OPT_LOT_CODE_0;
|
|
||||||
uint32_t lot_code_1 = fuse_chip->FUSE_OPT_LOT_CODE_1 & 0x0FFFFFFF;
|
|
||||||
uint32_t fab_code = fuse_chip->FUSE_OPT_FAB_CODE & 0x3F;
|
|
||||||
uint32_t vendor_code = fuse_chip->FUSE_OPT_VENDOR_CODE & 0xF;
|
|
||||||
|
|
||||||
/* Hardware Info = OPS_RESERVED || Y_COORD || X_COORD || WAFER_ID || LOT_CODE || FAB_CODE || VENDOR_ID */
|
|
||||||
hw_info[0] = (uint32_t)((lot_code_1 << 30) | (wafer_id << 24) | (x_coord << 15) | (y_coord << 6) | (ops_reserved));
|
|
||||||
hw_info[1] = (uint32_t)((lot_code_0 << 26) | (lot_code_1 >> 2));
|
|
||||||
hw_info[2] = (uint32_t)((fab_code << 26) | (lot_code_0 >> 6));
|
|
||||||
hw_info[3] = (uint32_t)(vendor_code);
|
|
||||||
|
|
||||||
memcpy(dst, hw_info, 0x10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if have a new ODM fuse format. */
|
|
||||||
bool fuse_is_new_format(void) {
|
|
||||||
return ((fuse_get_reserved_odm(4) & 0x800) && (fuse_get_reserved_odm(0) == 0x8E61ECAE) && (fuse_get_reserved_odm(1) == 0xF2BA3BB2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the DeviceUniqueKeyGeneration. */
|
|
||||||
uint32_t fuse_get_device_unique_key_generation(void) {
|
|
||||||
if (fuse_is_new_format()) {
|
|
||||||
return (fuse_get_reserved_odm(2) & 0x1F);
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the SocType from the HardwareType. */
|
|
||||||
uint32_t fuse_get_soc_type(void) {
|
|
||||||
switch (fuse_get_hardware_type()) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
return 0; /* SocType_Erista */
|
|
||||||
case 3:
|
|
||||||
case 2:
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
return 1; /* SocType_Mariko */
|
|
||||||
default:
|
|
||||||
return 0xF; /* SocType_Undefined */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the Regulator type. */
|
|
||||||
uint32_t fuse_get_regulator(void) {
|
|
||||||
if (fuse_get_soc_type() == 1) {
|
|
||||||
return ((fuse_get_reserved_odm(28) & 1) + 1); /* Regulator_Mariko_Max77812_A or Regulator_Mariko_Max77812_B */
|
|
||||||
} else {
|
|
||||||
return 0; /* Regulator_Erista_Max77621 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user