1 /** @file 2 * @brief Bluetooth HCI RAW channel handling 3 */ 4 5 /* 6 * Copyright (c) 2016 Intel Corporation 7 * 8 * SPDX-License-Identifier: Apache-2.0 9 */ 10 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_HCI_RAW_H_ 11 #define ZEPHYR_INCLUDE_BLUETOOTH_HCI_RAW_H_ 12 13 /** 14 * @brief HCI RAW channel 15 * @defgroup hci_raw HCI RAW channel 16 * @ingroup bluetooth 17 * @{ 18 */ 19 20 #include <stdint.h> 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 /** @brief Send packet to the Bluetooth controller 27 * 28 * Send packet to the Bluetooth controller. Caller needs to 29 * implement netbuf pool. 30 * 31 * @param buf netbuf packet to be send 32 * 33 * @return Zero on success or (negative) error code otherwise. 34 */ 35 int bt_send(struct net_buf *buf); 36 37 enum { 38 /** Passthrough mode 39 * 40 * While in this mode the buffers are passed as is between the stack 41 * and the driver. 42 */ 43 BT_HCI_RAW_MODE_PASSTHROUGH = 0x00, 44 45 /** H:4 mode 46 * 47 * While in this mode H:4 headers will added into the buffers 48 * according to the buffer type when coming from the stack and will be 49 * removed and used to set the buffer type. 50 */ 51 BT_HCI_RAW_MODE_H4 = 0x01, 52 }; 53 54 /** @brief Set Bluetooth RAW channel mode 55 * 56 * Set access mode of Bluetooth RAW channel. 57 * 58 * @param mode Access mode. 59 * 60 * @return Zero on success or (negative) error code otherwise. 61 */ 62 int bt_hci_raw_set_mode(uint8_t mode); 63 64 /** @brief Get Bluetooth RAW channel mode 65 * 66 * Get access mode of Bluetooth RAW channel. 67 * 68 * @return Access mode. 69 */ 70 uint8_t bt_hci_raw_get_mode(void); 71 72 #define BT_HCI_ERR_EXT_HANDLED 0xff 73 74 /** Helper macro to define a command extension 75 * 76 * @param _op Opcode of the command. 77 * @param _min_len Minimal length of the command. 78 * @param _func Handler function to be called. 79 */ 80 #define BT_HCI_RAW_CMD_EXT(_op, _min_len, _func) \ 81 { \ 82 .op = _op, \ 83 .min_len = _min_len, \ 84 .func = _func, \ 85 } 86 87 struct bt_hci_raw_cmd_ext { 88 /** Opcode of the command */ 89 uint16_t op; 90 91 /** Minimal length of the command */ 92 size_t min_len; 93 94 /** Handler function. 95 * 96 * Handler function to be called when a command is intercepted. 97 * 98 * @param buf Buffer containing the command. 99 * 100 * @return HCI Status code or BT_HCI_ERR_EXT_HANDLED if command has 101 * been handled already and a response has been sent as oppose to 102 * BT_HCI_ERR_SUCCESS which just indicates that the command can be 103 * sent to the controller to be processed. 104 */ 105 uint8_t (*func)(struct net_buf *buf); 106 }; 107 108 /** @brief Register Bluetooth RAW command extension table 109 * 110 * Register Bluetooth RAW channel command extension table, opcodes in this 111 * table are intercepted to sent to the handler function. 112 * 113 * @param cmds Pointer to the command extension table. 114 * @param size Size of the command extension table. 115 */ 116 void bt_hci_raw_cmd_ext_register(struct bt_hci_raw_cmd_ext *cmds, size_t size); 117 118 /** @brief Enable Bluetooth RAW channel: 119 * 120 * Enable Bluetooth RAW HCI channel. 121 * 122 * @param rx_queue netbuf queue where HCI packets received from the Bluetooth 123 * controller are to be queued. The queue is defined in the caller while 124 * the available buffers pools are handled in the stack. 125 * 126 * @return Zero on success or (negative) error code otherwise. 127 */ 128 int bt_enable_raw(struct k_fifo *rx_queue); 129 130 #ifdef __cplusplus 131 } 132 #endif 133 /** 134 * @} 135 */ 136 137 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_HCI_RAW_H_ */ 138