48
48
MXC_F_UART_INTFL_RX_FIFO_OVERFLOW)
49
49
50
50
// Variables for managing the stdio UART
51
- int stdio_uart_inited ;
52
- serial_t stdio_uart ;
51
+ int stdio_uart_inited = 0 ;
52
+ serial_t stdio_uart = { 0 } ;
53
53
54
54
// Variables for interrupt driven
55
55
static uart_irq_handler irq_handler ;
@@ -75,12 +75,6 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
75
75
obj -> index = MXC_UART_GET_IDX (obj -> uart );
76
76
obj -> fifo = (mxc_uart_fifo_regs_t * )MXC_UART_GET_BASE_FIFO (obj -> index );
77
77
78
- // Manage stdio UART
79
- if (uart == STDIO_UART ) {
80
- stdio_uart_inited = 1 ;
81
- memcpy (& stdio_uart , obj , sizeof (serial_t ));
82
- }
83
-
84
78
// Record the pins requested
85
79
obj -> tx = tx ;
86
80
obj -> rx = rx ;
@@ -111,6 +105,12 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
111
105
obj -> cfg .size = UART_DATA_SIZE_8_BITS ;
112
106
obj -> cfg .parity = UART_PARITY_DISABLE ;
113
107
108
+ // Manage stdio UART
109
+ if (uart == STDIO_UART ) {
110
+ stdio_uart_inited = 1 ;
111
+ stdio_uart = * obj ;
112
+ }
113
+
114
114
int retval = UART_Init (obj -> uart , & obj -> cfg , & obj -> sys_cfg );
115
115
MBED_ASSERT (retval == E_NO_ERROR );
116
116
}
@@ -181,7 +181,16 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
181
181
void uart_handler (serial_t * obj )
182
182
{
183
183
if (obj && obj -> id ) {
184
- irq_handler (obj -> id , RxIrq );
184
+ // Check for errors or RX Threshold
185
+ if (obj -> uart -> intfl & (MXC_F_UART_INTFL_RX_FIFO_NOT_EMPTY | UART_ERRORS )) {
186
+ irq_handler (obj -> id , RxIrq );
187
+ obj -> uart -> intfl = (MXC_F_UART_INTFL_RX_FIFO_NOT_EMPTY | UART_ERRORS );
188
+ }
189
+ // Check for TX Threshold
190
+ if (obj -> uart -> intfl & MXC_F_UART_INTFL_TX_FIFO_AE ) {
191
+ irq_handler (obj -> id , TxIrq );
192
+ obj -> uart -> intfl = MXC_F_UART_INTFL_TX_FIFO_AE ;
193
+ }
185
194
}
186
195
}
187
196
@@ -199,6 +208,9 @@ void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
199
208
//******************************************************************************
200
209
void serial_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable )
201
210
{
211
+ MBED_ASSERT (obj -> index < MXC_CFG_UART_INSTANCES );
212
+ objs [obj -> index ] = obj ;
213
+
202
214
switch (obj -> index ) {
203
215
case 0 :
204
216
NVIC_SetVector (UART0_IRQn , (uint32_t )uart0_handler );
@@ -250,7 +262,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
250
262
//******************************************************************************
251
263
int serial_getc (serial_t * obj )
252
264
{
253
- int c = 0 ;
265
+ int c = -1 ;
254
266
255
267
if (obj -> rx != NC ) {
256
268
// Wait for data to be available
0 commit comments