<div dir="ltr">Hello Christian,<div><br></div><div>This looks fine.  Are you the original author of the patch?</div><div><br></div><div>Miguel</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 24, 2015 at 3:45 PM, Christian Hofstaedtler <span dir="ltr"><<a href="mailto:ch---mono-devel@zeha.at" target="_blank">ch---mono-devel@zeha.at</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This patch (against mono-2.10.8.1 from Debian) allows setting<br>
custom baud rates, and very likely would support a baudrate of<br>
1000000.<br>
<br>
I release this patch under the MIT license.<br>
<br>
<br>
--- serial.c.orig       2013-01-30 12:06:52.379691461 +0100<br>
+++ serial.c.orig       2013-01-30 13:05:50.383390154 +0100<br>
@@ -17,6 +17,11 @@<br>
 #endif<br>
 #include <sys/ioctl.h><br>
<br>
+/* This is for ASYNC_*, serial_struct on linux */<br>
+#if defined(__linux__)<br>
+#include <linux/serial.h><br>
+#endif<br>
+<br>
 #include <glib.h><br>
<br>
 /* This is for FIONREAD on solaris */<br>
@@ -151,6 +156,7 @@<br>
 set_attributes (int fd, int baud_rate, MonoParity parity, int dataBits, MonoStopBits stopBits, MonoHandshake handshake)<br>
 {<br>
        struct termios newtio;<br>
+       gboolean custom_baud_rate = FALSE;<br>
<br>
        if (tcgetattr (fd, &newtio) == -1)<br>
                return FALSE;<br>
@@ -227,8 +233,10 @@<br>
            break;<br>
        case 50:<br>
        case 0:<br>
-       default:<br>
            baud_rate = B9600;<br>
+           break;<br>
+       default:<br>
+           custom_baud_rate = TRUE;<br>
                break;<br>
        }<br>
<br>
@@ -319,16 +327,54 @@<br>
            newtio.c_iflag |= IXOFF | IXON;<br>
                break;<br>
        }<br>
-<br>
-       if (cfsetospeed (&newtio, baud_rate) < 0 || cfsetispeed (&newtio, baud_rate) < 0 ||<br>
-           tcsetattr (fd, TCSANOW, &newtio) < 0)<br>
+<br>
+       if (custom_baud_rate == FALSE)<br>
        {<br>
-               return FALSE;<br>
+               if (cfsetospeed (&newtio, baud_rate) < 0 || cfsetispeed (&newtio, baud_rate) < 0)<br>
+               {<br>
+                       return FALSE;<br>
+               }<br>
        }<br>
        else<br>
        {<br>
-       return TRUE;<br>
+               /* On Linux, to set a custom baud rate, we must set the "standard" baud_rate<br>
+                * to 38400. */<br>
+               if (cfsetospeed (&newtio, B38400) < 0 || cfsetispeed (&newtio, B38400) < 0)<br>
+               {<br>
+                       return FALSE;<br>
+               }<br>
+       }<br>
+<br>
+       if (tcsetattr (fd, TCSANOW, &newtio) < 0)<br>
+       {<br>
+               return FALSE;<br>
+       }<br>
+<br>
+       if (custom_baud_rate == TRUE)<br>
+       {<br>
+#if defined(__linux__)<br>
+               struct serial_struct ser;<br>
+<br>
+               if (ioctl (fd, TIOCGSERIAL, &ser) < 0)<br>
+               {<br>
+                       return FALSE;<br>
+               }<br>
+<br>
+               ser.custom_divisor = ser.baud_base / baud_rate;<br>
+               ser.flags &= ~ASYNC_SPD_MASK;<br>
+               ser.flags |= ASYNC_SPD_CUST;<br>
+<br>
+               if (ioctl (fd, TIOCSSERIAL, &ser) < 0)<br>
+               {<br>
+                       return FALSE;<br>
+               }<br>
+#else<br>
+               /* Don't know how to set custom baud rate on this platform. */<br>
+               return FALSE;<br>
+#endif<br>
        }<br>
+<br>
+       return TRUE;<br>
 }<br>
<br>
<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br></div>