X-Spam-Check-By: sourceware.org Message-ID: <45A34E7D.6ABD61F5@dessent.net> Date: Tue, 09 Jan 2007 00:12:45 -0800 From: Brian Dessent X-Mailer: Mozilla 4.79 [en] (Windows NT 5.0; U) MIME-Version: 1.0 To: cygwin AT cygwin DOT com Subject: Re: Support for Baud Rates above 250000 baud? References: <45A34258 DOT 7040709 AT avegasystems DOT com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Reply-To: cygwin AT cygwin DOT com Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com David le Comte wrote: > I am running Cygwin on a PC that is running Windows XP. My Cygwin > version is "CYGWIN_NT-5.1" and it was downloaded and installed late last No, it's not. The output from uname tells us nothing about which version of Cygwin (or any of the other of dozens of packages you might have installed), rather it simply means that you are running Windows NT version 5.1, aka Windows XP. The current version of Cygwin is 1.5.23-2, and if you want to include helpful information try attaching the output of "cygcheck -svr" as requested in the posting instructions. > Adding entries into termios.h for higher > baudrates using the convention that B460800 was 0x01006, > B500000 was 0x01007, and B921600 was 0x01008 > caused errors. > > #define B230400 0x01004 > #define B256000 0x01005 > /* 3 new entries - as an experiement to see if it works */ > #define B460800 0x01006 > #define B500000 0x01007 > #define B921600 0x01008 > > The calls to cfsetispeed() and cfsetospeed() failed. Not unsurprising, > as one could assume that they had been using the original termios.h when > they were compiled. This is a Very Bad Idea in general. You can't just add new defines to a header file and expect it to work. The header is an indication of what a library supports, it is a one-way street. > 1) Is there a build available for Cygwin (on a Windows platform) that > has support for higher baud rates? If so, does anyone know where I > could find it? That's kind of an odd question. Cygwin is open source and of course people are free to take it and patch it to do whatever they want, so it's certainly possible that someone has patched their Cygwin to allow other baud rate settings. But if they did it would be a separate project and off-topic for this list, and I'm not aware of any such thing existing. Occasionally new features are added to the code which have yet to be included in released versions, in which case users are directed to try the new code in the Cygwin snapshots which are provided on cygwin.com, but in this case that's not an issue as I'm not aware of any recent changes to this part of the code. > 2) Assuming there is no such build available, are there plans to add > support for higher baud rates? If so, does anyone know when? > > 2) Would it be difficult to download the appropriate source files, modify > them, and make my own Cygwin build? (The idea of doing this terrifies > me by the way). If it is possible, could someone give me some pointers > on how to do this? If you read the Win32 API docs for SetCommState() and struct DCB: you see the canonical list of #defined baud rates that Win32 supports. But there's also this tidbit: "This member can be an actual baud rate value, or one of the following indexes." So from this we can see that Win32 supports arbitrary baud rates (with a certain list of #defined standard ones) whereas the POSIX termios.h / speed_t API that Cygwin is emulating does not have the capability to set the rate arbitarily. Thus, any baud rate can be supported, but the code has to exist to do the mapping of the symbolic constant. You can see this happening in fhandler_serial.cc, which does the actual mapping of termios to filling the Win32 struct DCB: case B110: state.BaudRate = CBR_110; break; case B300: state.BaudRate = CBR_300; break; case B600: state.BaudRate = CBR_600; break; case B1200: state.BaudRate = CBR_1200; break; case B2400: state.BaudRate = CBR_2400; break; case B4800: state.BaudRate = CBR_4800; break; case B9600: state.BaudRate = CBR_9600; break; case B19200: state.BaudRate = CBR_19200; break; case B38400: state.BaudRate = CBR_38400; break; case B57600: state.BaudRate = CBR_57600; break; case B115200: state.BaudRate = CBR_115200; break; case B230400: state.BaudRate = 230400 /* CBR_230400 - not defined */; break; default: /* Unsupported baud rate! */ termios_printf ("Invalid t->c_ospeed %d", t->c_ospeed); set_errno (EINVAL); return -1; } Thus it appears that it should be easily possible to add a Bxxxxx define for any desired baud rate, as long as you update termios.h and fhandler_serial.cc to know about it. So yes, you could just make this change and rebuild a local cygwin1.dll that supports it. Building cygwin1.dll is not much different than any other autoconf-style package and there are instructions in the Users Guide (or the FAQ, I can't remember.) It would be better however to somehow figure out a list of the missing standard baud rates that are in common use and submit a patch to add them upstream, rather than just ad hoc adding whatever you need. Brian -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/