xref: /aosp_15_r20/hardware/interfaces/bluetooth/aidl/default/BluetoothHci.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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