btdrv.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/logging/log.h"
  4. #include "core/core.h"
  5. #include "core/hle/kernel/k_event.h"
  6. #include "core/hle/service/btdrv/btdrv.h"
  7. #include "core/hle/service/ipc_helpers.h"
  8. #include "core/hle/service/kernel_helpers.h"
  9. #include "core/hle/service/server_manager.h"
  10. #include "core/hle/service/service.h"
  11. #include "core/hle/service/sm/sm.h"
  12. namespace Service::BtDrv {
  13. class Bt final : public ServiceFramework<Bt> {
  14. public:
  15. explicit Bt(Core::System& system_)
  16. : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} {
  17. // clang-format off
  18. static const FunctionInfo functions[] = {
  19. {0, nullptr, "LeClientReadCharacteristic"},
  20. {1, nullptr, "LeClientReadDescriptor"},
  21. {2, nullptr, "LeClientWriteCharacteristic"},
  22. {3, nullptr, "LeClientWriteDescriptor"},
  23. {4, nullptr, "LeClientRegisterNotification"},
  24. {5, nullptr, "LeClientDeregisterNotification"},
  25. {6, nullptr, "SetLeResponse"},
  26. {7, nullptr, "LeSendIndication"},
  27. {8, nullptr, "GetLeEventInfo"},
  28. {9, &Bt::RegisterBleEvent, "RegisterBleEvent"},
  29. };
  30. // clang-format on
  31. RegisterHandlers(functions);
  32. register_event = service_context.CreateEvent("BT:RegisterEvent");
  33. }
  34. ~Bt() override {
  35. service_context.CloseEvent(register_event);
  36. }
  37. private:
  38. void RegisterBleEvent(HLERequestContext& ctx) {
  39. LOG_WARNING(Service_BTM, "(STUBBED) called");
  40. IPC::ResponseBuilder rb{ctx, 2, 1};
  41. rb.Push(ResultSuccess);
  42. rb.PushCopyObjects(register_event->GetReadableEvent());
  43. }
  44. KernelHelpers::ServiceContext service_context;
  45. Kernel::KEvent* register_event;
  46. };
  47. class BtDrv final : public ServiceFramework<BtDrv> {
  48. public:
  49. explicit BtDrv(Core::System& system_) : ServiceFramework{system_, "btdrv"} {
  50. // clang-format off
  51. static const FunctionInfo functions[] = {
  52. {0, nullptr, "InitializeBluetoothDriver"},
  53. {1, nullptr, "InitializeBluetooth"},
  54. {2, nullptr, "EnableBluetooth"},
  55. {3, nullptr, "DisableBluetooth"},
  56. {4, nullptr, "FinalizeBluetooth"},
  57. {5, nullptr, "GetAdapterProperties"},
  58. {6, nullptr, "GetAdapterProperty"},
  59. {7, nullptr, "SetAdapterProperty"},
  60. {8, nullptr, "StartInquiry"},
  61. {9, nullptr, "StopInquiry"},
  62. {10, nullptr, "CreateBond"},
  63. {11, nullptr, "RemoveBond"},
  64. {12, nullptr, "CancelBond"},
  65. {13, nullptr, "RespondToPinRequest"},
  66. {14, nullptr, "RespondToSspRequest"},
  67. {15, nullptr, "GetEventInfo"},
  68. {16, nullptr, "InitializeHid"},
  69. {17, nullptr, "OpenHidConnection"},
  70. {18, nullptr, "CloseHidConnection"},
  71. {19, nullptr, "WriteHidData"},
  72. {20, nullptr, "WriteHidData2"},
  73. {21, nullptr, "SetHidReport"},
  74. {22, nullptr, "GetHidReport"},
  75. {23, nullptr, "TriggerConnection"},
  76. {24, nullptr, "AddPairedDeviceInfo"},
  77. {25, nullptr, "GetPairedDeviceInfo"},
  78. {26, nullptr, "FinalizeHid"},
  79. {27, nullptr, "GetHidEventInfo"},
  80. {28, nullptr, "SetTsi"},
  81. {29, nullptr, "EnableBurstMode"},
  82. {30, nullptr, "SetZeroRetransmission"},
  83. {31, nullptr, "EnableMcMode"},
  84. {32, nullptr, "EnableLlrScan"},
  85. {33, nullptr, "DisableLlrScan"},
  86. {34, nullptr, "EnableRadio"},
  87. {35, nullptr, "SetVisibility"},
  88. {36, nullptr, "EnableTbfcScan"},
  89. {37, nullptr, "RegisterHidReportEvent"},
  90. {38, nullptr, "GetHidReportEventInfo"},
  91. {39, nullptr, "GetLatestPlr"},
  92. {40, nullptr, "GetPendingConnections"},
  93. {41, nullptr, "GetChannelMap"},
  94. {42, nullptr, "EnableTxPowerBoostSetting"},
  95. {43, nullptr, "IsTxPowerBoostSettingEnabled"},
  96. {44, nullptr, "EnableAfhSetting"},
  97. {45, nullptr, "IsAfhSettingEnabled"},
  98. {46, nullptr, "InitializeBle"},
  99. {47, nullptr, "EnableBle"},
  100. {48, nullptr, "DisableBle"},
  101. {49, nullptr, "FinalizeBle"},
  102. {50, nullptr, "SetBleVisibility"},
  103. {51, nullptr, "SetBleConnectionParameter"},
  104. {52, nullptr, "SetBleDefaultConnectionParameter"},
  105. {53, nullptr, "SetBleAdvertiseData"},
  106. {54, nullptr, "SetBleAdvertiseParameter"},
  107. {55, nullptr, "StartBleScan"},
  108. {56, nullptr, "StopBleScan"},
  109. {57, nullptr, "AddBleScanFilterCondition"},
  110. {58, nullptr, "DeleteBleScanFilterCondition"},
  111. {59, nullptr, "DeleteBleScanFilter"},
  112. {60, nullptr, "ClearBleScanFilters"},
  113. {61, nullptr, "EnableBleScanFilter"},
  114. {62, nullptr, "RegisterGattClient"},
  115. {63, nullptr, "UnregisterGattClient"},
  116. {64, nullptr, "UnregisterAllGattClients"},
  117. {65, nullptr, "ConnectGattServer"},
  118. {66, nullptr, "CancelConnectGattServer"},
  119. {67, nullptr, "DisconnectGattServer"},
  120. {68, nullptr, "GetGattAttribute"},
  121. {69, nullptr, "GetGattService"},
  122. {70, nullptr, "ConfigureAttMtu"},
  123. {71, nullptr, "RegisterGattServer"},
  124. {72, nullptr, "UnregisterGattServer"},
  125. {73, nullptr, "ConnectGattClient"},
  126. {74, nullptr, "DisconnectGattClient"},
  127. {75, nullptr, "AddGattService"},
  128. {76, nullptr, "EnableGattService"},
  129. {77, nullptr, "AddGattCharacteristic"},
  130. {78, nullptr, "AddGattDescriptor"},
  131. {79, nullptr, "GetBleManagedEventInfo"},
  132. {80, nullptr, "GetGattFirstCharacteristic"},
  133. {81, nullptr, "GetGattNextCharacteristic"},
  134. {82, nullptr, "GetGattFirstDescriptor"},
  135. {83, nullptr, "GetGattNextDescriptor"},
  136. {84, nullptr, "RegisterGattManagedDataPath"},
  137. {85, nullptr, "UnregisterGattManagedDataPath"},
  138. {86, nullptr, "RegisterGattHidDataPath"},
  139. {87, nullptr, "UnregisterGattHidDataPath"},
  140. {88, nullptr, "RegisterGattDataPath"},
  141. {89, nullptr, "UnregisterGattDataPath"},
  142. {90, nullptr, "ReadGattCharacteristic"},
  143. {91, nullptr, "ReadGattDescriptor"},
  144. {92, nullptr, "WriteGattCharacteristic"},
  145. {93, nullptr, "WriteGattDescriptor"},
  146. {94, nullptr, "RegisterGattNotification"},
  147. {95, nullptr, "UnregisterGattNotification"},
  148. {96, nullptr, "GetLeHidEventInfo"},
  149. {97, nullptr, "RegisterBleHidEvent"},
  150. {98, nullptr, "SetBleScanParameter"},
  151. {99, nullptr, "MoveToSecondaryPiconet"},
  152. {100, nullptr, "IsBluetoothEnabled"},
  153. {128, nullptr, "AcquireAudioEvent"},
  154. {129, nullptr, "GetAudioEventInfo"},
  155. {130, nullptr, "OpenAudioConnection"},
  156. {131, nullptr, "CloseAudioConnection"},
  157. {132, nullptr, "OpenAudioOut"},
  158. {133, nullptr, "CloseAudioOut"},
  159. {134, nullptr, "AcquireAudioOutStateChangedEvent"},
  160. {135, nullptr, "StartAudioOut"},
  161. {136, nullptr, "StopAudioOut"},
  162. {137, nullptr, "GetAudioOutState"},
  163. {138, nullptr, "GetAudioOutFeedingCodec"},
  164. {139, nullptr, "GetAudioOutFeedingParameter"},
  165. {140, nullptr, "AcquireAudioOutBufferAvailableEvent"},
  166. {141, nullptr, "SendAudioData"},
  167. {142, nullptr, "AcquireAudioControlInputStateChangedEvent"},
  168. {143, nullptr, "GetAudioControlInputState"},
  169. {144, nullptr, "AcquireAudioConnectionStateChangedEvent"},
  170. {145, nullptr, "GetConnectedAudioDevice"},
  171. {146, nullptr, "CloseAudioControlInput"},
  172. {147, nullptr, "RegisterAudioControlNotification"},
  173. {148, nullptr, "SendAudioControlPassthroughCommand"},
  174. {149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"},
  175. {150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"},
  176. {151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"},
  177. {152, nullptr, "GetAudioSinkVolume"},
  178. {153, nullptr, "RequestUpdateAudioSinkVolume"},
  179. {154, nullptr, "IsAudioSinkVolumeSupported"},
  180. {256, nullptr, "IsManufacturingMode"},
  181. {257, nullptr, "EmulateBluetoothCrash"},
  182. {258, nullptr, "GetBleChannelMap"},
  183. };
  184. // clang-format on
  185. RegisterHandlers(functions);
  186. }
  187. };
  188. void LoopProcess(Core::System& system) {
  189. auto server_manager = std::make_unique<ServerManager>(system);
  190. server_manager->RegisterNamedService("btdrv", std::make_shared<BtDrv>(system));
  191. server_manager->RegisterNamedService("bt", std::make_shared<Bt>(system));
  192. ServerManager::RunServer(std::move(server_manager));
  193. }
  194. } // namespace Service::BtDrv