Skip to content

Commit 0c33d40

Browse files
author
Bogdan Marinescu
committed
Added support for UART break generation.
1 parent 0af919a commit 0c33d40

File tree

12 files changed

+108
-0
lines changed

12 files changed

+108
-0
lines changed

libraries/mbed/api/Serial.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ class Serial : public Stream {
121121
}
122122
}
123123

124+
/** Generate a break condition on the serial line
125+
*/
126+
void send_break();
127+
124128
static void _irq_handler(uint32_t id, SerialIrq irq_type);
125129

126130
protected:
@@ -129,6 +133,7 @@ class Serial : public Stream {
129133

130134
serial_t _serial;
131135
FunctionPointer _irq[2];
136+
int _baud;
132137
};
133138

134139
} // namespace mbed

libraries/mbed/common/Serial.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,21 @@
1414
* limitations under the License.
1515
*/
1616
#include "Serial.h"
17+
#include "wait_api.h"
1718

1819
#if DEVICE_SERIAL
1920

2021
namespace mbed {
2122

2223
Serial::Serial(PinName tx, PinName rx, const char *name) : Stream(name) {
2324
serial_init(&_serial, tx, rx);
25+
_baud = 9600;
2426
serial_irq_handler(&_serial, Serial::_irq_handler, (uint32_t)this);
2527
}
2628

2729
void Serial::baud(int baudrate) {
2830
serial_baud(&_serial, baudrate);
31+
_baud = baudrate;
2932
}
3033

3134
void Serial::format(int bits, Parity parity, int stop_bits) {
@@ -65,6 +68,20 @@ int Serial::_putc(int c) {
6568
return c;
6669
}
6770

71+
void Serial::send_break() {
72+
// Wait for 1.5 frames before clearing the break condition
73+
// This will have different effects on our platforms, but should
74+
// ensure that we keep the break active for at least one frame.
75+
// We consider a full frame (1 start bit + 8 data bits bits +
76+
// 1 parity bit + 2 stop bits = 12 bits) for computation.
77+
// One bit time (in us) = 1000000/_baud
78+
// Twelve bits: 12000000/baud delay
79+
// 1.5 frames: 18000000/baud delay
80+
serial_break_set(&_serial);
81+
wait_us(18000000/_baud);
82+
serial_break_clear(&_serial);
83+
}
84+
6885
} // namespace mbed
6986

7087
#endif

libraries/mbed/hal/serial_api.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ int serial_readable (serial_t *obj);
5555
int serial_writable (serial_t *obj);
5656
void serial_clear (serial_t *obj);
5757

58+
void serial_break_set (serial_t *obj);
59+
void serial_break_clear(serial_t *obj);
60+
5861
void serial_pinout_tx(PinName tx);
5962

6063
#ifdef __cplusplus

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL05Z/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,12 @@ void serial_clear(serial_t *obj) {
277277
void serial_pinout_tx(PinName tx) {
278278
pinmap_pinout(tx, PinMap_UART_TX);
279279
}
280+
281+
void serial_break_set(serial_t *obj) {
282+
obj->uart->C2 |= UART0_C2_SBK_MASK;
283+
}
284+
285+
void serial_break_clear(serial_t *obj) {
286+
obj->uart->C2 &= ~UART0_C2_SBK_MASK;
287+
}
288+

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,12 @@ void serial_clear(serial_t *obj) {
294294
void serial_pinout_tx(PinName tx) {
295295
pinmap_pinout(tx, PinMap_UART_TX);
296296
}
297+
298+
void serial_break_set(serial_t *obj) {
299+
obj->uart->C2 |= UART_C2_SBK_MASK;
300+
}
301+
302+
void serial_break_clear(serial_t *obj) {
303+
obj->uart->C2 &= ~UART_C2_SBK_MASK;
304+
}
305+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,12 @@ void serial_clear(serial_t *obj) {
271271
void serial_pinout_tx(PinName tx) {
272272
pinmap_pinout(tx, PinMap_UART_TX);
273273
}
274+
275+
void serial_break_set(serial_t *obj) {
276+
obj->uart->LCR |= (1 << 6);
277+
}
278+
279+
void serial_break_clear(serial_t *obj) {
280+
obj->uart->LCR &= ~(1 << 6);
281+
}
282+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC13XX/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,12 @@ void serial_clear(serial_t *obj) {
271271
void serial_pinout_tx(PinName tx) {
272272
pinmap_pinout(tx, PinMap_UART_TX);
273273
}
274+
275+
void serial_break_set(serial_t *obj) {
276+
obj->uart->LCR |= (1 << 6);
277+
}
278+
279+
void serial_break_clear(serial_t *obj) {
280+
obj->uart->LCR &= ~(1 << 6);
281+
}
282+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,12 @@ void serial_clear(serial_t *obj) {
307307
void serial_pinout_tx(PinName tx) {
308308
pinmap_pinout(tx, PinMap_UART_TX);
309309
}
310+
311+
void serial_break_set(serial_t *obj) {
312+
obj->uart->LCR |= (1 << 6);
313+
}
314+
315+
void serial_break_clear(serial_t *obj) {
316+
obj->uart->LCR &= ~(1 << 6);
317+
}
318+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC23XX/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,12 @@ void serial_clear(serial_t *obj) {
307307
void serial_pinout_tx(PinName tx) {
308308
pinmap_pinout(tx, PinMap_UART_TX);
309309
}
310+
311+
void serial_break_set(serial_t *obj) {
312+
obj->uart->LCR |= (1 << 6);
313+
}
314+
315+
void serial_break_clear(serial_t *obj) {
316+
obj->uart->LCR &= ~(1 << 6);
317+
}
318+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC408X/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,12 @@ void serial_clear(serial_t *obj) {
300300
void serial_pinout_tx(PinName tx) {
301301
pinmap_pinout(tx, PinMap_UART_TX);
302302
}
303+
304+
void serial_break_set(serial_t *obj) {
305+
obj->uart->LCR |= (1 << 6);
306+
}
307+
308+
void serial_break_clear(serial_t *obj) {
309+
obj->uart->LCR &= ~(1 << 6);
310+
}
311+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC43XX/serial_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,3 +281,12 @@ void serial_clear(serial_t *obj) {
281281
void serial_pinout_tx(PinName tx) {
282282
pinmap_pinout(tx, PinMap_UART_TX);
283283
}
284+
285+
void serial_break_set(serial_t *obj) {
286+
obj->uart->LCR |= (1 << 6);
287+
}
288+
289+
void serial_break_clear(serial_t *obj) {
290+
obj->uart->LCR &= ~(1 << 6);
291+
}
292+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/serial_api.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ static int get_available_uart(void) {
5959
#define RXRDY (0x01<<0)
6060
#define TXRDY (0x01<<2)
6161

62+
#define TXBRKEN (0x01<<1)
63+
6264
static uint32_t UARTSysClk;
6365

6466
static uint32_t serial_irq_ids[UART_NUM] = {0};
@@ -267,3 +269,12 @@ void serial_clear(serial_t *obj) {
267269
void serial_pinout_tx(PinName tx) {
268270

269271
}
272+
273+
void serial_break_set(serial_t *obj) {
274+
obj->uart->CTRL |= TXBRKEN;
275+
}
276+
277+
void serial_break_clear(serial_t *obj) {
278+
obj->uart->CTRL &= ~TXBRKEN;
279+
}
280+

0 commit comments

Comments
 (0)