17
17
18
18
LOG_MODULE_REGISTER (nrf_rpc_uart , CONFIG_NRF_RPC_TR_LOG_LEVEL );
19
19
20
+ #define CRC_SIZE sizeof(uint16_t)
21
+
20
22
enum {
21
23
HDLC_CHAR_ESCAPE = 0x7d ,
22
24
HDLC_CHAR_DELIMITER = 0x7e ,
@@ -68,6 +70,10 @@ struct nrf_rpc_uart {
68
70
69
71
K_KERNEL_STACK_MEMBER (rx_workq_stack , CONFIG_NRF_RPC_UART_RX_THREAD_STACK_SIZE );
70
72
73
+ /* HDLC ack decoding state */
74
+ struct hdlc_decode_ctx rx_ack_ctx ;
75
+ uint8_t rx_ack [CRC_SIZE ];
76
+
71
77
/* HDLC packet decoding state */
72
78
struct hdlc_decode_ctx rx_pkt_ctx ;
73
79
uint8_t rx_pkt [CONFIG_NRF_RPC_UART_MAX_PACKET_SIZE ];
@@ -96,18 +102,16 @@ static void log_hexdump_dbg(const uint8_t *data, size_t length, const char *fmt,
96
102
}
97
103
}
98
104
99
- #define CRC_SIZE sizeof(uint16_t)
100
-
101
105
static void send_byte (const struct device * dev , uint8_t byte );
102
106
103
107
static void ack_rx (struct nrf_rpc_uart * uart_tr )
104
108
{
105
- if (!IS_ENABLED (CONFIG_NRF_RPC_UART_RELIABLE ) || uart_tr -> rx_pkt_ctx .len != CRC_SIZE ) {
106
- log_hexdump_dbg (uart_tr -> rx_pkt , uart_tr -> rx_pkt_ctx .len , ">>> RX invalid frame" );
109
+ if (!IS_ENABLED (CONFIG_NRF_RPC_UART_RELIABLE ) || uart_tr -> rx_ack_ctx .len != CRC_SIZE ) {
110
+ log_hexdump_dbg (uart_tr -> rx_ack , uart_tr -> rx_ack_ctx .len , ">>> RX invalid frame" );
107
111
return ;
108
112
}
109
113
110
- uint16_t rx_ack = sys_get_le16 (uart_tr -> rx_pkt );
114
+ uint16_t rx_ack = sys_get_le16 (uart_tr -> rx_ack );
111
115
112
116
LOG_DBG (">>> RX ack %04x" , rx_ack );
113
117
@@ -117,7 +121,6 @@ static void ack_rx(struct nrf_rpc_uart *uart_tr)
117
121
}
118
122
119
123
k_sem_give (& uart_tr -> ack_sem );
120
- k_yield ();
121
124
}
122
125
123
126
static void ack_tx (struct nrf_rpc_uart * uart_tr , uint16_t ack_pld )
@@ -246,7 +249,8 @@ static void work_handler(struct k_work *work)
246
249
}
247
250
248
251
if (uart_tr -> rx_pkt_ctx .len <= CRC_SIZE ) {
249
- ack_rx (uart_tr );
252
+ /* ACKs are already handled in ISR, so only process normal
253
+ * packets in this handler */
250
254
continue ;
251
255
}
252
256
@@ -282,6 +286,17 @@ static void work_handler(struct k_work *work)
282
286
}
283
287
}
284
288
289
+ static void decode_ack (struct nrf_rpc_uart * inst , const uint8_t * in , size_t len )
290
+ {
291
+ for (size_t i = 0 ; i < len ; i ++ ) {
292
+ hdlc_decode_byte (& inst -> rx_ack_ctx , inst -> rx_ack , in [i ]);
293
+
294
+ if (inst -> rx_ack_ctx .state == HDLC_STATE_FRAME_FOUND ) {
295
+ ack_rx (inst );
296
+ }
297
+ }
298
+ }
299
+
285
300
static void serial_cb (const struct device * uart , void * user_data )
286
301
{
287
302
struct nrf_rpc_uart * uart_tr = user_data ;
@@ -294,6 +309,7 @@ static void serial_cb(const struct device *uart, void *user_data)
294
309
uart_tr -> rx_ringbuf .size );
295
310
if (rx_len > 0 ) {
296
311
rx_len = uart_fifo_read (uart , rx_buffer , rx_len );
312
+ decode_ack (uart_tr , rx_buffer , rx_len );
297
313
int err = ring_buf_put_finish (& uart_tr -> rx_ringbuf , rx_len );
298
314
(void )err ; /*silence the compiler*/
299
315
__ASSERT_NO_MSG (err == 0 );
@@ -373,6 +389,8 @@ static int init(const struct nrf_rpc_tr *transport, nrf_rpc_tr_receive_handler_t
373
389
374
390
uart_tr -> rx_pkt_ctx .state = HDLC_STATE_UNSYNC ;
375
391
uart_tr -> rx_pkt_ctx .capacity = sizeof (uart_tr -> rx_pkt );
392
+ uart_tr -> rx_ack_ctx .state = HDLC_STATE_UNSYNC ;
393
+ uart_tr -> rx_ack_ctx .capacity = sizeof (uart_tr -> rx_ack );
376
394
uart_irq_rx_enable (uart_tr -> uart );
377
395
378
396
return 0 ;
0 commit comments