fixeria has submitted this change. ( https://gerrit.osmocom.org/c/libosmocore/+/35067?usp=email )
(
4 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: soft_uart: implement OSMO_SUART_PARITY_{MARK,SPACE} ......................................................................
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(-)
Approvals: laforge: Looks good to me, approved Jenkins Builder: Verified jolly: Looks good to me, but someone else must approve
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