1fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson/******************************************************************************
2fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
3fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  Copyright (C) 2014 Google, Inc.
4fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
5fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  Licensed under the Apache License, Version 2.0 (the "License");
6fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  you may not use this file except in compliance with the License.
7fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  You may obtain a copy of the License at:
8fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
9fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  http://www.apache.org/licenses/LICENSE-2.0
10fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
11fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  Unless required by applicable law or agreed to in writing, software
12fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  distributed under the License is distributed on an "AS IS" BASIS,
13fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  See the License for the specific language governing permissions and
15fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  limitations under the License.
16fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
17fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson ******************************************************************************/
18fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
19fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#pragma once
20fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
21fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include <stdbool.h>
22fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
23fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include "allocator.h"
24218f375e989a6189cd9a3227656be17bf614485bZach Johnson#include "bt_types.h"
25fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include "data_dispatcher.h"
26b55a8a62b23be97fcb3f2ba9f3c4cb03cfb59914Zach Johnson#include "fixed_queue.h"
27cd01adc807c14915db3ad566a47d738f82fd3319Zach Johnson#include "future.h"
28fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include "osi.h"
29fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
3006ef205ebcb0d3f0fe2b88ddcea73e646981940eSharvil Nanavatistatic const char HCI_MODULE[] = "hci_module";
3106ef205ebcb0d3f0fe2b88ddcea73e646981940eSharvil Nanavati
32fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson///// LEGACY DEFINITIONS /////
33fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
34fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson/* Message event mask across Host/Controller lib and stack */
35fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_EVT_MASK                    0xFF00 /* eq. BT_EVT_MASK */
36fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_SUB_EVT_MASK                0x00FF /* eq. BT_SUB_EVT_MASK */
37fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
38fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson/* Message event ID passed from Host/Controller lib to stack */
39fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_HC_TO_STACK_HCI_ERR        0x1300 /* eq. BT_EVT_TO_BTU_HCIT_ERR */
40fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_HC_TO_STACK_HCI_ACL        0x1100 /* eq. BT_EVT_TO_BTU_HCI_ACL */
41fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_HC_TO_STACK_HCI_SCO        0x1200 /* eq. BT_EVT_TO_BTU_HCI_SCO */
42fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_HC_TO_STACK_HCI_EVT        0x1000 /* eq. BT_EVT_TO_BTU_HCI_EVT */
43fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_HC_TO_STACK_L2C_SEG_XMIT   0x1900 /* eq. BT_EVT_TO_BTU_L2C_SEG_XMIT */
44fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
45fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson/* Message event ID passed from stack to vendor lib */
46fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_STACK_TO_HC_HCI_ACL        0x2100 /* eq. BT_EVT_TO_LM_HCI_ACL */
47fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_STACK_TO_HC_HCI_SCO        0x2200 /* eq. BT_EVT_TO_LM_HCI_SCO */
48fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define MSG_STACK_TO_HC_HCI_CMD        0x2000 /* eq. BT_EVT_TO_LM_HCI_CMD */
49fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
50fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson/* Local Bluetooth Controller ID for BR/EDR */
51fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#define LOCAL_BR_EDR_CONTROLLER_ID      0
52fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
53fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson///// END LEGACY DEFINITIONS /////
54fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
55bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct hci_hal_t hci_hal_t;
56bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct btsnoop_t btsnoop_t;
57bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct controller_t controller_t;
58bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct hci_inject_t hci_inject_t;
59bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct packet_fragmenter_t packet_fragmenter_t;
60bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct vendor_t vendor_t;
61bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct low_power_manager_t low_power_manager_t;
62fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
63fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsontypedef unsigned char * bdaddr_t;
64218f375e989a6189cd9a3227656be17bf614485bZach Johnsontypedef uint16_t command_opcode_t;
65fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
66fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsontypedef enum {
67fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  LPM_DISABLE,
68fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  LPM_ENABLE,
69fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  LPM_WAKE_ASSERT,
70fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  LPM_WAKE_DEASSERT
71fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson} low_power_command_t;
72fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
73218f375e989a6189cd9a3227656be17bf614485bZach Johnsontypedef void (*command_complete_cb)(BT_HDR *response, void *context);
74218f375e989a6189cd9a3227656be17bf614485bZach Johnsontypedef void (*command_status_cb)(uint8_t status, BT_HDR *command, void *context);
75fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
76bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsontypedef struct hci_t {
77fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  // Send a low power command, if supported and the low power manager is enabled.
78fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  void (*send_low_power_command)(low_power_command_t command);
79fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
80fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  // Do the postload sequence (call after the rest of the BT stack initializes).
81fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  void (*do_postload)(void);
82fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
83b55a8a62b23be97fcb3f2ba9f3c4cb03cfb59914Zach Johnson  // Register with this data dispatcher to receive events flowing upward out of the HCI layer
84b55a8a62b23be97fcb3f2ba9f3c4cb03cfb59914Zach Johnson  data_dispatcher_t *event_dispatcher;
85b55a8a62b23be97fcb3f2ba9f3c4cb03cfb59914Zach Johnson
86b55a8a62b23be97fcb3f2ba9f3c4cb03cfb59914Zach Johnson  // Set the queue to receive ACL data in
87b55a8a62b23be97fcb3f2ba9f3c4cb03cfb59914Zach Johnson  void (*set_data_queue)(fixed_queue_t *queue);
88fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
89218f375e989a6189cd9a3227656be17bf614485bZach Johnson  // Send a command through the HCI layer
90218f375e989a6189cd9a3227656be17bf614485bZach Johnson  void (*transmit_command)(
91218f375e989a6189cd9a3227656be17bf614485bZach Johnson      BT_HDR *command,
92218f375e989a6189cd9a3227656be17bf614485bZach Johnson      command_complete_cb complete_callback,
93218f375e989a6189cd9a3227656be17bf614485bZach Johnson      command_status_cb status_cb,
94218f375e989a6189cd9a3227656be17bf614485bZach Johnson      void *context
95218f375e989a6189cd9a3227656be17bf614485bZach Johnson  );
96218f375e989a6189cd9a3227656be17bf614485bZach Johnson
97cd01adc807c14915db3ad566a47d738f82fd3319Zach Johnson  future_t *(*transmit_command_futured)(BT_HDR *command);
98cd01adc807c14915db3ad566a47d738f82fd3319Zach Johnson
99fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  // Send some data downward through the HCI layer
100fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  void (*transmit_downward)(data_dispatcher_type_t type, void *data);
101bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson} hci_t;
102bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
103bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonconst hci_t *hci_layer_get_interface();
104bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
105bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonconst hci_t *hci_layer_get_test_interface(
106bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    const allocator_t *buffer_allocator_interface,
107bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    const hci_hal_t *hal_interface,
108bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    const btsnoop_t *btsnoop_interface,
109bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    const hci_inject_t *hci_inject_interface,
110bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    const packet_fragmenter_t *packet_fragmenter_interface,
111bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    const vendor_t *vendor_interface,
112bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    const low_power_manager_t *low_power_manager_interface);
113