1 /*
2 * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #include <string.h>
7 #include <stdio.h>
8 #include "esp_hci_internal.h"
9 #include "esp_hci_driver.h"
10
11 typedef struct {
12 hci_driver_forward_fn *forward_cb;
13 } hci_driver_vhci_env_t;
14
15 static hci_driver_vhci_env_t s_hci_driver_vhci_env;
16
17 static int
hci_driver_vhci_controller_tx(hci_driver_data_type_t data_type,uint8_t * data)18 hci_driver_vhci_controller_tx(hci_driver_data_type_t data_type, uint8_t *data)
19 {
20 /* The length is contained in the data. */
21 return s_hci_driver_vhci_env.forward_cb(data_type, data, 0, HCI_DRIVER_DIR_C2H);
22 }
23
24 static int
hci_driver_vhci_host_tx(hci_driver_data_type_t data_type,uint8_t * data,uint32_t length)25 hci_driver_vhci_host_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length)
26 {
27 return s_hci_driver_vhci_env.forward_cb(data_type, data, length, HCI_DRIVER_DIR_H2C);
28 }
29
30 static int
hci_driver_vhci_tx(hci_driver_data_type_t data_type,uint8_t * data,uint32_t length,hci_driver_direction_t dir)31 hci_driver_vhci_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length,
32 hci_driver_direction_t dir)
33 {
34 int rc;
35
36 if (dir == HCI_DRIVER_DIR_C2H) {
37 rc = hci_driver_vhci_controller_tx(data_type, data);
38 } else {
39 rc = hci_driver_vhci_host_tx(data_type, data, length);
40 }
41 return rc;
42 }
43
44 static int
hci_driver_vhci_init(hci_driver_forward_fn * cb)45 hci_driver_vhci_init(hci_driver_forward_fn *cb)
46 {
47 s_hci_driver_vhci_env.forward_cb = cb;
48 return 0;
49 }
50
51 static void
hci_driver_vhci_deinit(void)52 hci_driver_vhci_deinit(void)
53 {
54 memset(&s_hci_driver_vhci_env, 0, sizeof(hci_driver_vhci_env_t));
55 }
56
57 hci_driver_ops_t hci_driver_vhci_ops = {
58 .hci_driver_tx = hci_driver_vhci_tx,
59 .hci_driver_init = hci_driver_vhci_init,
60 .hci_driver_deinit = hci_driver_vhci_deinit,
61 };
62