The Linux Serial HOWTO by Greg Hankins, gregh@cc.gatech.edu v1.7, 29 October 1994 This document describes how to set up serial communications devices on a Linux box. 1. Introduction This is the Linux Serial HOWTO. All about how to set up modems and terminals under Linux, some serial tips, and troubleshooting. 1.1. Copyright The Linux Serial HOWTO is copyright (C) 1994 by Greg Hankins. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions. All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below. In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs. If you have questions, please contact Matt Welsh, the Linux HOWTO coordinator, at mdw@sunsite.unc.edu. You may finger this address for phone number and additional contact information. 1.2. Other sources of information o man pages for: getty(1m), gettydefs(4), init(1), login(1), setserial(8) o Your modem manual o UUCP HOWTO: for information on setting up UUCP o Printing HOWTO: deals with setting up a serial printer o NET-2 HOWTO: all about networking, including SLIP and PPP o Term HOWTO: everything you wanted to know about the term program o USENET newsgroups: comp.os.linux.admin Installing and administering Linux systems. comp.os.linux.announce Announcements important to the Linux community. (Moderated) comp.os.linux.development Ongoing work on the Linux operating system. comp.os.linux.help Questions and advice about Linux. comp.os.linux.misc Linux topics not covered by other groups. o the Linux SERIAL channel mailing list. To join, send email to linux-activists-request@niksula.hut.fi with ``X-Mn-Admin: join SERIAL'' in the message body or header. If you send ``X-Mn-Admin: help'' you get a help message. 1.3. New versions of this document New versions will be placed on sunsite.unc.edu:/pub/Linux/docs/HOWTO/Serial-HOWTO, and the mirror sites. The Serial HOWTO (http://sunsite.unc.edu/mdw/HOWTO/Serial-HOWTO.html) is also available for WWW clients such as mosaic. If you don't have FTP access, you can get Linux help files via email. Bill Riemers runs a mail handler on his account. Send mail to bcr@physics.purdue.edu with a subject of ``help'' for more infomation, and to get an index file. 1.4. Feedback Please send me any questions, comments, suggestions, or additional material. I'm always eager to hear about what you think about the HOWTO. I'm also always on the lookout for improvements! Tell me exactly what you don't understand, or what could be clearer. You can reach me at gregh@cc.gatech.edu via email. I can also be reached at: Greg Hankins College of Computing 801 Atlantic Drive Atlanta, GA 30332-0280 via snail mail, and at my home page (http://www.cc.gatech.edu/staff/h/Greg.Hankins/) via the WWW. Please include the version number of the Serial HOWTO when writing, this is version 1.7. 1.5. Disclaimer Your milage may vary. The answers given may not work for all systems and all setup combinations. 2. Supported serial hardware Linux supports the following serial hardware, (ie is known to work with). o standard PC serial boards (COM1 - COM4) o standard PC internal modems (COM1 - COM4) 2.1. Multiport serial boards o Usenet Serial Board II o Boca 4-port (BB-1004) o Boca 8-port (BB-1008) o Boca 16-port (BB-2016) o Boca 6-port (IO/AT66) o AST FourPort boards and clones o Accent Async boards o Bell Technologies HUB6 o STB-4COM In general, Linux will support any serial board which uses a 8250, 16450, 16550, 16550A (or compatible) UART, or an internal modem which emulates one of the above UARTs. Special note on the BB-1004 and BB-1008, they do not support DCD and RI lines, and thus are not usable for dialin modems. They will work fine for all other purposes. 2.2. Intelligent multiport serial boards o Cyclades Cyclom 8-port (Cyclom 8Y) o Cyclades Cyclom 16-port (Cyclom 16Y) o DigiBoard PC/Xe (2, 4, or 8 port) (expected November 1994) o Digiboard COM/Xi (4 or 8 port) (pre-ALPHA driver contact Simon Park for information) o Specialix SI0 (modular, 4 - 32 ports) (ALPHA driver: contact Simon Allen for information) 2.3. Network serial boards o SDL N2 (RS-232 and V.35) HDLC (driver under developement) o Sangoma Technologies frame-relay board (driver under developement) 3. What are the names of the serial ports? There are the 4 serial devices corresponding to COM1 - COM4: /dev/cua0, /dev/ttyS0 (COM1) address 0x3f8 IRQ 4 /dev/cua1, /dev/ttyS1 (COM2) address 0x2f8 IRQ 3 /dev/cua2, /dev/ttyS2 (COM3) address 0x3e8 IRQ 4 /dev/cua3, /dev/ttyS3 (COM4) address 0x2e8 IRQ 3 The /dev/ttySN devices are for incoming connections and /dev/cuaN devices for outgoing connections. N is the serial port number. In this document, I refer to COM1 as ttyS0, COM2 as ttyS1, COM3 as ttyS2, and COM4 as ttyS3. If I am refering to a specific device in /dev, I will always prepend /dev to avoid confusing you. On some installations, two extra devices will be created, /dev/modem for your modem and /dev/mouse for your mouse. Both of these are symbolic links to the appropriate /dev/cuaN device which you specified during the installation (unless you have a bus mouse, then /dev/mouse will point to the bus mouse device). There has been some discussion on the merits of /dev/mouse and /dev/modem. I strongly discourage the use of these links. In particular, if you are planning on using your modem for dialin you will run into problems because the lock files will not work correctly if you use /dev/modem. Also, Taylor UUCP does not support symlinks either. Use them if you like, but be sure they point to the right device. 3.1. Major and minor device numbers of serial devices in /dev /dev/ttyS0 major 4, minor 64 /dev/cua0 major 5, minor 64 /dev/ttyS1 major 4, minor 65 /dev/cua1 major 5, minor 65 /dev/ttyS2 major 4, minor 66 /dev/cua2 major 5, minor 66 /dev/ttyS3 major 4, minor 67 /dev/cua3 major 5, minor 67 Note that all distributions come with these devices already made correctly. 3.1.1. Creating devices in /dev If you don't have a device, you will have to create it with the mknod command. Example, suppose you needed to create devices for ttyS0: linux# mknod -m 666 /dev/cua0 c 5 64 linux# mknod -m 666 /dev/ttyS0 c 4 64 You can also get the MAKEDEV script, available on the usual FTP sites. This simplifies the making of devices. For example, if you needed to make the devices for ttyS0 you would type: linux# cd /dev linux# MAKEDEV ttyS0 This handles the devices creation for the incoming and outgoing devices. 3.1.2. Notes for multiport boards The devices your multiport board uses depends on what kind of board you have. These are listed in detail in the rc.serial which comes with the setserial program. You will probably need to create these devices. Either use the mknod command, or get the MAKEDEV script. Devices for mulitport boards are made by adding 64 + the port number. So, if you wanted to create devices for ttyS17, you would type: linux# mknod -m 666 /dev/cua17 c 5 81 linux# mknod -m 666 /dev/ttyS17 c 4 81 Note that ``64 + 17 = 81''. Using the MAKEDEV script, you would type: linux# cd /dev linux# /dev/MAKEDEV ttyS17 4. What is getty_ps? This is just another version of getty, which is a program that handles some of the login process when you log in to a UNIX box. It was written by Paul Sutcliffe, Jr. . Kris Gleason currently maintains it. 2.0.7e is the latest version, and supercedes any older versions. Most Linux distributions come with getty_ps installed as the default getty. Thus, I will mainly focus on using the getty_ps package in this document, but you are free to use any getty you like. You should check to make sure you do indeed have getty_ps as the default getty. At your Linux prompt, type: linux# strings /sbin/getty | grep RINGBACK If grep returns ``RINGBACK'' then you have the right getty. If you do not have this version of getty, I highly recommend that you get it. It can be found on the standard Linux FTP sites. (Kris has promised me to implement a version feature in the next release, to avoid doing this grep sillyness.) 4.1. Installing getty_ps Get the latest version from a Linux FTP site. By default, getty_ps will be configured to be Linux FSSTND (FileSystem STaNDard) compliant, which means that it will put the binaries in /sbin, and config files in /etc/conf.{uu}getty.ttySN. It will also expect lock files to go in /var/lock. Make sure you have the /var/lock directory. If you don't want FSSTND compliance, binaries will go in /etc, config files will go in /etc/default/{uu}getty.ttySN, and lock file will go in /usr/spool/uucp. I recommend doing things this way if you are using UUCP, because Taylor UUCP will have problems if you move the lock files to where it isn't looking for them. You could always link /usr/spool/uucp to /var/lock though, I guess. getty_ps also uses syslogd to log messages. See the man pages for syslogd(1) and syslog.conf(5) for setting up syslogd, if you don't have it running already. Messages are logged with priority LOG_AUTH, errors use LOG_ERR, and debugging uses LOG_DEBUG. If you don't want to use syslogd you can edit tune.h in the getty_ps source files to use a log file for messages instead, namely /var/adm/getty.log by default. When you have decided if you want FSSTND, and syslog, edit tune.h and the Makefile in the getty_ps source directory to reflect you decisions. Now, install according to the instructions. Once you have installed getty_ps, and are certain it is working, you can remove any other versions of getty you have. Be sure to check in /bin, /etc, /usr/bin, /usr/etc, /usr/man/man1, and /usr/man/cat1 for any thing called getty - there are old versions lurking everywhere. Also, you can safely remove the old config file /etc/gettytab - you only need /etc/gettydefs. From this point on, all references to getty will refer to getty_ps. References to uugetty will refer to the uugetty that comes with the getty_ps package. 5. What is setserial? setserial is a program which allows you to look at and change various attributes of a serial device, including its port, its IRQ, and other serial port options. It was initially written Rick Sladkey, and was heavily modified by Ted T'so , who also maintains it. The newest version is 2.10, and can be found on the Linux FTP sites. You can find out what version you have by running setserial with no arguments. On boot, only the ttyS{0-3} ports are configured, using the default IRQs of 4 and 3. So, if you have any other serial ports provided by other boards (such as an AST Fourport), or if ttyS{0-3} have a non- standard IRQ, you must use this program in order to configure those serial ports. For the full listing of options, consult the man page. 6. How do I dial out with my modem? 6.1. Hardware requirements First, make sure you have the right cable. Your modem requires a straight through cable, with no pins crossed. Any computer store should have these. Make sure you get the correct gender. Your DB25 serial port on your PC is always male. Do not confuse it with the parallel port, which is the female DB25. Hook up your modem to one of your serial ports. Consult your modem manual on how to do this if you need help. 6.1.1. Notes on internal modems For an internal modem, you will not need a cable. An internal modem does not need a serial port, it has one built in. All you need to do is configure it to use an interrupt that is not being used, and configure the I/O address. Consult your modem manual if you get stuck. Also, see section ``Can I use more than 2 serial devices?'' if you need help on choosing interrupts or addresses. Due to a bit of stupidity on IBM's part, you may encounter problems if you want your internal modem to be on ttyS3. If Linux does not detect your internal modem on ttyS3, you can use setserial and the modem will work fine. Internal modems on ttyS{0-2} should not have any problems being detected. 6.2. Talking to your modem Make sure that nothing is using the serial port you hooked your modem to. Check your /etc/inittab for getty processes using the serial port. Comment the line out (with a ``#'') and restart init: linux# init q Do not comment any lines that contain a ttyN device, only ones containing ttySN devices. ttyN devices are your virtual consoles. Use kermit to test the setup. For example, say your modem was on ttyS3, and it could handle 2400 bps. You would do the following: linux# kermit C-Kermit 5A(188), 23 Nov 92, POSIX Type ? or HELP for help C-Kermit>set line /dev/cua3 C-Kermit>set speed 2400 /dev/cua3, 2400 bps C-Kermit>c Connecting to /dev/cua3, speed 2400. The escape character is Ctrl-\ (ASCII 28, FS) Type the escape character followed by C to get back, or followed by ? to see other options. AT OK -\-C (Back at linux) C-Kermit>quit linux# If your modem responds to AT commands, you can assume your modem is working correctly on the Linux side. Try calling another modem. If you don't like kermit, try one of the more advanced comm programs. Check out section ``Noteworthy communications programs'' about comm programs if you need some pointers. 6.3. Dial out modem configuration For dial out use only, you can configure your modem however you want. I like to see result codes, so I set Q0 - result codes are reported. To set this on my modem, I would have to preceed the register name with an AT command. Using kermit or some comm program, connect to your modem and do the following: ATQ0 If your modem says OK back to you, then the register is set. Do this for each register you want to set. I also like to see what I'm typing, so I set E1 - command echo on. If your modem has data compression capabilities, you probably want to enable them. If you can lock the serial port speed, and let the modem handle modem-modem bps rate transitions, do this. Consult your modem manual for more help, and a full listing of options. If your modem supports a stored profile, be sure to write the configuration to the modem (often done with AT&W) if not you will have to set the registers everytime you turn on your, or reset your modem. When you dial out with your modem, set the speed to the highest bps rate that your modem supports. Since there is no speed named 57600 or 115200 bps, you must use the setserial program to set your serial port to a higher speed. See section ``How do I set up my serial ports for higher speeds?'' for doing this. Then, set the speed to 38400 bps in your comm program. 6.4. Hardware flow control If your modem supports hardware flow control (RTS/CTS), I highly recommend you use it. This will allow you to lock your serial port - modem speed (DTE - DCE) at a high bps rate, independant from the modem - modem speed. This is particularly important for modems that support data compression. First, you have to enable RTS/CTS flow control on the serial port itself. This is best done on startup, like in /etc/rc.local or /etc/rc.serial: stty crtscts < /dev/cua3 Be sure to put in the correct serial port you wish to enable. You must also enable RTS/CTS flow control on your modem. Consult your modem manual on how to do this, as it varies between modem manufacturers. Be sure to save your modem configuration if your modem supports stored profiles. 7. How do I dial in and out with my modem? Get your modem to dial out correctly. If you haven't read section ``How do I dial out with my modem'' go read it now. 7.1. Dial in and out modem configuration For dialin and dialout use, you have to set up your modem a certain way (again, using the AT command on your modem): E1 command echo ON Q0 result codes are reported V1 verbose ON S0=0 never answer (uugetty handles this with the WAITFOR option) If you don't set these correctly, your INIT string in your config file may fail, hosing the whole process. But, more on config files below... &C1 DCD is on after connect only &S0 DSR is always on DTR on/off resets modem (depends on manufacturer - RTFM) These affect what your modem does when calls start and end. If your modem does not support a stored profile, you can set these through the INIT string in your config file. See below. Some modems come with DIP switches that affect register settings. Be sure these are set correctly, too. I have started a collection of modem setups for different types of modems. So far, I only have a few of them, if you would like to send me your working configuration, please do so! If you would like me to send you one of the configurations, just mail me and ask. I'm not listing them here due to space concerns. I have setups for Telebit T1600, USR Courier, and Zoom 14.4/28.8 modems. 7.2. Setting up uugetty For dialing into, and out from your modem, we want to use uugetty. uugetty does important lock file checking. Replace the stock getty with getty_ps as described in section ``What is getty_ps''. Update /etc/gettydefs to include entries for modems (note that the entries point to each other, these are not for fixed speed): # Modem entries 38400# B38400 CS8 # B38400 SANE -ISTRIP HUPCL #@S @L @B login: #19200 19200# B19200 CS8 # B19200 SANE -ISTRIP HUPCL #@S @L @B login: #9600 9600# B9600 CS8 # B9600 SANE -ISTRIP HUPCL #@S @L @B login: #2400 2400# B2400 CS8 # B2400 SANE -ISTRIP HUPCL #@S @L @B login: #1200 1200# B1200 CS8 # B1200 SANE -ISTRIP HUPCL #@S @L @B login: #300 300# B300 CS8 # B300 SANE -ISTRIP HUPCL #@S @L @B login: #38400 If you have a 9600 bps or faster modem, you can lock your serial port speed and let the modem handle the transition to other bps rates. Then, instead of the step down series of lines listed above, /etc/gettydefs only needs to contain one line for the modem: # 38400 fixed speed F38400# B38400 CS8 # B38400 SANE -ISTRIP HUPCL #@S @L @B login: #F38400 # 19200 fixed speed F19200# B19200 CS8 # B19200 SANE -ISTRIP HUPCL #@S @L @B login: #F19200 # 9600 fixed speed F9600# B9600 CS8 # B9600 SANE -ISTRIP HUPCL #@S @L @B login: #F9600 If you have your modem set up to do RTS/CTS hardware flow control, you can add CRTSCTS to the entries: # 38400 fixed speed with hardware flow control F38400# B38400 CS8 CRTSCTS # B38400 SANE -ISTRIP HUPCL CRTSCTS #@S @L @B login: #F38400 # 19200 fixed speed with hardware flow control F19200# B19200 CS8 CRTSCTS # B19200 SANE -ISTRIP HUPCL CRTSCTS #@S @L @B login: #F19200 # 9600 fixed speed with hardware flow control F9600# B9600 CS8 CRTSCTS # B9600 SANE -ISTRIP HUPCL CRTSCTS #@S @L @B login: #F9600 If you want, you can make uugetty print interesting things in the login banner. In my examples, I have the system name, the serial line, and the current bps rate. You can add other things: @B The current (evaluated at the time the @B is seen) bps rate. @D The current date, in MM/DD/YY. @L The serial line to which getty is attached. @S The system name. @T The current time, in HH:MM:SS (24-hour). @U The number of currently signed-on users. This is a count of the number of entries in the /etc/utmp file that have a non-null ut_name field. @V The value of VERSION, as given in the defaults file. To display a single '@' character, use either '\@' or '@@'. Next, make sure that you have an outgoing and incoming device for the serial port your modem is on. If you have your modem on ttyS3 you will need the /dev/cua3, and /dev/ttyS3 devices. If you don't have the correct devices, see section ``Creating devices in /dev'' on how to create devices, and create the devices. 7.3. Customizing uugetty There are lots of parameters you can tweak for each port you have. These are implemented in seperate config files for each port. The file /etc/conf.uugetty will be used by all instances of uugetty, and /etc/conf.uugetty.ttySN will only be used by that one port. Sample default config files can be found with the getty_ps source files, which come with most Linux distributions. Due to space concerns, they are not listed here. Note that if you are using older versions of getty (older than 2.0.7e), or aren't using FSSTND, then the default files will be in /etc/default/uugetty.ttySN. My /etc/conf.uugetty.ttyS3 looks like this: # sample uugetty configuration file for a Hayes compatible modem to allow # incoming modem connections # alternate lock file to check... if this lock file exists, then uugetty is # restarted so that the modem is re-initialized ALTLOCK=cua3 ALTLINE=cua3 # line to initialize INITLINE=cua3 # timeout to disconnect if idle... TIMEOUT=60 # modem initialization string... # # format: ... (chat sequence) INIT="" \d+++\dAT\r OK\r\n ATH0\r OK\r\n AT\r OK\r\n WAITFOR=RING CONNECT="" ATA\r CONNECT\s\A # this line sets the time to delay before sending the login banner DELAY=1 #DEBUG=010 Add the following line to your /etc/inittab, so that uugetty is run on your serial port (substituting in the correct information for your environment - port, speed, and terminal type): S3:456:respawn:/sbin/uugetty ttyS3 F38400 vt100 Restart init: linux# init q For the speed parameter in your inittab, you will want to use the highest bps rate that your modem supports. Since there is no speed named 57600 or 115200, you must use the setserial program to set your serial port to a higher speed. See section ``How do I set up my serial ports for higher speeds?'' for doing this. Then, use 38400 bps in your inittab. Now Linux will be watching your serial port for connections. Dial in from another site and login to you Linux system. Rejoice. getty and uugetty have a lot more options, see the man page for getty(1m) for a full description. Among other things there is a scheduling feature, and a ringback feature. RTFM :-). 8. How do I set up a terminal connected to my PC? 8.1. Hardware requirements Make sure you have the right kind of cable. A null modem cable bought at a computer store will do it. But it must be a null modem cable! Make sure you are using your serial port, and not your parallel port. At a minimum, you should have (for a DB25 connector): RxD Receive Data 2 - 3 TxD Transmit Data TxD Transmit Data 3 - 2 RxD Receive Data GND Signal Ground 7 - 7 GND Signal Ground If you want to have flow control and hardware handshaking, you must have a full null modem cable: Frame Ground 1 - 1 Frame Ground RxD Receive Data 2 - 3 TxD Transmit Data TxD Transmit Data 3 - 2 RxD Receive Data RTS Request To Send 4 - 5 CTS Clear To Send CTS Clear To Send 5 - 4 RTS Request To Send DSR Data Set Ready 6 - 20 DTR Data Terminal Ready GND Signal Ground 7 - 7 GND Signal Ground DCD Carrier Detect 8 - 20 DTR Data Terminal Ready DTR Data Terminal Ready 20 - 6 DSR Data Set Ready DTR Data Terminal Ready 20 - 8 DCD Carrier Detect If you have a DB9 connector on your port, try the following: DB9 DB25 RxD Receive Data 2 - 2 TxD Transmit Data TxD Transmit Data 3 - 3 RxD Receive Data GND Signal Ground 5 - 7 GND Signal Ground Alternatively, a DB9-DB25 null modem cable: DB9 DB25 DCD Carrier Detect 1 - 20 DTR Data Terminal Ready RxD Receive Data 2 - 2 TxD Transmit Data TxD Transmit Data 3 - 3 RxD Receive Data DTR Data Terminal Ready 4 - 6 DSR Data Set Ready DTR Data Terminal Ready 4 - 8 DCD Carrier Detect GND Signal Ground 5 - 7 GND Signal Ground DSR Data Set Ready 6 - 20 DTR Data Terminal Ready RTS Request To Send 7 - 5 CTS Clear To Send CTS Clear To Send 8 - 4 RTS Request To Send (RI Ring Indicator 9 not needed) If you are not using a full null modem cable, you might have to do the following trick: on your computer side of the connector, connect RTS and CTS together, and also connect DSR, DCD and DTR together. This way, when the computer wants a certain handshaking signal, it will get it (from itself). Now that you have the right kind of cable, connect your terminal to your computer. If you can, tell you terminal to ignore modem control signals. Try using 9600 bps, 8 data bits, 1 stop bit, no parity bits for the terminal's setup. 8.2. Setting up getty Replace the stock getty with getty_ps as described in section ``What is getty_ps?''. Add an entry for getty to use for your terminal in /etc/gettydefs: # 38400 bps Dumb Terminal entry DT38400# B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL #S @L login: #DT38400 # 19200 bps Dumb Terminal entry DT19200# B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL #S @L login: #DT19200 # 9600 bps Dumb Terminal entry DT9600# B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL #S @L login: #DT9600 You can add HUPCL so the login is killed whenever you switch of the terminal (provided you use a proper null modem cable). If you want, you can make getty print interesting things in the login banner. In my examples, I have the system name and the serial line printed. You can add other things: @B The current (evaluated at the time the @B is seen) bps rate. @D The current date, in MM/DD/YY. @L The serial line to which getty is attached. @S The system name. @T The current time, in HH:MM:SS (24-hour). @U The number of currently signed-on users. This is a count of the number of entries in the /etc/utmp file that have a non-null ut_name field. @V The value of VERSION, as given in the defaults file. To display a single '@' character, use either '\@' or '@@'. Edit your /etc/inittab file to run getty on the serial port (substituting in the correct information for your environment - port, speed, and terminal type): S1:456:respawn:/sbin/getty ttyS1 DT9600 vt100 Restart init: linux# init q At this point, you should see a login prompt on your terminal. You may have to hit return a couple of times to get the terminal's attention. Rejoice. Party. Log in on your terminal and PC. talk to yourself from accross the room. 9. Can I use more than 2 serial devices? You don't need to read this section, unless you want to use 3 or more serial devices... (assuming you don't have a multiport board). Providing you have another spare serial port, yes, you can. The number of serial ports you can use is limited by the number of interrupts (IRQ) and port I/O addresses we have to use. Each serial devices must be assigned it's own interrupt and address. A serial device can be a serial port, an internal modem, or a multiport serial board. Multiport serial boards are specially designed to have multiple serial ports that share the same IRQ for all serial ports on the board. Linux gets data from them by using a different I/O address for each port on the card. 9.1. Choosing serial device interrupts Your PC will normally come with ttyS0 and ttyS2 at IRQ 4, and ttyS1 and ttyS3 at IRQ 3. To use more than 2 serial devices, you will have to give up an interrupt to use. A good choice is to reassign an interrupt from your parallel port. Your PC normally comes with IRQ 5 and IRQ 7 set up as interrupts for your parallel ports, but few people use 2 parallel ports. You can reassign one of the interrupts to a serial device, and still happily use a parallel port. You will need the setserial program to do this. In addition, you have to play with the jumpers on your boards, check the docs for your board. Set the jumpers to the IRQ you want for each port. You will need to set things up so that there is one, and only one interrupt for each serial device. Here is how I set mine up in /etc/rc.local - you should do it upon startup somewhere: /etc/setserial /dev/cua0 irq 3 # my mouse /etc/setserial /dev/cua1 irq 4 # my dumb terminal /etc/setserial /dev/cua2 irq 5 # my 2400 bps modem /etc/setserial /dev/cua3 irq 9 # my telebit modem Standard IRQ assignments: IRQ 0 Timer channel 0 IRQ 1 Keyboard IRQ 2 Cascade for controller 2 IRQ 3 Serial port 2 IRQ 4 Serial port 1 IRQ 5 Parallel port 2 IRQ 6 Floppy diskette IRQ 7 Parallel port 1 IRQ 8 Real-time clock IRQ 9 Redirected to IRQ2 IRQ 10 not assigned IRQ 11 not assigned IRQ 12 not assigned IRQ 13 Math coprocessor IRQ 14 Hard disk controller IRQ 15 not assigned There is really no Right Thing to do when choosing interrupts. Just make sure it isn't being used. 2, 3, 4, 5, or 7 is a good choice. ``not assigned'' means that currently nothing standard uses these IRQs. Also note that IRQ 2 is the same as IRQ 9. You can call it either 2 or 9, the serial driver is very understanding. If you have a serial card with a 16-bit bus connector, you can also use IRQ 10, 11, 12 or 15. Just make sure you don't use IRQ 0, 1, 6, 8, 13 or 14! These are used by your mother board. You will make her very unhappy by taking her IRQs. 9.2. Setting serial device addresses Next, you must set the port address. Check the manual on your board for the jumper settings. Like interrupts, there can only be one serial device at each address. Yours port will usually come configured as follows: /dev/cua0, /dev/ttyS0 address 0x3f8 ttyS0 /dev/cua1, /dev/ttyS1 address 0x2f8 ttyS1 /dev/cua2, /dev/ttyS2 address 0x3e8 ttyS2 /dev/cua3, /dev/ttyS3 address 0x3e8 ttyS3 Choose which address you want each serial device to have and set the jumpers accordingly. I have my modem on ttyS3, and my mouse on ttyS0. When you reboot, Linux should see your serial ports at the address you set them. The IRQ Linux sees may not correspond to the IRQ you set with the jumpers. Don't worry about this. Linux does not do any IRQ detection when it boots, because IRQ detection is dicy and can be fooled. Use setserial to tell Linux what IRQ the port is using. 10. Can Linux configure the serial devices automagically? Yes. To get Linux to detect and set up the serial devices automatically on startup, add the line: /etc/setserial /dev/cua0 auto_irq skip_test autoconfig to your /etc/rc.local or /etc/rc.serial file. Do this for every serial port you want to auto configure. Be sure to give the correct location of where your setserial program lives, and give a device name that really does exist on your machine. 10.1. Notes for multiport boards For board addresses, and IRQs, look at the rc.serial that comes with the setserial program. It has a lot of detail on multiport boards, including I/O addresses and device names. 11. How do I set up my serial ports for higher speeds? Use setserial, with the spd_hi flag to configure your serial port to use 57600 bps. Use spd_vhi to use 115200 bps. Then, set your speed to 38400 bps. This is now the new speed you have set. There is no speed named 57600 or 115200. Make sure you have 16550A UARTs :-). In my /etc/rc.local I set ttyS3 to 115200 bps by doing: /bin/setserial /dev/cua3 irq 9 spd_vhi 12. Noteworthy communications programs and utilities Once you get everything working, you may want to check out these more advanced programs, all are available on the usual FTP sites, if they didn't come with your distribution. o seyon - X based comm program o minicom - telix-like comm program o procomm - procommish comm program with zmodem These programs offer more features that just kermit alone, including telephone directories, auto-dialing and so on. o Another useful program is term. term multiplexes many connections over one serial line. It is somewhat similar to SLIP, and offers some SLIP functionality. These include rlogin, telnet, ftp, ncftp, finger, rdate, xmosaic and tredir. tredir is a special program which lets you redirect remote TCP/IP ports to your local machine. This allows for remote NNTP, and SMTP access. The good thing about term is that is runs entirely in user space, meaning it requires no kernel support, or sysadmin support (like SLIP does). o screen is another multi-session program. This one behaves like the virtual consoles. o callback is a program that will have your modem call you back immediately from where you just called. o mgetty+fax handles FAX stuff, and provides an alternate getty o Other things can be found on sunsite.unc.edu:/pub/Linux/system/Serial and sunsite.unc.edu:/pub/Linux/apps/comm or one of the many mirrors. These are the directories where all the serial type things are kept. 13. Serial Tips Here are some serial tips you might find helpful... 13.1. kermit and zmodem To use zmodem with kermit, add the following to your .kermrc: define rz !rz < /dev/cua3 > /dev/cua3 define sz !sz \%0 > /dev/cua3 < /dev/cua3 Be sure to put in the correct port your modem is on. Then, to use it, just type rz or sz at the kermit prompt. 13.2. Setting terminal types automagically To set your terminal type automagically when you log in, add the terminal type to the entry in /etc/inittab. If I have a vt100 terminal on ttyS1, I would add ``vt100'' to the getty command: S1:456:respawn:/sbin/getty ttyS1 DT9600 vt100 You can also get tset from sunsite.unc.edu:/pub/Linux/system/Terminal- management or a mirror site. See the docs that come with tset to learn how to use it. tset can establish terminal characteristics when you log in, and doesn't depend on any defaults. 13.3. Color ls on serial connections If ls is screwing up your terminal emulation with the color feature, turn it off. ls --color, and ls --colour all use the color feature. Some installations have ls set to use color by default. Check /etc/profile and /etc/csh.cshrc for ls aliases. You can also alias ls to ls -o or ls --no-color, if you don't want to change the system defaults. 13.4. Printing to a printer connected to a terminal There is a program called vtprint that will do this, written by Garrett D'Amore . It is available from ftp.sdsu.edu:/pub/vtprint. The following is from the README file that comes with the program: vtprint is a program that allows users to print from a remote UNIX host to a printer attached to their local termi- nal or emulator, which makes it great for printing files at home, etc. (It only does text files, though.) 14. Linux FTP sites sunsite.unc.edu [152.2.22.81]:/pub/Linux (NC, USA) tsx-11.mit.edu [18.172.1.2]:/pub/linux (MA, USA) nic.funet.fi [128.214.6.100)]/pub/OS/Linux (Finland, Europe) sunsite.unc.edu is the official Linux FTP site, and has many mirrors. Please use a mirror site if at all possible to save sunsite some traffic. sunsite mirrors: site path ------------------------------------------------------------------------------ mrcnext.cso.uiuc.edu /pub/linux/ ftp.linux.org /pub/mirrors/sunsite.unc.edu/ ftp.uni-paderborn.de /pub/Mirrors/sunsite.unc.edu/ ftp.cs.cuhk.hk /pub/Linux/ ftp.dungeon.com /pub/lunux/sunsite-mirror/ ftp.dfv.rwth-aachen.de /pub/linux/sunsite/ ftp.maths.warwick.ac.uk /mirrors/linux/sunsite.unc-mirror/ ftp.rus.uni-stuttgart.de /pub/unix/systems/linux/MIRROR.sunsite/ ftp.uni-erlangen.de /pub/Linux/MIRROR.sunsite/ ftp.uni-paderborn.de /pub/linux/sunsite/ ftp.gwdg.de /pub/linux/mirrors/sunsite/ ftp.tu-graz.ac.at /pub/Linux/ pub.vse.cz /pub/386-unix/linux/ dcs.muni.cz /pub/UNIX/linux/ ftp.univ-angers.fr /pub/linux/ hypergly.watson.ibm.com /pub/linux-sunsite (IBM internal network only) brandy.jf.intel.com /something (Intel internal network only) ftp.tu-dresden.de /pub/Linux/sunsite/ ftp.germany.eu.net /pub/os/Linux/Mirror.SunSITE/ ftp.nus.sg /pub/unix/Linux/ ftp.uni-tuebingen.de /pup/linux/Mirror.sunsite/ ftp.cnr.it /pub/Linux/ ftp.kfki.hu /pub/linux/ cnuce-arch.cnr.it /pub/Linux/ ftp.orst.edu /pub/mirrors/sunsite.unc.edu/linux/ ftp.nectec.or.th /pub/mirrors/linux/ ftp.switch.ch /mirrors/linux/ ftp.iquest.com /pub/linux/sunsite/ src.doc.ic.ac.uk /packages/linux/sunsite.unc-mirror/ smug.student.adelaide.edu.au /pub/sunsite.linux/ ftp.ba-mannheim.de /pub/linux/mirror.sunsite ftp.loria.fr /pub/linux/sunsite ftp.rz.uni-ulm.de /pub/mirrors/linux/sunsite ftp.cc.gatech.edu /pub/linux These FTP sites support annonymous FTP, which means login as ftp, and password as your email address, ie logname@yourhost.yourdomain. 15. One step further... 15.1. What are lock files? Lock file are simply a file saying that a particular device is in use. They are kept in /usr/spool/uucp, or /var/lock. Lock files are named LCK.., where is either a device name, or a UUCP site name. Certain processes create these locks so that they can have exclusive access to devices, for instance if you dial out on your modem, a lock will appear telling other processes that someone is using the modem already. Locks mainly contain the PID of the process that has locked the device. Most programs look at the lock, and try to determine if that lock is still valid by checking the process table for the process that has locked the device. If the lock is found to be valid, the program (should) exit. If not, some programs remove the stale lock, and use the device, creating their own lock in the process. Other programs just exit and tell you that the device is in use. 15.2. ``baud'' vs. ``bps'' ``baud'' and ``bps'' are prehaps one of the most misused terms in the computing/telecom field. Many people use these terms interchangeably, when in fact they are not! baud The baud rate is a measure of how many times per second the signal sent by a modem (modulator-demodulator) changes. For example, a baud rate of 1200 implies one signal change every 833 microseconds. Common baud rates are 300, 600, 1200, and 2400. Most high speed modems run at 2400 baud. Because of the bandwidth limitations on voice-grade phone lines, baud rates greater than 2400 are harder to achieve, and only work under very pristine phone line quality. ``baud'' is named after Emile Baudot, the inventor of the asynchronous telegraph printer. bps The bps rate is a measure of how many bits per second are transmitted. Common modem bps rates are 300, 1200, 2400, 4800, ... 28800. With V.42bis compression (4:1 compression), theoretical bps rates are possible up to 115200. This is what most people mean when they misuse the word ``baud''. So, if high speed modems are running at 2400 baud, how can they send 14400 bps? The modems achive a bps > baud rate by encoding a number of bits per baud. Thus, when 2 or more bits are encoded per baud, the bps rate exceeds the baud rate. If your modem connects at 14400 bps, it's going to be sending 6 bits per baud. How did this confusion start? Well, back when low speed modems were high speed modems, the bps rate actually did equal the baud rate. One bit would be encoded per baud. People would use bps and baud interchangeably, because they were the same number. For example, a 300 bps modem also had a baud rate of 300. This all changed when faster bps modems came around, and the bit rate exceeded the baud rate. 15.3. What are UARTs? How do they affect performance? UARTs (Universal Asyncronous Receiver Transmitter) are chips on your PC serial card. Their purpose is to convert data to bits, send the bits down the serial line, and then rebuild the data again on the other end. UARTs deal with data in byte sized pieces, which is conveniently also the size of ASCII characters. Say you have a terminal hooked up to your PC. When you type a character, the terminal presents it to it's transmitter (also a UART, although probably different that the PC UART). The transmitter sends that byte out onto the serial line, one bit at a time, at a specific rate. On the PC end, the receiving UART takes all the bits and rebuilds the byte and puts it in a buffer. There are two different types of UARTs. You have probably heard of dumb UARTs - the 8250 and 16450, and smart or FIFO UARTs - the 16550A. To understand their differences, first let's examine what happens when a UART has sent or received a byte. The UART itself can't do anything with the data, it just sends and receives it. The CPU gets an interrupt every time a byte has been sent or received. The CPU then moves the received byte out of the UART's buffer and into memory somewhere, or gives the UART another byte to send. The 8250 and 16450 UARTs only have a 1 byte buffer. That means, that every time 1 byte is sent or received, it interrupts the CPU. At low rates, this is OK. But, at high transfer rates, the CPU get so busy dealing with the UART, that is doesn't have time to tend to other tasks. In some cases, the CPU does not get around to servicing the interrupt in time, and the byte is overwritten, because they are coming in so fast. That's where the 16550A UARTs come in. These chips come with 16 byte FIFOs. This means that it can receive or transmit up to 16 bytes before it has to interrupt the CPU. Not only can it wait, but the CPU then can transfer all 16 bytes at a time. Although the interrupt threshold is seldom set at 16, this is still a significant advantage over the other UARTs, which only have the 1 byte buffer. The CPU receives less interrupts, and is free to do other things. Data is not lost, and everyone is happy. In general, the 8250 and 16450 UARTs should be fine for speeds up to 19200 bps. At speeds greater than 19200 bps, you might start seeing data loss, and a reduction in interactive response time. Other PC operating systems (definition used loosely here), like DOS aren't multitasking, so they might be able to cope better with 8250 or 16450s. That's why some people don't see data loss, until they switch to Linux. Keep in mind that these dumb UART types are not bad, they just aren't good for high speeds. You should have no problem connecting a terminal, or a mouse to these UARTs. But, for a high speed modem, the 16550A is definately a must. You can buy serial cards with the 16550A UARTs for a little more money, just ask your dealer what type of UART is on the card. Or if you want to upgrade your existing card, you can simply purchase 16550A chips and replace your existing 16450 UARTs. They are pin-to-pin compatible. Some cards come with socketed UARTs for this purpose, if not you can solder. Note, that you'll probably save yourself a lot of trouble by just getting a new card, if you've got the money, they are under US$ 50. 16. Troubleshooting 16.1. I keep getting ``line NNN of inittab invalid''. Make sure you are using the correct syntax for your version of init. The different init's that are out there use different syntax in the /etc/inittab file. Make sure you are using the correct syntax for your version of getty. 16.2. When I try to dial out, it says ``/dev/cuaN: Device or resource busy''. This problem can arise when DCD or DTR are not set correctly. DCD should only be set when there is an actual connection (ie someone is dialed in), not when getty is watching the port. Check to make sure that your modem is configured to only set DCD when there is a connection. DTR should be set whenever something is using, or watching the line, like getty, kermit, or some other comm program. Another common cause of ``device busy'' errors, is that you set up your serial port with an interrupt already taken by something else. As each device initializes, it asks Linux for permission to use its hardware interrupt. Linux keeps track of which interrupt is assigned to whom, and if your interrupt is already taken, your device won't be able to initialize properly. The device really doesn't have much of any way to tell you that this happened, except that when you try to use it, it will return a ``device-busy'' error. Check the interrupts on all of your cards (serial, ethernet, SCSI, etc.). Look for IRQ conflicts. 16.3. I keep getting ``Id SN respawning too fast: disabled for 5 min- utes''. Make sure your modem is configured correctly. Look at registers ` E and Q. This can occur when your modem is chatting with getty. Make sure you are calling getty correctly from your /etc/inittab. Using the wrong syntax or device names will cause serious problems. 16.4. Serial devices are slow or serial devices can only send in one direction. You probably have an IRQ conflict. Make sure there are no IRQs being shared. Check all your cards (serial, ethernet, SCSI, etc...). Make sure the jumper settings, and the setserial parameters are correct for all your serial devices. 16.5. My modem is hosed after someone hangs up. This can happen when your modem doesn't reset when DTR is dropped. I saw my RD and SD LEDs go nuts when this happened to me. You need to have your modem reset. Most Hayes compatible modems do this with &D3, but on my USR Courier, I had to set &D2 and S13=1. Check your modem manual. 16.6. I have a serial device connected, but root can't login on it. This is done on purpose for security reasons. Generally, you should only have root logins enabled on the console. It is considered dangerous to allow root logins on anything other than the console. But, you asked... Edit /etc/login.defs, and find the line that says CONSOLE. Add the name of the serial device to it. Say I have my terminal on ttyS1. I would change the line: CONSOLE tty1:tty2:tty3:tty4:tty5:tty6:tty8 to CONSOLE tty1:tty2:tty3:tty4:tty5:tty6:tty8:ttyS1 16.7. it just locks up. I have my terminal connected to my PC, but after I type in a login name, You probably don't have CLOCAL in your /etc/gettydefs entry for the terminal, and you're probably not using a full null modem cable. You need CLOCAL. CLOCAL tells Linux to ignore modem control signals. Here is what it should look like: # 38400 bps Dumb Terminal entry DT38400# B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL #@S @L login: #D38400 # 19200 bps Dumb Terminal entry DT19200# B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL #@S @L login: #DT19200 # 9600 bps Dumb Terminal entry DT9600# B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL #@S @L login: #DT9600 Next, kill the getty process so a new one will be spawned with the new entry. 16.8. At high speeds, my modem looses data. If you are trying to run your modem at > 19200 bps, and you don't have 16550A UARTs, you should upgrade them. See section ``What are UARTs?'' about UARTs. 16.9. them configured. On startup, Linux doesn't report the serial devices the way I have This is true. Linux does not do any IRQ detection on startup, it only does serial device detection. Thus, disregard what it says about the IRQ, because it's just assuming the standard IRQs. This is done, because IRQ detection is unreliable, and can be fooled. So, even though I have my ttyS2 set at IRQ 5, I still see Jan 23 22:25:28 misfits vmunix: tty02 at 0x03e8 (irq = 4) is a 16550A You have to use setserial to tell Linux the IRQ you are using. 16.10. rz and/or sz don't work when I call my Linux box on my modem. If Linux looks for /dev/modem when you try to transfer files, look at /etc/profile, and /etc/csh.cshrc. There are a bunch of aliases defined there on some distributions, most notably Slackware. These aliases mess up the zmodem programs. Take them out, or correct them. 16.11. My screen is printing funny looking characters. This happens on virtual consoles when you send binary data to your screen, or sometimes on serial connections. The way to fix this is to type echo ^v^[c. For the control-character-impaired, thats echo vc. 16.12. getty or uugetty still doesn't work. There is a DEBUG option that comes with getty_ps. Edit your config file /etc/conf.{uu}getty.ttySN and add DEBUG=NNN. Where NNN is one of the following combination of numbers according to what you are trying to debug: D_OPT 001 option settings D_DEF 002 defaults file processing D_UTMP 004 utmp/wtmp processing D_INIT 010 line initialization (INIT) D_GTAB 020 gettytab file processing D_RUN 040 other runtime diagnostics D_RB 100 ringback debugging D_LOCK 200 uugetty lockfile processing D_SCH 400 schedule processing D_ALL 777 everything Setting DEBUG=010 is a good place to start. If you are running syslogd, debugging info will appear in your log files. If you aren't running syslogd info will appear in /tmp/getty:ttySN for debugging getty and /tmp/uugetty:ttySN for uugetty. Look at the debugging info and see what is going on. Most likely, you will need to tune some of the parameters in your config file, and you may have to configure your modem differently, too. 16.12.1. Alternate versions of getty You might like these better: mgetty, a different version of getty, can also handle faxes. It can be found on the Linux FTP sites. agetty, a simpler version of getty. This version comes with most distributions. If not, it should be on the Linux FTP sites. 17. Contributions There was no possible way to write this HOWTO alone. Although a lot of the HOWTO is my writing, I have often rewritten contributions to maintain continuity in the writing style and flow. Thanks to everyone who has contributed or commented, the list of people has gotten too long to list (somewhere over fifty). Special thanks to Matt Welch for coordinating the LPD project (I suspect that's much like herding cats), Ted T'so for answering questions about the serial drivers, and to Kris Gleason who maintains getty_ps. END OF Serial-HOWTO