mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-17 16:14:15 +00:00
h5: chunk outgoing slip frames to avoid buffer size double the size of the hci buffer
This commit is contained in:
parent
94764e9910
commit
6ae10533e1
@ -86,6 +86,9 @@ typedef enum {
|
|||||||
#define LINK_ACKNOWLEDGEMENT_TYPE 0x00
|
#define LINK_ACKNOWLEDGEMENT_TYPE 0x00
|
||||||
#define LINK_CONTROL_PACKET_TYPE 0x0f
|
#define LINK_CONTROL_PACKET_TYPE 0x0f
|
||||||
|
|
||||||
|
// max size of write requests
|
||||||
|
#define LINK_SLIP_TX_CHUNK_LEN 64
|
||||||
|
|
||||||
// ---
|
// ---
|
||||||
static const uint8_t link_control_sync[] = { 0x01, 0x7e};
|
static const uint8_t link_control_sync[] = { 0x01, 0x7e};
|
||||||
static const uint8_t link_control_sync_response[] = { 0x02, 0x7d};
|
static const uint8_t link_control_sync_response[] = { 0x02, 0x7d};
|
||||||
@ -100,8 +103,9 @@ static const uint8_t link_control_sleep[] = { 0x07, 0x78};
|
|||||||
// incoming pre-bufffer + 4 bytes H5 header + max(acl header + acl payload, event header + event data) + 2 bytes opt CRC
|
// incoming pre-bufffer + 4 bytes H5 header + max(acl header + acl payload, event header + event data) + 2 bytes opt CRC
|
||||||
static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 6 + HCI_PACKET_BUFFER_SIZE];
|
static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 6 + HCI_PACKET_BUFFER_SIZE];
|
||||||
|
|
||||||
// Non-optimized outgoing buffer (EOF, 4 bytes header, payload, EOF)
|
// outgoing slip encoded buffer. +1 to assert that last SOF fits in buffer
|
||||||
static uint8_t slip_outgoing_buffer[2 + 2 * (HCI_PACKET_BUFFER_SIZE + 4)];
|
static uint8_t slip_outgoing_buffer[LINK_SLIP_TX_CHUNK_LEN+1];
|
||||||
|
static int slip_write_active;
|
||||||
|
|
||||||
// H5 Link State
|
// H5 Link State
|
||||||
static hci_transport_link_state_t link_state;
|
static hci_transport_link_state_t link_state;
|
||||||
@ -130,8 +134,6 @@ static const btstack_uart_block_t * btstack_uart;
|
|||||||
static btstack_uart_config_t uart_config;
|
static btstack_uart_config_t uart_config;
|
||||||
static btstack_uart_sleep_mode_t btstack_uart_sleep_mode;
|
static btstack_uart_sleep_mode_t btstack_uart_sleep_mode;
|
||||||
|
|
||||||
static int uart_write_active;
|
|
||||||
|
|
||||||
// Prototypes
|
// Prototypes
|
||||||
static void hci_transport_h5_process_frame(uint16_t frame_size);
|
static void hci_transport_h5_process_frame(uint16_t frame_size);
|
||||||
static int hci_transport_link_have_outgoing_packet(void);
|
static int hci_transport_link_have_outgoing_packet(void);
|
||||||
@ -164,6 +166,24 @@ static void hci_transport_inactivity_timer_set(void){
|
|||||||
// -----------------------------
|
// -----------------------------
|
||||||
// SLIP Outgoing
|
// SLIP Outgoing
|
||||||
|
|
||||||
|
// Fill chunk and write
|
||||||
|
static void hci_transport_slip_encode_chunk_and_send(int pos){
|
||||||
|
while (btstack_slip_encoder_has_data() & (pos < LINK_SLIP_TX_CHUNK_LEN)) {
|
||||||
|
slip_outgoing_buffer[pos++] = btstack_slip_encoder_get_byte();
|
||||||
|
}
|
||||||
|
if (!btstack_slip_encoder_has_data()){
|
||||||
|
// Start of Frame
|
||||||
|
slip_outgoing_buffer[pos++] = BTSTACK_SLIP_SOF;
|
||||||
|
}
|
||||||
|
slip_write_active = 1;
|
||||||
|
log_info("hci_transport_slip: send %u bytes", pos);
|
||||||
|
btstack_uart->send_block(slip_outgoing_buffer, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void hci_transport_slip_send_next_chunk(void){
|
||||||
|
hci_transport_slip_encode_chunk_and_send(0);
|
||||||
|
}
|
||||||
|
|
||||||
// format: 0xc0 HEADER PACKER 0xc0
|
// format: 0xc0 HEADER PACKER 0xc0
|
||||||
// @param uint8_t header[4]
|
// @param uint8_t header[4]
|
||||||
static void hci_transport_slip_send_frame(const uint8_t * header, const uint8_t * packet, uint16_t packet_size){
|
static void hci_transport_slip_send_frame(const uint8_t * header, const uint8_t * packet, uint16_t packet_size){
|
||||||
@ -181,15 +201,9 @@ static void hci_transport_slip_send_frame(const uint8_t * header, const uint8_t
|
|||||||
|
|
||||||
// Packet
|
// Packet
|
||||||
btstack_slip_encoder_start(packet, packet_size);
|
btstack_slip_encoder_start(packet, packet_size);
|
||||||
while (btstack_slip_encoder_has_data()){
|
|
||||||
slip_outgoing_buffer[pos++] = btstack_slip_encoder_get_byte();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start of Frame
|
// Fill rest of chunk from packet and send
|
||||||
slip_outgoing_buffer[pos++] = BTSTACK_SLIP_SOF;
|
hci_transport_slip_encode_chunk_and_send(pos);
|
||||||
|
|
||||||
uart_write_active = 1;
|
|
||||||
btstack_uart->send_block(slip_outgoing_buffer, pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SLIP Incoming
|
// SLIP Incoming
|
||||||
@ -282,7 +296,7 @@ static void hci_transport_link_send_ack_packet(void){
|
|||||||
|
|
||||||
static void hci_transport_link_run(void){
|
static void hci_transport_link_run(void){
|
||||||
// exit if outgoing active
|
// exit if outgoing active
|
||||||
if (uart_write_active) return;
|
if (slip_write_active) return;
|
||||||
|
|
||||||
// process queued requests
|
// process queued requests
|
||||||
if (hci_transport_link_actions & HCI_TRANSPORT_LINK_SEND_SYNC){
|
if (hci_transport_link_actions & HCI_TRANSPORT_LINK_SEND_SYNC){
|
||||||
@ -604,7 +618,15 @@ static void hci_transport_h5_block_received(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void hci_transport_h5_block_sent(void){
|
static void hci_transport_h5_block_sent(void){
|
||||||
uart_write_active = 0;
|
|
||||||
|
// check if more data to send
|
||||||
|
if (btstack_slip_encoder_has_data()){
|
||||||
|
hci_transport_slip_send_next_chunk();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// done
|
||||||
|
slip_write_active = 0;
|
||||||
|
|
||||||
// enter sleep mode after sending sleep message
|
// enter sleep mode after sending sleep message
|
||||||
if (hci_transport_link_actions & HCI_TRANSPORT_LINK_ENTER_SLEEP){
|
if (hci_transport_link_actions & HCI_TRANSPORT_LINK_ENTER_SLEEP){
|
||||||
@ -688,7 +710,7 @@ static void hci_transport_h5_register_packet_handler(void (*handler)(uint8_t pac
|
|||||||
|
|
||||||
static int hci_transport_h5_can_send_packet_now(uint8_t packet_type){
|
static int hci_transport_h5_can_send_packet_now(uint8_t packet_type){
|
||||||
int res = !hci_transport_link_have_outgoing_packet() && link_state == LINK_ACTIVE;
|
int res = !hci_transport_link_have_outgoing_packet() && link_state == LINK_ACTIVE;
|
||||||
log_info("hci_transport_h5_can_send_packet_now: %u", res);
|
// log_info("hci_transport_h5_can_send_packet_now: %u", res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user