Added support for UART break generation.

pull/17/head
Bogdan Marinescu 2013-07-17 15:29:39 +03:00
parent 0af919a5e9
commit 0c33d40fbb
12 changed files with 108 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}