This driver allows to use any tty as peripheral for BrlTTY. There are many ways
to use it.

By ssh-ing from another machine
-------------------------------

ssh from machB to machA, and give the current tty as device to brltty:

samy@machB$ ssh machA
samy@machA$ su -
Password:
root@machA# brltty -b tt -d `tty` -B term=$TERM -n

By using an Xterm
-----------------

Just give the tty used by the xterm to brltty.

$ su -
Password:
# brltty -b tt -d `tty` -B term=$TERM -n

By using a real tty
-------------------

Just give the serial port on which it is connected to brltty:

# brltty -b tt -d /dev/ttyS0 -B term=ampex232,baud=19200,charset=IBM850,locale=fr_FR.IBM850

I here had to precise the type of terminal (I have an Ampex232, see somewhere
like /usr/share/terminfo for your own's.

I also had to tell that it uses the IBM850 codepage table. And I hence also
had to tell to use a special locale: fr_FR.IBM850, since I want french,
with IBM850 charset. I had to generate since by hand by adding
fr_FR.IBM850 IBM850
to my /etc/locale.gen, and then relaunch locale-gen


Notes
-----

Another machine connected by a null-modem can be used as a tty: just run
minicom on it, and use vt100 as type of terminal.

If a BrlAPI application writes dots (Gnopernicus for instance) you won't
get the text.

See help.txt (or press F1) to get help on key bindings
Default configuration should be fine, but if not, get sure to use 8-dot text
style and not to show attributes in the configuration menu (F4).

Note that when the displayed window is not supposed to contain the cursor, the
cursor is actually put below the displayed window.
