@@ -68,15 +68,15 @@ static const PinMap PinMap_UART_CTS[] = {
68
68
#define UART_MCR_CTSEN_MASK (1 << 7)
69
69
#define UART_MCR_FLOWCTRL_MASK (UART_MCR_RTSEN_MASK | UART_MCR_CTSEN_MASK)
70
70
71
- static uint32_t serial_irq_ids [UART_NUM ] = {0 };
72
71
static uart_irq_handler irq_handler ;
73
72
74
73
int stdio_uart_inited = 0 ;
75
74
serial_t stdio_uart ;
76
75
77
76
struct serial_global_data_s {
77
+ uint32_t serial_irq_id ;
78
78
gpio_t sw_rts , sw_cts ;
79
- uint8_t count , initialized , rx_irq_set_flow , rx_irq_set_api ;
79
+ uint8_t rx_irq_set_flow , rx_irq_set_api ;
80
80
};
81
81
82
82
static struct serial_global_data_s uart_data [UART_NUM ];
@@ -130,11 +130,9 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
130
130
case UART_2 : obj -> index = 2 ; break ;
131
131
case UART_3 : obj -> index = 3 ; break ;
132
132
}
133
- if (!uart_data [obj -> index ].initialized ) {
134
- uart_data [obj -> index ].sw_rts .pin = NC ;
135
- uart_data [obj -> index ].sw_cts .pin = NC ;
136
- uart_data [obj -> index ].initialized = 1 ;
137
- }
133
+ uart_data [obj -> index ].sw_rts .pin = NC ;
134
+ uart_data [obj -> index ].sw_cts .pin = NC ;
135
+ serial_set_flow_control (obj , FlowControlNone , NC , NC );
138
136
139
137
is_stdio_uart = (uart == STDIO_UART ) ? (1 ) : (0 );
140
138
@@ -145,7 +143,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
145
143
}
146
144
147
145
void serial_free (serial_t * obj ) {
148
- serial_irq_ids [obj -> index ] = 0 ;
146
+ uart_data [obj -> index ]. serial_irq_id = 0 ;
149
147
}
150
148
151
149
// serial_baud
@@ -262,15 +260,15 @@ static inline void uart_irq(uint32_t iir, uint32_t index, LPC_UART_TypeDef *puar
262
260
case 2 : irq_type = RxIrq ; break ;
263
261
default : return ;
264
262
}
265
-
266
263
if ((RxIrq == irq_type ) && (NC != uart_data [index ].sw_rts .pin )) {
267
264
gpio_write (& uart_data [index ].sw_rts , 1 );
268
265
// Disable interrupt if it wasn't enabled by other part of the application
269
266
if (!uart_data [index ].rx_irq_set_api )
270
267
puart -> IER &= ~(1 << RxIrq );
271
268
}
272
- if (serial_irq_ids [index ] != 0 )
273
- irq_handler (serial_irq_ids [index ], irq_type );
269
+ if (uart_data [index ].serial_irq_id != 0 )
270
+ if ((irq_type != RxIrq ) || (uart_data [index ].rx_irq_set_api ))
271
+ irq_handler (uart_data [index ].serial_irq_id , irq_type );
274
272
}
275
273
276
274
void uart0_irq () {uart_irq ((LPC_UART0 -> IIR >> 1 ) & 0x7 , 0 , (LPC_UART_TypeDef * )LPC_UART0 );}
@@ -280,7 +278,7 @@ void uart3_irq() {uart_irq((LPC_UART3->IIR >> 1) & 0x7, 3, (LPC_UART_TypeDef*)LP
280
278
281
279
void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id ) {
282
280
irq_handler = handler ;
283
- serial_irq_ids [obj -> index ] = id ;
281
+ uart_data [obj -> index ]. serial_irq_id = id ;
284
282
}
285
283
286
284
static void serial_irq_set_internal (serial_t * obj , SerialIrq irq , uint32_t enable ) {
@@ -334,7 +332,6 @@ int serial_getc(serial_t *obj) {
334
332
void serial_putc (serial_t * obj , int c ) {
335
333
while (!serial_writable (obj ));
336
334
obj -> uart -> THR = c ;
337
- uart_data [obj -> index ].count ++ ;
338
335
}
339
336
340
337
int serial_readable (serial_t * obj ) {
@@ -345,12 +342,8 @@ int serial_writable(serial_t *obj) {
345
342
int isWritable = 1 ;
346
343
if (NC != uart_data [obj -> index ].sw_cts .pin )
347
344
isWritable = gpio_read (& uart_data [obj -> index ].sw_cts ) == 0 ;
348
- if (isWritable ) {
349
- if (obj -> uart -> LSR & 0x20 )
350
- uart_data [obj -> index ].count = 0 ;
351
- else if (uart_data [obj -> index ].count >= 16 )
352
- isWritable = 0 ;
353
- }
345
+ if (isWritable )
346
+ isWritable = obj -> uart -> LSR & 0x40 ;
354
347
return isWritable ;
355
348
}
356
349
@@ -393,6 +386,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
393
386
if ((UART_1 == uart_cts ) && (NULL != uart1 )) {
394
387
// Enable auto-CTS mode
395
388
uart1 -> MCR |= UART_MCR_CTSEN_MASK ;
389
+ pinmap_pinout (txflow , PinMap_UART_CTS );
396
390
} else {
397
391
// Can't enable in hardware, use software emulation
398
392
gpio_init (& uart_data [index ].sw_cts , txflow , PIN_INPUT );
@@ -408,6 +402,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
408
402
if ((UART_1 == uart_rts ) && (NULL != uart1 )) {
409
403
// Enable auto-RTS mode
410
404
uart1 -> MCR |= UART_MCR_RTSEN_MASK ;
405
+ pinmap_pinout (rxflow , PinMap_UART_RTS );
411
406
} else { // can't enable in hardware, use software emulation
412
407
gpio_init (& uart_data [index ].sw_rts , rxflow , PIN_OUTPUT );
413
408
gpio_write (& uart_data [index ].sw_rts , 0 );
0 commit comments