Basic configuration for tty.
authorFlorian Pose <fp@igh-essen.com>
Thu, 21 Jan 2010 16:41:41 +0100
changeset 1778 94dbb44884ec
parent 1777 a93fc03eeb06
child 1779 9fab229d6ca9
Basic configuration for tty.
tty/module.c
--- a/tty/module.c	Tue Jan 19 19:33:47 2010 +0100
+++ b/tty/module.c	Thu Jan 21 16:41:41 2010 +0100
@@ -41,6 +41,8 @@
 #include <linux/termios.h>
 #include <linux/timer.h>
 #include <linux/version.h>
+#include <linux/serial.h>
+#include <linux/uaccess.h>
 
 #include "../master/globals.h"
 #include "../include/ectty.h"
@@ -78,11 +80,15 @@
 
 /** \endcond */
 
+/** Standard termios for ec_tty devices.
+ *
+ * Simplest possible configuration, as you would expect.
+ */
 static struct ktermios ec_tty_std_termios = {
-    .c_iflag = ICRNL | IXON,
-    .c_oflag = OPOST,
-    .c_cflag = B38400 | CS8 | CREAD | HUPCL,
-    .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE | IEXTEN,
+    .c_iflag = 0,
+    .c_oflag = 0,
+    .c_cflag = B9600 | CS8 | CREAD,
+    .c_lflag = 0,
     .c_cc = INIT_C_CC,
 };
 
@@ -139,7 +145,6 @@
     tty_driver->subtype = SERIAL_TYPE_NORMAL;
     tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
     tty_driver->init_termios = ec_tty_std_termios;
-    tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
     tty_set_operations(tty_driver, &ec_tty_ops);
 
     ret = tty_register_driver(tty_driver);
@@ -301,6 +306,23 @@
     tty_unregister_device(tty_driver, tty->minor);
 }
 
+/*****************************************************************************/
+
+int ec_tty_get_serial_info(ec_tty_t *tty, struct serial_struct *data)
+{
+	struct serial_struct tmp;
+  
+	if (!data)
+		return -EFAULT;
+
+	memset(&tmp, 0, sizeof(tmp));
+    
+	if (copy_to_user(data, &tmp, sizeof(*data))) {
+        return -EFAULT;
+    }
+	return 0;
+}
+
 /******************************************************************************
  * Device callbacks
  *****************************************************************************/
@@ -454,28 +476,38 @@
 static int ec_tty_ioctl(struct tty_struct *tty, struct file *file,
 		    unsigned int cmd, unsigned long arg)
 {
-#if EC_TTY_DEBUG >= 2
-    printk(KERN_INFO PFX "%s().\n", __func__);
-#endif
-    return -ENOTTY;
-}
-
-/*****************************************************************************/
-
-static void ec_tty_throttle(struct tty_struct *tty)
-{
-#if EC_TTY_DEBUG >= 2
-    printk(KERN_INFO PFX "%s().\n", __func__);
-#endif
-}
-
-/*****************************************************************************/
-
-static void ec_tty_unthrottle(struct tty_struct *tty)
-{
-#if EC_TTY_DEBUG >= 2
-    printk(KERN_INFO PFX "%s().\n", __func__);
-#endif
+    ec_tty_t *t = (ec_tty_t *) tty->driver_data;
+    int ret = -ENOTTY;
+    
+#if EC_TTY_DEBUG >= 2
+    printk(KERN_INFO PFX "%s(tty=%p, file=%p, cmd=%08x, arg=%08lx).\n",
+            __func__, tty, file, cmd, arg);
+    printk(KERN_INFO PFX "decoded: type=%02x nr=%u\n",
+            _IOC_TYPE(cmd), _IOC_NR(cmd));
+#endif
+
+    switch (cmd) {
+		case TIOCGSERIAL:
+			if (access_ok(VERIFY_WRITE,
+                        (void *) arg, sizeof(struct serial_struct))) {
+                ret = ec_tty_get_serial_info(t, (struct serial_struct *) arg);
+            } else {
+                ret = -EFAULT;
+            }
+            break;
+
+        case TIOCSSERIAL: // TODO
+            break;
+
+        default:
+#if EC_TTY_DEBUG >= 2
+            printk(KERN_INFO PFX "no ioctl()!\n");
+#endif
+            ret = -ENOIOCTLCMD;
+            break;
+    }
+
+    return ret;
 }
 
 /*****************************************************************************/
@@ -483,9 +515,19 @@
 static void ec_tty_set_termios(struct tty_struct *tty,
 			   struct ktermios *old_termios)
 {
+    //ec_tty_t *t = (ec_tty_t *) tty->driver_data;
+
 #if EC_TTY_DEBUG >= 2
     printk(KERN_INFO PFX "%s().\n", __func__);
 #endif
+
+    if (tty->termios->c_cflag == old_termios->c_cflag)
+        return;
+
+#if EC_TTY_DEBUG >= 2
+    printk(KERN_INFO "cflag changed from %x to %x.\n",
+            old_termios->c_cflag, tty->termios->c_cflag);
+#endif
 }
 
 /*****************************************************************************/
@@ -552,27 +594,6 @@
 
 /*****************************************************************************/
 
-static int ec_tty_tiocmget(struct tty_struct *tty, struct file *file)
-{
-#if EC_TTY_DEBUG >= 2
-    printk(KERN_INFO PFX "%s().\n", __func__);
-#endif
-    return -EBUSY;
-}
-
-/*****************************************************************************/
-
-static int ec_tty_tiocmset(struct tty_struct *tty, struct file *file,
-		    unsigned int set, unsigned int clear)
-{
-#if EC_TTY_DEBUG >= 2
-    printk(KERN_INFO PFX "%s(set=%u, clear=%u).\n", __func__, set, clear);
-#endif
-    return -EBUSY;
-}
-
-/*****************************************************************************/
-
 static const struct tty_operations ec_tty_ops = {
     .open = ec_tty_open,
     .close = ec_tty_close,
@@ -582,8 +603,6 @@
 	.chars_in_buffer = ec_tty_chars_in_buffer,
 	.flush_buffer = ec_tty_flush_buffer,
 	.ioctl = ec_tty_ioctl,
-	.throttle = ec_tty_throttle,
-	.unthrottle = ec_tty_unthrottle,
 	.set_termios = ec_tty_set_termios,
 	.stop = ec_tty_stop,
 	.start = ec_tty_start,
@@ -591,8 +610,6 @@
 	.break_ctl = ec_tty_break,
 	.send_xchar = ec_tty_send_xchar,
 	.wait_until_sent = ec_tty_wait_until_sent,
-	.tiocmget = ec_tty_tiocmget,
-	.tiocmset = ec_tty_tiocmset,
 };
 
 /******************************************************************************