40
40
#define DEFAULT_UART_STOP (1)
41
41
#define DEFAULT_UART0_TX (0)
42
42
#define DEFAULT_UART0_RX (1)
43
+ #define DEFAULT_UART0_CTS (2)
44
+ #define DEFAULT_UART0_RTS (3)
43
45
#define DEFAULT_UART1_TX (4)
44
46
#define DEFAULT_UART1_RX (5)
47
+ #define DEFAULT_UART1_CTS (6)
48
+ #define DEFAULT_UART1_RTS (7)
45
49
#define DEFAULT_BUFFER_SIZE (256)
46
50
#define MIN_BUFFER_SIZE (32)
47
51
#define MAX_BUFFER_SIZE (32766)
48
52
49
53
#define IS_VALID_PERIPH (uart , pin ) (((((pin) + 4) & 8) >> 3) == (uart))
50
54
#define IS_VALID_TX (uart , pin ) (((pin) & 3) == 0 && IS_VALID_PERIPH(uart, pin))
51
55
#define IS_VALID_RX (uart , pin ) (((pin) & 3) == 1 && IS_VALID_PERIPH(uart, pin))
56
+ #define IS_VALID_CTS (uart , pin ) (((pin) & 3) == 2 && IS_VALID_PERIPH(uart, pin))
57
+ #define IS_VALID_RTS (uart , pin ) (((pin) & 3) == 3 && IS_VALID_PERIPH(uart, pin))
52
58
53
59
#define UART_INVERT_TX (1)
54
60
#define UART_INVERT_RX (2)
55
61
#define UART_INVERT_MASK (UART_INVERT_TX | UART_INVERT_RX)
56
62
63
+ #define UART_HWCONTROL_CTS (1)
64
+ #define UART_HWCONTROL_RTS (2)
65
+
57
66
typedef struct _machine_uart_obj_t {
58
67
mp_obj_base_t base ;
59
68
uart_inst_t * const uart ;
@@ -64,9 +73,12 @@ typedef struct _machine_uart_obj_t {
64
73
uint8_t stop ;
65
74
uint8_t tx ;
66
75
uint8_t rx ;
76
+ uint8_t cts ;
77
+ uint8_t rts ;
67
78
uint16_t timeout ; // timeout waiting for first char (in ms)
68
79
uint16_t timeout_char ; // timeout waiting between chars (in ms)
69
80
uint8_t invert ;
81
+ uint8_t flow ;
70
82
ringbuf_t read_buffer ;
71
83
bool read_lock ;
72
84
ringbuf_t write_buffer ;
@@ -75,9 +87,9 @@ typedef struct _machine_uart_obj_t {
75
87
76
88
STATIC machine_uart_obj_t machine_uart_obj [] = {
77
89
{{& machine_uart_type }, uart0 , 0 , 0 , DEFAULT_UART_BITS , UART_PARITY_NONE , DEFAULT_UART_STOP ,
78
- DEFAULT_UART0_TX , DEFAULT_UART0_RX , 0 , 0 , 0 , {NULL , 1 , 0 , 0 }, 0 , {NULL , 1 , 0 , 0 }, 0 },
90
+ DEFAULT_UART0_TX , DEFAULT_UART0_RX , DEFAULT_UART0_CTS , DEFAULT_UART0_RTS , 0 , 0 , 0 , 0 , {NULL , 1 , 0 , 0 }, 0 , {NULL , 1 , 0 , 0 }, 0 },
79
91
{{& machine_uart_type }, uart1 , 1 , 0 , DEFAULT_UART_BITS , UART_PARITY_NONE , DEFAULT_UART_STOP ,
80
- DEFAULT_UART1_TX , DEFAULT_UART1_RX , 0 , 0 , 0 , {NULL , 1 , 0 , 0 }, 0 , {NULL , 1 , 0 , 0 }, 0 , },
92
+ DEFAULT_UART1_TX , DEFAULT_UART1_RX , DEFAULT_UART1_CTS , DEFAULT_UART1_RTS , 0 , 0 , 0 , 0 , {NULL , 1 , 0 , 0 }, 0 , {NULL , 1 , 0 , 0 }, 0 },
81
93
};
82
94
83
95
STATIC const char * _parity_name [] = {"None" , "0" , "1" };
@@ -140,8 +152,8 @@ STATIC void machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_pri
140
152
}
141
153
142
154
STATIC mp_obj_t machine_uart_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * all_args ) {
143
- enum { ARG_id , ARG_baudrate , ARG_bits , ARG_parity , ARG_stop , ARG_tx , ARG_rx ,
144
- ARG_timeout , ARG_timeout_char , ARG_invert , ARG_txbuf , ARG_rxbuf };
155
+ enum { ARG_id , ARG_baudrate , ARG_bits , ARG_parity , ARG_stop , ARG_tx , ARG_rx , ARG_cts , ARG_rts ,
156
+ ARG_timeout , ARG_timeout_char , ARG_invert , ARG_flow , ARG_txbuf , ARG_rxbuf };
145
157
static const mp_arg_t allowed_args [] = {
146
158
{ MP_QSTR_id , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
147
159
{ MP_QSTR_baudrate , MP_ARG_INT , {.u_int = -1 } },
@@ -150,9 +162,12 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
150
162
{ MP_QSTR_stop , MP_ARG_INT , {.u_int = -1 } },
151
163
{ MP_QSTR_tx , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
152
164
{ MP_QSTR_rx , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
165
+ { MP_QSTR_cts , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
166
+ { MP_QSTR_rts , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
153
167
{ MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
154
168
{ MP_QSTR_timeout_char , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
155
169
{ MP_QSTR_invert , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
170
+ { MP_QSTR_flow , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
156
171
{ MP_QSTR_txbuf , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
157
172
{ MP_QSTR_rxbuf , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
158
173
};
@@ -212,6 +227,22 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
212
227
self -> rx = rx ;
213
228
}
214
229
230
+ // Set CTS/RTS pins if configured.
231
+ if (args [ARG_cts ].u_obj != mp_const_none ) {
232
+ int cts = mp_hal_get_pin_obj (args [ARG_cts ].u_obj );
233
+ if (!IS_VALID_CTS (self -> uart_id , cts )) {
234
+ mp_raise_ValueError (MP_ERROR_TEXT ("bad CTS pin" ));
235
+ }
236
+ self -> cts = cts ;
237
+ }
238
+ if (args [ARG_rts ].u_obj != mp_const_none ) {
239
+ int rts = mp_hal_get_pin_obj (args [ARG_rts ].u_obj );
240
+ if (!IS_VALID_RTS (self -> uart_id , rts )) {
241
+ mp_raise_ValueError (MP_ERROR_TEXT ("bad RTS pin" ));
242
+ }
243
+ self -> rts = rts ;
244
+ }
245
+
215
246
// Set timeout if configured.
216
247
if (args [ARG_timeout ].u_int >= 0 ) {
217
248
self -> timeout = args [ARG_timeout ].u_int ;
@@ -230,6 +261,14 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
230
261
self -> invert = args [ARG_invert ].u_int ;
231
262
}
232
263
264
+ // Set hardware flow control if configured.
265
+ if (args [ARG_flow ].u_int >= 0 ) {
266
+ if (args [ARG_flow ].u_int & ~(UART_HWCONTROL_CTS | UART_HWCONTROL_RTS )) {
267
+ mp_raise_ValueError (MP_ERROR_TEXT ("bad hardware flow control mask" ));
268
+ }
269
+ self -> flow = args [ARG_flow ].u_int ;
270
+ }
271
+
233
272
self -> read_lock = false;
234
273
235
274
// Set the RX buffer size if configured.
@@ -278,6 +317,15 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
278
317
gpio_set_outover (self -> tx , GPIO_OVERRIDE_INVERT );
279
318
}
280
319
320
+ // Set hardware flow control if configured.
321
+ if (self -> flow & UART_HWCONTROL_CTS ) {
322
+ gpio_set_function (self -> cts , GPIO_FUNC_UART );
323
+ }
324
+ if (self -> flow & UART_HWCONTROL_RTS ) {
325
+ gpio_set_function (self -> rts , GPIO_FUNC_UART );
326
+ }
327
+ uart_set_hw_flow (self -> uart , self -> flow & UART_HWCONTROL_CTS , self -> flow & UART_HWCONTROL_RTS );
328
+
281
329
// Allocate the RX/TX buffers.
282
330
ringbuf_alloc (& (self -> read_buffer ), rxbuf_len + 1 );
283
331
MP_STATE_PORT (rp2_uart_rx_buffer [uart_id ]) = self -> read_buffer .buf ;
@@ -333,6 +381,9 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
333
381
{ MP_ROM_QSTR (MP_QSTR_INV_TX ), MP_ROM_INT (UART_INVERT_TX ) },
334
382
{ MP_ROM_QSTR (MP_QSTR_INV_RX ), MP_ROM_INT (UART_INVERT_RX ) },
335
383
384
+ { MP_ROM_QSTR (MP_QSTR_CTS ), MP_ROM_INT (UART_HWCONTROL_CTS ) },
385
+ { MP_ROM_QSTR (MP_QSTR_RTS ), MP_ROM_INT (UART_HWCONTROL_RTS ) },
386
+
336
387
};
337
388
STATIC MP_DEFINE_CONST_DICT (machine_uart_locals_dict , machine_uart_locals_dict_table );
338
389
0 commit comments