@@ -76,7 +76,7 @@ serial_t stdio_uart;
76
76
77
77
struct serial_global_data_s {
78
78
gpio_t sw_rts , sw_cts ;
79
- uint8_t count , initialized , irq_set_flow , irq_set_api ;
79
+ uint8_t count , initialized , rx_irq_set_flow , rx_irq_set_api ;
80
80
};
81
81
82
82
static struct serial_global_data_s uart_data [UART_NUM ];
@@ -254,7 +254,7 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
254
254
/******************************************************************************
255
255
* INTERRUPTS HANDLING
256
256
******************************************************************************/
257
- static inline void uart_irq (uint32_t iir , uint32_t index ) {
257
+ static inline void uart_irq (uint32_t iir , uint32_t index , LPC_UART_TypeDef * puart ) {
258
258
// [Chapter 14] LPC17xx UART0/2/3: UARTn Interrupt Handling
259
259
SerialIrq irq_type ;
260
260
switch (iir ) {
@@ -263,16 +263,20 @@ static inline void uart_irq(uint32_t iir, uint32_t index) {
263
263
default : return ;
264
264
}
265
265
266
- if ((RxIrq == irq_type ) && (uart_data [index ].sw_rts .pin != NC ))
266
+ if ((RxIrq == irq_type ) && (NC != uart_data [index ].sw_rts .pin )) {
267
267
gpio_write (& uart_data [index ].sw_rts , 1 );
268
+ // Disable interrupt if it wasn't enabled by other part of the application
269
+ if (!uart_data [index ].rx_irq_set_api )
270
+ puart -> IER &= ~(1 << RxIrq );
271
+ }
268
272
if (serial_irq_ids [index ] != 0 )
269
273
irq_handler (serial_irq_ids [index ], irq_type );
270
274
}
271
275
272
- void uart0_irq () {uart_irq ((LPC_UART0 -> IIR >> 1 ) & 0x7 , 0 );}
273
- void uart1_irq () {uart_irq ((LPC_UART1 -> IIR >> 1 ) & 0x7 , 1 );}
274
- void uart2_irq () {uart_irq ((LPC_UART2 -> IIR >> 1 ) & 0x7 , 2 );}
275
- void uart3_irq () {uart_irq ((LPC_UART3 -> IIR >> 1 ) & 0x7 , 3 );}
276
+ void uart0_irq () {uart_irq ((LPC_UART0 -> IIR >> 1 ) & 0x7 , 0 , ( LPC_UART_TypeDef * ) LPC_UART0 );}
277
+ void uart1_irq () {uart_irq ((LPC_UART1 -> IIR >> 1 ) & 0x7 , 1 , ( LPC_UART_TypeDef * ) LPC_UART1 );}
278
+ void uart2_irq () {uart_irq ((LPC_UART2 -> IIR >> 1 ) & 0x7 , 2 , ( LPC_UART_TypeDef * ) LPC_UART2 );}
279
+ void uart3_irq () {uart_irq ((LPC_UART3 -> IIR >> 1 ) & 0x7 , 3 , ( LPC_UART_TypeDef * ) LPC_UART3 );}
276
280
277
281
void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id ) {
278
282
irq_handler = handler ;
@@ -293,7 +297,7 @@ static void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enabl
293
297
obj -> uart -> IER |= 1 << irq ;
294
298
NVIC_SetVector (irq_n , vector );
295
299
NVIC_EnableIRQ (irq_n );
296
- } else if (uart_data [obj -> index ].irq_set_api + uart_data [obj -> index ].irq_set_flow == 0 ) { // disable
300
+ } else if (( TxIrq == irq ) || ( uart_data [obj -> index ].rx_irq_set_api + uart_data [obj -> index ].rx_irq_set_flow == 0 ) ) { // disable
297
301
int all_disabled = 0 ;
298
302
SerialIrq other_irq = (irq == RxIrq ) ? (TxIrq ) : (RxIrq );
299
303
obj -> uart -> IER &= ~(1 << irq );
@@ -304,23 +308,27 @@ static void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enabl
304
308
}
305
309
306
310
void serial_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable ) {
307
- uart_data [obj -> index ].irq_set_api = enable ;
311
+ if (RxIrq == irq )
312
+ uart_data [obj -> index ].rx_irq_set_api = enable ;
308
313
serial_irq_set_internal (obj , irq , enable );
309
314
}
310
315
311
- static void serial_flow_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable ) {
312
- uart_data [obj -> index ].irq_set_flow = enable ;
313
- serial_irq_set_internal (obj , irq , enable );
316
+ static void serial_flow_irq_set (serial_t * obj , uint32_t enable ) {
317
+ uart_data [obj -> index ].rx_irq_set_flow = enable ;
318
+ serial_irq_set_internal (obj , RxIrq , enable );
314
319
}
315
320
316
321
/******************************************************************************
317
322
* READ/WRITE
318
323
******************************************************************************/
319
324
int serial_getc (serial_t * obj ) {
320
325
while (!serial_readable (obj ));
321
- if (NC != uart_data [obj -> index ].sw_rts .pin )
326
+ int data = obj -> uart -> RBR ;
327
+ if (NC != uart_data [obj -> index ].sw_rts .pin ) {
322
328
gpio_write (& uart_data [obj -> index ].sw_rts , 0 );
323
- return obj -> uart -> RBR ;
329
+ obj -> uart -> IER |= 1 << RxIrq ;
330
+ }
331
+ return data ;
324
332
}
325
333
326
334
void serial_putc (serial_t * obj , int c ) {
@@ -373,8 +381,8 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
373
381
// First, disable flow control completely
374
382
if (uart1 )
375
383
uart1 -> MCR = uart1 -> MCR & ~UART_MCR_FLOWCTRL_MASK ;
376
- serial_flow_irq_set (obj , RxIrq , 0 );
377
384
uart_data [index ].sw_rts .pin = uart_data [index ].sw_cts .pin = NC ;
385
+ serial_flow_irq_set (obj , 0 );
378
386
if (FlowControlNone == type )
379
387
return ;
380
388
// Check type(s) of flow control to use
@@ -404,7 +412,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
404
412
gpio_init (& uart_data [index ].sw_rts , rxflow , PIN_OUTPUT );
405
413
gpio_write (& uart_data [index ].sw_rts , 0 );
406
414
// Enable RX interrupt
407
- serial_flow_irq_set (obj , RxIrq , 1 );
415
+ serial_flow_irq_set (obj , 1 );
408
416
}
409
417
}
410
418
}
0 commit comments