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