summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Morph2021-07-16 13:35:59 -0400
committerGravatar Morph2021-07-20 01:45:19 -0400
commit9b7e57f3f41ef0a5052a7da78b3984f95f55b7c0 (patch)
treeec02e8b8292caf147384ca7c9b73304df4663c38
parentfile_sys: Support load game collection (#6582) (diff)
downloadyuzu-9b7e57f3f41ef0a5052a7da78b3984f95f55b7c0.tar.gz
yuzu-9b7e57f3f41ef0a5052a7da78b3984f95f55b7c0.tar.xz
yuzu-9b7e57f3f41ef0a5052a7da78b3984f95f55b7c0.zip
applet_controller: Add preliminary support for version 8
Version 8 adds support for key remapping introduced in FW 11.0, we will not be implementing this for now.
-rw-r--r--src/core/hle/service/am/applets/applet_controller.cpp21
-rw-r--r--src/core/hle/service/am/applets/applet_controller.h15
2 files changed, 33 insertions, 3 deletions
diff --git a/src/core/hle/service/am/applets/applet_controller.cpp b/src/core/hle/service/am/applets/applet_controller.cpp
index 12682effe..2721679c1 100644
--- a/src/core/hle/service/am/applets/applet_controller.cpp
+++ b/src/core/hle/service/am/applets/applet_controller.cpp
@@ -87,6 +87,10 @@ void Controller::Initialize() {
87 case sizeof(ControllerUpdateFirmwareArg): 87 case sizeof(ControllerUpdateFirmwareArg):
88 controller_private_arg.mode = ControllerSupportMode::ShowControllerFirmwareUpdate; 88 controller_private_arg.mode = ControllerSupportMode::ShowControllerFirmwareUpdate;
89 break; 89 break;
90 case sizeof(ControllerKeyRemappingArg):
91 controller_private_arg.mode =
92 ControllerSupportMode::ShowControllerKeyRemappingForSystem;
93 break;
90 default: 94 default:
91 UNIMPLEMENTED_MSG("Unknown ControllerPrivateArg mode={} with arg_size={}", 95 UNIMPLEMENTED_MSG("Unknown ControllerPrivateArg mode={} with arg_size={}",
92 controller_private_arg.mode, controller_private_arg.arg_size); 96 controller_private_arg.mode, controller_private_arg.arg_size);
@@ -99,7 +103,9 @@ void Controller::Initialize() {
99 // This is always 0 (Application) except with ShowControllerFirmwareUpdateForSystem. 103 // This is always 0 (Application) except with ShowControllerFirmwareUpdateForSystem.
100 if (controller_private_arg.caller >= ControllerSupportCaller::MaxControllerSupportCaller) { 104 if (controller_private_arg.caller >= ControllerSupportCaller::MaxControllerSupportCaller) {
101 if (controller_private_arg.flag_1 && 105 if (controller_private_arg.flag_1 &&
102 controller_private_arg.mode == ControllerSupportMode::ShowControllerFirmwareUpdate) { 106 (controller_private_arg.mode == ControllerSupportMode::ShowControllerFirmwareUpdate ||
107 controller_private_arg.mode ==
108 ControllerSupportMode::ShowControllerKeyRemappingForSystem)) {
103 controller_private_arg.caller = ControllerSupportCaller::System; 109 controller_private_arg.caller = ControllerSupportCaller::System;
104 } else { 110 } else {
105 controller_private_arg.caller = ControllerSupportCaller::Application; 111 controller_private_arg.caller = ControllerSupportCaller::Application;
@@ -121,6 +127,7 @@ void Controller::Initialize() {
121 std::memcpy(&controller_user_arg_old, user_arg.data(), user_arg.size()); 127 std::memcpy(&controller_user_arg_old, user_arg.data(), user_arg.size());
122 break; 128 break;
123 case ControllerAppletVersion::Version7: 129 case ControllerAppletVersion::Version7:
130 case ControllerAppletVersion::Version8:
124 ASSERT(user_arg.size() == sizeof(ControllerSupportArgNew)); 131 ASSERT(user_arg.size() == sizeof(ControllerSupportArgNew));
125 std::memcpy(&controller_user_arg_new, user_arg.data(), user_arg.size()); 132 std::memcpy(&controller_user_arg_new, user_arg.data(), user_arg.size());
126 break; 133 break;
@@ -143,6 +150,16 @@ void Controller::Initialize() {
143 std::memcpy(&controller_update_arg, update_arg.data(), update_arg.size()); 150 std::memcpy(&controller_update_arg, update_arg.data(), update_arg.size());
144 break; 151 break;
145 } 152 }
153 case ControllerSupportMode::ShowControllerKeyRemappingForSystem: {
154 const auto remapping_arg_storage = broker.PopNormalDataToApplet();
155 ASSERT(remapping_arg_storage != nullptr);
156
157 const auto& remapping_arg = remapping_arg_storage->GetData();
158 ASSERT(remapping_arg.size() == sizeof(ControllerKeyRemappingArg));
159
160 std::memcpy(&controller_key_remapping_arg, remapping_arg.data(), remapping_arg.size());
161 break;
162 }
146 default: { 163 default: {
147 UNIMPLEMENTED_MSG("Unimplemented ControllerSupportMode={}", controller_private_arg.mode); 164 UNIMPLEMENTED_MSG("Unimplemented ControllerSupportMode={}", controller_private_arg.mode);
148 break; 165 break;
@@ -179,6 +196,7 @@ void Controller::Execute() {
179 std::vector<ExplainText>(controller_user_arg_old.explain_text.begin(), 196 std::vector<ExplainText>(controller_user_arg_old.explain_text.begin(),
180 controller_user_arg_old.explain_text.end())); 197 controller_user_arg_old.explain_text.end()));
181 case ControllerAppletVersion::Version7: 198 case ControllerAppletVersion::Version7:
199 case ControllerAppletVersion::Version8:
182 default: 200 default:
183 return ConvertToFrontendParameters( 201 return ConvertToFrontendParameters(
184 controller_private_arg, controller_user_arg_new.header, 202 controller_private_arg, controller_user_arg_new.header,
@@ -210,6 +228,7 @@ void Controller::Execute() {
210 } 228 }
211 case ControllerSupportMode::ShowControllerStrapGuide: 229 case ControllerSupportMode::ShowControllerStrapGuide:
212 case ControllerSupportMode::ShowControllerFirmwareUpdate: 230 case ControllerSupportMode::ShowControllerFirmwareUpdate:
231 case ControllerSupportMode::ShowControllerKeyRemappingForSystem:
213 UNIMPLEMENTED_MSG("ControllerSupportMode={} is not implemented", 232 UNIMPLEMENTED_MSG("ControllerSupportMode={} is not implemented",
214 controller_private_arg.mode); 233 controller_private_arg.mode);
215 ConfigurationComplete(); 234 ConfigurationComplete();
diff --git a/src/core/hle/service/am/applets/applet_controller.h b/src/core/hle/service/am/applets/applet_controller.h
index 20617e91f..0a34c4fc0 100644
--- a/src/core/hle/service/am/applets/applet_controller.h
+++ b/src/core/hle/service/am/applets/applet_controller.h
@@ -25,13 +25,15 @@ enum class ControllerAppletVersion : u32_le {
25 Version3 = 0x3, // 1.0.0 - 2.3.0 25 Version3 = 0x3, // 1.0.0 - 2.3.0
26 Version4 = 0x4, // 3.0.0 - 5.1.0 26 Version4 = 0x4, // 3.0.0 - 5.1.0
27 Version5 = 0x5, // 6.0.0 - 7.0.1 27 Version5 = 0x5, // 6.0.0 - 7.0.1
28 Version7 = 0x7, // 8.0.0+ 28 Version7 = 0x7, // 8.0.0 - 10.2.0
29 Version8 = 0x8, // 11.0.0+
29}; 30};
30 31
31enum class ControllerSupportMode : u8 { 32enum class ControllerSupportMode : u8 {
32 ShowControllerSupport, 33 ShowControllerSupport,
33 ShowControllerStrapGuide, 34 ShowControllerStrapGuide,
34 ShowControllerFirmwareUpdate, 35 ShowControllerFirmwareUpdate,
36 ShowControllerKeyRemappingForSystem,
35 37
36 MaxControllerSupportMode, 38 MaxControllerSupportMode,
37}; 39};
@@ -78,7 +80,7 @@ struct ControllerSupportArgOld {
78static_assert(sizeof(ControllerSupportArgOld) == 0x21C, 80static_assert(sizeof(ControllerSupportArgOld) == 0x21C,
79 "ControllerSupportArgOld has incorrect size."); 81 "ControllerSupportArgOld has incorrect size.");
80 82
81// LibraryAppletVersion 0x7 83// LibraryAppletVersion 0x7, 0x8
82struct ControllerSupportArgNew { 84struct ControllerSupportArgNew {
83 ControllerSupportArgHeader header{}; 85 ControllerSupportArgHeader header{};
84 std::array<IdentificationColor, 8> identification_colors{}; 86 std::array<IdentificationColor, 8> identification_colors{};
@@ -95,6 +97,14 @@ struct ControllerUpdateFirmwareArg {
95static_assert(sizeof(ControllerUpdateFirmwareArg) == 0x4, 97static_assert(sizeof(ControllerUpdateFirmwareArg) == 0x4,
96 "ControllerUpdateFirmwareArg has incorrect size."); 98 "ControllerUpdateFirmwareArg has incorrect size.");
97 99
100struct ControllerKeyRemappingArg {
101 u64 unknown{};
102 u32 unknown_2{};
103 INSERT_PADDING_WORDS(1);
104};
105static_assert(sizeof(ControllerKeyRemappingArg) == 0x10,
106 "ControllerKeyRemappingArg has incorrect size.");
107
98struct ControllerSupportResultInfo { 108struct ControllerSupportResultInfo {
99 s8 player_count{}; 109 s8 player_count{};
100 INSERT_PADDING_BYTES(3); 110 INSERT_PADDING_BYTES(3);
@@ -128,6 +138,7 @@ private:
128 ControllerSupportArgOld controller_user_arg_old; 138 ControllerSupportArgOld controller_user_arg_old;
129 ControllerSupportArgNew controller_user_arg_new; 139 ControllerSupportArgNew controller_user_arg_new;
130 ControllerUpdateFirmwareArg controller_update_arg; 140 ControllerUpdateFirmwareArg controller_update_arg;
141 ControllerKeyRemappingArg controller_key_remapping_arg;
131 bool complete{false}; 142 bool complete{false};
132 ResultCode status{ResultSuccess}; 143 ResultCode status{ResultSuccess};
133 bool is_single_mode{false}; 144 bool is_single_mode{false};