/* * Copyright (c) 2020-2021 ndeadly * * 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 . */ #include #include #include "mcmitm_initialization.hpp" #include "mcmitm_config.hpp" #include "bluetooth_mitm/btdrv_mitm_service.hpp" #include "bluetooth_mitm/bluetoothmitm_module.hpp" #include "btm_mitm/btmmitm_module.hpp" #include "bluetooth_mitm/bluetooth/bluetooth_events.hpp" #include "bluetooth_mitm/bluetooth/bluetooth_core.hpp" #include "bluetooth_mitm/bluetooth/bluetooth_hid.hpp" #include "bluetooth_mitm/bluetooth/bluetooth_ble.hpp" namespace ams::mitm { namespace { constexpr size_t InitializeThreadStackSize = 0x1000; os::ThreadType g_initialize_thread; alignas(os::ThreadStackAlignment) u8 g_initialize_thread_stack[InitializeThreadStackSize]; os::Event g_init_event(os::EventClearMode_ManualClear); void InitializeThreadFunc(void *arg) { // Start bluetooth event handling thread ams::bluetooth::events::Initialize(); // Wait for system to call BluetoothEnable ams::bluetooth::core::WaitEnabled(); // Connect to btdrv service now that we're sure the mitm is up and running R_ABORT_UNLESS(btdrvInitialize()); // Get global module settings auto config = GetGlobalConfig(); // Set bluetooth adapter host address override ams::bluetooth::Address null_address = {}; if (std::memcmp(&config->bluetooth.host_address, &null_address, sizeof(ams::bluetooth::Address)) != 0) { if (hos::GetVersion() < hos::Version_12_0_0) { R_ABORT_UNLESS(btdrvLegacySetAdapterProperty(BtdrvBluetoothPropertyType_Address, &config->bluetooth.host_address, sizeof(ams::bluetooth::Address))); } else { BtdrvAdapterProperty property; property.type = BtdrvAdapterPropertyType_Address; property.size = sizeof(ams::bluetooth::Address); std::memcpy(property.data, &config->bluetooth.host_address, sizeof(ams::bluetooth::Address)); R_ABORT_UNLESS(btdrvSetAdapterProperty(BtdrvAdapterPropertyType_Address, &property)); } } // Set bluetooth adapter host name override if (std::strlen(config->bluetooth.host_name) > 0) { if (hos::GetVersion() < hos::Version_12_0_0) { R_ABORT_UNLESS(btdrvLegacySetAdapterProperty(BtdrvBluetoothPropertyType_Name, config->bluetooth.host_name, std::strlen(config->bluetooth.host_name))); } else { BtdrvAdapterProperty property; property.type = BtdrvAdapterPropertyType_Name; property.size = std::strlen(config->bluetooth.host_name); std::memcpy(property.data, config->bluetooth.host_name, std::strlen(config->bluetooth.host_name)); R_ABORT_UNLESS(btdrvSetAdapterProperty(BtdrvAdapterPropertyType_Name, &property)); } } g_init_event.Signal(); } } void StartInitialize(void) { R_ABORT_UNLESS(os::CreateThread(&g_initialize_thread, InitializeThreadFunc, nullptr, g_initialize_thread_stack, sizeof(g_initialize_thread_stack), -7 )); os::StartThread(&g_initialize_thread); } void WaitInitialized(void) { g_init_event.Wait(); } void LaunchModules(void) { R_ABORT_UNLESS(ams::mitm::bluetooth::Launch()); R_ABORT_UNLESS(ams::mitm::btm::Launch()); } void WaitModules(void) { ams::mitm::btm::WaitFinished(); ams::mitm::bluetooth::WaitFinished(); } }