Change in ...osmo-ccid-firmware[master]: 'cuart' Card-UART abstraction + driver for simple serial reader

2019-10-09 Thread laforge
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

2019-10-09 Thread laforge
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

2019-10-09 Thread laforge
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

2019-10-09 Thread laforge
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

2019-10-07 Thread laforge
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);