@@ -63,6 +63,7 @@ typedef struct _machine_uart_obj_t {
6363 uint32_t * data_cb ;
6464 uint32_t * pattern_cb ;
6565 uint32_t * error_cb ;
66+ uint32_t inverted ;
6667 uint8_t end_task ;
6768 uint8_t lineend [3 ];
6869} machine_uart_obj_t ;
@@ -149,10 +150,10 @@ static void _sched_callback(mp_obj_t function, int uart, int type, int iarglen,
149150 if (!make_carg_entry (carg , 0 , MP_SCHED_ENTRY_TYPE_INT , uart , NULL , NULL )) return ;
150151 if (!make_carg_entry (carg , 1 , MP_SCHED_ENTRY_TYPE_INT , type , NULL , NULL )) return ;
151152 if (sarg ) {
152- if (!make_carg_entry (carg , 2 , MP_SCHED_ENTRY_TYPE_INT , iarglen , NULL , NULL )) return ;
153+ if (!make_carg_entry (carg , 2 , MP_SCHED_ENTRY_TYPE_STR , iarglen , sarg , NULL )) return ;
153154 }
154155 else {
155- if (!make_carg_entry (carg , 2 , MP_SCHED_ENTRY_TYPE_STR , iarglen , sarg , NULL )) return ;
156+ if (!make_carg_entry (carg , 2 , MP_SCHED_ENTRY_TYPE_INT , iarglen , NULL , NULL )) return ;
156157 }
157158 mp_sched_schedule (function , mp_const_none , carg );
158159}
@@ -281,9 +282,10 @@ static const mp_arg_t allowed_args[] = {
281282 { MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
282283 { MP_QSTR_buffer_size , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 512 } },
283284 { MP_QSTR_lineend , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
285+ { MP_QSTR_inverted , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_int = -1 } },
284286};
285287
286- enum { ARG_baudrate , ARG_bits , ARG_parity , ARG_stop , ARG_tx , ARG_rx , ARG_rts , ARG_cts , ARG_timeout , ARG_buffer_size , ARG_lineend };
288+ enum { ARG_baudrate , ARG_bits , ARG_parity , ARG_stop , ARG_tx , ARG_rx , ARG_rts , ARG_cts , ARG_timeout , ARG_buffer_size , ARG_lineend , ARG_inverted };
287289
288290//-----------------------------------------------------------------------------------------------
289291STATIC void machine_uart_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
@@ -314,10 +316,28 @@ STATIC void machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_pri
314316 lnend_idx ++ ;
315317 }
316318 }
319+ char inverted [24 ] = {'\0' };
320+ if (self -> inverted & (uint32_t )UART_INVERSE_RXD ) {
321+ if (inverted [0 ] != '\0' ) strcat (inverted , ", " );
322+ strcat (inverted , "RX" );
323+ }
324+ if (self -> inverted & (uint32_t )UART_INVERSE_TXD ) {
325+ if (inverted [0 ] != '\0' ) strcat (inverted , ", " );
326+ strcat (inverted , "TX" );
327+ }
328+ if (self -> inverted & (uint32_t )UART_INVERSE_CTS ) {
329+ if (inverted [0 ] != '\0' ) strcat (inverted , ", " );
330+ strcat (inverted , "CTS" );
331+ }
332+ if (self -> inverted & (uint32_t )UART_INVERSE_RTS ) {
333+ if (inverted [0 ] != '\0' ) strcat (inverted , ", " );
334+ strcat (inverted , "RTS" );
335+ }
317336
318- mp_printf (print , "UART(%u, baudrate=%u, bits=%u, parity=%s, stop=%s, tx=%d, rx=%d, rts=%d, cts=%d, timeout=%u, buf_size=%u, lineend=b'%s') " ,
337+ mp_printf (print , "UART(%u, baudrate=%u, bits=%u, parity=%s, stop=%s, tx=%d, rx=%d, rts=%d, cts=%d, inverted: [%s]\n " ,
319338 self -> uart_num + 1 , baudrate , self -> bits , _parity_name [self -> parity ], _stopbits_name [self -> stop ],
320- self -> tx , self -> rx , self -> rts , self -> cts , self -> timeout , self -> buffer_size , lnend );
339+ self -> tx , self -> rx , self -> rts , self -> cts , inverted );
340+ mp_printf (print , " timeout=%u, buf_size=%u, lineend=b'%s')" , self -> timeout , self -> buffer_size , lnend );
321341 if (self -> data_cb ) {
322342 mp_printf (print , "\n data CB: True, on len: %d" , self -> data_cb_size );
323343 }
@@ -420,6 +440,12 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
420440 }
421441 }
422442
443+ // set inverted pins
444+ if ((args [ARG_inverted ].u_int > -1 ) && (args [ARG_inverted ].u_int != self -> inverted )) {
445+ self -> inverted = args [ARG_inverted ].u_int & (UART_INVERSE_RXD | UART_INVERSE_TXD | UART_INVERSE_RTS | UART_INVERSE_CTS );
446+ uart_set_line_inverse (self -> uart_num + 1 , self -> inverted );
447+ }
448+
423449 // set pins
424450 if (((self -> tx == -2 ) && (args [ARG_tx ].u_int == UART_PIN_NO_CHANGE )) || ((self -> rx == -2 ) && (args [ARG_rx ].u_int == UART_PIN_NO_CHANGE ))) {
425451 nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "Tx&Rx pins must be set: u=machine.UART(uart_num, tx=pin, rx=pin)" ));
@@ -435,8 +461,16 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
435461
436462 if (args [ARG_tx ].u_int != UART_PIN_NO_CHANGE ) self -> tx = args [ARG_tx ].u_int ;
437463 if (args [ARG_rx ].u_int != UART_PIN_NO_CHANGE ) self -> rx = args [ARG_rx ].u_int ;
438- if (args [ARG_rts ].u_int != UART_PIN_NO_CHANGE ) self -> rts = args [ARG_rts ].u_int ;
439- if (args [ARG_cts ].u_int != UART_PIN_NO_CHANGE ) self -> cts = args [ARG_cts ].u_int ;
464+ if ((self -> rts != args [ARG_rts ].u_int ) || (self -> cts != args [ARG_cts ].u_int )) {
465+ if (args [ARG_rts ].u_int != UART_PIN_NO_CHANGE ) self -> rts = args [ARG_rts ].u_int ;
466+ if (args [ARG_cts ].u_int != UART_PIN_NO_CHANGE ) self -> cts = args [ARG_cts ].u_int ;
467+ // set flow control
468+ int fwc = 0 ;
469+ if (self -> rts >= 0 ) fwc |= UART_HW_FLOWCTRL_RTS ;
470+ if (self -> cts >= 0 ) fwc |= UART_HW_FLOWCTRL_CTS ;
471+ // Only when UART_HW_FLOWCTRL_RTS is set, will the rx_thresh value be set.
472+ uart_set_hw_flow_ctrl (self -> uart_num + 1 , fwc , UART_FIFO_LEN / 4 * 3 );
473+ }
440474 }
441475
442476 // set timeout
@@ -496,6 +530,7 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
496530 self -> stop = UART_STOP_BITS_1 ;
497531 self -> rts = UART_PIN_NO_CHANGE ;
498532 self -> cts = UART_PIN_NO_CHANGE ;
533+ self -> inverted = UART_INVERSE_DISABLE ;
499534 self -> timeout = 0 ;
500535 self -> pattern [0 ] = 0 ;
501536 self -> pattern_len = 0 ;
@@ -773,6 +808,33 @@ STATIC mp_obj_t machine_uart_callback(size_t n_args, const mp_obj_t *pos_args, m
773808}
774809STATIC MP_DEFINE_CONST_FUN_OBJ_KW (machine_uart_callback_obj , 2 , machine_uart_callback );
775810
811+ //---------------------------------------------------------------------------
812+ STATIC mp_obj_t machine_uart_write_break (size_t n_args , const mp_obj_t * args )
813+ {
814+ machine_uart_obj_t * self = MP_OBJ_TO_PTR (args [0 ]);
815+
816+ mp_buffer_info_t bufinfo ;
817+ mp_get_buffer_raise (args [1 ], & bufinfo , MP_BUFFER_READ );
818+
819+ // break signal length
820+ // unit: one BIT time at current_baudrate
821+ int nbreak = nbreak = mp_obj_get_int_truncated (args [2 ]);
822+ if ((nbreak < 1 ) || (nbreak > 255 )) {
823+ mp_raise_ValueError ("values 1 - 255 are allowed" );
824+ }
825+
826+ int len = bufinfo .len ;
827+ if (n_args == 4 ) {
828+ len = mp_obj_get_int_truncated (args [3 ]);
829+ if ((len < 0 ) || (len > bufinfo .len )) len = bufinfo .len ;;
830+ }
831+
832+ int bytes_written = uart_write_bytes_with_break (self -> uart_num + 1 , (const char * )bufinfo .buf , len , nbreak );
833+
834+ return MP_OBJ_NEW_SMALL_INT (bytes_written );
835+ }
836+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (machine_uart_write_break_obj , 3 , 4 , machine_uart_write_break );
837+
776838
777839//=================================================================
778840STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table [] = {
@@ -783,6 +845,7 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
783845 { MP_ROM_QSTR (MP_QSTR_readline ), MP_ROM_PTR (& mp_stream_unbuffered_readline_obj ) },
784846 { MP_ROM_QSTR (MP_QSTR_readinto ), MP_ROM_PTR (& mp_stream_readinto_obj ) },
785847 { MP_ROM_QSTR (MP_QSTR_write ), MP_ROM_PTR (& mp_stream_write_obj ) },
848+ { MP_ROM_QSTR (MP_QSTR_write_break ), MP_ROM_PTR (& machine_uart_write_break_obj ) },
786849 { MP_ROM_QSTR (MP_QSTR_readln ), MP_ROM_PTR (& machine_uart_readln_obj ) },
787850 { MP_ROM_QSTR (MP_QSTR_flush ), MP_ROM_PTR (& machine_uart_flush_obj ) },
788851 { MP_ROM_QSTR (MP_QSTR_callback ), MP_ROM_PTR (& machine_uart_callback_obj ) },
@@ -791,6 +854,12 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
791854 { MP_ROM_QSTR (MP_QSTR_CBTYPE_DATA ), MP_ROM_INT (UART_CB_TYPE_DATA ) },
792855 { MP_ROM_QSTR (MP_QSTR_CBTYPE_PATTERN ), MP_ROM_INT (UART_CB_TYPE_PATTERN ) },
793856 { MP_ROM_QSTR (MP_QSTR_CBTYPE_ERROR ), MP_ROM_INT (UART_CB_TYPE_ERROR ) },
857+
858+ { MP_ROM_QSTR (MP_QSTR_INV_RX ), MP_ROM_INT (UART_INVERSE_RXD >> 1 ) },
859+ { MP_ROM_QSTR (MP_QSTR_INV_TX ), MP_ROM_INT (UART_INVERSE_TXD >> 1 ) },
860+ { MP_ROM_QSTR (MP_QSTR_INV_CTS ), MP_ROM_INT (UART_INVERSE_CTS >> 1 ) },
861+ { MP_ROM_QSTR (MP_QSTR_INV_RTS ), MP_ROM_INT (UART_INVERSE_RTS >> 1 ) },
862+ { MP_ROM_QSTR (MP_QSTR_INV_NONE ), MP_ROM_INT (0 ) },
794863};
795864STATIC MP_DEFINE_CONST_DICT (machine_uart_locals_dict , machine_uart_locals_dict_table );
796865
0 commit comments