diff options
| author | 2021-07-16 13:35:59 -0400 | |
|---|---|---|
| committer | 2021-07-20 01:45:19 -0400 | |
| commit | 9b7e57f3f41ef0a5052a7da78b3984f95f55b7c0 (patch) | |
| tree | ec02e8b8292caf147384ca7c9b73304df4663c38 | |
| parent | file_sys: Support load game collection (#6582) (diff) | |
| download | yuzu-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.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/service/am/applets/applet_controller.h | 15 |
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 | ||
| 31 | enum class ControllerSupportMode : u8 { | 32 | enum 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 { | |||
| 78 | static_assert(sizeof(ControllerSupportArgOld) == 0x21C, | 80 | static_assert(sizeof(ControllerSupportArgOld) == 0x21C, |
| 79 | "ControllerSupportArgOld has incorrect size."); | 81 | "ControllerSupportArgOld has incorrect size."); |
| 80 | 82 | ||
| 81 | // LibraryAppletVersion 0x7 | 83 | // LibraryAppletVersion 0x7, 0x8 |
| 82 | struct ControllerSupportArgNew { | 84 | struct 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 { | |||
| 95 | static_assert(sizeof(ControllerUpdateFirmwareArg) == 0x4, | 97 | static_assert(sizeof(ControllerUpdateFirmwareArg) == 0x4, |
| 96 | "ControllerUpdateFirmwareArg has incorrect size."); | 98 | "ControllerUpdateFirmwareArg has incorrect size."); |
| 97 | 99 | ||
| 100 | struct ControllerKeyRemappingArg { | ||
| 101 | u64 unknown{}; | ||
| 102 | u32 unknown_2{}; | ||
| 103 | INSERT_PADDING_WORDS(1); | ||
| 104 | }; | ||
| 105 | static_assert(sizeof(ControllerKeyRemappingArg) == 0x10, | ||
| 106 | "ControllerKeyRemappingArg has incorrect size."); | ||
| 107 | |||
| 98 | struct ControllerSupportResultInfo { | 108 | struct 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}; |