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 21 #include <errno.h> 22 #include <fcntl.h> 23 #include <log/log.h> 24 #include <sys/uio.h> 25 #include <unistd.h> 26 27 namespace android { 28 namespace hardware { 29 namespace bluetooth { 30 namespace hci { 31 32 size_t H4Protocol::Send(uint8_t type, const uint8_t* data, size_t length) { 33 struct iovec iov[] = {{&type, sizeof(type)}, 34 {const_cast<uint8_t*>(data), length}}; 35 ssize_t ret = 0; 36 do { 37 ret = TEMP_FAILURE_RETRY(writev(uart_fd_, iov, sizeof(iov) / sizeof(iov[0]))); 38 } while (-1 == ret && EAGAIN == errno); 39 40 if (ret == -1) { 41 ALOGE("%s error writing to UART (%s)", __func__, strerror(errno)); 42 } else if (ret < static_cast<ssize_t>(length + 1)) { 43 ALOGE("%s: %d / %d bytes written - something went wrong...", __func__, 44 static_cast<int>(ret), static_cast<int>(length + 1)); 45 } 46 return ret; 47 } 48 49 void H4Protocol::OnPacketReady() { 50 switch (hci_packet_type_) { 51 case HCI_PACKET_TYPE_EVENT: 52 event_cb_(hci_packetizer_.GetPacket()); 53 break; 54 case HCI_PACKET_TYPE_ACL_DATA: 55 acl_cb_(hci_packetizer_.GetPacket()); 56 break; 57 case HCI_PACKET_TYPE_SCO_DATA: 58 sco_cb_(hci_packetizer_.GetPacket()); 59 break; 60 default: 61 LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, 62 static_cast<int>(hci_packet_type_)); 63 } 64 // Get ready for the next type byte. 65 hci_packet_type_ = HCI_PACKET_TYPE_UNKNOWN; 66 } 67 68 void H4Protocol::OnDataReady(int fd) { 69 if (hci_packet_type_ == HCI_PACKET_TYPE_UNKNOWN) { 70 uint8_t buffer[1] = {0}; 71 ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buffer, 1)); 72 if (bytes_read != 1) { 73 if (bytes_read == 0) { 74 // This is only expected if the UART got closed when shutting down. 75 ALOGE("%s: Unexpected EOF reading the packet type!", __func__); 76 sleep(5); // Expect to be shut down within 5 seconds. 77 return; 78 } else if (bytes_read < 0) { 79 LOG_ALWAYS_FATAL("%s: Read packet type error: %s", __func__, 80 strerror(errno)); 81 } else { 82 LOG_ALWAYS_FATAL("%s: More bytes read than expected (%u)!", __func__, 83 static_cast<unsigned int>(bytes_read)); 84 } 85 } 86 hci_packet_type_ = static_cast<HciPacketType>(buffer[0]); 87 if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA && 88 hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA && 89 hci_packet_type_ != HCI_PACKET_TYPE_EVENT) { 90 LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, 91 static_cast<int>(hci_packet_type_)); 92 } 93 } else { 94 hci_packetizer_.OnDataReady(fd, hci_packet_type_); 95 } 96 } 97 98 } // namespace hci 99 } // namespace bluetooth 100 } // namespace hardware 101 } // namespace android 102