25
25
#include "esp_system.h"
26
26
#include "esp_spi_flash.h"
27
27
#include "nvs_flash.h"
28
+ #include "esp_event.h"
28
29
29
30
#include "esp_types.h"
30
31
#include "esp_attr.h"
@@ -92,6 +93,7 @@ struct _mach_uart_obj_t {
92
93
uint8_t rx_timeout ;
93
94
uint8_t n_pins ;
94
95
bool init ;
96
+ uint32_t invert ; // lines to invert
95
97
};
96
98
97
99
/******************************************************************************
@@ -293,10 +295,39 @@ STATIC void mach_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_print_
293
295
mp_printf (print , ", parity=UART.%q" , (self -> config .parity == UART_PARITY_EVEN ) ? MP_QSTR_EVEN : MP_QSTR_ODD );
294
296
}
295
297
if (self -> config .stop_bits == UART_STOP_BITS_1_5 ) {
296
- mp_printf (print , ", stop=1.5) " );
298
+ mp_printf (print , ", stop=1.5" );
297
299
} else {
298
- mp_printf (print , ", stop=%u) " , (self -> config .stop_bits == UART_STOP_BITS_1 ) ? 1 : 2 );
300
+ mp_printf (print , ", stop=%u" , (self -> config .stop_bits == UART_STOP_BITS_1 ) ? 1 : 2 );
299
301
}
302
+ if (self -> invert ) {
303
+ mp_printf (print , ", invert=" );
304
+ uint32_t invert_mask = self -> invert ;
305
+ if (invert_mask & UART_INVERSE_TXD ) {
306
+ mp_print_str (print , "INV_TX" );
307
+ invert_mask &= ~UART_INVERSE_TXD ;
308
+ if (invert_mask ) {
309
+ mp_print_str (print , "|" );
310
+ }
311
+ }
312
+ if (invert_mask & UART_INVERSE_RXD ) {
313
+ mp_print_str (print , "INV_RX" );
314
+ invert_mask &= ~UART_INVERSE_RXD ;
315
+ if (invert_mask ) {
316
+ mp_print_str (print , "|" );
317
+ }
318
+ }
319
+ if (invert_mask & UART_INVERSE_RTS ) {
320
+ mp_print_str (print , "INV_RTS" );
321
+ invert_mask &= ~UART_INVERSE_RTS ;
322
+ if (invert_mask ) {
323
+ mp_print_str (print , "|" );
324
+ }
325
+ }
326
+ if (invert_mask & UART_INVERSE_CTS ) {
327
+ mp_print_str (print , "INV_CTS" );
328
+ }
329
+ }
330
+ mp_printf (print , ")" );
300
331
} else {
301
332
mp_printf (print , "UART(%u)" , self -> uart_id );
302
333
}
@@ -432,6 +463,11 @@ STATIC mp_obj_t mach_uart_init_helper(mach_uart_obj_t *self, const mp_arg_val_t
432
463
self -> config .rx_flow_ctrl_thresh = 64 ;
433
464
uart_param_config (self -> uart_id , & self -> config );
434
465
466
+ self -> invert = args [7 ].u_int ;
467
+ if (self -> invert != 0 ) {
468
+ uart_set_line_inverse (self -> uart_id , self -> invert );
469
+ }
470
+
435
471
// install the UART driver
436
472
uart_driver_install (self -> uart_id , rx_buffer_size , 0 , 0 , NULL , 0 , UARTRxCallback );
437
473
@@ -458,7 +494,8 @@ STATIC const mp_arg_t mach_uart_init_args[] = {
458
494
{ MP_QSTR_stop , MP_ARG_OBJ , {.u_obj = mp_const_none } },
459
495
{ MP_QSTR_pins , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
460
496
{ MP_QSTR_timeout_chars , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 2 } },
461
- { MP_QSTR_rx_buffer_size , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = MACHUART_RX_BUFFER_LEN } }
497
+ { MP_QSTR_rx_buffer_size , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = MACHUART_RX_BUFFER_LEN } },
498
+ { MP_QSTR_invert , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } }
462
499
};
463
500
STATIC mp_obj_t mach_uart_make_new (const mp_obj_type_t * type , mp_uint_t n_args , mp_uint_t n_kw , const mp_obj_t * all_args ) {
464
501
// parse args
@@ -560,9 +597,9 @@ STATIC mp_obj_t mach_uart_sendbreak(mp_uint_t n_args, const mp_obj_t *pos_args,
560
597
gpio_matrix_out (pin -> pin_number , pin -> af_out , false, false);
561
598
}
562
599
563
- WRITE_PERI_REG (UART_CONF0_REG (self -> uart_id ), READ_PERI_REG (UART_CONF0_REG (self -> uart_id )) | UART_TXD_INV );
600
+ WRITE_PERI_REG (UART_CONF0_REG (self -> uart_id ), READ_PERI_REG (UART_CONF0_REG (self -> uart_id )) ^ UART_TXD_INV );
564
601
ets_delay_us ((delay > 0 ) ? delay : 1 );
565
- WRITE_PERI_REG (UART_CONF0_REG (self -> uart_id ), READ_PERI_REG (UART_CONF0_REG (self -> uart_id )) & (~ UART_TXD_INV ) );
602
+ WRITE_PERI_REG (UART_CONF0_REG (self -> uart_id ), READ_PERI_REG (UART_CONF0_REG (self -> uart_id )) ^ UART_TXD_INV );
566
603
567
604
if (self -> n_pins == 1 ) {
568
605
// make it an input again
@@ -595,6 +632,11 @@ STATIC const mp_map_elem_t mach_uart_locals_dict_table[] = {
595
632
// class constants
596
633
{ MP_OBJ_NEW_QSTR (MP_QSTR_EVEN ), MP_OBJ_NEW_SMALL_INT (UART_PARITY_EVEN ) },
597
634
{ MP_OBJ_NEW_QSTR (MP_QSTR_ODD ), MP_OBJ_NEW_SMALL_INT (UART_PARITY_ODD ) },
635
+ { MP_OBJ_NEW_QSTR (MP_QSTR_INV_RX ), MP_OBJ_NEW_SMALL_INT (UART_INVERSE_RXD ) },
636
+ { MP_OBJ_NEW_QSTR (MP_QSTR_INV_CTS ), MP_OBJ_NEW_SMALL_INT (UART_INVERSE_CTS ) },
637
+ { MP_OBJ_NEW_QSTR (MP_QSTR_INV_TX ), MP_OBJ_NEW_SMALL_INT (UART_INVERSE_TXD ) },
638
+ { MP_OBJ_NEW_QSTR (MP_QSTR_INV_RTS ), MP_OBJ_NEW_SMALL_INT (UART_INVERSE_RTS ) },
639
+
598
640
// { MP_OBJ_NEW_QSTR(MP_QSTR_RX_ANY), MP_OBJ_NEW_SMALL_INT(2) },
599
641
};
600
642
STATIC MP_DEFINE_CONST_DICT (mach_uart_locals_dict , mach_uart_locals_dict_table );
0 commit comments