3131
3232#include <zephyr/kernel.h>
3333#include <zephyr/drivers/uart.h>
34- #include <zephyr/sys/ring_buffer.h>
3534
3635#include "py/mperrno.h"
36+ #include "py/obj.h"
37+ #include "py/runtime.h"
38+ #include "py/stream.h"
39+ #include "py/ringbuf.h"
3740#include "zephyr_device.h"
41+ #include "extmod/modmachine.h"
3842
39- // The UART class doesn't have any constants for this port.
40- #define MICROPY_PY_MACHINE_UART_CLASS_CONSTANTS
4143
42- #define UART_RX_RING_BUF_DEF_SIZE 128
43- #define UART_TX_RING_BUF_DEF_SIZE 128
44+ #define MACHINE_UART_RTS 1
45+ #define MACHINE_UART_CTS 2
46+
47+ // This class needs a finalizer, so we add it here
48+ #define MICROPY_PY_MACHINE_UART_CLASS_CONSTANTS \
49+ { MP_ROM_QSTR(MP_QSTR_RTS), MP_ROM_INT(MACHINE_UART_RTS) }, \
50+ { MP_ROM_QSTR(MP_QSTR_CTS), MP_ROM_INT(MACHINE_UART_CTS) }, \
51+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&machine_uart_deinit_obj) },
52+
53+ #define UART_RX_RING_BUF_DEF_SIZE 128
54+ #define UART_TX_RING_BUF_DEF_SIZE 128
4455
4556static void uart_interrupt_handler (const struct device * dev , void * user_data );
4657
@@ -49,12 +60,8 @@ typedef struct _machine_uart_obj_t {
4960 const struct device * dev ;
5061 uint16_t timeout ; // timeout waiting for first char (in ms)
5162 uint16_t timeout_char ; // timeout waiting between chars (in ms)
52- uint16_t txbuf_size ;
53- uint16_t rxbuf_size ;
54- uint8_t * rx_buffer ;
55- struct ring_buf rx_ringbuffer ;
56- uint8_t * tx_buffer ;
57- struct ring_buf tx_ringbuffer ;
63+ ringbuf_t rx_ringbuffer ;
64+ ringbuf_t tx_ringbuffer ;
5865} machine_uart_obj_t ;
5966
6067static const char * _parity_name [] = {"None" , "Odd" , "Even" , "Mark" , "Space" };
@@ -73,27 +80,84 @@ static void mp_machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_
7380}
7481
7582static void mp_machine_uart_init_helper (machine_uart_obj_t * self , size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
76- enum { ARG_txbuf , ARG_rxbuf , ARG_timeout , ARG_timeout_char };
83+ enum { ARG_baudrate , ARG_bits , ARG_parity , ARG_stop , ARG_txbuf , ARG_rxbuf , ARG_timeout , ARG_timeout_char , ARG_flow };
7784 static const mp_arg_t allowed_args [] = {
85+ { MP_QSTR_baudrate , MP_ARG_INT , {.u_int = 115200 } },
86+ { MP_QSTR_bits , MP_ARG_INT , {.u_int = 8 } },
87+ { MP_QSTR_parity , MP_ARG_OBJ , {.u_obj = mp_const_none } },
88+ { MP_QSTR_stop , MP_ARG_INT , {.u_int = 1 } },
7889 { MP_QSTR_txbuf , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = UART_RX_RING_BUF_DEF_SIZE } },
7990 { MP_QSTR_rxbuf , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = UART_TX_RING_BUF_DEF_SIZE } },
8091 { MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
8192 { MP_QSTR_timeout_char , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
93+ { MP_QSTR_flow , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
8294 };
8395
8496 mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
8597 mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
8698
87- self -> txbuf_size = args [ARG_txbuf ].u_int ;
88- self -> rxbuf_size = args [ARG_rxbuf ].u_int ;
8999 self -> timeout = args [ARG_timeout ].u_int ;
90100 self -> timeout_char = args [ARG_timeout_char ].u_int ;
91101
92- self -> tx_buffer = m_tracked_calloc (self -> txbuf_size , sizeof (uint8_t ));
93- ring_buf_init (& self -> tx_ringbuffer , self -> txbuf_size , self -> tx_buffer );
102+ uint8_t data_bits ;
103+ if (args [ARG_bits ].u_int == 5 ) {
104+ data_bits = UART_CFG_DATA_BITS_5 ;
105+ } else if (args [ARG_bits ].u_int == 6 ) {
106+ data_bits = UART_CFG_DATA_BITS_6 ;
107+ } else if (args [ARG_bits ].u_int == 7 ) {
108+ data_bits = UART_CFG_DATA_BITS_7 ;
109+ } else if (args [ARG_bits ].u_int == 8 ) {
110+ data_bits = UART_CFG_DATA_BITS_8 ;
111+ } else if (args [ARG_bits ].u_int == 9 ) {
112+ data_bits = UART_CFG_DATA_BITS_9 ;
113+ } else {
114+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("invalid data bits" ));
115+ }
116+
117+ uint8_t parity ;
118+ if (args [ARG_parity ].u_obj == mp_const_none ) {
119+ parity = UART_CFG_PARITY_NONE ;
120+ } else if (mp_obj_get_int (args [ARG_parity ].u_obj ) == 0 ) {
121+ parity = UART_CFG_PARITY_EVEN ;
122+ } else if (mp_obj_get_int (args [ARG_parity ].u_obj ) == 1 ) {
123+ parity = UART_CFG_PARITY_ODD ;
124+ } else {
125+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("invalid parity" ));
126+ }
94127
95- self -> rx_buffer = m_tracked_calloc (self -> rxbuf_size , sizeof (uint8_t ));
96- ring_buf_init (& self -> rx_ringbuffer , self -> rxbuf_size , self -> rx_buffer );
128+ uint8_t stop_bits ;
129+ if (args [ARG_stop ].u_int == 1 ) {
130+ stop_bits = UART_CFG_STOP_BITS_1 ;
131+ } else if (args [ARG_stop ].u_int == 2 ) {
132+ data_bits = UART_CFG_STOP_BITS_2 ;
133+ } else {
134+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("invalid stop bits" ));
135+ }
136+
137+ uint8_t flow_ctrl ;
138+ if (args [ARG_flow ].u_obj == mp_const_none ) {
139+ flow_ctrl = UART_CFG_FLOW_CTRL_NONE ;
140+ } else if (mp_obj_get_int (args [ARG_flow ].u_obj ) == (MACHINE_UART_RTS | MACHINE_UART_RTS )) {
141+ flow_ctrl = UART_CFG_FLOW_CTRL_RTS_CTS ;
142+ } else {
143+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("invalid flow control" ));
144+ }
145+
146+ const struct uart_config cfg = {
147+ .baudrate = args [ARG_baudrate ].u_int ,
148+ .parity = parity ,
149+ .stop_bits = args [ARG_stop ].u_int ,
150+ .data_bits = data_bits ,
151+ .flow_ctrl = flow_ctrl
152+ };
153+
154+ int ret = uart_configure (self -> dev , & cfg );
155+ if (ret < 0 ) {
156+ mp_raise_OSError (- ret );
157+ }
158+
159+ ringbuf_alloc (& self -> tx_ringbuffer , args [ARG_txbuf ].u_int );
160+ ringbuf_alloc (& self -> rx_ringbuffer , args [ARG_rxbuf ].u_int );
97161
98162 uart_irq_callback_user_data_set (self -> dev , uart_interrupt_handler , (void * )self );
99163 uart_irq_rx_enable (self -> dev );
@@ -102,7 +166,7 @@ static void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
102166static 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 ) {
103167 mp_arg_check_num (n_args , n_kw , 1 , MP_OBJ_FUN_ARGS_MAX , true);
104168
105- machine_uart_obj_t * self = mp_obj_malloc (machine_uart_obj_t , & machine_uart_type );
169+ machine_uart_obj_t * self = mp_obj_malloc_with_finaliser (machine_uart_obj_t , & machine_uart_type );
106170 self -> dev = zephyr_device_find (args [0 ]);
107171
108172 mp_map_t kw_args ;
@@ -113,19 +177,16 @@ static mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_arg
113177}
114178
115179static void mp_machine_uart_deinit (machine_uart_obj_t * self ) {
116- m_tracked_free (self -> tx_buffer );
117- m_tracked_free (self -> rx_buffer );
180+ uart_irq_rx_disable (self -> dev );
181+ uart_irq_tx_disable (self -> dev );
118182}
119183
120184static mp_int_t mp_machine_uart_any (machine_uart_obj_t * self ) {
121- return ring_buf_size_get (& self -> rx_ringbuffer );
185+ return ringbuf_avail (& self -> rx_ringbuffer );
122186}
123187
124188static bool mp_machine_uart_txdone (machine_uart_obj_t * self ) {
125- if (ring_buf_is_empty (& self -> tx_ringbuffer )) {
126- return true;
127- }
128- return false;
189+ return ringbuf_avail (& self -> tx_ringbuffer ) ? false : true;
129190}
130191
131192static mp_uint_t mp_machine_uart_read (mp_obj_t self_in , void * buf_in , mp_uint_t size , int * errcode ) {
@@ -136,8 +197,9 @@ static mp_uint_t mp_machine_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t
136197 size_t time_to_wait = self -> timeout ;
137198
138199 do {
139- int _rx_len = ring_buf_get ( & self -> rx_ringbuffer , & buffer [ bytes_read ] , size - bytes_read );
200+ int _rx_len = MIN ( ringbuf_avail ( & self -> rx_ringbuffer ) , size - bytes_read );
140201 if (_rx_len > 0 ) {
202+ ringbuf_get_bytes (& self -> rx_ringbuffer , & buffer [bytes_read ], _rx_len );
141203 bytes_read += _rx_len ;
142204 elapsed_ms = 0 ;
143205 time_to_wait = self -> timeout_char ;
@@ -160,7 +222,7 @@ static mp_uint_t mp_machine_uart_write(mp_obj_t self_in, const void *buf_in, mp_
160222 }
161223
162224 int _ex_size = 0 ;
163- int _free_space = ring_buf_space_get (& self -> tx_ringbuffer );
225+ int _free_space = ringbuf_free (& self -> tx_ringbuffer );
164226 if (size > _free_space ) {
165227 _ex_size = size - _free_space ;
166228 }
@@ -170,7 +232,7 @@ static mp_uint_t mp_machine_uart_write(mp_obj_t self_in, const void *buf_in, mp_
170232 uart_poll_out (self -> dev , buffer [i ]);
171233 }
172234
173- ring_buf_put (& self -> tx_ringbuffer , & buffer [_ex_size ], size - _ex_size );
235+ ringbuf_put_bytes (& self -> tx_ringbuffer , & buffer [_ex_size ], size - _ex_size );
174236 uart_irq_tx_enable (self -> dev );
175237
176238 return size ;
@@ -206,7 +268,7 @@ static void uart_interrupt_handler(const struct device *dev, void *user_data) {
206268 while (uart_irq_update (dev ) && uart_irq_is_pending (dev )) {
207269 if (uart_irq_rx_ready (dev )) {
208270 uint8_t _rx_buffer [32 ];
209- size_t _free_space = MIN (ring_buf_space_get (& self -> rx_ringbuffer ), sizeof (_rx_buffer ));
271+ size_t _free_space = MIN (ringbuf_free (& self -> rx_ringbuffer ), sizeof (_rx_buffer ));
210272
211273 // empty the uart fifo even if we can't store bytes anymore
212274 // otherwise we will never exit this interrupt handler
@@ -215,17 +277,20 @@ static void uart_interrupt_handler(const struct device *dev, void *user_data) {
215277 continue ;
216278 }
217279
218- ring_buf_put (& self -> rx_ringbuffer , _rx_buffer , rcv_len );
280+ ringbuf_put_bytes (& self -> rx_ringbuffer , _rx_buffer , rcv_len );
219281 }
220282
221- int _max_tx_len = uart_irq_tx_ready (dev );
222- if (_max_tx_len > 0 ) {
283+ int _max_uart_tx_len = uart_irq_tx_ready (dev );
284+ if (_max_uart_tx_len > 0 ) {
223285 uint8_t _tx_buffer [32 ];
224- size_t _tx_len = MIN (_max_tx_len , sizeof (_tx_buffer ));
225-
226- _tx_len = ring_buf_get (& self -> tx_ringbuffer , _tx_buffer , _tx_len );
227- if (_tx_len > 0 ) {
228- uart_fifo_fill (dev , _tx_buffer , _tx_len );
286+ size_t _buffer_tx_len ;
287+
288+ _max_uart_tx_len = MIN (_max_uart_tx_len , sizeof (_tx_buffer ));
289+ _buffer_tx_len = ringbuf_avail (& self -> tx_ringbuffer );
290+ if (_buffer_tx_len > 0 ) {
291+ _buffer_tx_len = MIN (_max_uart_tx_len , _buffer_tx_len );
292+ ringbuf_get_bytes (& self -> tx_ringbuffer , _tx_buffer , _buffer_tx_len );
293+ uart_fifo_fill (dev , _tx_buffer , _buffer_tx_len );
229294 } else {
230295 uart_irq_tx_disable (dev );
231296 }
0 commit comments