fixeria submitted this change.
4 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.
soft_uart: implement OSMO_SUART_PARITY_{MARK,SPACE}
Change-Id: I4c8fe5bfdcc2f4eb52c259d1e62d06684cd8f823
Related: OS#4396
---
M include/osmocom/core/soft_uart.h
M src/core/soft_uart.c
M tests/soft_uart/soft_uart_test.c
M tests/soft_uart/soft_uart_test.ok
4 files changed, 72 insertions(+), 0 deletions(-)
diff --git a/include/osmocom/core/soft_uart.h b/include/osmocom/core/soft_uart.h
index 15cea81..2b108c4 100644
--- a/include/osmocom/core/soft_uart.h
+++ b/include/osmocom/core/soft_uart.h
@@ -29,6 +29,8 @@
OSMO_SUART_PARITY_NONE,
OSMO_SUART_PARITY_EVEN,
OSMO_SUART_PARITY_ODD,
+ OSMO_SUART_PARITY_MARK, /* always 1 */
+ OSMO_SUART_PARITY_SPACE, /* always 0 */
_OSMO_SUART_PARITY_NUM
};
diff --git a/src/core/soft_uart.c b/src/core/soft_uart.c
index bc563ca..c94070f 100644
--- a/src/core/soft_uart.c
+++ b/src/core/soft_uart.c
@@ -153,6 +153,16 @@
if (suart->rx.parity_bit == bit)
suart->rx.flags |= OSMO_SUART_F_PARITY_ERROR;
break;
+ case OSMO_SUART_PARITY_MARK:
+ /* parity bit must always be 1 */
+ if (bit != 1)
+ suart->rx.flags |= OSMO_SUART_F_PARITY_ERROR;
+ break;
+ case OSMO_SUART_PARITY_SPACE:
+ /* parity bit must always be 0 */
+ if (bit != 0)
+ suart->rx.flags |= OSMO_SUART_F_PARITY_ERROR;
+ break;
case OSMO_SUART_PARITY_NONE: /* shall not happen */
default:
OSMO_ASSERT(0);
@@ -238,6 +248,14 @@
/* number of 1-bits (in both data and parity) shall be odd */
tx_bit = !suart->tx.parity_bit;
break;
+ case OSMO_SUART_PARITY_MARK:
+ /* parity bit must always be 1 */
+ tx_bit = 1;
+ break;
+ case OSMO_SUART_PARITY_SPACE:
+ /* parity bit must always be 0 */
+ tx_bit = 0;
+ break;
case OSMO_SUART_PARITY_NONE:
default: /* shall not happen */
OSMO_ASSERT(0);
diff --git a/tests/soft_uart/soft_uart_test.c b/tests/soft_uart/soft_uart_test.c
index f5597f3..ad876bd 100644
--- a/tests/soft_uart/soft_uart_test.c
+++ b/tests/soft_uart/soft_uart_test.c
@@ -284,6 +284,18 @@
osmo_soft_uart_configure(suart, &cfg);
test_tx_rx_exec(suart, (1 + 8 + 1 + 1));
+ printf("======== %s(): testing 8-M-1\n", __func__);
+ cfg = suart_test_default_cfg;
+ cfg.parity_mode = OSMO_SUART_PARITY_MARK;
+ osmo_soft_uart_configure(suart, &cfg);
+ test_tx_rx_exec(suart, (1 + 8 + 1 + 1));
+
+ printf("======== %s(): testing 8-S-1\n", __func__);
+ cfg = suart_test_default_cfg;
+ cfg.parity_mode = OSMO_SUART_PARITY_SPACE;
+ osmo_soft_uart_configure(suart, &cfg);
+ test_tx_rx_exec(suart, (1 + 8 + 1 + 1));
+
printf("======== %s(): testing 6-N-1\n", __func__);
cfg = suart_test_default_cfg;
cfg.num_data_bits = 6;
diff --git a/tests/soft_uart/soft_uart_test.ok b/tests/soft_uart/soft_uart_test.ok
index 118c547..e041104 100644
--- a/tests/soft_uart/soft_uart_test.ok
+++ b/tests/soft_uart/soft_uart_test.ok
@@ -126,6 +126,36 @@
test_tx_rx_exec_one(n_bits_total=44): 00000100001 00000010001 00000001001 00000000101
suart_tx_cb(len=0/4):
test_tx_rx_exec_one(n_bits_total=44): 11111111111 11111111111 11111111111 11111111111
+======== test_tx_rx(): testing 8-M-1
+suart_tx_cb(len=4/4): de ad be ef
+suart_rx_cb(flags=00): de ad be ef
+test_tx_rx_exec_one(n_bits_total=44): 00111101111 01011010111 00111110111 01111011111
+suart_tx_cb(len=4/4): 00 aa 55 ff
+suart_rx_cb(flags=00): 00 aa 55 ff
+test_tx_rx_exec_one(n_bits_total=44): 00000000011 00101010111 01010101011 01111111111
+suart_tx_cb(len=4/4): 01 02 04 08
+suart_rx_cb(flags=00): 01 02 04 08
+test_tx_rx_exec_one(n_bits_total=44): 01000000011 00100000011 00010000011 00001000011
+suart_tx_cb(len=4/4): 10 20 40 80
+suart_rx_cb(flags=00): 10 20 40 80
+test_tx_rx_exec_one(n_bits_total=44): 00000100011 00000010011 00000001011 00000000111
+suart_tx_cb(len=0/4):
+test_tx_rx_exec_one(n_bits_total=44): 11111111111 11111111111 11111111111 11111111111
+======== test_tx_rx(): testing 8-S-1
+suart_tx_cb(len=4/4): de ad be ef
+suart_rx_cb(flags=00): de ad be ef
+test_tx_rx_exec_one(n_bits_total=44): 00111101101 01011010101 00111110101 01111011101
+suart_tx_cb(len=4/4): 00 aa 55 ff
+suart_rx_cb(flags=00): 00 aa 55 ff
+test_tx_rx_exec_one(n_bits_total=44): 00000000001 00101010101 01010101001 01111111101
+suart_tx_cb(len=4/4): 01 02 04 08
+suart_rx_cb(flags=00): 01 02 04 08
+test_tx_rx_exec_one(n_bits_total=44): 01000000001 00100000001 00010000001 00001000001
+suart_tx_cb(len=4/4): 10 20 40 80
+suart_rx_cb(flags=00): 10 20 40 80
+test_tx_rx_exec_one(n_bits_total=44): 00000100001 00000010001 00000001001 00000000101
+suart_tx_cb(len=0/4):
+test_tx_rx_exec_one(n_bits_total=44): 11111111111 11111111111 11111111111 11111111111
======== test_tx_rx(): testing 6-N-1
suart_tx_cb(len=4/4): de ad be ef
suart_rx_cb(flags=00): 1e 2d 3e 2f
To view, visit change 35067. To unsubscribe, or for help writing mail filters, visit settings.