From 0c33d40fbb462438af65bbe2d36e6d846b4d8bf3 Mon Sep 17 00:00:00 2001 From: Bogdan Marinescu Date: Wed, 17 Jul 2013 15:29:39 +0300 Subject: [PATCH] Added support for UART break generation. --- libraries/mbed/api/Serial.h | 5 +++++ libraries/mbed/common/Serial.cpp | 17 +++++++++++++++++ libraries/mbed/hal/serial_api.h | 3 +++ .../TARGET_Freescale/TARGET_KL05Z/serial_api.c | 9 +++++++++ .../TARGET_Freescale/TARGET_KL25Z/serial_api.c | 9 +++++++++ .../hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.c | 9 +++++++++ .../hal/TARGET_NXP/TARGET_LPC13XX/serial_api.c | 9 +++++++++ .../hal/TARGET_NXP/TARGET_LPC176X/serial_api.c | 9 +++++++++ .../hal/TARGET_NXP/TARGET_LPC23XX/serial_api.c | 9 +++++++++ .../hal/TARGET_NXP/TARGET_LPC408X/serial_api.c | 9 +++++++++ .../hal/TARGET_NXP/TARGET_LPC43XX/serial_api.c | 9 +++++++++ .../hal/TARGET_NXP/TARGET_LPC81X/serial_api.c | 11 +++++++++++ 12 files changed, 108 insertions(+) diff --git a/libraries/mbed/api/Serial.h b/libraries/mbed/api/Serial.h index 7c7b39e84b..2d830fb608 100644 --- a/libraries/mbed/api/Serial.h +++ b/libraries/mbed/api/Serial.h @@ -121,6 +121,10 @@ public: } } + /** Generate a break condition on the serial line + */ + void send_break(); + static void _irq_handler(uint32_t id, SerialIrq irq_type); protected: @@ -129,6 +133,7 @@ protected: serial_t _serial; FunctionPointer _irq[2]; + int _baud; }; } // namespace mbed diff --git a/libraries/mbed/common/Serial.cpp b/libraries/mbed/common/Serial.cpp index fe7dcef745..eb20350722 100644 --- a/libraries/mbed/common/Serial.cpp +++ b/libraries/mbed/common/Serial.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ #include "Serial.h" +#include "wait_api.h" #if DEVICE_SERIAL @@ -21,11 +22,13 @@ namespace mbed { Serial::Serial(PinName tx, PinName rx, const char *name) : Stream(name) { serial_init(&_serial, tx, rx); + _baud = 9600; serial_irq_handler(&_serial, Serial::_irq_handler, (uint32_t)this); } void Serial::baud(int baudrate) { serial_baud(&_serial, baudrate); + _baud = baudrate; } void Serial::format(int bits, Parity parity, int stop_bits) { @@ -65,6 +68,20 @@ int Serial::_putc(int c) { return c; } +void Serial::send_break() { + // Wait for 1.5 frames before clearing the break condition + // This will have different effects on our platforms, but should + // ensure that we keep the break active for at least one frame. + // We consider a full frame (1 start bit + 8 data bits bits + + // 1 parity bit + 2 stop bits = 12 bits) for computation. + // One bit time (in us) = 1000000/_baud + // Twelve bits: 12000000/baud delay + // 1.5 frames: 18000000/baud delay + serial_break_set(&_serial); + wait_us(18000000/_baud); + serial_break_clear(&_serial); +} + } // namespace mbed #endif diff --git a/libraries/mbed/hal/serial_api.h b/libraries/mbed/hal/serial_api.h index c93fc347c4..60a3d0243d 100644 --- a/libraries/mbed/hal/serial_api.h +++ b/libraries/mbed/hal/serial_api.h @@ -55,6 +55,9 @@ int serial_readable (serial_t *obj); int serial_writable (serial_t *obj); void serial_clear (serial_t *obj); +void serial_break_set (serial_t *obj); +void serial_break_clear(serial_t *obj); + void serial_pinout_tx(PinName tx); #ifdef __cplusplus diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL05Z/serial_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL05Z/serial_api.c index 94b6047af7..2b39712f43 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL05Z/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL05Z/serial_api.c @@ -277,3 +277,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->C2 |= UART0_C2_SBK_MASK; +} + +void serial_break_clear(serial_t *obj) { + obj->uart->C2 &= ~UART0_C2_SBK_MASK; +} + diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/serial_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/serial_api.c index 7a8ac4e162..f20361bec3 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/serial_api.c @@ -294,3 +294,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->C2 |= UART_C2_SBK_MASK; +} + +void serial_break_clear(serial_t *obj) { + obj->uart->C2 &= ~UART_C2_SBK_MASK; +} + diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.c index c491ffea9c..ec62bda434 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.c @@ -271,3 +271,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->LCR |= (1 << 6); +} + +void serial_break_clear(serial_t *obj) { + obj->uart->LCR &= ~(1 << 6); +} + diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC13XX/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC13XX/serial_api.c index c82e3869ff..af61d230bb 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC13XX/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC13XX/serial_api.c @@ -271,3 +271,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->LCR |= (1 << 6); +} + +void serial_break_clear(serial_t *obj) { + obj->uart->LCR &= ~(1 << 6); +} + diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c index fad6da2452..f62fcaab63 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c @@ -307,3 +307,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->LCR |= (1 << 6); +} + +void serial_break_clear(serial_t *obj) { + obj->uart->LCR &= ~(1 << 6); +} + diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC23XX/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC23XX/serial_api.c index fad6da2452..f62fcaab63 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC23XX/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC23XX/serial_api.c @@ -307,3 +307,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->LCR |= (1 << 6); +} + +void serial_break_clear(serial_t *obj) { + obj->uart->LCR &= ~(1 << 6); +} + diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC408X/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC408X/serial_api.c index 88c544db07..a59876bcd3 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC408X/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC408X/serial_api.c @@ -300,3 +300,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->LCR |= (1 << 6); +} + +void serial_break_clear(serial_t *obj) { + obj->uart->LCR &= ~(1 << 6); +} + diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC43XX/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC43XX/serial_api.c index f402d9969d..2ab2c4b6e6 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC43XX/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC43XX/serial_api.c @@ -281,3 +281,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); } + +void serial_break_set(serial_t *obj) { + obj->uart->LCR |= (1 << 6); +} + +void serial_break_clear(serial_t *obj) { + obj->uart->LCR &= ~(1 << 6); +} + diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/serial_api.c index f5afea4b20..9a98f82e87 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/serial_api.c @@ -59,6 +59,8 @@ static int get_available_uart(void) { #define RXRDY (0x01<<0) #define TXRDY (0x01<<2) +#define TXBRKEN (0x01<<1) + static uint32_t UARTSysClk; static uint32_t serial_irq_ids[UART_NUM] = {0}; @@ -267,3 +269,12 @@ void serial_clear(serial_t *obj) { void serial_pinout_tx(PinName tx) { } + +void serial_break_set(serial_t *obj) { + obj->uart->CTRL |= TXBRKEN; +} + +void serial_break_clear(serial_t *obj) { + obj->uart->CTRL &= ~TXBRKEN; +} +