1
0
mirror of https://github.com/UzixLS/picocom.git synced 2025-07-19 07:21:18 +03:00

#84: Manual control of handshake lines for OpenBsd, NetBsd and Dragonfly

This commit is contained in:
Joe Merten
2018-01-15 20:23:07 +01:00
parent f9e0b4c8a2
commit 7a14651b93
4 changed files with 89 additions and 5 deletions

81
bsd.txt Normal file
View File

@ -0,0 +1,81 @@
Test environment
================
- VirtualBox host Kubuntu 16.04
- FreeBsd 11.0 (VM)
- OpenBsd 6.2 (VM)
- NetBsd 7.1.1 (VM)
- Dragonfly 5.0.2 (VM)
- OSX 10.11.6 El Capitan (native on Macbook Pro)
- macOS 10.12 Sierra (native on Macbook Pro)
- Kubuntu 16.04 (native on Macbook Pro)
- all above on Intel x86 64 Bit
- Cygwin 5.1 on Windows XP 32 Bit host
- Ftdi FT232R, max 1MBaud (chip can 3MBaud, but hw rs232 level shifter is specified for just 1MBaud)
- Prolific PL2303, max 230kBaud (chip can 12MBaud, but hw rs232 level shifter is specified for just 230kBaud)
- Unknown Asus onboard (16550 compatible?) uart chip, max 115kBaud.
Just minor testing with this uart, because it seems that it don't supports non standard baudrates.
For Cygwin, I'd just checked if it will build and ran `picocom -h`. I'd personally failed opening a serial port within Cygwin.
Note that for Cygwin it needs to implement a `cfmakeraw()` replacement. See also:
https://cygwin.com/ml/cygwin/2008-09/msg00295.html
https://sourceforge.net/p/ser2net/patches/9/
https://sourceforge.net/p/ser2net/patches/_discuss/thread/8b87fdad/ed37/attachment/ser2net-2.2-cygwin.patch
Accessings serial ports (examples)
==================================
- Kubuntu:
/dev/ttyS0
/dev/ttyUSB0
- FreeBsd:
/dev/ttyu0
/dev/ttyU0
- OpenBsd:
/dev/cuaU0
- NetBsd:
/dev/ttyU0
- Dragonfly:
/dev/ttyU0
- macOS
/dev/tty.usbserial-FTGNI4B7
Manual controlling handshake lines
==================================
All above listed Bsd variants (FreeBsd, OpenBsd, NetBsd, Dragonfly and even macOS) fail when trying to control the handshake lines
(rts and dtr) using the `tcsetattr()` based default implementation. But they all basically work with the `ioctl()` based alternate code.
So I changed that `#define USE_IOCTL` appropriate.
But however, there are some issues regarding rts and dtr control for OpenBsd, NetBsd and Dragonfly (see details below).
Issues
======
OpenBsd
-------
- `term_get_mctl()` sometimes reports wrong values for rts and dtr state (after port open).
- `--lower-rts` works as expected, but `--lower-dtr` lowers both rts and dtr lines.
Same for interactive toggle via `[C-t]` and `[C-g]`. Toggle rts via `[C-g]` works but toggle
dtr via `[C-t]` also changes the state of rts (and `term_get_mctl()` reports wrong rts state afterwards).
- Issues occurs with both Ftdi and Prolific adapters.
NetBsd
------
- `term_get_mctl()` sometimes reports wrong values for rts and dtr state (after port open)
- Issue occurs with both Ftdi and Prolific adapters.
Dragonfly
---------
- Got "FATAL: cannot lock /dev/ttyU0: Operation not supported" on startup.
Need to pass `--nolock` or build with `#define USE_FLOCK` not set.
- `term_get_mctl()` sometimes reports wrong state for dtr, e.g. when passing `--lower-dtr`.
- When exit via `[C+x]`, got "term_exitfunc: reset failed for dev /dev/ttyU0: Invalid argument".

View File

@ -96,7 +96,8 @@ here.
: Toggle the RTS line. If RTS is up, then lower it. If it is down,
then raise it. Not supported if the flow control mode is RTS/CTS.
Only supported in Linux, FreeBSD and macOS.
Only supported in Linux, FreeBSD, OpenBSD, NetBSD, DragonFly and
macOS.
**C-backslash**

View File

@ -255,8 +255,8 @@ int sig_exit = 0;
int tty_fd = -1;
int log_fd = -1;
/* RTS and DTR are usually raised upon opening the serial port (at
least as tested on Linux and macOS, but FreeBSD behave different) */
/* RTS and DTR are usually raised upon opening the serial port (at least
as tested on Linux, OpenBSD and macOS, but FreeBSD behave different) */
int rts_up = 1;
int dtr_up = 1;

6
term.c
View File

@ -52,8 +52,10 @@
#define CMSPAR 0
#endif
#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
#if defined(__linux__) || \
defined(__FreeBSD__) || defined(__OpenBSD__) || \
defined(__NetBSD__) || defined(__DragonFly__) || \
defined(__APPLE__)
#define USE_IOCTL
#endif
#ifdef USE_IOCTL