@@ -8,16 +8,18 @@ typedef struct OpenTitanUart open_titan_uart_t;
8
8
typedef struct _machine_uart_obj_t {
9
9
mp_obj_base_t base ;
10
10
volatile open_titan_uart_t * uart_block ;
11
+ uint32_t timeout_ms ;
12
+ uint32_t char_timeout_ms ;
11
13
} machine_uart_obj_t ;
12
14
13
15
16
+ extern void uart_init (volatile open_titan_uart_t * block , uint32_t baudrate );
14
17
extern uint8_t uart_get_rx_level (volatile open_titan_uart_t * block );
15
18
extern uint8_t uart_get_tx_level (volatile open_titan_uart_t * block );
16
19
extern bool uart_is_readable (volatile open_titan_uart_t * block );
17
20
extern bool uart_is_writable (volatile open_titan_uart_t * block );
18
- extern uint8_t uart_read (volatile open_titan_uart_t * block );
21
+ extern bool uart_read (volatile open_titan_uart_t * block , uint8_t * out , uint32_t timeout_ms );
19
22
extern void uart_write (volatile open_titan_uart_t * block , uint8_t data );
20
- extern void uart_init (volatile open_titan_uart_t * block , uint32_t baudrate );
21
23
22
24
volatile open_titan_uart_t * get_uart_block (uint32_t id ) {
23
25
switch (id )
@@ -49,8 +51,8 @@ static void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
49
51
{ MP_QSTR_rx , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
50
52
{ MP_QSTR_cts , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
51
53
{ MP_QSTR_rts , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
52
- { MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
53
- { MP_QSTR_timeout_char , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
54
+ { MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 100 } },
55
+ { MP_QSTR_timeout_char , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 100 } },
54
56
{ MP_QSTR_invert , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
55
57
{ MP_QSTR_flow , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
56
58
{ MP_QSTR_txbuf , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 32 } },
@@ -84,11 +86,6 @@ static void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
84
86
mp_raise_ValueError ("rx buffer is 64 bytes long" );
85
87
}
86
88
87
- if (args [ARG_timeout ].u_int != -1 ||
88
- args [ARG_timeout_char ].u_int != -1 ) {
89
- mp_raise_NotImplementedError ("UART Timeouts not implemented" );
90
- }
91
-
92
89
if (args [ARG_invert ].u_int != -1 ) {
93
90
mp_raise_NotImplementedError ("UART invert not implemented" );
94
91
}
@@ -103,6 +100,9 @@ static void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
103
100
// parity = mp_obj_get_int(args[ARG_parity].u_obj);
104
101
}
105
102
103
+ self -> timeout_ms = args [ARG_timeout ].u_int ;
104
+ self -> char_timeout_ms = args [ARG_timeout_char ].u_int ;
105
+
106
106
uint32_t baudrate = args [ARG_baudrate ].u_int ;
107
107
uart_init (self -> uart_block , baudrate );
108
108
}
@@ -141,24 +141,34 @@ static bool mp_machine_uart_txdone(machine_uart_obj_t *self) {
141
141
142
142
static mp_uint_t mp_machine_uart_read (mp_obj_t self_in , void * buf_in , mp_uint_t size , int * errcode ) {
143
143
machine_uart_obj_t * self = MP_OBJ_TO_PTR (self_in );
144
-
145
- uint8_t * dest = buf_in ;
144
+ uint8_t * dest = (uint8_t * )buf_in ;
146
145
147
146
for (size_t i = 0 ; i < size ; i ++ ) {
148
- dest [i ] = uart_read (self -> uart_block );
147
+ uint32_t timeout = (i == 0 ? self -> timeout_ms :self -> char_timeout_ms );
148
+ if (!uart_read (self -> uart_block , & dest [i ], timeout )) {
149
+ for (size_t x = 0 ; x < size ; x ++ ) {
150
+ }
151
+ if (i <= 0 ) {
152
+ * errcode = MP_EAGAIN ;
153
+ return MP_STREAM_ERROR ;
154
+ } else {
155
+ return i ;
156
+ }
157
+ }
158
+
149
159
}
150
160
return size ;
151
161
}
152
162
153
163
154
164
static mp_uint_t mp_machine_uart_write (mp_obj_t self_in , const void * buf_in , mp_uint_t size , int * errcode ) {
155
165
machine_uart_obj_t * self = MP_OBJ_TO_PTR (self_in );
156
-
157
166
uint8_t * data = (uint8_t * )buf_in ;
158
167
159
168
for (size_t i = 0 ; i < size ; i ++ ) {
160
169
uart_write (self -> uart_block , data [i ]);
161
170
}
171
+
162
172
return size ;
163
173
}
164
174
0 commit comments