36
36
#include "py/mperrno.h"
37
37
#include "modpyb.h"
38
38
39
- // baudrate is currently fixed to this value
40
- #define UART_BAUDRATE (115200)
39
+ // UartDev is defined and initialized in rom code.
40
+ extern UartDevice UartDev ;
41
41
42
42
typedef struct _pyb_uart_obj_t {
43
43
mp_obj_base_t base ;
44
44
uint8_t uart_id ;
45
+ uint8_t bits ;
46
+ uint8_t parity ;
47
+ uint8_t stop ;
48
+ uint32_t baudrate ;
45
49
uint16_t timeout ; // timeout waiting for first char (in ms)
46
50
uint16_t timeout_char ; // timeout waiting between chars (in ms)
47
51
} pyb_uart_obj_t ;
48
52
53
+ STATIC const char * _parity_name [] = {"None" , "1" , "0" };
54
+
49
55
/******************************************************************************/
50
56
// MicroPython bindings for UART
51
57
52
58
STATIC void pyb_uart_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
53
59
pyb_uart_obj_t * self = MP_OBJ_TO_PTR (self_in );
54
- mp_printf (print , "UART(%u, baudrate=%u, timeout=%u, timeout_char=%u)" ,
55
- self -> uart_id , UART_BAUDRATE , self -> timeout , self -> timeout_char );
60
+ mp_printf (print , "UART(%u, baudrate=%u, bits=%u, parity=%s, stop=%u, timeout=%u, timeout_char=%u)" ,
61
+ self -> uart_id , self -> baudrate , self -> bits , _parity_name [self -> parity ],
62
+ self -> stop , self -> timeout , self -> timeout_char );
56
63
}
57
64
58
65
STATIC void pyb_uart_init_helper (pyb_uart_obj_t * self , size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
59
- enum { ARG_timeout , ARG_timeout_char };
66
+ enum { ARG_baudrate , ARG_bits , ARG_parity , ARG_stop , ARG_timeout , ARG_timeout_char };
60
67
static const mp_arg_t allowed_args [] = {
61
- // { MP_QSTR_baudrate, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 9600 } },
62
- // { MP_QSTR_bits, MP_ARG_INT, {.u_int = 8 } },
63
- // { MP_QSTR_parity, MP_ARG_OBJ, {.u_obj = mp_const_none } },
64
- // { MP_QSTR_stop, MP_ARG_INT, {.u_int = 1 } },
68
+ { MP_QSTR_baudrate , MP_ARG_INT , {.u_int = 0 } },
69
+ { MP_QSTR_bits , MP_ARG_INT , {.u_int = 0 } },
70
+ { MP_QSTR_parity , MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
71
+ { MP_QSTR_stop , MP_ARG_INT , {.u_int = 0 } },
65
72
//{ MP_QSTR_tx, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
66
73
//{ MP_QSTR_rx, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
67
74
{ MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
@@ -70,16 +77,84 @@ STATIC void pyb_uart_init_helper(pyb_uart_obj_t *self, size_t n_args, const mp_o
70
77
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
71
78
mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
72
79
80
+ // set baudrate
81
+ if (args [ARG_baudrate ].u_int > 0 ) {
82
+ self -> baudrate = args [ARG_baudrate ].u_int ;
83
+ UartDev .baut_rate = self -> baudrate ; // Sic!
84
+ }
85
+
86
+ // set data bits
87
+ switch (args [ARG_bits ].u_int ) {
88
+ case 0 :
89
+ break ;
90
+ case 5 :
91
+ UartDev .data_bits = UART_FIVE_BITS ;
92
+ self -> bits = 5 ;
93
+ break ;
94
+ case 6 :
95
+ UartDev .data_bits = UART_SIX_BITS ;
96
+ self -> bits = 6 ;
97
+ break ;
98
+ case 7 :
99
+ UartDev .data_bits = UART_SEVEN_BITS ;
100
+ self -> bits = 7 ;
101
+ break ;
102
+ case 8 :
103
+ UartDev .data_bits = UART_EIGHT_BITS ;
104
+ self -> bits = 8 ;
105
+ break ;
106
+ default :
107
+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "invalid data bits" ));
108
+ break ;
109
+ }
110
+
111
+ // set parity
112
+ if (args [ARG_parity ].u_obj != MP_OBJ_NULL ) {
113
+ if (args [ARG_parity ].u_obj == mp_const_none ) {
114
+ UartDev .parity = UART_NONE_BITS ;
115
+ self -> parity = 0 ;
116
+ } else {
117
+ mp_int_t parity = mp_obj_get_int (args [ARG_parity ].u_obj );
118
+ if (parity & 1 ) {
119
+ UartDev .parity = UART_ODD_BITS ;
120
+ self -> parity = 1 ;
121
+ } else {
122
+ UartDev .parity = UART_EVEN_BITS ;
123
+ self -> parity = 2 ;
124
+ }
125
+ }
126
+ }
127
+
128
+ // set stop bits
129
+ switch (args [ARG_stop ].u_int ) {
130
+ case 0 :
131
+ break ;
132
+ case 1 :
133
+ UartDev .stop_bits = UART_ONE_STOP_BIT ;
134
+ self -> stop = 1 ;
135
+ break ;
136
+ case 2 :
137
+ UartDev .stop_bits = UART_TWO_STOP_BIT ;
138
+ self -> stop = 2 ;
139
+ break ;
140
+ default :
141
+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "invalid stop bits" ));
142
+ break ;
143
+ }
144
+
73
145
// set timeout
74
146
self -> timeout = args [ARG_timeout ].u_int ;
75
147
76
148
// set timeout_char
77
149
// make sure it is at least as long as a whole character (13 bits to be safe)
78
150
self -> timeout_char = args [ARG_timeout_char ].u_int ;
79
- uint32_t min_timeout_char = 13000 / UART_BAUDRATE + 1 ;
151
+ uint32_t min_timeout_char = 13000 / self -> baudrate + 1 ;
80
152
if (self -> timeout_char < min_timeout_char ) {
81
153
self -> timeout_char = min_timeout_char ;
82
154
}
155
+
156
+ // setup
157
+ uart_setup (self -> uart_id );
83
158
}
84
159
85
160
STATIC mp_obj_t pyb_uart_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * args ) {
@@ -95,6 +170,12 @@ STATIC mp_obj_t pyb_uart_make_new(const mp_obj_type_t *type, size_t n_args, size
95
170
pyb_uart_obj_t * self = m_new_obj (pyb_uart_obj_t );
96
171
self -> base .type = & pyb_uart_type ;
97
172
self -> uart_id = uart_id ;
173
+ self -> baudrate = 115200 ;
174
+ self -> bits = 8 ;
175
+ self -> parity = 0 ;
176
+ self -> stop = 1 ;
177
+ self -> timeout = 0 ;
178
+ self -> timeout_char = 0 ;
98
179
99
180
// init the peripheral
100
181
mp_map_t kw_args ;
0 commit comments