mirror of https://github.com/ARMmbed/mbed-os.git
Added support for UART break generation.
parent
0af919a5e9
commit
0c33d40fbb
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue