blob: d0406017479bd0448321c15a421830397cd04651 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_CONNECTIVITY_BLUETOOTH_HCI_VENDOR_BROADCOM_PACKETS_H_
#define SRC_CONNECTIVITY_BLUETOOTH_HCI_VENDOR_BROADCOM_PACKETS_H_
#include <endian.h>
#include <stdint.h>
#include <zircon/compiler.h>
#include <cstddef>
#include <limits>
namespace bt_hci_broadcom {
// Official HCI definitions:
struct HciCommandHeader {
uint16_t opcode;
uint8_t parameter_total_size;
} __PACKED;
constexpr uint16_t kResetCmdOpCode = 0x0c03;
constexpr uint16_t kReadBdaddrCmdOpCode = 0x1009;
struct HciEventHeader {
uint8_t event_code;
uint8_t parameter_total_size;
} __PACKED;
struct HciCommandComplete {
HciEventHeader header;
uint8_t num_hci_command_packets;
uint16_t command_opcode;
uint8_t return_code;
} __PACKED;
constexpr uint8_t kHciEvtCommandCompleteEventCode = 0x0e;
constexpr size_t kMacAddrLen = 6;
struct ReadBdaddrCommandComplete {
HciCommandComplete header;
uint8_t bdaddr[kMacAddrLen];
} __PACKED;
// Vendor HCI definitions:
constexpr uint16_t kStartFirmwareDownloadCmdOpCode = 0xfc2e;
struct BcmSetBaudRateCmd {
HciCommandHeader header;
uint16_t unused;
uint32_t baud_rate;
} __PACKED;
constexpr uint16_t kBcmSetBaudRateCmdOpCode = 0xfc18;
struct BcmSetBdaddrCmd {
HciCommandHeader header;
uint8_t bdaddr[kMacAddrLen];
} __PACKED;
constexpr uint16_t kBcmSetBdaddrCmdOpCode = 0xfc01;
struct BcmSetAclPriorityCmd {
HciCommandHeader header;
uint16_t connection_handle;
uint8_t priority;
uint8_t direction;
} __PACKED;
constexpr uint16_t kBcmSetAclPriorityCmdOpCode = ((0x3F << 10) | 0x11A);
constexpr uint8_t kBcmAclPriorityNormal = 0x00;
constexpr uint8_t kBcmAclPriorityHigh = 0x01;
constexpr uint8_t kBcmAclDirectionSource = 0x00;
constexpr uint8_t kBcmAclDirectionSink = 0x01;
constexpr size_t kBcmSetAclPriorityCmdSize = sizeof(BcmSetAclPriorityCmd);
constexpr size_t kMaxHciCommandSize =
sizeof(HciCommandHeader) +
std::numeric_limits<decltype(HciCommandHeader::parameter_total_size)>::max();
// Max size of an event frame.
constexpr size_t kChanReadBufLen =
sizeof(HciEventHeader) +
std::numeric_limits<decltype(HciEventHeader::parameter_total_size)>::max();
// Min event param size for a valid command complete event frame
constexpr size_t kMinEvtParamSize = sizeof(HciCommandComplete) - sizeof(HciEventHeader);
// HCI reset command
const HciCommandHeader kResetCmd = {
.opcode = htole16(kResetCmdOpCode),
.parameter_total_size = 0,
};
// vendor command to begin firmware download
const HciCommandHeader kStartFirmwareDownloadCmd = {
.opcode = htole16(kStartFirmwareDownloadCmdOpCode),
.parameter_total_size = 0,
};
// HCI command to read BDADDR from controller
const HciCommandHeader kReadBdaddrCmd = {
.opcode = htole16(kReadBdaddrCmdOpCode),
.parameter_total_size = 0,
};
} // namespace bt_hci_broadcom
#endif // SRC_CONNECTIVITY_BLUETOOTH_HCI_VENDOR_BROADCOM_PACKETS_H_