4848 MXC_F_UART_INTFL_RX_FIFO_OVERFLOW)
4949
5050// 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 } ;
5353
5454// Variables for interrupt driven
5555static uart_irq_handler irq_handler ;
@@ -75,12 +75,6 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
7575 obj -> index = MXC_UART_GET_IDX (obj -> uart );
7676 obj -> fifo = (mxc_uart_fifo_regs_t * )MXC_UART_GET_BASE_FIFO (obj -> index );
7777
78- // Manage stdio UART
79- if (uart == STDIO_UART ) {
80- stdio_uart_inited = 1 ;
81- memcpy (& stdio_uart , obj , sizeof (serial_t ));
82- }
83-
8478 // Record the pins requested
8579 obj -> tx = tx ;
8680 obj -> rx = rx ;
@@ -111,6 +105,12 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
111105 obj -> cfg .size = UART_DATA_SIZE_8_BITS ;
112106 obj -> cfg .parity = UART_PARITY_DISABLE ;
113107
108+ // Manage stdio UART
109+ if (uart == STDIO_UART ) {
110+ stdio_uart_inited = 1 ;
111+ stdio_uart = * obj ;
112+ }
113+
114114 int retval = UART_Init (obj -> uart , & obj -> cfg , & obj -> sys_cfg );
115115 MBED_ASSERT (retval == E_NO_ERROR );
116116}
@@ -181,7 +181,16 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
181181void uart_handler (serial_t * obj )
182182{
183183 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+ }
185194 }
186195}
187196
@@ -199,6 +208,9 @@ void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
199208//******************************************************************************
200209void serial_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable )
201210{
211+ MBED_ASSERT (obj -> index < MXC_CFG_UART_INSTANCES );
212+ objs [obj -> index ] = obj ;
213+
202214 switch (obj -> index ) {
203215 case 0 :
204216 NVIC_SetVector (UART0_IRQn , (uint32_t )uart0_handler );
@@ -250,7 +262,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
250262//******************************************************************************
251263int serial_getc (serial_t * obj )
252264{
253- int c = 0 ;
265+ int c = -1 ;
254266
255267 if (obj -> rx != NC ) {
256268 // Wait for data to be available
0 commit comments