|  | 
| 6 | 6 | 
 | 
| 7 | 7 | #include "pico.h" | 
| 8 | 8 | #include "cyw43.h" | 
| 9 |  | -#include "hci_transport.h" | 
|  | 9 | +#include "btstack_config.h" | 
| 10 | 10 | #include "hci.h" | 
|  | 11 | +#include "hci_transport.h" | 
| 11 | 12 | #include "pico/btstack_hci_transport_cyw43.h" | 
| 12 | 13 | #include "pico/btstack_chipset_cyw43.h" | 
| 13 | 14 | 
 | 
|  | 15 | +// cyw43_bluetooth_hci_write and cyw43_bluetooth_hci_read require a custom 4-byte packet header in front of the actual HCI packet | 
|  | 16 | +// the HCI packet type is stored in the fourth byte of the packet header | 
|  | 17 | +#define CYW43_PACKET_HEADER_SIZE 4 | 
|  | 18 | + | 
| 14 | 19 | // assert outgoing pre-buffer for cyw43 header is available | 
| 15 |  | -#if !defined(HCI_OUTGOING_PRE_BUFFER_SIZE) || (HCI_OUTGOING_PRE_BUFFER_SIZE < 4) | 
| 16 |  | -#error HCI_OUTGOING_PRE_BUFFER_SIZE not defined or smaller than 4. Please update btstack_config.h | 
|  | 20 | +#if !defined(HCI_OUTGOING_PRE_BUFFER_SIZE) || (HCI_OUTGOING_PRE_BUFFER_SIZE < CYW43_PACKET_HEADER_SIZE) | 
|  | 21 | +#error HCI_OUTGOING_PRE_BUFFER_SIZE not defined or smaller than 4 (CYW43_PACKET_HEADER_SIZE) bytes. Please update btstack_config.h | 
| 17 | 22 | #endif | 
| 18 | 23 | 
 | 
| 19 | 24 | // assert outgoing packet fragments are word aligned | 
| 20 | 25 | #if !defined(HCI_ACL_CHUNK_SIZE_ALIGNMENT) || ((HCI_ACL_CHUNK_SIZE_ALIGNMENT & 3) != 0) | 
| 21 |  | -#error HCI_ACL_CHUNK_SIZE_ALIGNMENT not defined or not a multiply of 4. Please update btstack_config.h | 
|  | 26 | +#error HCI_ACL_CHUNK_SIZE_ALIGNMENT not defined or not a multiple of 4. Please update btstack_config.h | 
| 22 | 27 | #endif | 
| 23 | 28 | 
 | 
|  | 29 | +// ensure incoming pre-buffer for cyw43 header is available (defaults from btstack/src/hci.h) | 
|  | 30 | +#if HCI_INCOMING_PRE_BUFFER_SIZE < CYW43_PACKET_HEADER_SIZE | 
|  | 31 | +#undef HCI_INCOMING_PRE_BUFFER_SIZE | 
|  | 32 | +#define HCI_INCOMING_PRE_BUFFER_SIZE CYW43_PACKET_HEADER_SIZE | 
|  | 33 | +#endif | 
|  | 34 | + | 
|  | 35 | +// ensure buffer for cyw43_bluetooth_hci_read starts word aligned (word align pre buffer) | 
|  | 36 | +#define HCI_INCOMING_PRE_BUFFER_SIZE_ALIGNED ((HCI_INCOMING_PRE_BUFFER_SIZE + 3) & ~3) | 
|  | 37 | + | 
| 24 | 38 | #define BT_DEBUG_ENABLED 0 | 
| 25 | 39 | #if BT_DEBUG_ENABLED | 
| 26 | 40 | #define BT_DEBUG(...) CYW43_PRINTF(__VA_ARGS__) | 
|  | 
| 31 | 45 | // Callback when we have data | 
| 32 | 46 | static void (*hci_transport_cyw43_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size) = NULL; | 
| 33 | 47 | 
 | 
| 34 |  | -// Incoming packet buffer - cyw43 packet header (incl packet type) + incoming pre buffer + max(acl header + acl payload, event header + event data) | 
|  | 48 | +// The incoming packet buffer consist of a pre-buffer and the actual HCI packet | 
|  | 49 | +// For the call to cyw43_bluetooth_hci_read, the last 4 bytes (CY43_PACKET_HEADER_SIZE) of the pre-buffer is used for the CYW43 packet header | 
|  | 50 | +// After that, only the actual HCI packet is forwarded to BTstack, which expects HCI_INCOMING_PACKET_BUFFER_SIZE of pre-buffer bytes for its own use. | 
| 35 | 51 | __attribute__((aligned(4))) | 
| 36 |  | -static uint8_t hci_packet_with_pre_buffer[4 + HCI_INCOMING_PRE_BUFFER_SIZE + HCI_INCOMING_PACKET_BUFFER_SIZE ]; | 
|  | 52 | +static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE_ALIGNED + HCI_INCOMING_PACKET_BUFFER_SIZE ]; | 
|  | 53 | +static uint8_t * cyw43_receive_buffer = &hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE_ALIGNED - CYW43_PACKET_HEADER_SIZE]; | 
| 37 | 54 | 
 | 
| 38 | 55 | static btstack_data_source_t transport_data_source; | 
| 39 | 56 | static bool hci_transport_ready; | 
| @@ -97,8 +114,8 @@ static int hci_transport_cyw43_can_send_now(uint8_t packet_type) { | 
| 97 | 114 | static int hci_transport_cyw43_send_packet(uint8_t packet_type, uint8_t *packet, int size) { | 
| 98 | 115 |     // store packet type before actual data and increase size | 
| 99 | 116 |     // This relies on HCI_OUTGOING_PRE_BUFFER_SIZE being set | 
| 100 |  | -    uint8_t *buffer = &packet[-4]; | 
| 101 |  | -    uint32_t buffer_size = size + 4; | 
|  | 117 | +    uint8_t *buffer = &packet[-CYW43_PACKET_HEADER_SIZE]; | 
|  | 118 | +    uint32_t buffer_size = size + CYW43_PACKET_HEADER_SIZE; | 
| 102 | 119 |     buffer[3] = packet_type; | 
| 103 | 120 | 
 | 
| 104 | 121 |     CYW43_THREAD_ENTER | 
| @@ -143,10 +160,10 @@ static void hci_transport_cyw43_process(void) { | 
| 143 | 160 |     uint32_t loop_count = 0; | 
| 144 | 161 | #endif | 
| 145 | 162 |     do { | 
| 146 |  | -        int err = cyw43_bluetooth_hci_read(hci_packet_with_pre_buffer, sizeof(hci_packet_with_pre_buffer), &len); | 
|  | 163 | +        int err = cyw43_bluetooth_hci_read(cyw43_receive_buffer, CYW43_PACKET_HEADER_SIZE + HCI_INCOMING_PACKET_BUFFER_SIZE , &len); | 
| 147 | 164 |         BT_DEBUG("bt in len=%lu err=%d\n", len, err); | 
| 148 | 165 |         if (err == 0 && len > 0) { | 
| 149 |  | -            hci_transport_cyw43_packet_handler(hci_packet_with_pre_buffer[3], hci_packet_with_pre_buffer + 4, len - 4); | 
|  | 166 | +            hci_transport_cyw43_packet_handler(cyw43_receive_buffer[3], &cyw43_receive_buffer[CYW43_PACKET_HEADER_SIZE], len - CYW43_PACKET_HEADER_SIZE); | 
| 150 | 167 |             has_work = true; | 
| 151 | 168 |         } else { | 
| 152 | 169 |             has_work = false; | 
|  | 
0 commit comments