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