Change in ...osmo-ccid-firmware[master]: 'cuart' Card-UART abstraction + driver for simple serial reader
laforge has submitted this change and it was merged. ( https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 ) Change subject: 'cuart' Card-UART abstraction + driver for simple serial reader .. 'cuart' Card-UART abstraction + driver for simple serial reader Change-Id: Ic7e324d99f78b3bfb98fc667d9a1b7fa363f092d --- A ccid_common/cuart.c A ccid_common/cuart.h M ccid_host/Makefile A ccid_host/cuart_driver_tty.c A ccid_host/cuart_test.c A ccid_host/utils_ringbuffer.c A ccid_host/utils_ringbuffer.h 7 files changed, 836 insertions(+), 1 deletion(-) Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved diff --git a/ccid_common/cuart.c b/ccid_common/cuart.c new file mode 100644 index 000..2c0428e --- /dev/null +++ b/ccid_common/cuart.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include + +#include "cuart.h" + +static LLIST_HEAD(g_cuart_drivers); + +const struct value_string card_uart_event_vals[] = { + OSMO_VALUE_STRING(CUART_E_RX_SINGLE), + OSMO_VALUE_STRING(CUART_E_RX_COMPLETE), + OSMO_VALUE_STRING(CUART_E_RX_TIMEOUT), + OSMO_VALUE_STRING(CUART_E_TX_COMPLETE), + { 0, NULL } +}; + +static struct card_uart_driver *cuart_drv_by_name(const char *driver_name) +{ + struct card_uart_driver *drv; + llist_for_each_entry(drv, _cuart_drivers, list) { + if (!strcmp(drv->name, driver_name)) + return drv; + } + return NULL; +} + +int card_uart_open(struct card_uart *cuart, const char *driver_name, const char *device_name) +{ + struct card_uart_driver *drv = cuart_drv_by_name(driver_name); + int rc; + + if (!drv) + return -ENODEV; + + cuart->rx_enabled = true; + cuart->rx_threshold = 1; + + rc = drv->ops->open(cuart, device_name); + if (rc < 0) + return rc; + + cuart->driver = drv; + return 0; +} + +int card_uart_close(struct card_uart *cuart) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->close); + return cuart->driver->ops->close(cuart); +} + +int card_uart_ctrl(struct card_uart *cuart, enum card_uart_ctl ctl, bool enable) +{ + int rc; + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->ctrl); + rc = cuart->driver->ops->ctrl(cuart, ctl, enable); + if (rc < 0) + return rc; + + switch (ctl) { + case CUART_CTL_RX: + cuart->rx_enabled = enable; + break; + default: + break; + } + + return rc; +} + +int card_uart_tx(struct card_uart *cuart, const uint8_t *data, size_t len, bool rx_after_complete) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->async_tx); + + OSMO_ASSERT(!cuart->tx_busy); + cuart->tx_busy = true; + /* disable receiver to avoid receiving what we transmit */ + card_uart_ctrl(cuart, CUART_CTL_RX, false); + + return cuart->driver->ops->async_tx(cuart, data, len, rx_after_complete); +} + +int card_uart_rx(struct card_uart *cuart, uint8_t *data, size_t len) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->async_rx); + return cuart->driver->ops->async_rx(cuart, data, len); +} + +void card_uart_set_rx_threshold(struct card_uart *cuart, size_t rx_threshold) +{ + cuart->rx_threshold = rx_threshold; +} + +void card_uart_notification(struct card_uart *cuart, enum card_uart_event evt, void *data) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->handle_event); + + switch (evt) { + case CUART_E_TX_COMPLETE: + cuart->tx_busy = false; + /* re-enable receiver if we're done with transmit */ + sleep(1); + card_uart_ctrl(cuart, CUART_CTL_RX, true); + break; + default: + break; + } + + cuart->handle_event(cuart, evt, data); +} + +int card_uart_driver_register(struct card_uart_driver *drv) +{ + OSMO_ASSERT(!cuart_drv_by_name(drv->name)); + OSMO_ASSERT(drv->name); + OSMO_ASSERT(drv->ops); + llist_add_tail(>list, _cuart_drivers); + return 0; +} diff --git a/ccid_common/cuart.h b/ccid_common/cuart.h new file mode 100644 index 000..7e217db --- /dev/null +++ b/ccid_common/cuart.h @@ -0,0 +1,107 @@ +#pragma once +#include +#include +#include + +#include +#include "utils_ringbuffer.h" + +enum card_uart_event { + /* a single byte was received, it's present at the (uint8_t *) data location */ + CUART_E_RX_SINGLE, + /* an entire block of data was
Change in ...osmo-ccid-firmware[master]: 'cuart' Card-UART abstraction + driver for simple serial reader
laforge has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 ) Change subject: 'cuart' Card-UART abstraction + driver for simple serial reader .. Patch Set 6: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ccid-firmware Gerrit-Branch: master Gerrit-Change-Id: Ic7e324d99f78b3bfb98fc667d9a1b7fa363f092d Gerrit-Change-Number: 15691 Gerrit-PatchSet: 6 Gerrit-Owner: laforge Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge Gerrit-Comment-Date: Wed, 09 Oct 2019 16:36:06 + Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
Change in ...osmo-ccid-firmware[master]: 'cuart' Card-UART abstraction + driver for simple serial reader
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 to look at the new patch set (#6). Change subject: 'cuart' Card-UART abstraction + driver for simple serial reader .. 'cuart' Card-UART abstraction + driver for simple serial reader Change-Id: Ic7e324d99f78b3bfb98fc667d9a1b7fa363f092d --- A ccid_common/cuart.c A ccid_common/cuart.h M ccid_host/Makefile A ccid_host/cuart_driver_tty.c A ccid_host/cuart_test.c A ccid_host/utils_ringbuffer.c A ccid_host/utils_ringbuffer.h 7 files changed, 836 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/91/15691/6 -- To view, visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ccid-firmware Gerrit-Branch: master Gerrit-Change-Id: Ic7e324d99f78b3bfb98fc667d9a1b7fa363f092d Gerrit-Change-Number: 15691 Gerrit-PatchSet: 6 Gerrit-Owner: laforge Gerrit-Reviewer: Jenkins Builder Gerrit-MessageType: newpatchset
Change in ...osmo-ccid-firmware[master]: 'cuart' Card-UART abstraction + driver for simple serial reader
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 to look at the new patch set (#2). Change subject: 'cuart' Card-UART abstraction + driver for simple serial reader .. 'cuart' Card-UART abstraction + driver for simple serial reader Change-Id: Ic7e324d99f78b3bfb98fc667d9a1b7fa363f092d --- A ccid_common/cuart.c A ccid_common/cuart.h M ccid_host/Makefile A ccid_host/cuart_driver_tty.c A ccid_host/cuart_test.c A ccid_host/utils_ringbuffer.c A ccid_host/utils_ringbuffer.h 7 files changed, 836 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/91/15691/2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ccid-firmware Gerrit-Branch: master Gerrit-Change-Id: Ic7e324d99f78b3bfb98fc667d9a1b7fa363f092d Gerrit-Change-Number: 15691 Gerrit-PatchSet: 2 Gerrit-Owner: laforge Gerrit-Reviewer: Jenkins Builder Gerrit-MessageType: newpatchset
Change in ...osmo-ccid-firmware[master]: 'cuart' Card-UART abstraction + driver for simple serial reader
laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15691 Change subject: 'cuart' Card-UART abstraction + driver for simple serial reader .. 'cuart' Card-UART abstraction + driver for simple serial reader Change-Id: Ic7e324d99f78b3bfb98fc667d9a1b7fa363f092d --- M ccid/Makefile A ccid/cuart.c A ccid/cuart.h A ccid/cuart_driver_tty.c A ccid/cuart_test.c A ccid/utils_ringbuffer.c A ccid/utils_ringbuffer.h 7 files changed, 833 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/91/15691/1 diff --git a/ccid/Makefile b/ccid/Makefile index 5f784ba..a0d6952 100644 --- a/ccid/Makefile +++ b/ccid/Makefile @@ -1,13 +1,18 @@ CFLAGS=-Wall -g +all: ccid_functionfs hub_functionfs cuart_test + ccid_functionfs: ccid_main_functionfs.o logging.o ccid_proto.o ccid_device.o ccid_slot_sim.o $(CC) $(CFLAGS) -o $@ $^ -lasan -losmocore -ltalloc -laio hub_functionfs: hub_main_functionfs.o $(CC) $(CFLAGS) -o $@ $^ -lasan -losmocore -ltalloc -laio +cuart_test: cuart_test.o cuart.o cuart_driver_tty.o utils_ringbuffer.o + $(CC) $(CFLAGS) -o $@ $^ -lasan -losmocore -ltalloc + %.o: %.c $(CC) $(CFLAGS) -o $@ -c $^ clean: - rm ccid_functionfs *.o + rm ccid_functionfs hub_functionfs cuart_test *.o diff --git a/ccid/cuart.c b/ccid/cuart.c new file mode 100644 index 000..2c0428e --- /dev/null +++ b/ccid/cuart.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include + +#include "cuart.h" + +static LLIST_HEAD(g_cuart_drivers); + +const struct value_string card_uart_event_vals[] = { + OSMO_VALUE_STRING(CUART_E_RX_SINGLE), + OSMO_VALUE_STRING(CUART_E_RX_COMPLETE), + OSMO_VALUE_STRING(CUART_E_RX_TIMEOUT), + OSMO_VALUE_STRING(CUART_E_TX_COMPLETE), + { 0, NULL } +}; + +static struct card_uart_driver *cuart_drv_by_name(const char *driver_name) +{ + struct card_uart_driver *drv; + llist_for_each_entry(drv, _cuart_drivers, list) { + if (!strcmp(drv->name, driver_name)) + return drv; + } + return NULL; +} + +int card_uart_open(struct card_uart *cuart, const char *driver_name, const char *device_name) +{ + struct card_uart_driver *drv = cuart_drv_by_name(driver_name); + int rc; + + if (!drv) + return -ENODEV; + + cuart->rx_enabled = true; + cuart->rx_threshold = 1; + + rc = drv->ops->open(cuart, device_name); + if (rc < 0) + return rc; + + cuart->driver = drv; + return 0; +} + +int card_uart_close(struct card_uart *cuart) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->close); + return cuart->driver->ops->close(cuart); +} + +int card_uart_ctrl(struct card_uart *cuart, enum card_uart_ctl ctl, bool enable) +{ + int rc; + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->ctrl); + rc = cuart->driver->ops->ctrl(cuart, ctl, enable); + if (rc < 0) + return rc; + + switch (ctl) { + case CUART_CTL_RX: + cuart->rx_enabled = enable; + break; + default: + break; + } + + return rc; +} + +int card_uart_tx(struct card_uart *cuart, const uint8_t *data, size_t len, bool rx_after_complete) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->async_tx); + + OSMO_ASSERT(!cuart->tx_busy); + cuart->tx_busy = true; + /* disable receiver to avoid receiving what we transmit */ + card_uart_ctrl(cuart, CUART_CTL_RX, false); + + return cuart->driver->ops->async_tx(cuart, data, len, rx_after_complete); +} + +int card_uart_rx(struct card_uart *cuart, uint8_t *data, size_t len) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->async_rx); + return cuart->driver->ops->async_rx(cuart, data, len); +} + +void card_uart_set_rx_threshold(struct card_uart *cuart, size_t rx_threshold) +{ + cuart->rx_threshold = rx_threshold; +} + +void card_uart_notification(struct card_uart *cuart, enum card_uart_event evt, void *data) +{ + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->handle_event); + + switch (evt) { + case CUART_E_TX_COMPLETE: + cuart->tx_busy = false; + /* re-enable receiver if we're done with transmit */ + sleep(1); + card_uart_ctrl(cuart, CUART_CTL_RX, true); + break; + default: + break; + } + + cuart->handle_event(cuart, evt, data);