xref: /aosp_15_r20/hardware/interfaces/bluetooth/1.1/default/bluetooth_hci.cc (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright 2016 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 #define LOG_TAG "[email protected]"
18*4d7e907cSAndroid Build Coastguard Worker #include "bluetooth_hci.h"
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <log/log.h>
21*4d7e907cSAndroid Build Coastguard Worker 
22*4d7e907cSAndroid Build Coastguard Worker #include "vendor_interface.h"
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker using android::hardware::bluetooth::V1_0::implementation::VendorInterface;
25*4d7e907cSAndroid Build Coastguard Worker 
26*4d7e907cSAndroid Build Coastguard Worker namespace android {
27*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
28*4d7e907cSAndroid Build Coastguard Worker namespace bluetooth {
29*4d7e907cSAndroid Build Coastguard Worker namespace V1_1 {
30*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
31*4d7e907cSAndroid Build Coastguard Worker 
32*4d7e907cSAndroid Build Coastguard Worker static const uint8_t HCI_DATA_TYPE_COMMAND = 1;
33*4d7e907cSAndroid Build Coastguard Worker static const uint8_t HCI_DATA_TYPE_ACL = 2;
34*4d7e907cSAndroid Build Coastguard Worker static const uint8_t HCI_DATA_TYPE_SCO = 3;
35*4d7e907cSAndroid Build Coastguard Worker static const uint8_t HCI_DATA_TYPE_ISO = 5;
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker class BluetoothDeathRecipient : public hidl_death_recipient {
38*4d7e907cSAndroid Build Coastguard Worker  public:
BluetoothDeathRecipient(const sp<IBluetoothHci> hci)39*4d7e907cSAndroid Build Coastguard Worker   BluetoothDeathRecipient(const sp<IBluetoothHci> hci) : mHci(hci) {}
40*4d7e907cSAndroid Build Coastguard Worker 
serviceDied(uint64_t,const wp<::android::hidl::base::V1_0::IBase> &)41*4d7e907cSAndroid Build Coastguard Worker   virtual void serviceDied(
42*4d7e907cSAndroid Build Coastguard Worker       uint64_t /*cookie*/,
43*4d7e907cSAndroid Build Coastguard Worker       const wp<::android::hidl::base::V1_0::IBase>& /*who*/) {
44*4d7e907cSAndroid Build Coastguard Worker     ALOGE("BluetoothDeathRecipient::serviceDied - Bluetooth service died");
45*4d7e907cSAndroid Build Coastguard Worker     has_died_ = true;
46*4d7e907cSAndroid Build Coastguard Worker     mHci->close();
47*4d7e907cSAndroid Build Coastguard Worker   }
48*4d7e907cSAndroid Build Coastguard Worker   sp<IBluetoothHci> mHci;
getHasDied() const49*4d7e907cSAndroid Build Coastguard Worker   bool getHasDied() const { return has_died_; }
setHasDied(bool has_died)50*4d7e907cSAndroid Build Coastguard Worker   void setHasDied(bool has_died) { has_died_ = has_died; }
51*4d7e907cSAndroid Build Coastguard Worker 
52*4d7e907cSAndroid Build Coastguard Worker  private:
53*4d7e907cSAndroid Build Coastguard Worker   bool has_died_;
54*4d7e907cSAndroid Build Coastguard Worker };
55*4d7e907cSAndroid Build Coastguard Worker 
BluetoothHci()56*4d7e907cSAndroid Build Coastguard Worker BluetoothHci::BluetoothHci()
57*4d7e907cSAndroid Build Coastguard Worker     : death_recipient_(new BluetoothDeathRecipient(this)) {}
58*4d7e907cSAndroid Build Coastguard Worker 
initialize_1_1(const::android::sp<V1_1::IBluetoothHciCallbacks> & cb)59*4d7e907cSAndroid Build Coastguard Worker Return<void> BluetoothHci::initialize_1_1(
60*4d7e907cSAndroid Build Coastguard Worker     const ::android::sp<V1_1::IBluetoothHciCallbacks>& cb) {
61*4d7e907cSAndroid Build Coastguard Worker   ALOGI("BluetoothHci::initialize_1_1()");
62*4d7e907cSAndroid Build Coastguard Worker   if (cb == nullptr) {
63*4d7e907cSAndroid Build Coastguard Worker     ALOGE("cb == nullptr! -> Unable to call initializationComplete(ERR)");
64*4d7e907cSAndroid Build Coastguard Worker     return Void();
65*4d7e907cSAndroid Build Coastguard Worker   }
66*4d7e907cSAndroid Build Coastguard Worker 
67*4d7e907cSAndroid Build Coastguard Worker   death_recipient_->setHasDied(false);
68*4d7e907cSAndroid Build Coastguard Worker   cb->linkToDeath(death_recipient_, 0);
69*4d7e907cSAndroid Build Coastguard Worker 
70*4d7e907cSAndroid Build Coastguard Worker   bool rc = VendorInterface::Initialize(
71*4d7e907cSAndroid Build Coastguard Worker       [cb](bool status) {
72*4d7e907cSAndroid Build Coastguard Worker         auto hidl_status = cb->initializationComplete(
73*4d7e907cSAndroid Build Coastguard Worker             status ? V1_0::Status::SUCCESS
74*4d7e907cSAndroid Build Coastguard Worker                    : V1_0::Status::INITIALIZATION_ERROR);
75*4d7e907cSAndroid Build Coastguard Worker         if (!hidl_status.isOk()) {
76*4d7e907cSAndroid Build Coastguard Worker           ALOGE("VendorInterface -> Unable to call initializationComplete()");
77*4d7e907cSAndroid Build Coastguard Worker         }
78*4d7e907cSAndroid Build Coastguard Worker       },
79*4d7e907cSAndroid Build Coastguard Worker       [cb](const hidl_vec<uint8_t>& packet) {
80*4d7e907cSAndroid Build Coastguard Worker         auto hidl_status = cb->hciEventReceived(packet);
81*4d7e907cSAndroid Build Coastguard Worker         if (!hidl_status.isOk()) {
82*4d7e907cSAndroid Build Coastguard Worker           ALOGE("VendorInterface -> Unable to call hciEventReceived()");
83*4d7e907cSAndroid Build Coastguard Worker         }
84*4d7e907cSAndroid Build Coastguard Worker       },
85*4d7e907cSAndroid Build Coastguard Worker       [cb](const hidl_vec<uint8_t>& packet) {
86*4d7e907cSAndroid Build Coastguard Worker         auto hidl_status = cb->aclDataReceived(packet);
87*4d7e907cSAndroid Build Coastguard Worker         if (!hidl_status.isOk()) {
88*4d7e907cSAndroid Build Coastguard Worker           ALOGE("VendorInterface -> Unable to call aclDataReceived()");
89*4d7e907cSAndroid Build Coastguard Worker         }
90*4d7e907cSAndroid Build Coastguard Worker       },
91*4d7e907cSAndroid Build Coastguard Worker       [cb](const hidl_vec<uint8_t>& packet) {
92*4d7e907cSAndroid Build Coastguard Worker         auto hidl_status = cb->scoDataReceived(packet);
93*4d7e907cSAndroid Build Coastguard Worker         if (!hidl_status.isOk()) {
94*4d7e907cSAndroid Build Coastguard Worker           ALOGE("VendorInterface -> Unable to call scoDataReceived()");
95*4d7e907cSAndroid Build Coastguard Worker         }
96*4d7e907cSAndroid Build Coastguard Worker       },
97*4d7e907cSAndroid Build Coastguard Worker       [cb](const hidl_vec<uint8_t>& packet) {
98*4d7e907cSAndroid Build Coastguard Worker         auto hidl_status = cb->isoDataReceived(packet);
99*4d7e907cSAndroid Build Coastguard Worker         if (!hidl_status.isOk()) {
100*4d7e907cSAndroid Build Coastguard Worker           ALOGE("VendorInterface -> Unable to call isoDataReceived()");
101*4d7e907cSAndroid Build Coastguard Worker         }
102*4d7e907cSAndroid Build Coastguard Worker       });
103*4d7e907cSAndroid Build Coastguard Worker   if (!rc) {
104*4d7e907cSAndroid Build Coastguard Worker     auto hidl_status =
105*4d7e907cSAndroid Build Coastguard Worker         cb->initializationComplete(V1_0::Status::INITIALIZATION_ERROR);
106*4d7e907cSAndroid Build Coastguard Worker     if (!hidl_status.isOk()) {
107*4d7e907cSAndroid Build Coastguard Worker       ALOGE("VendorInterface -> Unable to call initializationComplete(ERR)");
108*4d7e907cSAndroid Build Coastguard Worker     }
109*4d7e907cSAndroid Build Coastguard Worker   }
110*4d7e907cSAndroid Build Coastguard Worker 
111*4d7e907cSAndroid Build Coastguard Worker   unlink_cb_ = [cb](sp<BluetoothDeathRecipient>& death_recipient) {
112*4d7e907cSAndroid Build Coastguard Worker     if (death_recipient->getHasDied())
113*4d7e907cSAndroid Build Coastguard Worker       ALOGI("Skipping unlink call, service died.");
114*4d7e907cSAndroid Build Coastguard Worker     else
115*4d7e907cSAndroid Build Coastguard Worker       cb->unlinkToDeath(death_recipient);
116*4d7e907cSAndroid Build Coastguard Worker   };
117*4d7e907cSAndroid Build Coastguard Worker 
118*4d7e907cSAndroid Build Coastguard Worker   return Void();
119*4d7e907cSAndroid Build Coastguard Worker }
120*4d7e907cSAndroid Build Coastguard Worker 
121*4d7e907cSAndroid Build Coastguard Worker class OldCbWrapper : public V1_1::IBluetoothHciCallbacks {
122*4d7e907cSAndroid Build Coastguard Worker  public:
123*4d7e907cSAndroid Build Coastguard Worker   const ::android::sp<V1_0::IBluetoothHciCallbacks> old_cb_;
OldCbWrapper(const::android::sp<V1_0::IBluetoothHciCallbacks> & old_cb)124*4d7e907cSAndroid Build Coastguard Worker   OldCbWrapper(const ::android::sp<V1_0::IBluetoothHciCallbacks>& old_cb)
125*4d7e907cSAndroid Build Coastguard Worker       : old_cb_(old_cb) {}
126*4d7e907cSAndroid Build Coastguard Worker 
127*4d7e907cSAndroid Build Coastguard Worker   virtual ~OldCbWrapper() = default;
128*4d7e907cSAndroid Build Coastguard Worker 
initializationComplete(V1_0::Status status)129*4d7e907cSAndroid Build Coastguard Worker   Return<void> initializationComplete(V1_0::Status status) override {
130*4d7e907cSAndroid Build Coastguard Worker     return old_cb_->initializationComplete(status);
131*4d7e907cSAndroid Build Coastguard Worker   };
132*4d7e907cSAndroid Build Coastguard Worker 
hciEventReceived(const::android::hardware::hidl_vec<uint8_t> & event)133*4d7e907cSAndroid Build Coastguard Worker   Return<void> hciEventReceived(
134*4d7e907cSAndroid Build Coastguard Worker       const ::android::hardware::hidl_vec<uint8_t>& event) override {
135*4d7e907cSAndroid Build Coastguard Worker     return old_cb_->hciEventReceived(event);
136*4d7e907cSAndroid Build Coastguard Worker   };
137*4d7e907cSAndroid Build Coastguard Worker 
aclDataReceived(const::android::hardware::hidl_vec<uint8_t> & data)138*4d7e907cSAndroid Build Coastguard Worker   Return<void> aclDataReceived(
139*4d7e907cSAndroid Build Coastguard Worker       const ::android::hardware::hidl_vec<uint8_t>& data) override {
140*4d7e907cSAndroid Build Coastguard Worker     return old_cb_->aclDataReceived(data);
141*4d7e907cSAndroid Build Coastguard Worker   };
142*4d7e907cSAndroid Build Coastguard Worker 
scoDataReceived(const::android::hardware::hidl_vec<uint8_t> & data)143*4d7e907cSAndroid Build Coastguard Worker   Return<void> scoDataReceived(
144*4d7e907cSAndroid Build Coastguard Worker       const ::android::hardware::hidl_vec<uint8_t>& data) override {
145*4d7e907cSAndroid Build Coastguard Worker     return old_cb_->scoDataReceived(data);
146*4d7e907cSAndroid Build Coastguard Worker   };
147*4d7e907cSAndroid Build Coastguard Worker 
isoDataReceived(const::android::hardware::hidl_vec<uint8_t> &)148*4d7e907cSAndroid Build Coastguard Worker   Return<void> isoDataReceived(
149*4d7e907cSAndroid Build Coastguard Worker       const ::android::hardware::hidl_vec<uint8_t>&) override {
150*4d7e907cSAndroid Build Coastguard Worker     ALOGE("Please use HAL V1_1 for ISO.");
151*4d7e907cSAndroid Build Coastguard Worker     return Void();
152*4d7e907cSAndroid Build Coastguard Worker   };
153*4d7e907cSAndroid Build Coastguard Worker };
154*4d7e907cSAndroid Build Coastguard Worker 
initialize(const::android::sp<V1_0::IBluetoothHciCallbacks> & cb)155*4d7e907cSAndroid Build Coastguard Worker Return<void> BluetoothHci::initialize(
156*4d7e907cSAndroid Build Coastguard Worker     const ::android::sp<V1_0::IBluetoothHciCallbacks>& cb) {
157*4d7e907cSAndroid Build Coastguard Worker   ALOGE("Using initialize from HAL V1_0 instead of initialize_1_1.");
158*4d7e907cSAndroid Build Coastguard Worker   return initialize_1_1(new OldCbWrapper(cb));
159*4d7e907cSAndroid Build Coastguard Worker }
160*4d7e907cSAndroid Build Coastguard Worker 
close()161*4d7e907cSAndroid Build Coastguard Worker Return<void> BluetoothHci::close() {
162*4d7e907cSAndroid Build Coastguard Worker   ALOGI("BluetoothHci::close()");
163*4d7e907cSAndroid Build Coastguard Worker   unlink_cb_(death_recipient_);
164*4d7e907cSAndroid Build Coastguard Worker   VendorInterface::Shutdown();
165*4d7e907cSAndroid Build Coastguard Worker   return Void();
166*4d7e907cSAndroid Build Coastguard Worker }
167*4d7e907cSAndroid Build Coastguard Worker 
sendHciCommand(const hidl_vec<uint8_t> & command)168*4d7e907cSAndroid Build Coastguard Worker Return<void> BluetoothHci::sendHciCommand(const hidl_vec<uint8_t>& command) {
169*4d7e907cSAndroid Build Coastguard Worker   sendDataToController(HCI_DATA_TYPE_COMMAND, command);
170*4d7e907cSAndroid Build Coastguard Worker   return Void();
171*4d7e907cSAndroid Build Coastguard Worker }
172*4d7e907cSAndroid Build Coastguard Worker 
sendAclData(const hidl_vec<uint8_t> & data)173*4d7e907cSAndroid Build Coastguard Worker Return<void> BluetoothHci::sendAclData(const hidl_vec<uint8_t>& data) {
174*4d7e907cSAndroid Build Coastguard Worker   sendDataToController(HCI_DATA_TYPE_ACL, data);
175*4d7e907cSAndroid Build Coastguard Worker   return Void();
176*4d7e907cSAndroid Build Coastguard Worker }
177*4d7e907cSAndroid Build Coastguard Worker 
sendScoData(const hidl_vec<uint8_t> & data)178*4d7e907cSAndroid Build Coastguard Worker Return<void> BluetoothHci::sendScoData(const hidl_vec<uint8_t>& data) {
179*4d7e907cSAndroid Build Coastguard Worker   sendDataToController(HCI_DATA_TYPE_SCO, data);
180*4d7e907cSAndroid Build Coastguard Worker   return Void();
181*4d7e907cSAndroid Build Coastguard Worker }
182*4d7e907cSAndroid Build Coastguard Worker 
sendIsoData(const hidl_vec<uint8_t> & data)183*4d7e907cSAndroid Build Coastguard Worker Return<void> BluetoothHci::sendIsoData(const hidl_vec<uint8_t>& data) {
184*4d7e907cSAndroid Build Coastguard Worker   sendDataToController(HCI_DATA_TYPE_ISO, data);
185*4d7e907cSAndroid Build Coastguard Worker   return Void();
186*4d7e907cSAndroid Build Coastguard Worker }
187*4d7e907cSAndroid Build Coastguard Worker 
sendDataToController(const uint8_t type,const hidl_vec<uint8_t> & data)188*4d7e907cSAndroid Build Coastguard Worker void BluetoothHci::sendDataToController(const uint8_t type,
189*4d7e907cSAndroid Build Coastguard Worker                                         const hidl_vec<uint8_t>& data) {
190*4d7e907cSAndroid Build Coastguard Worker   VendorInterface::get()->Send(type, data.data(), data.size());
191*4d7e907cSAndroid Build Coastguard Worker }
192*4d7e907cSAndroid Build Coastguard Worker 
193*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
194*4d7e907cSAndroid Build Coastguard Worker }  // namespace V1_1
195*4d7e907cSAndroid Build Coastguard Worker }  // namespace bluetooth
196*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
197*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
198