CTK terminal/telnet server driver implementation, by Mathias Bergvall
diff --git a/contiki/ctk/ctk-termserial.c b/contiki/ctk/ctk-termserial.c
new file mode 100644
index 0000000..6ed155f
--- /dev/null
+++ b/contiki/ctk/ctk-termserial.c
@@ -0,0 +1,75 @@
+#include "dispatcher.h"
+#include "loader.h"
+#include "ctk-term.h"
+#include "serial32.h"
+
+/*-----------------------------------------------------------------------------------*/
+/* 
+ * #defines and enums
+ */
+/*-----------------------------------------------------------------------------------*/
+#define SIO_POLL(c)  (SerialRead(&c) == 1)
+#define SIO_SEND(c)  SerialWrite(c)
+#define SIO_INIT     SerialOpenPort("COM1")
+
+#ifdef CTK_TERM_CONF_SERIAL_BUFFER_SIZE
+#define OUTPUT_BUFFER_SIZE CTK_TERM_CONF_SERIAL_BUFFER_SIZE
+#else
+#define OUTPUT_BUFFER_SIZE 200
+#endif
+
+/*-----------------------------------------------------------------------------------*/
+/* 
+ * Local variables
+ */
+/*-----------------------------------------------------------------------------------*/
+static void ctk_termserial_idle(void);
+
+static ek_id_t id = EK_ID_NONE;
+
+static struct ctk_term_state* termstate;
+static unsigned char outbuffer[OUTPUT_BUFFER_SIZE];
+
+static struct dispatcher_proc p =
+  {DISPATCHER_PROC("CTK serial server", ctk_termserial_idle, NULL,
+		   NULL)};
+
+/*-----------------------------------------------------------------------------------*/
+/* 
+ * Idle function
+ */
+/*-----------------------------------------------------------------------------------*/
+static void 
+ctk_termserial_idle(void)
+{
+  unsigned char c;
+  unsigned short len;
+  while(SIO_POLL(c)) {
+    ctk_term_input(termstate, c);
+  }
+
+  len = ctk_term_send(termstate, outbuffer, OUTPUT_BUFFER_SIZE);
+  if (len > 0) {
+    unsigned short i;
+    for (i=0; i < len; ++i) {
+      SIO_SEND(outbuffer[i]);
+    }
+    ctk_term_sent(termstate);
+  }
+}
+
+/*-----------------------------------------------------------------------------------*/
+/* 
+ * Init function
+ */
+/*-----------------------------------------------------------------------------------*/
+LOADER_INIT_FUNC(ctk_termserial_init, arg)
+{
+  arg_free(arg);
+  SIO_INIT;
+  termstate = ctk_term_alloc_state();
+  if (termstate == NULL) return;
+  if(id == EK_ID_NONE) {
+    id = dispatcher_start(&p);
+  }
+}