1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright 2022 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #pragma once 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/BnBluetoothHci.h> 20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/IBluetoothHciCallbacks.h> 21*4d7e907cSAndroid Build Coastguard Worker 22*4d7e907cSAndroid Build Coastguard Worker #include <future> 23*4d7e907cSAndroid Build Coastguard Worker #include <string> 24*4d7e907cSAndroid Build Coastguard Worker 25*4d7e907cSAndroid Build Coastguard Worker #include "async_fd_watcher.h" 26*4d7e907cSAndroid Build Coastguard Worker #include "h4_protocol.h" 27*4d7e907cSAndroid Build Coastguard Worker #include "net_bluetooth_mgmt.h" 28*4d7e907cSAndroid Build Coastguard Worker 29*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::bluetooth::impl { 30*4d7e907cSAndroid Build Coastguard Worker 31*4d7e907cSAndroid Build Coastguard Worker class BluetoothDeathRecipient; 32*4d7e907cSAndroid Build Coastguard Worker 33*4d7e907cSAndroid Build Coastguard Worker // This Bluetooth HAL implementation connects with a serial port at dev_path_. 34*4d7e907cSAndroid Build Coastguard Worker class BluetoothHci : public BnBluetoothHci { 35*4d7e907cSAndroid Build Coastguard Worker public: 36*4d7e907cSAndroid Build Coastguard Worker BluetoothHci(const std::string& dev_path = "/dev/hvc5"); 37*4d7e907cSAndroid Build Coastguard Worker 38*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus initialize( 39*4d7e907cSAndroid Build Coastguard Worker const std::shared_ptr<IBluetoothHciCallbacks>& cb) override; 40*4d7e907cSAndroid Build Coastguard Worker 41*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus sendHciCommand( 42*4d7e907cSAndroid Build Coastguard Worker const std::vector<uint8_t>& packet) override; 43*4d7e907cSAndroid Build Coastguard Worker 44*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus sendAclData(const std::vector<uint8_t>& packet) override; 45*4d7e907cSAndroid Build Coastguard Worker 46*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus sendScoData(const std::vector<uint8_t>& packet) override; 47*4d7e907cSAndroid Build Coastguard Worker 48*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus sendIsoData(const std::vector<uint8_t>& packet) override; 49*4d7e907cSAndroid Build Coastguard Worker 50*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus close() override; 51*4d7e907cSAndroid Build Coastguard Worker 52*4d7e907cSAndroid Build Coastguard Worker static void OnPacketReady(); 53*4d7e907cSAndroid Build Coastguard Worker 54*4d7e907cSAndroid Build Coastguard Worker static BluetoothHci* get(); 55*4d7e907cSAndroid Build Coastguard Worker 56*4d7e907cSAndroid Build Coastguard Worker private: 57*4d7e907cSAndroid Build Coastguard Worker int mFd{-1}; 58*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IBluetoothHciCallbacks> mCb = nullptr; 59*4d7e907cSAndroid Build Coastguard Worker 60*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<::android::hardware::bluetooth::hci::H4Protocol> mH4; 61*4d7e907cSAndroid Build Coastguard Worker 62*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<BluetoothDeathRecipient> mDeathRecipient; 63*4d7e907cSAndroid Build Coastguard Worker 64*4d7e907cSAndroid Build Coastguard Worker std::string mDevPath; 65*4d7e907cSAndroid Build Coastguard Worker 66*4d7e907cSAndroid Build Coastguard Worker ::android::hardware::bluetooth::async::AsyncFdWatcher mFdWatcher; 67*4d7e907cSAndroid Build Coastguard Worker 68*4d7e907cSAndroid Build Coastguard Worker int getFdFromDevPath(); 69*4d7e907cSAndroid Build Coastguard Worker [[nodiscard]] ndk::ScopedAStatus send( 70*4d7e907cSAndroid Build Coastguard Worker ::android::hardware::bluetooth::hci::PacketType type, 71*4d7e907cSAndroid Build Coastguard Worker const std::vector<uint8_t>& packet); 72*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<NetBluetoothMgmt> management_{}; 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker // Send a reset command and discard all packets until a reset is received. 75*4d7e907cSAndroid Build Coastguard Worker void reset(); 76*4d7e907cSAndroid Build Coastguard Worker 77*4d7e907cSAndroid Build Coastguard Worker // Don't close twice or open before close is complete 78*4d7e907cSAndroid Build Coastguard Worker std::mutex mStateMutex; 79*4d7e907cSAndroid Build Coastguard Worker enum class HalState { 80*4d7e907cSAndroid Build Coastguard Worker READY, 81*4d7e907cSAndroid Build Coastguard Worker INITIALIZING, 82*4d7e907cSAndroid Build Coastguard Worker ONE_CLIENT, 83*4d7e907cSAndroid Build Coastguard Worker CLOSING, 84*4d7e907cSAndroid Build Coastguard Worker } mState{HalState::READY}; 85*4d7e907cSAndroid Build Coastguard Worker }; 86*4d7e907cSAndroid Build Coastguard Worker 87*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::bluetooth::impl 88