@@ -249,30 +249,45 @@ esp_err_t uart_get_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t *flo
249
249
return ESP_OK ;
250
250
}
251
251
252
- esp_err_t uart_wait_tx_done (uart_port_t uart_num )
252
+ esp_err_t uart_wait_tx_done (uart_port_t uart_num , TickType_t ticks_to_wait )
253
253
{
254
254
UART_CHECK ((uart_num < UART_NUM_MAX ), "uart_num error" , ESP_ERR_INVALID_ARG );
255
-
255
+ UART_CHECK ((p_uart_obj [uart_num ]), "uart driver error" , ESP_ERR_INVALID_ARG );
256
+ uint32_t baudrate ;
256
257
uint32_t byte_delay_us = 0 ;
257
- uart_get_baudrate (uart_num , & byte_delay_us );
258
- byte_delay_us = (uint32_t )(10000000 /byte_delay_us ); // (1/baudrate)*10*1000_000 us
258
+ BaseType_t res ;
259
+ portTickType ticks_end = xTaskGetTickCount () + ticks_to_wait ;
260
+
261
+ // Take tx_mux
262
+ res = xSemaphoreTake (p_uart_obj [uart_num ]-> tx_mux , (portTickType )ticks_to_wait );
263
+ if (res == pdFALSE ) {
264
+ return ESP_ERR_TIMEOUT ;
265
+ }
259
266
267
+ uart_get_baudrate (uart_num , & baudrate );
268
+ byte_delay_us = (uint32_t )(10000000 / baudrate ); // (1/baudrate)*10*1000_000 us
269
+
270
+ ticks_to_wait = ticks_end - xTaskGetTickCount ();
260
271
// wait for tx done sem.
261
- if (pdTRUE == xSemaphoreTake (p_uart_obj [uart_num ]-> tx_done_sem , ( portTickType ) portMAX_DELAY )) {
272
+ if (pdTRUE == xSemaphoreTake (p_uart_obj [uart_num ]-> tx_done_sem , ticks_to_wait )) {
262
273
while (1 ) {
263
274
if (UART [uart_num ]-> status .txfifo_cnt == 0 ) {
264
275
ets_delay_us (byte_delay_us ); // Delay one byte time to guarantee transmission completion
265
276
break ;
266
277
}
267
278
}
279
+ } else {
280
+ xSemaphoreGive (p_uart_obj [uart_num ]-> tx_mux );
281
+ return ESP_ERR_TIMEOUT ;
268
282
}
283
+ xSemaphoreGive (p_uart_obj [uart_num ]-> tx_mux );
269
284
return ESP_OK ;
270
285
}
271
286
272
287
esp_err_t uart_enable_swap (void )
273
288
{
274
289
// wait for tx done.
275
- uart_wait_tx_done (UART_NUM_0 );
290
+ uart_wait_tx_done (UART_NUM_0 , portMAX_DELAY );
276
291
277
292
UART_ENTER_CRITICAL ();
278
293
// MTCK -> UART0_CTS -> U0RXD
@@ -289,7 +304,7 @@ esp_err_t uart_enable_swap(void)
289
304
esp_err_t uart_disable_swap (void )
290
305
{
291
306
// wait for tx done.
292
- uart_wait_tx_done (UART_NUM_0 );
307
+ uart_wait_tx_done (UART_NUM_0 , portMAX_DELAY );
293
308
294
309
UART_ENTER_CRITICAL ();
295
310
// disable swap U0TXD <-> UART0_RTS and U0RXD <-> UART0_CTS
0 commit comments