hid.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <chrono>
  5. #include "core/hle/service/hid/controllers/controller_base.h"
  6. #include "core/hle/service/kernel_helpers.h"
  7. #include "core/hle/service/service.h"
  8. namespace Core::Timing {
  9. struct EventType;
  10. }
  11. namespace Service::SM {
  12. class ServiceManager;
  13. }
  14. namespace Service::HID {
  15. enum class HidController : std::size_t {
  16. DebugPad,
  17. Touchscreen,
  18. Mouse,
  19. Keyboard,
  20. XPad,
  21. HomeButton,
  22. SleepButton,
  23. CaptureButton,
  24. InputDetector,
  25. UniquePad,
  26. NPad,
  27. Gesture,
  28. ConsoleSixAxisSensor,
  29. Palma,
  30. MaxControllers,
  31. };
  32. class IAppletResource final : public ServiceFramework<IAppletResource> {
  33. public:
  34. explicit IAppletResource(Core::System& system_,
  35. KernelHelpers::ServiceContext& service_context_);
  36. ~IAppletResource() override;
  37. void ActivateController(HidController controller);
  38. void DeactivateController(HidController controller);
  39. template <typename T>
  40. T& GetController(HidController controller) {
  41. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  42. }
  43. template <typename T>
  44. const T& GetController(HidController controller) const {
  45. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  46. }
  47. private:
  48. template <typename T>
  49. void MakeController(HidController controller, u8* shared_memory) {
  50. controllers[static_cast<std::size_t>(controller)] =
  51. std::make_unique<T>(system.HIDCore(), shared_memory);
  52. }
  53. template <typename T>
  54. void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) {
  55. controllers[static_cast<std::size_t>(controller)] =
  56. std::make_unique<T>(system.HIDCore(), shared_memory, service_context);
  57. }
  58. void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx);
  59. void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  60. void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  61. void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  62. void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  63. KernelHelpers::ServiceContext& service_context;
  64. std::shared_ptr<Core::Timing::EventType> npad_update_event;
  65. std::shared_ptr<Core::Timing::EventType> default_update_event;
  66. std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event;
  67. std::shared_ptr<Core::Timing::EventType> motion_update_event;
  68. std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
  69. controllers{};
  70. };
  71. class Hid final : public ServiceFramework<Hid> {
  72. public:
  73. explicit Hid(Core::System& system_);
  74. ~Hid() override;
  75. std::shared_ptr<IAppletResource> GetAppletResource();
  76. private:
  77. void CreateAppletResource(Kernel::HLERequestContext& ctx);
  78. void ActivateDebugPad(Kernel::HLERequestContext& ctx);
  79. void ActivateTouchScreen(Kernel::HLERequestContext& ctx);
  80. void ActivateMouse(Kernel::HLERequestContext& ctx);
  81. void ActivateKeyboard(Kernel::HLERequestContext& ctx);
  82. void SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx);
  83. void ActivateXpad(Kernel::HLERequestContext& ctx);
  84. void GetXpadIDs(Kernel::HLERequestContext& ctx);
  85. void ActivateSixAxisSensor(Kernel::HLERequestContext& ctx);
  86. void DeactivateSixAxisSensor(Kernel::HLERequestContext& ctx);
  87. void StartSixAxisSensor(Kernel::HLERequestContext& ctx);
  88. void StopSixAxisSensor(Kernel::HLERequestContext& ctx);
  89. void IsSixAxisSensorFusionEnabled(Kernel::HLERequestContext& ctx);
  90. void EnableSixAxisSensorFusion(Kernel::HLERequestContext& ctx);
  91. void SetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx);
  92. void GetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx);
  93. void ResetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx);
  94. void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx);
  95. void GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx);
  96. void ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx);
  97. void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx);
  98. void IsFirmwareUpdateAvailableForSixAxisSensor(Kernel::HLERequestContext& ctx);
  99. void EnableSixAxisSensorUnalteredPassthrough(Kernel::HLERequestContext& ctx);
  100. void IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext& ctx);
  101. void LoadSixAxisSensorCalibrationParameter(Kernel::HLERequestContext& ctx);
  102. void GetSixAxisSensorIcInformation(Kernel::HLERequestContext& ctx);
  103. void ResetIsSixAxisSensorDeviceNewlyAssigned(Kernel::HLERequestContext& ctx);
  104. void ActivateGesture(Kernel::HLERequestContext& ctx);
  105. void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
  106. void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
  107. void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx);
  108. void ActivateNpad(Kernel::HLERequestContext& ctx);
  109. void DeactivateNpad(Kernel::HLERequestContext& ctx);
  110. void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx);
  111. void DisconnectNpad(Kernel::HLERequestContext& ctx);
  112. void GetPlayerLedPattern(Kernel::HLERequestContext& ctx);
  113. void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx);
  114. void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx);
  115. void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx);
  116. void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx);
  117. void SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx);
  118. void SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx);
  119. void MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx);
  120. void StartLrAssignmentMode(Kernel::HLERequestContext& ctx);
  121. void StopLrAssignmentMode(Kernel::HLERequestContext& ctx);
  122. void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx);
  123. void GetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx);
  124. void SwapNpadAssignment(Kernel::HLERequestContext& ctx);
  125. void IsUnintendedHomeButtonInputProtectionEnabled(Kernel::HLERequestContext& ctx);
  126. void EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& ctx);
  127. void SetNpadAnalogStickUseCenterClamp(Kernel::HLERequestContext& ctx);
  128. void SetNpadCaptureButtonAssignment(Kernel::HLERequestContext& ctx);
  129. void ClearNpadCaptureButtonAssignment(Kernel::HLERequestContext& ctx);
  130. void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx);
  131. void SendVibrationValue(Kernel::HLERequestContext& ctx);
  132. void GetActualVibrationValue(Kernel::HLERequestContext& ctx);
  133. void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx);
  134. void PermitVibration(Kernel::HLERequestContext& ctx);
  135. void IsVibrationPermitted(Kernel::HLERequestContext& ctx);
  136. void SendVibrationValues(Kernel::HLERequestContext& ctx);
  137. void SendVibrationGcErmCommand(Kernel::HLERequestContext& ctx);
  138. void GetActualVibrationGcErmCommand(Kernel::HLERequestContext& ctx);
  139. void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx);
  140. void EndPermitVibrationSession(Kernel::HLERequestContext& ctx);
  141. void IsVibrationDeviceMounted(Kernel::HLERequestContext& ctx);
  142. void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx);
  143. void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx);
  144. void StopConsoleSixAxisSensor(Kernel::HLERequestContext& ctx);
  145. void ActivateSevenSixAxisSensor(Kernel::HLERequestContext& ctx);
  146. void StartSevenSixAxisSensor(Kernel::HLERequestContext& ctx);
  147. void StopSevenSixAxisSensor(Kernel::HLERequestContext& ctx);
  148. void InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx);
  149. void FinalizeSevenSixAxisSensor(Kernel::HLERequestContext& ctx);
  150. void ResetSevenSixAxisSensorTimestamp(Kernel::HLERequestContext& ctx);
  151. void IsUsbFullKeyControllerEnabled(Kernel::HLERequestContext& ctx);
  152. void GetPalmaConnectionHandle(Kernel::HLERequestContext& ctx);
  153. void InitializePalma(Kernel::HLERequestContext& ctx);
  154. void AcquirePalmaOperationCompleteEvent(Kernel::HLERequestContext& ctx);
  155. void GetPalmaOperationInfo(Kernel::HLERequestContext& ctx);
  156. void PlayPalmaActivity(Kernel::HLERequestContext& ctx);
  157. void SetPalmaFrModeType(Kernel::HLERequestContext& ctx);
  158. void ReadPalmaStep(Kernel::HLERequestContext& ctx);
  159. void EnablePalmaStep(Kernel::HLERequestContext& ctx);
  160. void ResetPalmaStep(Kernel::HLERequestContext& ctx);
  161. void ReadPalmaApplicationSection(Kernel::HLERequestContext& ctx);
  162. void WritePalmaApplicationSection(Kernel::HLERequestContext& ctx);
  163. void ReadPalmaUniqueCode(Kernel::HLERequestContext& ctx);
  164. void SetPalmaUniqueCodeInvalid(Kernel::HLERequestContext& ctx);
  165. void WritePalmaActivityEntry(Kernel::HLERequestContext& ctx);
  166. void WritePalmaRgbLedPatternEntry(Kernel::HLERequestContext& ctx);
  167. void WritePalmaWaveEntry(Kernel::HLERequestContext& ctx);
  168. void SetPalmaDataBaseIdentificationVersion(Kernel::HLERequestContext& ctx);
  169. void GetPalmaDataBaseIdentificationVersion(Kernel::HLERequestContext& ctx);
  170. void SuspendPalmaFeature(Kernel::HLERequestContext& ctx);
  171. void GetPalmaOperationResult(Kernel::HLERequestContext& ctx);
  172. void ReadPalmaPlayLog(Kernel::HLERequestContext& ctx);
  173. void ResetPalmaPlayLog(Kernel::HLERequestContext& ctx);
  174. void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx);
  175. void SetIsPalmaPairedConnectable(Kernel::HLERequestContext& ctx);
  176. void PairPalma(Kernel::HLERequestContext& ctx);
  177. void SetPalmaBoostMode(Kernel::HLERequestContext& ctx);
  178. void CancelWritePalmaWaveEntry(Kernel::HLERequestContext& ctx);
  179. void EnablePalmaBoostMode(Kernel::HLERequestContext& ctx);
  180. void GetPalmaBluetoothAddress(Kernel::HLERequestContext& ctx);
  181. void SetDisallowedPalmaConnection(Kernel::HLERequestContext& ctx);
  182. void SetNpadCommunicationMode(Kernel::HLERequestContext& ctx);
  183. void GetNpadCommunicationMode(Kernel::HLERequestContext& ctx);
  184. void SetTouchScreenConfiguration(Kernel::HLERequestContext& ctx);
  185. void IsFirmwareUpdateNeededForNotification(Kernel::HLERequestContext& ctx);
  186. std::shared_ptr<IAppletResource> applet_resource;
  187. KernelHelpers::ServiceContext service_context;
  188. };
  189. /// Registers all HID services with the specified service manager.
  190. void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
  191. } // namespace Service::HID