public inbox for cygwin-cvs@sourceware.org help / color / mirror / Atom feed
From: Corinna Vinschen <corinna@sourceware.org> To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: fix TIOCMBIS/TIOCMBIC not working when using usbser.sys Date: Fri, 11 Nov 2022 12:06:17 +0000 (GMT) [thread overview] Message-ID: <20221111120618.BCEA2395B068@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=2dab880c963ce0204c3513d664f610b587a3e6a6 commit 2dab880c963ce0204c3513d664f610b587a3e6a6 Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com> Date: Fri Nov 11 11:15:27 2022 +0100 Cygwin: fix TIOCMBIS/TIOCMBIC not working when using usbser.sys In winsup/cygwin/fhandler/serial.cc, the function fhandler_serial::switch_modem_lines() is called when TIOCMBIS/TIOCMBIC are used in an ioctl() call. This function uses EscapeCommFunction() for setting and resetting RTS and DTR signals of a serial port. Unfortunately, this function does not work on USB CDC devices. This is not a true bug of CYGWIN but an issue of the usbser.sys driver, from Windows 2000 to the latest Windows 11. Both 32bit and 64bit versions of the operating system are affected. Actually, I tested EscapeCommFunction() also when using a real UART, based on the traditional 16550 driver and it works fine. Using thirdy party CDC drivers, like the one provided by FTDI for their USB bridge chips, probably also works. However, it is also possible to drive the RTS/DTR signals by writing their state with SetCommState(), which proved to be working fine all types of connection. This is also a better solution for handling these signals since RTS/DTR can be set at the same time rather than having two separate calls with a visible delay between them. Diff: --- winsup/cygwin/fhandler/serial.cc | 67 +++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 39 deletions(-) diff --git a/winsup/cygwin/fhandler/serial.cc b/winsup/cygwin/fhandler/serial.cc index 174a57a43..58a8df677 100644 --- a/winsup/cygwin/fhandler/serial.cc +++ b/winsup/cygwin/fhandler/serial.cc @@ -391,50 +391,39 @@ fhandler_serial::tcflow (int action) int fhandler_serial::switch_modem_lines (int set, int clr) { - int res = 0; - - if (set & TIOCM_RTS) - { - if (EscapeCommFunction (get_handle (), SETRTS)) - rts = TIOCM_RTS; - else - { - __seterrno (); - res = -1; - } - } - else if (clr & TIOCM_RTS) - { - if (EscapeCommFunction (get_handle (), CLRRTS)) - rts = 0; - else - { - __seterrno (); - res = -1; - } - } - if (set & TIOCM_DTR) + if ((set & (TIOCM_RTS | TIOCM_DTR)) || (clr & (TIOCM_RTS | TIOCM_DTR))) { - if (EscapeCommFunction (get_handle (), SETDTR)) - rts = TIOCM_DTR; + DCB dcb; + + memset(&dcb,0,sizeof(dcb)); + dcb.DCBlength = sizeof(dcb); + + if (!GetCommState(get_handle(), &dcb)) + { + __seterrno (); + return -1; + } + + if (set & TIOCM_RTS) + dcb.fRtsControl = RTS_CONTROL_ENABLE; else - { - __seterrno (); - res = -1; - } - } - else if (clr & TIOCM_DTR) - { - if (EscapeCommFunction (get_handle (), CLRDTR)) - rts = 0; + if (clr & TIOCM_RTS) + dcb.fRtsControl = RTS_CONTROL_DISABLE; + + if (set & TIOCM_DTR) + dcb.fRtsControl = DTR_CONTROL_ENABLE; else - { - __seterrno (); - res = -1; - } + if (clr & TIOCM_DTR) + dcb.fRtsControl = DTR_CONTROL_DISABLE; + + if (!SetCommState(get_handle(), &dcb)) + { + __seterrno (); + return -1; + } } - return res; + return 0; } /* ioctl: */
reply other threads:[~2022-11-11 12:06 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20221111120618.BCEA2395B068@sourceware.org \ --to=corinna@sourceware.org \ --cc=cygwin-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).