This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Support for Baud Rates above 250000 baud?


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()
<http://msdn2.microsoft.com/en-us/library/aa363436.aspx> and struct DCB:
<http://msdn2.microsoft.com/en-us/library/aa363214.aspx> 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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]