summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-05-15 17:16:48 +0200
committerHarald Welte <laforge@gnumonks.org>2017-05-17 15:15:09 +0100
commit799bef5cf614c303df1f88c1a7c4cc46a02e8c34 (patch)
tree5f8904878d69c8c4fb1c1ecc73e99aea1d8394ce /src
parenta362ee90b42898dc730ffddf3bdc1b7a6523f1b8 (diff)
sercomm: Better integration of driver interface
We cannot assume a certain UART API like uart_baudrate() which only exists in OsmocomBB. Rather, use generic function prototypes (sercomm_drv_*) which are to be provided by the application / environment to the sercomm core. Change-Id: I01ea3067baf1791000c1a7d537ccce496a1ab1ee
Diffstat (limited to 'src')
-rw-r--r--src/sercomm.c45
1 files changed, 17 insertions, 28 deletions
diff --git a/src/sercomm.c b/src/sercomm.c
index f3241c4e..409efba3 100644
--- a/src/sercomm.c
+++ b/src/sercomm.c
@@ -20,6 +20,8 @@
*
*/
+#include "config.h"
+
#include <stdint.h>
#include <stdio.h>
#include <errno.h>
@@ -30,31 +32,20 @@
#include <osmocom/core/linuxlist.h>
#ifndef EMBEDDED
-
# define DEFAULT_RX_MSG_SIZE 2048
-static inline void sercomm_drv_lock(unsigned long __attribute__((unused)) *flags) {}
-static inline void sercomm_drv_unlock(unsigned long __attribute__((unused)) *flags) {}
-
+void sercomm_drv_lock(unsigned long __attribute__((unused)) *flags) {}
+void sercomm_drv_unlock(unsigned long __attribute__((unused)) *flags) {}
#else
-
# define DEFAULT_RX_MSG_SIZE 256
-# include <debug.h>
-# include <asm/system.h>
+#endif /* EMBEDDED */
-static inline void sercomm_drv_lock(unsigned long *flags)
+/* weak symbols to be overridden by application */
+__attribute__((weak)) void sercomm_drv_start_tx(struct osmo_sercomm_inst *sercomm) {};
+__attribute__((weak)) int sercomm_drv_baudrate_chg(struct osmo_sercomm_inst *sercomm, uint32_t bdrt)
{
- local_firq_save(*flags);
+ return -1;
}
-static inline void sercomm_drv_unlock(unsigned long *flags)
-{
- local_irq_restore(*flags);
-}
-
-# include <uart.h>
-
-#endif
-
#define HDLC_FLAG 0x7E
#define HDLC_ESCAPE 0x7D
@@ -107,10 +98,8 @@ void osmo_sercomm_sendmsg(struct osmo_sercomm_inst *sercomm, uint8_t dlci, struc
msgb_enqueue(&sercomm->tx.dlci_queues[dlci], msg);
sercomm_drv_unlock(&flags);
-#ifdef EMBEDDED
/* tell UART that we have something to send */
- uart_irq_enable(sercomm->uart_id, UART_IRQ_TX_EMPTY, 1);
-#endif
+ sercomm_drv_start_tx(sercomm);
}
/* how deep is the Tx queue for a given DLCI */
@@ -126,10 +115,9 @@ unsigned int osmo_sercomm_tx_queue_depth(struct osmo_sercomm_inst *sercomm, uint
return num;
}
-#ifdef EMBEDDED
/* wait until everything has been transmitted, then grab the lock and
* change the baud rate as requested */
-void osmo_sercomm_change_speed(struct osmo_sercomm_inst *sercomm, enum uart_baudrate bdrt)
+int osmo_sercomm_change_speed(struct osmo_sercomm_inst *sercomm, uint32_t bdrt)
{
unsigned int i, count;
unsigned long flags;
@@ -138,7 +126,7 @@ void osmo_sercomm_change_speed(struct osmo_sercomm_inst *sercomm, enum uart_baud
/* count the number of pending messages */
count = 0;
for (i = 0; i < ARRAY_SIZE(sercomm->tx.dlci_queues); i++)
- count += sercomm_tx_queue_depth(i);
+ count += osmo_sercomm_tx_queue_depth(sercomm, i);
/* if we still have any in the queue, restart */
if (count == 0)
break;
@@ -149,15 +137,16 @@ void osmo_sercomm_change_speed(struct osmo_sercomm_inst *sercomm, enum uart_baud
* stays that way */
sercomm_drv_lock(&flags);
if (!sercomm->tx.msg && !sercomm->tx.next_char) {
+ int rc;
/* change speed */
- uart_baudrate(sercomm->uart_id, bdrt);
+ rc = sercomm_drv_baudrate_chg(sercomm, bdrt);
sercomm_drv_unlock(&flags);
- break;
- }
+ return rc;
+ } else
sercomm_drv_unlock(&flags);
}
+ return -1;
}
-#endif
/*! \brief fetch one octet of to-be-transmitted serial data
* \param[in] sercomm Sercomm Instance from which to fetch pending data