Nonstandard baud rates
lawson_whitney at juno.com
lawson_whitney at juno.com
Sun Feb 17 21:19:36 CST 2002
Good day!
I don't much like this patch, but it does provide support for
nonstandard baud rates, at least on systems with <linux/serial.h>
(I didn't know where else to find serial_struct), and it might make Wine
serial comms more accessible for new users.
I couldn't think of a good way for it to clean up after itself, so it
doesn't; it is easy enough for a reasonably intelligent human to do with
setserial. OTOH, it is easy for a reasonably intelligent human to get
nonstandard baud rates using setserial...Maybe I should say I didn't
find a good place to keep track of the flags and custom_divisor as they
were before I changed them. I trust I will get a suggestion or two on
that and can improve it.
I think WARN is too weak, as things are now, with warn off by default
(for good reason), but it's not a fixme nor an err. Almost, I wanted to
raise a messagebox, but I don't think a messagebox belongs here or
anywhere else.
I guess you know (I had to find out the hard way :-) you have to run
autoheader.
Anyway, this is Asbestos I can do for now. Comments, suggestions, or
improvements welcome. A copy is attached in case your mailer folds the
inline one.
Lawson
ChangeLog:
configure.ac, dlls/kernel/comm.c:
Lawson Whitney <lawson_whitney at juno..com>
Support for nunstandard baud rate in SetCommState.
diff -ur was/configure.ac is/configure.ac
--- was/configure.ac Sat Feb 16 23:36:08 2002
+++ is/configure.ac Sat Feb 16 23:39:39 2002
@@ -885,6 +885,7 @@
linux/cdrom.h \
linux/input.h \
linux/joystick.h \
+ linux/serial.h \
linux/ucdrom.h \
net/if.h \
netdb.h \
diff -ur was/dlls/kernel/comm.c is/dlls/kernel/comm.c
--- was/dlls/kernel/comm.c Wed Dec 26 22:14:09 2001
+++ is/dlls/kernel/comm.c Sun Feb 17 21:08:38 2002
@@ -68,6 +68,10 @@
#include "debugtools.h"
+#ifdef HAVE_LINUX_SERIAL_H
+#include <linux/serial.h>
+#endif
+
DEFAULT_DEBUG_CHANNEL(comm);
#if !defined(TIOCINQ) && defined(FIONREAD)
@@ -911,6 +915,29 @@
break;
#endif
default:
+#if defined (HAVE_LINUX_SERIAL_H) && defined (TIOCSSERIAL)
+ { struct serial_struct nuts;
+ int arby;
+ ioctl(fd, TIOCGSERIAL, &nuts);
+ nuts.custom_divisor = nuts.baud_base / lpdcb->BaudRate;
+ if (!(nuts.custom_divisor)) nuts.custom_divisor = 1;
+ arby = nuts.baud_base / nuts.custom_divisor;
+ nuts.flags &= ~ASYNC_SPD_MASK;
+ nuts.flags |= ASYNC_SPD_CUST;
+ WARN("You (or a program acting at your behest)\
+ have specified\n a non-standard baud rate %ld. Wine will set the\
+ rate to %d,\n which is as close as we can get by our present understanding\
+ of your\n hardware. I hope you know what you are doing. Any disruption\
+ Wine\n has caused to your linux system can be undone with setserial \n\
+ (see man setserial). If you have incapacitated a Hayes type modem,\n\
+ reset it and it will probably recover.\n", lpdcb->BaudRate, arby);
+ ioctl(fd, TIOCSSERIAL, &nuts);
+ port.c_cflag |= B38400;
+ }
+ break;
+#endif /* Don't have linux/serial.h or lack TIOCSSERIAL */
+
+
COMM_SetCommError(handle,IE_BAUDRATE);
close( fd );
ERR("baudrate %ld\n",lpdcb->BaudRate);
-------------- next part --------------
diff -ur was/configure.ac is/configure.ac
--- was/configure.ac Sat Feb 16 23:36:08 2002
+++ is/configure.ac Sat Feb 16 23:39:39 2002
@@ -885,6 +885,7 @@
linux/cdrom.h \
linux/input.h \
linux/joystick.h \
+ linux/serial.h \
linux/ucdrom.h \
net/if.h \
netdb.h \
diff -ur was/dlls/kernel/comm.c is/dlls/kernel/comm.c
--- was/dlls/kernel/comm.c Wed Dec 26 22:14:09 2001
+++ is/dlls/kernel/comm.c Sun Feb 17 21:08:38 2002
@@ -68,6 +68,10 @@
#include "debugtools.h"
+#ifdef HAVE_LINUX_SERIAL_H
+#include <linux/serial.h>
+#endif
+
DEFAULT_DEBUG_CHANNEL(comm);
#if !defined(TIOCINQ) && defined(FIONREAD)
@@ -911,6 +915,29 @@
break;
#endif
default:
+#if defined (HAVE_LINUX_SERIAL_H) && defined (TIOCSSERIAL)
+ { struct serial_struct nuts;
+ int arby;
+ ioctl(fd, TIOCGSERIAL, &nuts);
+ nuts.custom_divisor = nuts.baud_base / lpdcb->BaudRate;
+ if (!(nuts.custom_divisor)) nuts.custom_divisor = 1;
+ arby = nuts.baud_base / nuts.custom_divisor;
+ nuts.flags &= ~ASYNC_SPD_MASK;
+ nuts.flags |= ASYNC_SPD_CUST;
+ WARN("You (or a program acting at your behest)\
+ have specified\n a non-standard baud rate %ld. Wine will set the\
+ rate to %d,\n which is as close as we can get by our present understanding\
+ of your\n hardware. I hope you know what you are doing. Any disruption\
+ Wine\n has caused to your linux system can be undone with setserial \n\
+ (see man setserial). If you have incapacitated a Hayes type modem,\n\
+ reset it and it will probably recover.\n", lpdcb->BaudRate, arby);
+ ioctl(fd, TIOCSSERIAL, &nuts);
+ port.c_cflag |= B38400;
+ }
+ break;
+#endif /* Don't have linux/serial.h or lack TIOCSSERIAL */
+
+
COMM_SetCommError(handle,IE_BAUDRATE);
close( fd );
ERR("baudrate %ld\n",lpdcb->BaudRate);
More information about the wine-patches
mailing list