mirror of https://github.com/tLDP/LDP
updated
This commit is contained in:
parent
6bb0dd5562
commit
0ea9208526
|
@ -4032,7 +4032,7 @@ Addresses Linux localization issues specific to Serbian users
|
|||
Serial-HOWTO</ULink>,
|
||||
<CiteTitle>Serial HOWTO</CiteTitle>
|
||||
</Para><Para>
|
||||
<CiteTitle>Updated: Dec 2008</CiteTitle>.
|
||||
<CiteTitle>Updated: Nov 2010</CiteTitle>.
|
||||
Describes serial port features other than those which should be
|
||||
covered by other HOWTOs. Lists information on multiport serial cards
|
||||
and contains detailed technical information about the serial port
|
||||
|
|
|
@ -1166,7 +1166,7 @@ writers may need to know. </Para>
|
|||
Serial-HOWTO</ULink>,
|
||||
<CiteTitle>Serial HOWTO</CiteTitle>
|
||||
</Para><Para>
|
||||
<CiteTitle>Updated: Dec 2008</CiteTitle>.
|
||||
<CiteTitle>Updated: Nov 2010</CiteTitle>.
|
||||
Describes serial port features other than those which should be
|
||||
covered by other HOWTOs. Lists information on multiport serial cards
|
||||
and contains detailed technical information about the serial port
|
||||
|
|
|
@ -1,20 +1,15 @@
|
|||
<!doctype linuxdoc system>
|
||||
<article>
|
||||
<title> Serial HOWTO
|
||||
<author>David S.Lawyer
|
||||
<tt><htmlurl url="mailto:dave@lafn.org" name="dave@lafn.org"></tt>
|
||||
original by Greg Hankins
|
||||
<date> v2.27 December 2008
|
||||
<date> v2.26 November 2010
|
||||
|
||||
<!-- Change log:
|
||||
2.27 Dec. 2008: Changed 12 volts to 5 volts for typical serial port
|
||||
voltages today. generic_serial.ko module is not utilized by serial
|
||||
drivers. Use 8250.nr_uarts=16 etc. if serial support built into
|
||||
kernel and use nr_uarts=16 if a module. Erroneously had this
|
||||
reversed.
|
||||
2.26 Nov. 2008: Changed EIA-232 to RS-232. PCI-e bus is serial. No
|
||||
serial ports on most new PCs => serial port obsolete for desktop.
|
||||
2.25 Jan. 2007: picocom. devfs is obsolete. ser2net. Revised parts on
|
||||
2.26 Nov. 2010 Changed EIA-232 to RS-232. PCI-e bus is serial. No
|
||||
serial port on new PCs since it's obsolete and this HOWTO is now
|
||||
mainly of historical interest.
|
||||
2.25 Jan. 2007 picocom. devfs is obsolete. ser2net. Revised parts on
|
||||
drivers as modules vs. built into kernel. Serial Programming
|
||||
wikibook.
|
||||
2.24 Feb. 2006: Serial Laplink HOWTO (connecting 2 PCs via the
|
||||
|
@ -61,42 +56,43 @@ v2.00 May 1999 holding reg. to shift reg.
|
|||
only about the serial port.
|
||||
v1.12 July 1998: reissue of old doc (v1.11). Added more info on Winmodems.
|
||||
v1.11 15 November 1997 by Greg Hankins
|
||||
(Prior to v1.11 a number of versions are missing from the list below
|
||||
since I didn't think searching for them was worthwhile.)
|
||||
(Prior to this, a number of versions are not listed and it would take
|
||||
some research to determine them)
|
||||
v1.8.1: 9 Oct. 1995
|
||||
v1.7: 29 Oct. 1994
|
||||
v1.0: 6 Jan. 1994: first Serial-HOWTO by Greg Hankins
|
||||
v1.0: June 1993: was called Serial FAQ, by Greg Hankins
|
||||
-->
|
||||
<abstract>
|
||||
This document describes the UART serial port features other than
|
||||
those which should be covered by Modem-HOWTO, PPP-HOWTO,
|
||||
Serial-Programming-HOWTO, or Text-Terminal-HOWTO. It lists info on
|
||||
multiport serial cards. It contains technical info about the serial
|
||||
port itself in more detail than found in the above HOWTOs and should
|
||||
be best for troubleshooting when the problem is the serial port
|
||||
itself. If you are dealing with a Modem, PPP (used for Internet
|
||||
access on a phone line), or a Text-Terminal, those HOWTOs should be
|
||||
consulted first. It's also useful as an introduction to how the
|
||||
serial port works before reading other documents on how to program
|
||||
it. </abstract>
|
||||
This document describes the now obsolete UART serial port features
|
||||
other than those which should be covered by Modem-HOWTO, PPP-HOWTO,
|
||||
Serial-Programming-HOWTO, or Text-Terminal-HOWTO. It lists info on
|
||||
multiport serial cards. It contains technical info about the serial
|
||||
port itself in more detail than found in the above HOWTOs and should
|
||||
be best for troubleshooting when the problem is the serial port
|
||||
itself. If you are dealing with a Modem, PPP (used for Internet
|
||||
access on a phone line), or a Text-Terminal, those HOWTOs should be
|
||||
consulted first. </abstract>
|
||||
|
||||
<toc>
|
||||
<sect>Introduction
|
||||
|
||||
<p> This HOWTO covers basic info about the old analog Serial Port and
|
||||
multiport serial cards. It contains much more information in it than
|
||||
most people who use serial ports need to know and most people are able
|
||||
to use the serial port without reading this HOWTO. But if you're
|
||||
having problems or just want to understand how it works, this is one
|
||||
place to find out about it.
|
||||
<p> This HOWTO covers basic info on the now obsolete serial port and
|
||||
multiport serial cards. It was written when the serial port was a
|
||||
major port for connecting a PC to other devices and the style of this
|
||||
article reflects this. It is mostly in the present tense but due to
|
||||
the historical nature of the serial port it probably should be in the
|
||||
past tense. It thus hasn't been modified to have the tone of a
|
||||
historical document. It contains much more information in it than
|
||||
most people needed to know and most people were able to use the serial
|
||||
port without reading this HOWTO. But if you're having problems with
|
||||
it or just want to understand how it worked this is one place to find
|
||||
out about it.
|
||||
|
||||
This HOWTO is about the old and slow original serial port but it could
|
||||
have been designed to be much faster. See <ref id="slow_" name="RS-232
|
||||
Cable Is Low Speed & Short Distance">. It uses a UART chip and is
|
||||
sometimes called a "UART serial port" to differentiate it from the
|
||||
newer types of serial devices: Universal Serial Bus or IEEE 1394
|
||||
(Firewire). Information specific to devices which use serial ports:
|
||||
This HOWTO is about the slow original serial port which uses a UART
|
||||
chip and is sometimes called a "UART serial port" to differentiate it
|
||||
from the newer types of serial devices: Universal Serial Bus or
|
||||
Firewire. Information specific to devices which use serial ports:
|
||||
modems, text-terminals, infrared devices, and a few printers are found
|
||||
in Modem-HOWTO, Text-Terminal-HOWTO, Infrared-HOWTO, and
|
||||
Printing-HOWTO. Info on getty (the program that runs the login
|
||||
|
@ -116,7 +112,7 @@ might be valid for other architectures.
|
|||
<sect1> Copyright, Disclaimer, & Credits
|
||||
<sect2>Copyright
|
||||
<p>
|
||||
Copyright (c) 1993-1997 by Greg Hankins, (c) 1998-2009 by David S.
|
||||
Copyright (c) 1993-1997 by Greg Hankins, (c) 1998-2005 by David S.
|
||||
Lawyer <url url="mailto:dave@lafn.org">
|
||||
<!-- license.D begin -->
|
||||
|
||||
|
@ -154,62 +150,57 @@ respective owners. <!-- license.D end -->
|
|||
|
||||
<sect2>Credits
|
||||
<p> Most of the original Serial-HOWTO was written by Greg Hankins.
|
||||
<url url="mailto:gregh@twoguys.org">. He also rewrote many
|
||||
contributions by others in order to maintain continuity in the writing
|
||||
style and flow. He wrote: ``Thanks to everyone who has contributed or
|
||||
commented, the list of people has gotten too long to list (somewhere
|
||||
over one hundred). Special thanks to Ted Ts'o for answering questions
|
||||
about the serial drivers.'' Approximately half of v2.00 was from Greg
|
||||
Hankins HOWTO and the other half were additions by David Lawyer. Ted
|
||||
Ts'o has continued to be helpful. In Jan. 2006 "Charles Brockman"
|
||||
found many typos (which I fixed).
|
||||
<url url="mailto:gregh@twoguys.org">
|
||||
He also rewrote many contributions by others in order to maintain
|
||||
continuity in the writing style and flow. He wrote: ``Thanks to
|
||||
everyone who has contributed or commented, the list of people has
|
||||
gotten too long to list (somewhere over one hundred). Special thanks
|
||||
to Ted Ts'o for answering questions about the serial drivers.''
|
||||
Approximately half of v2.00 was from Greg Hankins HOWTO and the other
|
||||
half were additions by David Lawyer. Ted Ts'o has continued to be
|
||||
helpful. In Jan. 2006 "Charles Brockman" reviewed it for typos which
|
||||
resulted in many typos being fixed.
|
||||
|
||||
<sect1> New Versions of this Serial-HOWTO
|
||||
<p> Since the serial port is legacy technology and much faster means of
|
||||
communication exist, new versions of the Serial-HOWTO will be released
|
||||
every year or so. A list of mirror sites where you'll find copies is
|
||||
at <url url="http://www.tldp.org/mirrors.html">. If you only want to
|
||||
quickly check the date of the latest version look at <url
|
||||
<p> New versions will be issued infrequently (if at all) due to the
|
||||
obsolesence of the serial port. They will be available to browse
|
||||
and/or download at LDP mirror sites see: <url
|
||||
url="http://www.tldp.org/mirrors.html">. Various formats are
|
||||
available. If you only want to quickly check the date of the latest
|
||||
version look at <url
|
||||
url="http://www.tldp.org/HOWTO/Serial-HOWTO.html"> and compare it to
|
||||
this version: v2.27 December 2008 .
|
||||
this version: v2.26 November 2010 .
|
||||
|
||||
<sect1>New in Recent Versions
|
||||
<p> For a full revision history going back to the time I started
|
||||
maintaining this HOWTO, see the source file (in linuxdoc format):
|
||||
<url
|
||||
url="http://cvs.tldp.org/go.to/LDP/LDP/howto/linuxdoc/Serial-HOWTO.sgml?view=markup" name="(cvs) Serial-HOWTO.sgml">
|
||||
<itemize>
|
||||
2.27 Dec. 2008: Changed 12 volts to 5 volts for typical serial port
|
||||
voltages today. generic_serial.ko module is not utilized by serial
|
||||
drivers. Use 8250.nr_uarts=16 etc. if serial support built into
|
||||
kernel and use nr_uarts=16 if a module. Erroneously had this
|
||||
reversed.
|
||||
<item>2.26 Nov. 2008: Changed EIA-232 to RS-232. PCI-e bus is serial.
|
||||
No serial port on most new PCs.
|
||||
<sect1>New in Recent Versions <p> For a full revision history going
|
||||
back to the time I started maintaining this HOWTO, see the source file
|
||||
(in linuxdoc format): <url
|
||||
url="http://cvs.tldp.org/go.to/LDP/LDP/howto/linuxdoc/Serial-HOWTO.sgml?view=markup"
|
||||
name="(cvs) Serial-HOWTO.sgml"> <itemize>
|
||||
<item>2.26 Nov. 2010 Changed EIA-232 to RS-232. PCI-e bus is serial. No
|
||||
serial port on new PCs since it's obsolete and this HOWTO is now
|
||||
mainly of historical interest.
|
||||
<item>2.25 Jan. 2007 picocom. devfs is obsolete. ser2net. Revised
|
||||
parts on drivers as modules vs. built into kernel. Serial Programming
|
||||
wikibook.
|
||||
</itemize>
|
||||
|
||||
<sect1> Related HOWTO's, etc. about the Serial Port <label
|
||||
id="related_howtos"> <p> Modems, Text-Terminals, some printers, and
|
||||
other peripherals often use the serial port. Get these HOWTOs from
|
||||
the nearest mirror site as explained above.
|
||||
<sect1> Related HOWTO's, etc. about the Serial Port <label id="related_howtos">
|
||||
<p> Modems, Text-Terminals, some printers, and other peripherals often
|
||||
used the serial port. Get these HOWTOs from the nearest mirror site as
|
||||
explained above.
|
||||
|
||||
<itemize>
|
||||
<item><tt>Modem-HOWTO</tt> is about installing and configuring modems
|
||||
<item><tt>Printing-HOWTO</tt> has info for serial printers using old
|
||||
lpr command
|
||||
<item><tt>LPRng-HOWTO</tt> (not a LDP HOWTO, may come with software)
|
||||
has info for using the serial port for connecting to old printers
|
||||
using the "Next Generation" lpr program.
|
||||
has info for serial printing for "Next Generation" lpr
|
||||
<item> <url url="http://en.wikibooks.org/wiki/Programming:Serial_Data_Communications" name="Serial Programming"> is a wiki-book
|
||||
on the Internet <label id="ser_prog_wiki">
|
||||
on the Internet
|
||||
<item><tt>Serial-Programming-HOWTO</tt> helps you write
|
||||
C programs that read and write to the serial port
|
||||
and/or check/set its state. A better version written by Vern
|
||||
Hoxie but not submitted to LDP is at <ref id="verns_serial_HT"
|
||||
name="Serial Programming HOWTO">
|
||||
and/or check/set its state. A version written by Vern
|
||||
Hoxie but not submitted to LDP is at <ref id="vern_" name="Internet">.
|
||||
<item><tt>Text-Terminal-HOWTO</tt> is about how they work, how to install
|
||||
configure, and repair them. It includes a section on "Make a
|
||||
Terminal the Console" which is useful for using a remote terminal to
|
||||
|
@ -219,12 +210,13 @@ using the "Next Generation" lpr program.
|
|||
</itemize>
|
||||
|
||||
<sect1>Feedback
|
||||
<p> Please send me any suggestions, or additional material. Tell me
|
||||
what you don't understand, or what could be clearer. You can reach me
|
||||
via email at <tt><url url="mailto:dave@lafn.org"></tt>.
|
||||
<p> Please send me any suggestions, correction or additional
|
||||
material. Tell me what you don't understand, or what could be
|
||||
clearer. You can reach me via email at <tt><url
|
||||
url="mailto:dave@lafn.org"></tt>.
|
||||
|
||||
<sect1> What is a Serial Port?
|
||||
<p> The conventional serial port (not the newer USB port, or 1394
|
||||
<p> The conventional serial port (not the newer USB port, or Firewire
|
||||
port) is a very old I/O (Input/Output) port. Until around 2006, most
|
||||
new desktop PC's had one, and old PC's from the 1990's sometimes had 2
|
||||
of them. Most laptops gave up them before the desktops did. Macs
|
||||
|
@ -253,7 +245,7 @@ voltage meaning "off" and a steady positive voltage meaning "on".
|
|||
The UART (Universal Asynchronous Receiver-Transmitter) chip does most
|
||||
of the work. Today, the functionality of this chip is usually built
|
||||
into another chip. See <ref id="uart_" name="What Are UARTs?"> These
|
||||
have improved over time and old models (prior to say 1994) are very
|
||||
have improved over time and old models (prior to say 1994) are usually
|
||||
obsolete.
|
||||
|
||||
The serial port was originally designed for connecting external modems
|
||||
|
@ -264,26 +256,20 @@ internal modem cards have a built-in serial port so when you install
|
|||
one inside your PC it's as if you just installed another serial port
|
||||
in your PC.
|
||||
|
||||
The serial port is part of what Linux kernel programmers call the "tty
|
||||
layer". The text interface using the console on a PC is also part of
|
||||
the tty layer. Starting in 2005, Alan Cox and others made major
|
||||
improvements to this tty layer. A significant amount of work still
|
||||
was underway in 2008 to eliminate bugs including "race conditions" in
|
||||
this layer.
|
||||
|
||||
<sect> Quick Help
|
||||
<p>This repeats more detailed information found elsewhere. If your
|
||||
computer can't seem to find your serial port and you already know
|
||||
something about hardware resources (addresses like 3F8 and IRQs like
|
||||
5) then try this: First, get into the BIOS (often called "setup")
|
||||
when the computer is powered on by pressing certain keys. To find out
|
||||
what keys to press, freeze the first words that flash by on the screen
|
||||
what keys to press, watch the screen as your PC starts up. If
|
||||
the words that flash by on the screen too fast to read, freeze them
|
||||
by holding down the "pause" and "shift" keys at the same time. Then
|
||||
hit any key to resume (cease pausing) and hold down the key(s)
|
||||
required to enter the BIOS setup. You may have to try this again
|
||||
since there may be more than one screen which you can freeze with the
|
||||
"pause" key. Also, look for messages about the serial ports on these
|
||||
frozen screens.
|
||||
when read, hit any key to resume (cease pausing) and hold down the
|
||||
key(s) required to enter the BIOS setup. You may have to try this
|
||||
again since there may be more than one screen which you can freeze
|
||||
with the "pause" key. Also, look for messages about the serial ports
|
||||
on these frozen screens.
|
||||
|
||||
Once in the BIOS menus, try to find menus dealing with the serial port.
|
||||
They could be shown in a menu dealing with Resources, Plug-and-Play,
|
||||
|
@ -417,14 +403,14 @@ buffer. Then the port gives the CPU an interrupt to tell it to pick
|
|||
up that byte so that the serial port will have room for storing the
|
||||
next byte which is currently being received. For newer serial ports
|
||||
with 16-byte buffers, this interrupt (to fetch the bytes) may be sent
|
||||
when 14 bytes are in the receive buffer. The CPU then stops what it
|
||||
after 14 bytes are in the receive buffer. The CPU then stops what it
|
||||
was doing, runs the interrupt service routine, and picks up 14 to 16
|
||||
bytes from the port. For an interrupt sent when the 14th byte has
|
||||
been received, there could be 16 bytes to get if 2 more bytes have
|
||||
arrived since the interrupt. But if 3 more bytes should arrive
|
||||
(instead of 2), then the 16-byte buffer will overrun. It also may
|
||||
pick up less than 14 bytes by setting it up that way or due to
|
||||
timeouts. See <ref id="fifo_" name="FIFOs"> for more details.
|
||||
pick up less than 14 bytes by setting it that way or due to timeouts.
|
||||
See <ref id="fifo_" name="FIFOs"> for more details.
|
||||
|
||||
<sect1> The Large Serial Buffers
|
||||
<p> We've talked about small 16-byte serial port hardware
|
||||
|
@ -433,11 +419,11 @@ the CPU takes some bytes out of the receive buffer of the hardware, it
|
|||
puts them into a much larger (say 8k-byte) receive buffer in main
|
||||
memory. Then a program that is getting bytes from the serial port
|
||||
takes the bytes it's receiving out of that large buffer (using a
|
||||
"read" statement in a program). A similar situation exists for
|
||||
"read" statement in the program). A similar situation exists for
|
||||
bytes that are to be transmitted. When the CPU needs to fetch some
|
||||
bytes to be transmitted it takes them out of a large (8k-byte)
|
||||
transmit buffer in main memory and puts them into the small 16-byte
|
||||
transmit buffer in the uart hardware.
|
||||
transmit buffer in the hardware.
|
||||
|
||||
<sect> Serial Port Basics <label id="basics_">
|
||||
<!-- basics.D begin <sect> Serial Port and Modem Basics
|
||||
|
@ -469,15 +455,15 @@ name="How the Hardware Transfers Bytes"> but in greater detail.
|
|||
|
||||
<!-- ifdef SERIAL_ -->
|
||||
An I/O device is just a way to get data into and out of a computer.
|
||||
There are many types of I/O devices such as the older serial ports and
|
||||
parallel ports, network cards, universal serial buses (USB), and
|
||||
firewire etc.
|
||||
There are many types of I/O devices such as serial ports, parallel
|
||||
ports, disk drive controllers, ethernet boards, universal serial
|
||||
buses, etc.
|
||||
<!-- ifdef SERIAL_ end -->
|
||||
Most pre-2007 PC's have a serial port or two (on older PC's). Each
|
||||
has a 9-pin connector (sometimes 25-pin) on the back of the computer.
|
||||
Computer programs can send data (bytes) to the transmit pin (output)
|
||||
and receive bytes from the receive pin (input). The other pins are
|
||||
for control purposes and ground.
|
||||
Most PC's have one or two serial ports. Each has a 9-pin connector
|
||||
(sometimes 25-pin) on the back of the computer. Computer programs can
|
||||
send data (bytes) to the transmit pin (output) and receive bytes from
|
||||
the receive pin (input). The other pins are for control purposes and
|
||||
ground.
|
||||
|
||||
The serial port is much more than just a connector. It converts the
|
||||
data from parallel to serial and changes the electrical representation
|
||||
|
@ -497,8 +483,8 @@ things.
|
|||
|
||||
<sect2> Pins and Wires
|
||||
<p> Old PC's used 25 pin connectors but only about 9 pins were
|
||||
actually used so later on most connectors were only 9-pin. Each of
|
||||
the 9 pins usually connects to a wire. Besides the two wires used for
|
||||
actually used so today most connectors are only 9-pin. Each of the 9
|
||||
pins usually connects to a wire. Besides the two wires used for
|
||||
transmitting and receiving data, another pin (wire) is signal ground.
|
||||
The voltage on any wire is measured with respect to this ground. Thus
|
||||
the minimum number of wires to use for 2-way transmission of data is
|
||||
|
@ -531,11 +517,12 @@ Industries Association) and later EIA/TIA after EIA merged with TIA
|
|||
(Telecommunications Industries Association). The EIA-232 spec
|
||||
provides also for synchronous (sync) communication but the hardware to
|
||||
support sync is almost always missing on PC's. The RS designation is
|
||||
was intended to become obsolete but is still widely used and will be
|
||||
used in this howto for RS-232. Other documents may use the full
|
||||
EIA/TIA designation, or just EIA or TIA. For info on other
|
||||
(non-RS-232) serial ports see the section <ref id="non_rs232"
|
||||
name="Other Serial Devices (not async RS-232)">
|
||||
obsolete but is still widely used and will be used in this howto for
|
||||
RS-232. Other documents may use the full EIA/TIA designation, or just
|
||||
EIA or TIA. For info on other (non-RS-232) serial ports see the
|
||||
section <ref id="non_rs232" name="Other Serial Devices (not async
|
||||
RS-232)">
|
||||
|
||||
<!-- ifdef SERIAL_ end -->
|
||||
|
||||
<sect1> IO Address & IRQ
|
||||
|
@ -989,42 +976,39 @@ See <ref id="set_serial" name="What is Setserial"> for more info on
|
|||
<!-- basics.D end -->
|
||||
|
||||
|
||||
<sect> Is the Serial Port Obsolete?
|
||||
<sect> The Serial Port is Now Obsolete
|
||||
<sect1> Introduction
|
||||
<p> The serial port used to be found on almost all new PC's but not
|
||||
anymore. Thus as of 2008, it's becoming obsolete, if not already
|
||||
obsolete. It's often called a "legacy" device, but it's still used by
|
||||
some for hardware designed to connect to the serial port especially
|
||||
for computers used as servers by companies. Laptops and Macs stopped
|
||||
being sold with serial ports several years before desktops did.
|
||||
However, if one needs a serial port, it's possible to buy one and
|
||||
install it, such as on the USB bus, and it's still found on older
|
||||
PC's. Linux supports ordinary analog modems only if they work thru a
|
||||
serial port (although the port is likely to be built into the modem)
|
||||
so a PC often has a serial port even if you can't find any serial port
|
||||
connector on the back of the PC.
|
||||
<p> The serial port is today (2010) obsolete (and often called a "legacy"
|
||||
device) but it is still in use on some older computers, especially for
|
||||
Linux. The serial port has many shortcomings and after about 2005
|
||||
most new PC's no longer had them. Most laptops and Macs discontinued
|
||||
them even earlier. During the era when some new PC's came with serial
|
||||
ports and others didn't, the PC's that didn't have serial ports were
|
||||
called "legacy-free". However, while PC's today no longer have serial
|
||||
ports, some do have them built into a modem (which plugs into a
|
||||
telephone line). Such a serial port only works with the modem and
|
||||
can't be used for any other device. The reason they have such a
|
||||
"built in" serial port is that analog modems are designed to only work
|
||||
thru a serial port.
|
||||
|
||||
The external serial port connector on the back of a PC, must pass data
|
||||
via an external cable connected to that connector. Thus it has two
|
||||
interfaces: the serial-port-to-external-cable and the
|
||||
serial-port-to-computer-bus. Both of these interfaces are slow.
|
||||
First we'll consider the interface via external cable to the outside
|
||||
world.
|
||||
The physical serial port on the back of an old PC, must pass data between
|
||||
the computer and an external cable. Thus it has two interfaces: the
|
||||
serial-port-to cable and the serial-port-to-computer-bus. Both of
|
||||
these interfaces are slow. First we'll consider the interface via
|
||||
external cable to the outside world.
|
||||
|
||||
<sect1> RS-232 Cable Is Low Speed & Short Distance
|
||||
<label id="slow_">
|
||||
<p> The conventional RS-232 serial port is inherently low speed and
|
||||
is severely limited in distance. Ads used to read "high speed" but it
|
||||
is severely limited in distance. Ads often read "high speed" but it
|
||||
can only work at "high speed" over very short distances such as to a
|
||||
modem located right next to the computer. Compared to other
|
||||
connections to a PC such as as a USB bus, network card ethernet, or
|
||||
IEEE 1394 (firewire), this claimed "high speed" for a serial port is
|
||||
actually low speed. All of the RS-232 serial cable wires use a common
|
||||
ground return wire so that twisted-pair technology (needed for high
|
||||
speeds) can't be used without additional hardware. More modern
|
||||
interfaces for serial ports exist but they are not standard on PC's
|
||||
like the RS-232 is. See <ref id="non_232" name="Successors to
|
||||
RS-232">. Some multiport serial cards support them.
|
||||
modem located right next to the computer. Compared to a network card,
|
||||
even this "high speed" is actually low speed. All of the RS-232
|
||||
serial cable wires use a common ground return wire so that
|
||||
twisted-pair technology (needed for high speeds) can't be used without
|
||||
additional hardware. More modern interfaces for serial ports exist
|
||||
but they are not standard on PC's like the RS-232 is. See <ref
|
||||
id="non_232" name="Successors to RS-232">. Some multiport serial
|
||||
cards support them.
|
||||
|
||||
It is somewhat tragic that the RS-232 standard from 1969 did not use
|
||||
twisted pair technology which could operate about a hundred times
|
||||
|
@ -1037,20 +1021,19 @@ was originally designed for connecting a terminal to a low speed modem
|
|||
located nearby, the need for high speed and longer distance
|
||||
transmission was apparently not recognized. The result was that since
|
||||
the serial port couldn't handle high speeds, new types of serial
|
||||
interfaces were devised that could: Ethernet, USB, IEEE 1394, etc.
|
||||
All of these use high speed twisted-pair cabling as recommended by the
|
||||
"Cable Conference" of 1888.
|
||||
interfaces were devised that could: Ethernet, USB, Firewire, etc.
|
||||
The final outcome was the demise of the serial port which due to it's
|
||||
ancient technology became obsolete.
|
||||
|
||||
<sect1> Inefficient PCI Interface to the Computer (in some cases)
|
||||
|
||||
<p> The serial port communicates with the computer via the PCI bus,
|
||||
the LPC bus, X-bus, or ISA bus. The PCI bus is now 32 or 64 bits wide,
|
||||
but the serial port only sends a byte at a time (8 bits wide) which is
|
||||
a waste of PCI bus bandwidth. Not so for the LPC bus which has only a
|
||||
4-bit wide bus and thus provides an efficient interface even though it
|
||||
takes two transmissions to send a byte. The ISA bus is usually
|
||||
16-bits wide and the bus utilization efficiency is intermediate as
|
||||
compared to efficient LPC and inefficient PCI (although ISA is overall
|
||||
less efficient due to it's lower speed).
|
||||
4-bit wide bus and thus provides an efficient interface. The ISA bus
|
||||
is usually 16-bits wide and the efficiency is intermediate as compared
|
||||
to efficient LPC and inefficient PCI.
|
||||
|
||||
<sect> Multiport Serial Boards/Cards/Adapters
|
||||
<sect1> Intro to Multiport Serial
|
||||
|
@ -1063,9 +1046,9 @@ both industry and the home). They can connect to computer servers for
|
|||
the purpose of monitoring/controlling the server from a remote
|
||||
location. They were once mainly used for connecting up many dumb
|
||||
terminals and/or modems to serial ports. Today, use of dumb terminals
|
||||
is rare and several modems (or digital modems) can now be built
|
||||
into an internal card. So multiport serial cards are not very
|
||||
significant anymore.
|
||||
has declined, and several modems (or digital modems) can now be built
|
||||
into an internal card. So multiport serial cards are not as
|
||||
significant as they once were.
|
||||
|
||||
Each multiport card has a number of external connecters (DB-25 or
|
||||
RJ45) so that one may connect up a number of devices (modems,
|
||||
|
@ -1077,6 +1060,7 @@ on the ends of cables which come out (externally) from the card
|
|||
(octopus cable). Or they may be on an external box (possibly rack
|
||||
mountable) which is connected by a cable to a multiport card.
|
||||
|
||||
|
||||
<sect1> Dumb vs. Smart Cards
|
||||
<p>Dumb multiport cards are not too much different than ordinary serial
|
||||
ports. They are interrupt driven and the CPU of the computer does
|
||||
|
@ -3571,7 +3555,7 @@ since this would not permit someone else to send a message to your
|
|||
terminal using the write or talk program.
|
||||
|
||||
<sect1>Lock-Files if you use devfs
|
||||
<p> The abandoned device-filesystem (devfs) had the /dev directory with
|
||||
<p> The abandoned device-filesystem (devfs) has the /dev directory with
|
||||
subdirectories. As of late 2001, there were problems with lockfiles.
|
||||
For example, the lockfile mechanism considered dev/usb/tts/0 and
|
||||
/dev/tts/0 to be the same device with name "0". Ditto for all other
|
||||
|
@ -3666,12 +3650,10 @@ prompt.
|
|||
<sect>Serial Tips And Miscellany
|
||||
|
||||
<sect1> Serial Modules <label id="ser_module">
|
||||
<p> Often the serial driver is provided by modules such as
|
||||
serial_core.ko and 8250.ko, etc. Note that "8250" is really for the
|
||||
descendants of the now obsolete 8250 UART, such as the 16xxx series of
|
||||
UARTS. Drivers for USB serial ports and multiport cards are often
|
||||
provided as modules. Linux should automatically load any needed
|
||||
module, so in most cases you have nothing to do.
|
||||
<p> Often the serial driver is provided as a module(s) such as
|
||||
generic_serial.ko. Drivers for USB serial ports and multiport cards
|
||||
are often provided as modules. Linux should automatically load any
|
||||
needed module, so in most cases you have nothing to do.
|
||||
|
||||
But sometimes you need to configure Linux to load certain modules or
|
||||
gives parameters to the module or to the kernel.
|
||||
|
@ -3700,18 +3682,10 @@ parport_serial is for PCI cards that contain both serial and parallel
|
|||
ports.
|
||||
|
||||
As a last resort, one may modify the serial driver by editing the
|
||||
source code. Much of the serial driver used to be found in the file
|
||||
serial.c. But it's now spread across other files like serial_core.c
|
||||
and 8250.c. Note that 8250.c includes support for the successors of
|
||||
8250, namely the 16xxx series such as 16C752 and 16850. The serial module
|
||||
changed names similarly. Note that the module: generic_serial.ko was
|
||||
intended to provide support for other serial modules, but it didn't
|
||||
catch on so it's only used for one multiport serial card.
|
||||
|
||||
source code. Much of the serial driver is found in the file serial.c.
|
||||
For info regarding writing of programs for the serial port see
|
||||
Serial-Programming-HOWTO. It was revised in 1999 by Vern Hoxie but
|
||||
that revision is not at LDP. See also the Serial wiki <ref
|
||||
id="ser_prog_wiki" name="Serial-Programming Wiki">
|
||||
that revision is not at LDP.
|
||||
|
||||
<sect1>Kernel Configuration <label id="kernel_conf">
|
||||
|
||||
|
@ -3723,22 +3697,18 @@ kernel when compiling or by a parameter given to the kernel when it
|
|||
starts (boot-prompt or kernel command line).
|
||||
|
||||
The kernel configuration parameters:
|
||||
<tt/CONFIG_SERIAL_8250_RUNTIME_UARTS=32/ and
|
||||
<tt/CONFIG_SERIAL_8250_NR_UARTS=4/ set the maximum number of ordinary
|
||||
serial ports (UARTs) equal to 4. Distributions often set this
|
||||
to 4 before compiling. If you have more than 4 ordinary
|
||||
serial ports, then you need to change the 4 to whatever. If you
|
||||
kernel has already been compiled with not enough ports you may
|
||||
override this via the kernel command line for example:
|
||||
8250.nr_uarts=16 (if serial support built into the kernel). A boot
|
||||
loader such as lilo or grub can be told to do this. If serial support
|
||||
is via a module, such as 8250.ko, then give nr_uarts as a parameter to
|
||||
the module. You may use the command like: <tt/modinfo 8250/ to see
|
||||
what parameters the module 8250 (or whatever) will accept.
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4 and CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
set the maximum number of ordinary serial ports (UARTs) equal to 4.
|
||||
If you have more than 4 ordinary serial ports, then you need to change
|
||||
the 4 to whatever. But you may override this via the kernel command
|
||||
line for example: nr_uarts=16 (if serial support built into the
|
||||
kernel) or 8250.nr_uarts=16 (if serial support is via a module). The
|
||||
boot loader such as lilo or grub can be told to do this.
|
||||
|
||||
<sect1> Serial Console (console on the serial port)
|
||||
<p> See the kernel documentation in: Documentation/serial-console.txt.
|
||||
See also: Remote-Serial-Console-HOWTO.
|
||||
Kernel 2.4+ has better documentation. See also "Serial Console" in
|
||||
Text-Terminal-HOWTO.
|
||||
|
||||
<sect1> Line Drivers
|
||||
<p> For a text terminal, the RS-232 speeds are fast enough but the
|
||||
|
@ -4662,10 +4632,10 @@ Pin # Pin # Acronym Full-Name Direction What-it-May-Do/Mean
|
|||
and signal ground. This is fixed by the hardware and you can't change
|
||||
it. But the other signal lines are controlled by software and may do
|
||||
(and mean) almost anything at all. However they can only be in one of
|
||||
two states: asserted (+5 volts) or negated (-5 volts). Asserted is
|
||||
two states: asserted (+12 volts) or negated (-12 volts). Asserted is
|
||||
"on" and negated is "off". For example, Linux software may command
|
||||
that DTR be negated and the hardware only carries out this command and
|
||||
puts -5 volts on the DTR pin. A modem (or other device) that
|
||||
puts -12 volts on the DTR pin. A modem (or other device) that
|
||||
receives this DTR signal may do various things. If a modem has been
|
||||
configured a certain way it will hang up the telephone line when DTR
|
||||
is negated. In other cases it may ignore this signal or do something
|
||||
|
@ -4710,7 +4680,7 @@ since it connects two PCs without use of a modem. A null-modem cable
|
|||
may also be called a cross-over cable since the wires between pins 2
|
||||
and 3 cross over each other (if you draw them on a sheet of paper).
|
||||
The above example is for a 25 pin connector but for a 9-pin connector
|
||||
the pin numbers are just the opposite.
|
||||
the pin numbers 2 and 3 are just the opposite.
|
||||
|
||||
The serial pin designations were originally intended for connecting a
|
||||
dumb terminal to a modem. The terminal was DTE (Data Terminal
|
||||
|
@ -4745,9 +4715,9 @@ stty -F /dev/ttyS2 crtscts (or the like). This enables RTS/CTS
|
|||
hardware flow control in the Linux device driver.
|
||||
|
||||
Then when a DTE (such as a PC) wants to stop the flow into it, it
|
||||
negates RTS. Negated "Request To Send" (-5 volts) means "request NOT
|
||||
negates RTS. Negated "Request To Send" (-12 volts) means "request NOT
|
||||
to send to me" (stop sending). When the PC is ready for more bytes
|
||||
it asserts RTS (+5 volts) and the flow of bytes to it resumes. Flow
|
||||
it asserts RTS (+12 volts) and the flow of bytes to it resumes. Flow
|
||||
control signals are always sent in a direction opposite to the flow of
|
||||
bytes that is being controlled. DCE equipment (modems) works the same
|
||||
way but sends the stop signal out the CTS pin. Thus it's RTS/CTS flow
|
||||
|
@ -4805,16 +4775,16 @@ using minicom but didn't work if the port was using wvdial. Why?
|
|||
|
||||
<sect1> Preventing a Port From Opening
|
||||
<p> If "stty -clocal" (or getty is used with the "local" flag negated)
|
||||
then a serial port can't open until DCD gets an assert (+5 volts)
|
||||
then a serial port can't open until DCD gets an assert (+12 volts)
|
||||
signal.
|
||||
|
||||
<sect> Voltage Waveshapes <label id="volt_shape">
|
||||
|
||||
<sect1> Voltage for a Bit
|
||||
<p> At the RS-232 serial port, voltages are bipolar (positive or
|
||||
negative with respect to ground) and should be about 5 volts in
|
||||
magnitude (some are 3 to 12 volts). For the transmit and receive
|
||||
pins +5 volts is a 0-bit (sometimes called "space") and -5 volts is
|
||||
negative with respect to ground) and should be about 12 volts in
|
||||
magnitude (some are 5 or 10 volts). For the transmit and receive
|
||||
pins +12 volts is a 0-bit (sometimes called "space") and -12 volts is
|
||||
a 1-bit (sometimes called "mark"). This is known as inverted logic
|
||||
since normally a 0-bit is both false and negative while a one is
|
||||
normally both true and positive. Although the receive and transmit
|
||||
|
@ -4823,52 +4793,45 @@ logic with a positive voltage being true (or "on" or "asserted") and a
|
|||
negative voltage being false (or "off" or "negated"). Zero voltage
|
||||
has no meaning (except it usually means that the unit is powered off).
|
||||
|
||||
Skip this paragraph unless you are interested in unimportant
|
||||
technicalities. Precisely speaking, the RS-232 spec has the modem
|
||||
control lines using inverted logic since a positive voltage is logic 0
|
||||
(and not logic 1). But the rules (which are also an inverted logic of
|
||||
sorts) say that logic 0 means asserted. The result is that two
|
||||
applications of inverted logic result in what appear to be normal
|
||||
logic for the modem control lines.
|
||||
|
||||
A range of voltages is allowed. The specs say the magnitude of a
|
||||
transmitted signal should be between 5 and 15 volts but must never
|
||||
exceed 25 V. Any voltage received under 3 V is undefined (but some
|
||||
devices will accept a lower voltage as valid). The voltage on older
|
||||
PC (non-Mac) hardware from say the 1990's is likely to be higher, like
|
||||
11-12 volts. If you are using a RS-422 port on a Mac computer as an
|
||||
RS-232 (requires a special cable) or EIA-423 (RS-423) then the voltage
|
||||
will actually be 5 V.
|
||||
devices will accept a lower voltage as valid). One sometimes sees
|
||||
erroneous claims that the voltage is commonly 5 volts (or even 3
|
||||
volts) but it's usually 11-12 volts. If you are using a EIA-422
|
||||
(RS-422) port on a Mac computer as an RS-232 (requires a special
|
||||
cable) or EIA-423 (RS-423) then the voltage will actually be only 5 V.
|
||||
The discussion here assumes 12 V.
|
||||
|
||||
Note that normal computer logic normally is just a few volts (5 volts
|
||||
was once the standard) so that if you try to use test equipment
|
||||
designed for testing 3-5 volt computer logic (TTL) on the 12 volts of
|
||||
an older serial port, it may damage the test equipment.
|
||||
designed for testing 3-5 volt computer logic (TTL) on the 12 volts of a
|
||||
serial port, it may damage the test equipment.
|
||||
|
||||
<sect1> Voltage Sequence for a Byte <label id="byte_seq">
|
||||
<p> The transmit pin (TxD) is held at -5 V (mark) at idle when nothing
|
||||
is being sent. To start a byte it jumps to +5 V (space) for the
|
||||
start bit and remains at +5 V for the duration (period) of the start
|
||||
<p> The transmit pin (TxD) is held at -12 V (mark) at idle when nothing
|
||||
is being sent. To start a byte it jumps to +12 V (space) for the
|
||||
start bit and remains at +12 V for the duration (period) of the start
|
||||
bit. Next comes the low-order bit of the data byte. If it's a 0-bit
|
||||
nothing changes and the line remains at +5 V for another bit-period.
|
||||
If it's a 1-bit the voltage jumps from +5 to -5 V. After that comes
|
||||
the next bit (-5 V if a 1 or +5 V if a 0), etc., etc. After the
|
||||
last data bit, a parity bit may be sent and then a -5 V (mark) stop
|
||||
bit. Then the line remains at -5 V (idle) until the next start bit.
|
||||
nothing changes and the line remains at +12 V for another bit-period.
|
||||
If it's a 1-bit the voltage jumps from +12 to -12 V. After that comes
|
||||
the next bit (-12 V if a 1 or +12 V if a 0), etc., etc. After the
|
||||
last data bit, a parity bit may be sent and then a -12 V (mark) stop
|
||||
bit. Then the line remains at -12 V (idle) until the next start bit.
|
||||
Note that there is no return to 0 volts and thus there is no simple
|
||||
way (except by a synchronizing signal) to tell where one bit ends and
|
||||
the next one begins for the case where 2 consecutive bits are the same
|
||||
polarity (both zero or both one).
|
||||
|
||||
A 2nd stop bit would also be -5 V, just the same as the first stop
|
||||
A 2nd stop bit would also be -12 V, just the same as the first stop
|
||||
bit. Since there is no signal to mark the boundaries between these
|
||||
bits, the only effect of the 2nd stop bit is that the line must remain
|
||||
at -5 V idle twice as long. The receiver has no way of detecting the
|
||||
at -12 V idle twice as long. The receiver has no way of detecting the
|
||||
difference between a 2nd stop bit and a longer idle time between
|
||||
bytes. Thus communications works OK if one end uses one stop bit and
|
||||
the other end uses 2 stop bits, but using only one stop bit is
|
||||
obviously faster. In rare cases 1 1/2 stop bits are used. This means
|
||||
that the line is kept at -5 V for 1 1/2 time periods (like a stop bit
|
||||
that the line is kept at -12 V for 1 1/2 time periods (like a stop bit
|
||||
50% wider than normal).
|
||||
|
||||
<sect1> Parity Explained <label id="parity_def">
|
||||
|
@ -4928,9 +4891,9 @@ multi-byte frame and not the serial port frame of a single byte.
|
|||
<p> The RS-232 serial port as implemented on PC is asynchronous which
|
||||
in effect means that there is no "clock" signal sent with "ticks" to
|
||||
mark when each bit is sent.. There are only two states of the
|
||||
transmit (or receive) wire: mark (-5 V) or space (+5 V). There is
|
||||
transmit (or receive) wire: mark (-12 V) or space (+12 V). There is
|
||||
no state of 0 V. Thus a sequence of 1-bits is transmitted by just a
|
||||
steady -5 V with no markers of any kind between bits. For the
|
||||
steady -12 V with no markers of any kind between bits. For the
|
||||
receiver to detect individual bits it must always have a clock signal
|
||||
which is in synchronization with the transmitter clock. Such a clock
|
||||
would generate a "tick" in synchronization with each transmitted (or
|
||||
|
@ -5043,7 +5006,7 @@ topic.
|
|||
|
||||
<sect1> The Universal Serial Bus (USB)
|
||||
<p> The Universal Serial Bus (USB) is being built into PCI chips.
|
||||
All modern PC's have them. It was originally 12 Mbps but is now 480 Mbps
|
||||
Newer PC's have them. It was originally 12 Mbps but is now 480 Mbps
|
||||
over a twisted pair with a 4-pin connector (2 wires are power supply).
|
||||
It also is limited to short distances of at most 5 meters (depends on
|
||||
configuration). Linux supports the bus, although not all devices that
|
||||
|
@ -5069,19 +5032,13 @@ kernel/drivers/usb/serial. It would be nice to have a HOWTO on the
|
|||
USB. See also <url url="http://www.linux-usb.org"> and/or <url
|
||||
url="http://.www.qbik.ch/usb/">.
|
||||
|
||||
<sect1> IEEE 1394 (Firewire)
|
||||
<p>IEEE 1394 is something like USB only almost twice as fast at 800
|
||||
Mbps. The protocol on the bus is claimed to be more efficient than
|
||||
USB's. It uses two twisted pair for data plus two power conductors (6
|
||||
conductors in all). A variants uses only 4 conductors. You may
|
||||
compile 1394 support into the Linux kernel. Like USB, it's also
|
||||
limited to short distances.
|
||||
|
||||
<sect1>Ethernet
|
||||
<p>This started out at 10Mb/sec, then went to 100Mb/sec and then to
|
||||
1Gb/sec (gigabit ethernet). It too uses twisted pair cable or it can
|
||||
be wireless and use radio waves. It also uses serial transmission of
|
||||
data and can be used over long cables, unlike USB and analog serial.
|
||||
<sect1> Firewire
|
||||
<p> Firewire (IEEE 1394) is something like the USB only faster (800
|
||||
Mbps is planned). The protocol on the bus is claimed to be more
|
||||
efficient than USB's. It uses two twisted pair for data plus two
|
||||
power conductors (6 conductors in all). A variants uses only 4
|
||||
conductors. You may compile firewire support into the Linux kernel.
|
||||
Like USB, it's also limited to short distances.
|
||||
|
||||
<sect1> MIDI
|
||||
<p>Sound cards often have a 15-pin game port connector used for MIDI.
|
||||
|
@ -5257,7 +5214,12 @@ meaning of "stty" commands, etc.
|
|||
<itemize>
|
||||
<item> <url url="http://serial.sourceforge.net/" name="Linux Serial
|
||||
Driver home page"> Includes info about PCI support.
|
||||
|
||||
<!--
|
||||
<item> <label id="vern_"> Serial Suite by
|
||||
Vern Hoxie was a collection of blurbs about the
|
||||
care and feeding of the Linux serial port plus some simple programs.
|
||||
Not available.
|
||||
-->
|
||||
<item> <label id="vern_"> Serial-Programming-HOWTO (not yet available
|
||||
from the Linux Documentation Project). It's now on my website:
|
||||
<url
|
||||
|
@ -5265,13 +5227,12 @@ url="http://www.lafn.org/~dave/linux/Serial-Programming-HOWTO.txt">
|
|||
See also: <url
|
||||
url="http://www.lafn.org/~dave/linux/Serial-Programming-HOWTO-B.txt"
|
||||
name="Serial-Programming-HOWTO by Peter Baumann">
|
||||
<label id="verns_serial_HT">
|
||||
<item> <url
|
||||
url="http://www.lafn.org/~dave/linux/terminalIO.html" name="Terminal
|
||||
IO by Vern Hoxie">
|
||||
<url
|
||||
url="http://www.lafn.org/~dave/linux/termios.txt" name="Termios man
|
||||
page revision by Vern Hoxie">
|
||||
page revision by Vern Hoxie">
|
||||
|
||||
<item> A white paper discussing serial communications and multiport
|
||||
serial boards was available from Cyclades at <tt><htmlurl
|
||||
|
@ -5282,7 +5243,7 @@ url="http://www.freebsd.org/doc/en_US.ISO8859-1/articles/serial-uart/"
|
|||
name="Serial and UART Tutorial (FreeBSD)">
|
||||
</itemize>
|
||||
|
||||
<sect> Appendix A: Obsolete Hardware/Software
|
||||
<sect> Appendix A: Very Obsolete Hardware/Software
|
||||
|
||||
<sect1>Replacing pre 1990 UARTS
|
||||
<p> Many 486 PCs (old) and all Pentiums (or the like) should have
|
||||
|
@ -5309,9 +5270,9 @@ use the same IO address. See <ref id="probing_ss" name="Probing">.
|
|||
<sect1>Configuring by modifying source code
|
||||
<p>In the past, to get a certain serial port supported, one might need
|
||||
to modify the C source code, perhaps by adding a #define to it.
|
||||
Today, the use modules for multiport cards, use of parameters for
|
||||
modules or the kernel, or the use of configuration options should
|
||||
handle all cases.
|
||||
Today, the use of parameters for modules or the kernel, or the use of
|
||||
configuration options should handle all cases (except possible for
|
||||
antique hardware ??).
|
||||
|
||||
<sect1> Modems on Multiport Cards Obsolete for Sending at 56k
|
||||
<p>For a modem to transmit at nearly 56k requires that it be a special
|
||||
|
@ -5323,7 +5284,7 @@ are obsolete unless one doesn't need to send at 56k. In other words
|
|||
they are obsolete for ISP servers but might be OK for small business
|
||||
or home use.
|
||||
|
||||
An partial exception to the above are modem banks that connect to
|
||||
A partial exception to the above are modem banks that connect to
|
||||
multiport serial cards where the modem bank can access multiplexed
|
||||
digital phone lines. Thus one could use a multiport serial card with
|
||||
a few 56k digital modems for sending at 56k. For both analog and
|
||||
|
|
Loading…
Reference in New Issue