mirror of https://github.com/ARMmbed/mbed-os.git
Merge branch 'master' of https://github.com/mbedmicro/mbed
commit
b95ba7a52a
|
@ -76,7 +76,7 @@ serial_t stdio_uart;
|
||||||
struct serial_global_data_s {
|
struct serial_global_data_s {
|
||||||
uint32_t serial_irq_id;
|
uint32_t serial_irq_id;
|
||||||
gpio_t sw_rts, sw_cts;
|
gpio_t sw_rts, sw_cts;
|
||||||
uint8_t rx_irq_set_flow, rx_irq_set_api;
|
uint8_t count, rx_irq_set_flow, rx_irq_set_api;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct serial_global_data_s uart_data[UART_NUM];
|
static struct serial_global_data_s uart_data[UART_NUM];
|
||||||
|
@ -100,7 +100,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
|
||||||
case UART_2: LPC_SC->PCONP |= 1 << 24; break;
|
case UART_2: LPC_SC->PCONP |= 1 << 24; break;
|
||||||
case UART_3: LPC_SC->PCONP |= 1 << 25; break;
|
case UART_3: LPC_SC->PCONP |= 1 << 25; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// enable fifos and default rx trigger level
|
// enable fifos and default rx trigger level
|
||||||
obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled
|
obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled
|
||||||
| 0 << 1 // Rx Fifo Reset
|
| 0 << 1 // Rx Fifo Reset
|
||||||
|
@ -357,6 +357,7 @@ int serial_getc(serial_t *obj) {
|
||||||
void serial_putc(serial_t *obj, int c) {
|
void serial_putc(serial_t *obj, int c) {
|
||||||
while (!serial_writable(obj));
|
while (!serial_writable(obj));
|
||||||
obj->uart->THR = c;
|
obj->uart->THR = c;
|
||||||
|
uart_data[obj->index].count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
int serial_readable(serial_t *obj) {
|
int serial_readable(serial_t *obj) {
|
||||||
|
@ -364,10 +365,16 @@ int serial_readable(serial_t *obj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int serial_writable(serial_t *obj) {
|
int serial_writable(serial_t *obj) {
|
||||||
|
int isWritable = 1;
|
||||||
if (NC != uart_data[obj->index].sw_cts.pin)
|
if (NC != uart_data[obj->index].sw_cts.pin)
|
||||||
return (gpio_read(&uart_data[obj->index].sw_cts) == 0) && (obj->uart->LSR & 0x40); //If flow control: writable if CTS low + UART done
|
isWritable = (gpio_read(&uart_data[obj->index].sw_cts) == 0) && (obj->uart->LSR & 0x40); //If flow control: writable if CTS low + UART done
|
||||||
else
|
else {
|
||||||
return obj->uart->LSR & 0x20; //No flow control: writable if space in holding register
|
if (obj->uart->LSR & 0x20)
|
||||||
|
uart_data[obj->index].count = 0;
|
||||||
|
else if (uart_data[obj->index].count >= 16)
|
||||||
|
isWritable = 0;
|
||||||
|
}
|
||||||
|
return isWritable;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serial_clear(serial_t *obj) {
|
void serial_clear(serial_t *obj) {
|
||||||
|
|
Loading…
Reference in New Issue