1 /*
2  * Copyright (c) 2023 Ambiq Micro Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @brief Header file of Ambiq Apollox Blue SoC extended driver
9  * for SPI based HCI.
10  */
11 #ifndef ZEPHYR_DRIVERS_BLUETOOTH_HCI_APOLLOX_BLUE_H_
12 #define ZEPHYR_DRIVERS_BLUETOOTH_HCI_APOLLOX_BLUE_H_
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 /**
19  * @typedef bt_spi_transceive_fun
20  * @brief SPI transceive function for Bluetooth packet.
21  *
22  * @param tx Pointer of transmission packet.
23  * @param tx_len Length of transmission packet.
24  * @param rx Pointer of reception packet.
25  * @param rx_len Length of reception packet.
26  *
27  * @return 0 on success or negative error number on failure.
28  */
29 typedef int (*bt_spi_transceive_fun)(void *tx, uint32_t tx_len, void *rx, uint32_t rx_len);
30 
31 /**
32  * @typedef spi_transmit_fun
33  * @brief Define the SPI transmission function.
34  *
35  * @param data Pointer of transmission packet.
36  * @param len Length of transmission packet.
37  *
38  * @return 0 on success or negative error number on failure.
39  */
40 typedef int (*spi_transmit_fun)(uint8_t *data, uint16_t len);
41 
42 /**
43  * @brief Initialize the required devices for HCI driver.
44  *
45  * The devices mainly include the required gpio (e.g. reset-gpios,
46  * irq-gpios).
47  *
48  * @return 0 on success or negative error number on failure.
49  */
50 int bt_apollo_dev_init(void);
51 
52 /**
53  * @brief Send the packets to BLE controller from host via SPI.
54  *
55  * @param data Pointer of transmission packet.
56  * @param len  Length of transmission packet.
57  * @param transceive SPI transceive function for Bluetooth packet.
58  *
59  * @return 0 on success or negative error number on failure.
60  */
61 int bt_apollo_spi_send(uint8_t *data, uint16_t len, bt_spi_transceive_fun transceive);
62 
63 /**
64  * @brief Receive the packets sent from BLE controller to host via SPI.
65  *
66  * @param data Pointer of reception packet.
67  * @param len  Pointer of reception packet length.
68  * @param transceive  SPI transceive function for Bluetooth packet.
69  *
70  * @return 0 on success or negative error number on failure.
71  */
72 int bt_apollo_spi_rcv(uint8_t *data, uint16_t *len, bt_spi_transceive_fun transceive);
73 
74 /**
75  * @brief Initialize the BLE controller.
76  *
77  * This step may do the necessary handshaking with the controller before
78  * @param transmit SPI transmit function
79  *
80  * @return 0 on success or negative error number on failure.
81  */
82 int bt_apollo_controller_init(spi_transmit_fun transmit);
83 
84 /**
85  * @brief Deinitialize the BLE controller.
86  *
87  * @return 0 on success or negative error number on failure.
88  */
89 int bt_apollo_controller_deinit(void);
90 
91 /**
92  * @brief Vendor specific setup before general HCI command sequence for
93  * Bluetooth application.
94  *
95  * @return 0 on success or negative error number on failure.
96  */
97 int bt_apollo_vnd_setup(void);
98 
99 /**
100  * @brief Check if vendor specific receiving handling is ongoing.
101  *
102  * @param data Pointer of received packet.
103  *
104  * @return true indicates if vendor specific receiving handling is ongoing.
105  */
106 bool bt_apollo_vnd_rcv_ongoing(uint8_t *data, uint16_t len);
107 
108 /**
109  * @brief Do the specific preprocessing in HCI packet receiving ISR if needed,
110  * for example, clear the interrupt status.
111  */
112 void bt_apollo_rcv_isr_preprocess(void);
113 
114 #ifdef __cplusplus
115 }
116 #endif
117 
118 #endif /* ZEPHYR_DRIVERS_BLUETOOTH_HCI_APOLLOX_BLUE_H_ */
119