1
0
Fork 0

Refactor uart tx into a single thread

This commit is contained in:
Shawn Nock 2019-08-03 13:06:11 -05:00
parent bf1480abf5
commit 5947dd1de5
1 changed files with 35 additions and 12 deletions

View File

@ -68,6 +68,9 @@ static struct k_thread unproc_thread_data;
static K_THREAD_STACK_DEFINE(event_stack, 4096); static K_THREAD_STACK_DEFINE(event_stack, 4096);
static struct k_thread event_thread_data; static struct k_thread event_thread_data;
static K_THREAD_STACK_DEFINE(uart_tx_stack, 4096);
static struct k_thread uart_tx_thread_data;
static struct k_delayed_work ack_work; static struct k_delayed_work ack_work;
//static struct k_delayed_work retx_work; //static struct k_delayed_work retx_work;
@ -129,6 +132,7 @@ static struct h5 {
struct k_fifo unack_queue; struct k_fifo unack_queue;
struct k_fifo unprocessed_queue; struct k_fifo unprocessed_queue;
struct k_fifo event_queue; struct k_fifo event_queue;
struct k_fifo uart_tx_queue;
u8_t tx_win; u8_t tx_win;
u8_t next_expected_seq_from_host; u8_t next_expected_seq_from_host;
@ -158,6 +162,8 @@ NET_BUF_POOL_DEFINE(h5_pool, SIGNAL_COUNT, SIG_BUF_SIZE, 0, NULL);
#define PACKET_BUF_SIZE (CONFIG_BT_HCI_RESERVE + MAX_PACKET_LEN) #define PACKET_BUF_SIZE (CONFIG_BT_HCI_RESERVE + MAX_PACKET_LEN)
NET_BUF_POOL_DEFINE(h5_pack_pool, MAX_PACKETS_IN_FLIGHT + 10, PACKET_BUF_SIZE, 0, NULL); NET_BUF_POOL_DEFINE(h5_pack_pool, MAX_PACKETS_IN_FLIGHT + 10, PACKET_BUF_SIZE, 0, NULL);
NET_BUF_POOL_DEFINE(uart_tx_pool, MAX_PACKETS_IN_FLIGHT + 10, PACKET_BUF_SIZE, 0, NULL);
static inline void bt_uart_drain(struct device *dev) static inline void bt_uart_drain(struct device *dev)
{ {
u8_t c; u8_t c;
@ -288,18 +294,14 @@ void h5_send(const u8_t *payload, h5_pkt_t type, int len)
h5_hdr_update_checksum(&hdr); h5_hdr_update_checksum(&hdr);
uart_poll_out(hci_uart_dev, SLIP_DELIMITER); struct net_buf *buf = net_buf_alloc(&uart_tx_pool, K_MSEC(250));
if (!buf) {
uint8_t *u8_hdr = (uint8_t *)&hdr; LOG_WRN("Waited to long for a UART tx buffer, dropping");
for (int i = 0; i < 4; i++) { return;
h5_slip_byte(u8_hdr[i]);
} }
net_buf_add_mem(buf, &hdr, sizeof(h5_hdr_t));
for (int i = 0; i < len; i++) { net_buf_add_mem(buf, payload, len);
h5_slip_byte(payload[i]); net_buf_put(&h5.uart_tx_queue, buf);
}
uart_poll_out(hci_uart_dev, SLIP_DELIMITER);
} }
/* Delayed work taking care about retransmitting packets */ /* Delayed work taking care about retransmitting packets */
@ -337,6 +339,7 @@ void h5_send(const u8_t *payload, h5_pkt_t type, int len)
static void ack_timeout(struct k_work *work) { static void ack_timeout(struct k_work *work) {
ARG_UNUSED(work); ARG_UNUSED(work);
LOG_INF("ACK Timeout, sending H5 ACK packet");
h5_send(NULL, HCI_3WIRE_ACK_PKT, 0); h5_send(NULL, HCI_3WIRE_ACK_PKT, 0);
} }
@ -668,6 +671,18 @@ static void event_thread(void) {
} }
} }
static void uart_tx_thread() {
while (true) {
struct net_buf *buf = net_buf_get(&h5.uart_tx_queue, K_FOREVER);
uart_poll_out(hci_uart_dev, SLIP_DELIMITER);
for (size_t i=0; i < buf->len; i++) {
h5_slip_byte(net_buf_pull_u8(buf));
}
uart_poll_out(hci_uart_dev, SLIP_DELIMITER);
}
}
static void h5_init(void) static void h5_init(void)
{ {
LOG_DBG("h5_init"); LOG_DBG("h5_init");
@ -709,6 +724,14 @@ static void h5_init(void)
K_PRIO_PREEMPT(2), K_PRIO_PREEMPT(2),
0, K_NO_WAIT); 0, K_NO_WAIT);
/* Thread handles incoming events from BT Controller */
k_fifo_init(&h5.uart_tx_queue);
k_thread_create(&uart_tx_thread_data, uart_tx_stack,
K_THREAD_STACK_SIZEOF(uart_tx_stack),
(k_thread_entry_t)uart_tx_thread, NULL, NULL, NULL,
K_PRIO_PREEMPT(0),
0, K_NO_WAIT);
/* Init delayed work */ /* Init delayed work */
k_delayed_work_init(&ack_work, ack_timeout); k_delayed_work_init(&ack_work, ack_timeout);