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 24namespace android { 25namespace hardware { 26namespace bluetooth { 27namespace hci { 28 29size_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 37void 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 57void 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