1 // 2 // Copyright 2017 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "h4_protocol.h" 18 19 #define LOG_TAG "android.hardware.bluetooth-hci-h4" 20 #include <android-base/logging.h> 21 #include <assert.h> 22 #include <fcntl.h> 23 24 namespace android { 25 namespace hardware { 26 namespace bluetooth { 27 namespace hci { 28 29 size_t H4Protocol::Send(uint8_t type, const uint8_t* data, size_t length) { 30 int rv = WriteSafely(uart_fd_, &type, sizeof(type)); 31 if (rv == sizeof(type)) { 32 rv = WriteSafely(uart_fd_, data, length); 33 } 34 return rv; 35 } 36 37 void H4Protocol::OnPacketReady() { 38 switch (hci_packet_type_) { 39 case HCI_PACKET_TYPE_EVENT: 40 event_cb_(hci_packetizer_.GetPacket()); 41 break; 42 case HCI_PACKET_TYPE_ACL_DATA: 43 acl_cb_(hci_packetizer_.GetPacket()); 44 break; 45 case HCI_PACKET_TYPE_SCO_DATA: 46 sco_cb_(hci_packetizer_.GetPacket()); 47 break; 48 default: { 49 bool bad_packet_type = true; 50 CHECK(!bad_packet_type); 51 } 52 } 53 // Get ready for the next type byte. 54 hci_packet_type_ = HCI_PACKET_TYPE_UNKNOWN; 55 } 56 57 void H4Protocol::OnDataReady(int fd) { 58 if (hci_packet_type_ == HCI_PACKET_TYPE_UNKNOWN) { 59 uint8_t buffer[1] = {0}; 60 size_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buffer, 1)); 61 CHECK(bytes_read == 1); 62 hci_packet_type_ = static_cast<HciPacketType>(buffer[0]); 63 } else { 64 hci_packetizer_.OnDataReady(fd, hci_packet_type_); 65 } 66 } 67 68 } // namespace hci 69 } // namespace bluetooth 70 } // namespace hardware 71 } // namespace android 72