mirror of
https://github.com/licsber/micropython.git
synced 2024-09-20 00:50:24 +08:00
esp32/machine_uart: Add error checking for IDF API's.
Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
This commit is contained in:
parent
e676edac79
commit
f1d6af9819
@ -84,7 +84,7 @@ STATIC const char *_parity_name[] = {"None", "1", "0"};
|
||||
STATIC void mp_machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
||||
machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
uint32_t baudrate;
|
||||
uart_get_baudrate(self->uart_num, &baudrate);
|
||||
check_esp_err(uart_get_baudrate(self->uart_num, &baudrate));
|
||||
mp_printf(print, "UART(%u, baudrate=%u, bits=%u, parity=%s, stop=%u, tx=%d, rx=%d, rts=%d, cts=%d, txbuf=%u, rxbuf=%u, timeout=%u, timeout_char=%u",
|
||||
self->uart_num, baudrate, self->bits, _parity_name[self->parity],
|
||||
self->stop, self->tx, self->rx, self->rts, self->cts, self->txbuf, self->rxbuf, self->timeout, self->timeout_char);
|
||||
@ -177,22 +177,22 @@ STATIC void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
||||
.source_clk = UART_SOURCE_CLK,
|
||||
};
|
||||
uint32_t baudrate;
|
||||
uart_get_baudrate(self->uart_num, &baudrate);
|
||||
check_esp_err(uart_get_baudrate(self->uart_num, &baudrate));
|
||||
uartcfg.baud_rate = baudrate;
|
||||
uart_get_word_length(self->uart_num, &uartcfg.data_bits);
|
||||
uart_get_parity(self->uart_num, &uartcfg.parity);
|
||||
uart_get_stop_bits(self->uart_num, &uartcfg.stop_bits);
|
||||
uart_driver_delete(self->uart_num);
|
||||
uart_param_config(self->uart_num, &uartcfg);
|
||||
uart_driver_install(self->uart_num, self->rxbuf, self->txbuf, 0, NULL, 0);
|
||||
check_esp_err(uart_get_word_length(self->uart_num, &uartcfg.data_bits));
|
||||
check_esp_err(uart_get_parity(self->uart_num, &uartcfg.parity));
|
||||
check_esp_err(uart_get_stop_bits(self->uart_num, &uartcfg.stop_bits));
|
||||
check_esp_err(uart_driver_delete(self->uart_num));
|
||||
check_esp_err(uart_param_config(self->uart_num, &uartcfg));
|
||||
check_esp_err(uart_driver_install(self->uart_num, self->rxbuf, self->txbuf, 0, NULL, 0));
|
||||
}
|
||||
|
||||
// set baudrate
|
||||
uint32_t baudrate = 115200;
|
||||
if (args[ARG_baudrate].u_int > 0) {
|
||||
uart_set_baudrate(self->uart_num, args[ARG_baudrate].u_int);
|
||||
check_esp_err(uart_set_baudrate(self->uart_num, args[ARG_baudrate].u_int));
|
||||
}
|
||||
uart_get_baudrate(self->uart_num, &baudrate);
|
||||
check_esp_err(uart_get_baudrate(self->uart_num, &baudrate));
|
||||
|
||||
if (args[ARG_tx].u_obj != MP_OBJ_NULL) {
|
||||
self->tx = machine_pin_get_id(args[ARG_tx].u_obj);
|
||||
@ -209,26 +209,26 @@ STATIC void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
||||
if (args[ARG_cts].u_obj != MP_OBJ_NULL) {
|
||||
self->cts = machine_pin_get_id(args[ARG_cts].u_obj);
|
||||
}
|
||||
uart_set_pin(self->uart_num, self->tx, self->rx, self->rts, self->cts);
|
||||
check_esp_err(uart_set_pin(self->uart_num, self->tx, self->rx, self->rts, self->cts));
|
||||
|
||||
// set data bits
|
||||
switch (args[ARG_bits].u_int) {
|
||||
case 0:
|
||||
break;
|
||||
case 5:
|
||||
uart_set_word_length(self->uart_num, UART_DATA_5_BITS);
|
||||
check_esp_err(uart_set_word_length(self->uart_num, UART_DATA_5_BITS));
|
||||
self->bits = 5;
|
||||
break;
|
||||
case 6:
|
||||
uart_set_word_length(self->uart_num, UART_DATA_6_BITS);
|
||||
check_esp_err(uart_set_word_length(self->uart_num, UART_DATA_6_BITS));
|
||||
self->bits = 6;
|
||||
break;
|
||||
case 7:
|
||||
uart_set_word_length(self->uart_num, UART_DATA_7_BITS);
|
||||
check_esp_err(uart_set_word_length(self->uart_num, UART_DATA_7_BITS));
|
||||
self->bits = 7;
|
||||
break;
|
||||
case 8:
|
||||
uart_set_word_length(self->uart_num, UART_DATA_8_BITS);
|
||||
check_esp_err(uart_set_word_length(self->uart_num, UART_DATA_8_BITS));
|
||||
self->bits = 8;
|
||||
break;
|
||||
default:
|
||||
@ -239,15 +239,15 @@ STATIC void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
||||
// set parity
|
||||
if (args[ARG_parity].u_obj != MP_OBJ_NULL) {
|
||||
if (args[ARG_parity].u_obj == mp_const_none) {
|
||||
uart_set_parity(self->uart_num, UART_PARITY_DISABLE);
|
||||
check_esp_err(uart_set_parity(self->uart_num, UART_PARITY_DISABLE));
|
||||
self->parity = 0;
|
||||
} else {
|
||||
mp_int_t parity = mp_obj_get_int(args[ARG_parity].u_obj);
|
||||
if (parity & 1) {
|
||||
uart_set_parity(self->uart_num, UART_PARITY_ODD);
|
||||
check_esp_err(uart_set_parity(self->uart_num, UART_PARITY_ODD));
|
||||
self->parity = 1;
|
||||
} else {
|
||||
uart_set_parity(self->uart_num, UART_PARITY_EVEN);
|
||||
check_esp_err(uart_set_parity(self->uart_num, UART_PARITY_EVEN));
|
||||
self->parity = 2;
|
||||
}
|
||||
}
|
||||
@ -259,11 +259,11 @@ STATIC void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
uart_set_stop_bits(self->uart_num, UART_STOP_BITS_1);
|
||||
check_esp_err(uart_set_stop_bits(self->uart_num, UART_STOP_BITS_1));
|
||||
self->stop = 1;
|
||||
break;
|
||||
case 2:
|
||||
uart_set_stop_bits(self->uart_num, UART_STOP_BITS_2);
|
||||
check_esp_err(uart_set_stop_bits(self->uart_num, UART_STOP_BITS_2));
|
||||
self->stop = 2;
|
||||
break;
|
||||
default:
|
||||
@ -283,10 +283,10 @@ STATIC void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
||||
uint32_t char_time_ms = 12000 / baudrate + 1;
|
||||
uint32_t rx_timeout = self->timeout_char / char_time_ms;
|
||||
if (rx_timeout < 1) {
|
||||
uart_set_rx_full_threshold(self->uart_num, 1);
|
||||
uart_set_rx_timeout(self->uart_num, 1);
|
||||
check_esp_err(uart_set_rx_full_threshold(self->uart_num, 1));
|
||||
check_esp_err(uart_set_rx_timeout(self->uart_num, 1));
|
||||
} else {
|
||||
uart_set_rx_timeout(self->uart_num, rx_timeout);
|
||||
check_esp_err(uart_set_rx_timeout(self->uart_num, rx_timeout));
|
||||
}
|
||||
}
|
||||
|
||||
@ -297,7 +297,7 @@ STATIC void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
||||
}
|
||||
self->invert = args[ARG_invert].u_int;
|
||||
}
|
||||
uart_set_line_inverse(self->uart_num, self->invert);
|
||||
check_esp_err(uart_set_line_inverse(self->uart_num, self->invert));
|
||||
|
||||
// set hardware flow control
|
||||
if (args[ARG_flow].u_int != -1) {
|
||||
@ -306,7 +306,7 @@ STATIC void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
||||
}
|
||||
self->flowcontrol = args[ARG_flow].u_int;
|
||||
}
|
||||
uart_set_hw_flow_ctrl(self->uart_num, self->flowcontrol, UART_FIFO_LEN - UART_FIFO_LEN / 4);
|
||||
check_esp_err(uart_set_hw_flow_ctrl(self->uart_num, self->flowcontrol, UART_FIFO_LEN - UART_FIFO_LEN / 4));
|
||||
}
|
||||
|
||||
STATIC mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
||||
@ -367,13 +367,13 @@ STATIC mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_arg
|
||||
#endif
|
||||
{
|
||||
// Remove any existing configuration
|
||||
uart_driver_delete(self->uart_num);
|
||||
check_esp_err(uart_driver_delete(self->uart_num));
|
||||
|
||||
// init the peripheral
|
||||
// Setup
|
||||
uart_param_config(self->uart_num, &uartcfg);
|
||||
check_esp_err(uart_param_config(self->uart_num, &uartcfg));
|
||||
|
||||
uart_driver_install(uart_num, self->rxbuf, self->txbuf, 0, NULL, 0);
|
||||
check_esp_err(uart_driver_install(uart_num, self->rxbuf, self->txbuf, 0, NULL, 0));
|
||||
}
|
||||
|
||||
mp_map_t kw_args;
|
||||
@ -381,18 +381,18 @@ STATIC mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_arg
|
||||
mp_machine_uart_init_helper(self, n_args - 1, args + 1, &kw_args);
|
||||
|
||||
// Make sure pins are connected.
|
||||
uart_set_pin(self->uart_num, self->tx, self->rx, self->rts, self->cts);
|
||||
check_esp_err(uart_set_pin(self->uart_num, self->tx, self->rx, self->rts, self->cts));
|
||||
|
||||
return MP_OBJ_FROM_PTR(self);
|
||||
}
|
||||
|
||||
STATIC void mp_machine_uart_deinit(machine_uart_obj_t *self) {
|
||||
uart_driver_delete(self->uart_num);
|
||||
check_esp_err(uart_driver_delete(self->uart_num));
|
||||
}
|
||||
|
||||
STATIC mp_int_t mp_machine_uart_any(machine_uart_obj_t *self) {
|
||||
size_t rxbufsize;
|
||||
uart_get_buffered_data_len(self->uart_num, &rxbufsize);
|
||||
check_esp_err(uart_get_buffered_data_len(self->uart_num, &rxbufsize));
|
||||
return rxbufsize;
|
||||
}
|
||||
|
||||
@ -403,18 +403,18 @@ STATIC bool mp_machine_uart_txdone(machine_uart_obj_t *self) {
|
||||
STATIC void mp_machine_uart_sendbreak(machine_uart_obj_t *self) {
|
||||
// Save settings
|
||||
uint32_t baudrate;
|
||||
uart_get_baudrate(self->uart_num, &baudrate);
|
||||
check_esp_err(uart_get_baudrate(self->uart_num, &baudrate));
|
||||
|
||||
// Synthesise the break condition by reducing the baud rate,
|
||||
// and cater for the worst case of 5 data bits, no parity.
|
||||
uart_wait_tx_done(self->uart_num, pdMS_TO_TICKS(1000));
|
||||
uart_set_baudrate(self->uart_num, baudrate * 6 / 15);
|
||||
check_esp_err(uart_wait_tx_done(self->uart_num, pdMS_TO_TICKS(1000)));
|
||||
check_esp_err(uart_set_baudrate(self->uart_num, baudrate * 6 / 15));
|
||||
char buf[1] = {0};
|
||||
uart_write_bytes(self->uart_num, buf, 1);
|
||||
uart_wait_tx_done(self->uart_num, pdMS_TO_TICKS(1000));
|
||||
check_esp_err(uart_wait_tx_done(self->uart_num, pdMS_TO_TICKS(1000)));
|
||||
|
||||
// Restore original setting
|
||||
uart_set_baudrate(self->uart_num, baudrate);
|
||||
check_esp_err(uart_set_baudrate(self->uart_num, baudrate));
|
||||
}
|
||||
|
||||
STATIC mp_uint_t mp_machine_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) {
|
||||
@ -472,7 +472,7 @@ STATIC mp_uint_t mp_machine_uart_ioctl(mp_obj_t self_in, mp_uint_t request, uint
|
||||
mp_uint_t flags = arg;
|
||||
ret = 0;
|
||||
size_t rxbufsize;
|
||||
uart_get_buffered_data_len(self->uart_num, &rxbufsize);
|
||||
check_esp_err(uart_get_buffered_data_len(self->uart_num, &rxbufsize));
|
||||
if ((flags & MP_STREAM_POLL_RD) && rxbufsize > 0) {
|
||||
ret |= MP_STREAM_POLL_RD;
|
||||
}
|
||||
@ -483,7 +483,7 @@ STATIC mp_uint_t mp_machine_uart_ioctl(mp_obj_t self_in, mp_uint_t request, uint
|
||||
// The timeout is estimated using the buffer size and the baudrate.
|
||||
// Take the worst case assumptions at 13 bit symbol size times 2.
|
||||
uint32_t baudrate;
|
||||
uart_get_baudrate(self->uart_num, &baudrate);
|
||||
check_esp_err(uart_get_baudrate(self->uart_num, &baudrate));
|
||||
uint32_t timeout = (3 + self->txbuf) * 13000 * 2 / baudrate;
|
||||
if (uart_wait_tx_done(self->uart_num, timeout) == ESP_OK) {
|
||||
ret = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user