213 lines
8.5 KiB
TeX
213 lines
8.5 KiB
TeX
\subsection{Serial Console}
|
|
|
|
One core part of any computer systems is it's way to get human input. On older
|
|
systems, and even today on server machines, this is done via a serial console.
|
|
On this serial console characters are transmitted in serial, which means bit
|
|
by bit over the same line. The voltage levels used in these systems vary from
|
|
5V to 3.3V or +-10V. The most common standard for these voltage levels is the
|
|
former RS-232\footnote{RS... Recommended Standard}, or as it should be called
|
|
now, TIA-\footnote{TIA...Telecommunications Industry
|
|
Association}/EIA-\footnote{EIA.. Electronic Industries Alliance}232.\cite{rs232}
|
|
Voltage-levels, as per TIA-/EIA-232 standard, are not practical to handle over
|
|
short
|
|
distances however, so other voltages are used on most interface chips
|
|
and need to be converted.
|
|
|
|
\subsubsection{16550 UART}
|
|
|
|
The 16550 UART\footnote{Uinversal Asynchronous Receiver and Transmitter} is a
|
|
very common interface chip for serial communications. It produces 5V logic
|
|
levels as output on TX and needs the same as input on RX. Though common for a
|
|
UART, these voltage levels need to be converted to TIA-/EIA-232 levels for a
|
|
more common interface.
|
|
|
|
The 16550 UART is in it's core a 16450 UART, but has been given a FIFO
|
|
\footnote{First-In First-Out} buffer. It needs three address lines, and 8
|
|
data lines, which can be seen in Figure \ref{fig:16550_pinout}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includesvg[height=.3\textheight, angle=0]{pics/pc16550d_pinout.svg}
|
|
\caption{PC-16550D Pinout\cite{pc16550}}
|
|
\label{fig:16550_pinout}
|
|
\end{figure}
|
|
|
|
In Figure \ref{fig:16550_pinout} the most important lanes are the SIN and
|
|
SOUT lanes, as they contain the serial data to and from the 16550 UART.
|
|
|
|
\subsubsection{MAX-232}
|
|
|
|
To convert the voltage levels of the 16550 UART to levels compliant with
|
|
TIA-/EIA-232 levels the MAX-232 is used. It has two transmitters and two
|
|
receivers and generates the needed voltage levels via an internal voltage
|
|
pump\cite{max232}.
|
|
|
|
\subsubsection{Schematics}
|
|
Based on the descriptions in the datasheets, the schematic in figure
|
|
\ref{fig:schem_uart} was developed.
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[height=.65\textheight, angle=-90]{schem_pdf/16550.pdf}
|
|
\caption{The schematic of the UART Module}
|
|
\label{fig:schem_uart}
|
|
\end{figure}
|
|
|
|
\paragraph{Element Description}
|
|
|
|
The quartz oszillator Y1 is the clock source for the Baud Rate generation and
|
|
was chosen with 1.8432 MHz for availability reasons and because it is the lowest
|
|
ozillator from which all common baud rates can still be derived
|
|
\cite{pc16550}.
|
|
Resistors R1 and R2 are for stability and functionality of the Oszillator
|
|
nescessary as per datasheet. The resulting frequency can be measured via
|
|
J1 as can be seen in Figure \ref{fig:uartquartz}. C1 is used to
|
|
stabilize the
|
|
voltage for the 16550 UART and is common practice. Via JP1 the UART can be
|
|
transformed into a USRT, where the receiver is synchronized to the transmitter
|
|
via a clock line. This mode has, however, not been tested, and the clock needs
|
|
to be 16 times the receiver clock rate\cite{pc16550}. The final output of the
|
|
16550 UART can be used and measured via J2, as shown in Figure \ref{fig:uart232}
|
|
. Before the UART on J2 can be used however, the Jumpers JP2 and JP3 need to be
|
|
removed, as otherwise the MAX-232 will short out with the incoming signal.
|
|
Capacitors C4, C6, C7 and C8 are for the voltage pump as defined in the
|
|
datasheet\cite{max232}. R4 and R5 have been suggested by the supervisor in
|
|
order to avoid damage to the MAX-232. The RJ-45 plug is used to transmit the
|
|
TIA-/EIA-232 signal, rather than the more common D-SUB connector, because the
|
|
RJ-45 connector fits on a 2.54mm grid. The Pinout of the RJ-45 plug can be seen
|
|
in Figure \ref{fig:rs232rj45}. C5 has the same functionality for the
|
|
MAX-232 as the C1 has to the 16550-UART.
|
|
|
|
\begin{figure}[H]
|
|
\begin{tikzpicture}
|
|
\begin{axis}[
|
|
ylabel=Quartz Voltage,
|
|
xlabel=Time,
|
|
grid=both,
|
|
minor tick num=5,
|
|
width=\textwidth,
|
|
height=0.5\textheight]
|
|
|
|
\addplot table [x=t, y=c1, col sep=comma, mark=none] {meas/20200319uartquartz.csv};
|
|
\end{axis}
|
|
\end{tikzpicture}
|
|
\caption{Measurement of the 1.8432 MHz Output on J1}
|
|
\label{fig:uartquartz}
|
|
\end{figure}
|
|
\begin{figure}[H]
|
|
\begin{tikzpicture}
|
|
\begin{axis}[
|
|
ylabel=Lane Voltage,
|
|
xlabel=Time,
|
|
grid=both,
|
|
minor tick num=5,
|
|
width=\textwidth,
|
|
height=0.5\textheight]
|
|
|
|
\addplot table [x=t, y=c1, col sep=comma, mark=none] {meas/20200218ttluart.csv};
|
|
\addplot table [x=t, y=c2, col sep=comma, mark=none] {meas/20200218ttluart.csv};
|
|
\legend{TIA-/EIA-232 level,UART level}
|
|
\end{axis}
|
|
\end{tikzpicture}
|
|
\caption{Measurement of a character transmission before and after MAX-232}
|
|
\label{fig:uart232}
|
|
\end{figure}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[width=\textwidth, angle=0]{pics/rj45-consoleport-iface-500.png}
|
|
\caption{Pinout of the RJ-45 Plug; Src: \url{https://www.wti.com/}}
|
|
\label{fig:rs232rj45}
|
|
\end{figure}
|
|
|
|
\subsubsection{Demonstration Software}
|
|
|
|
To demonstrate the functionality and prove that the schematic has no underlying
|
|
error, a program which regularly transmits a character as well as
|
|
a simple echo program, which transmits all received characters are used.
|
|
Both programs
|
|
transmit 8 bit characters without parity at 38400 Baud. The output for program
|
|
one can be seen in Figure \ref{fig:uart232} and the output for program two in
|
|
Figure \ref{fig:232_echo}.
|
|
|
|
\begin{figure}[H]
|
|
\begin{tikzpicture}
|
|
\begin{axis}[
|
|
ylabel=Lane Voltage,
|
|
xlabel=Time,
|
|
grid=both,
|
|
minor tick num=5,
|
|
width=\textwidth,
|
|
height=0.5\textheight]
|
|
|
|
\addplot table [x=t, y=c1, col sep=comma, mark=none] {meas/20200218echo.csv};
|
|
\addplot table [x=t, y=c2, col sep=comma, mark=none] {meas/20200218echo.csv};
|
|
\legend{RX,TX}
|
|
\end{axis}
|
|
\end{tikzpicture}
|
|
\caption{Measurement of a character echo}
|
|
\label{fig:232_echo}
|
|
\end{figure}
|
|
|
|
\paragraph{Transmit code}
|
|
The transmit code regularly transmits the letter capital A via the 16550 UART.
|
|
Some initialisation is required beforehand. The
|
|
functions shown in Listing \ref{lst:16550-general} are the read and write
|
|
routines for accessing the 16550 UART. These routines also apply to the echo
|
|
code.
|
|
\lstinputlisting[language=C,frame=trBL,
|
|
breaklines=true, breakautoindent=true, formfeed=\newpage,
|
|
label={lst:16550-general}, caption={Read and write routines for the
|
|
16550 UART},
|
|
columns=flexible, style=cstyle, firstline=0, lastline=69]
|
|
{code/16550/transmit/src/main.c}
|
|
To write to the 16550 UART, you need to perform some setup tasks. After startup,
|
|
it requires a $MR$ for at least 5µs\cite{pc16550}. The baud rate divisor latch
|
|
needs to be set to the specified divisor for the desired
|
|
baud rate, and the character width and parity control
|
|
needs to be set. The $MR$ signal is beeing generated by the AVR on bootup. To
|
|
access the divisor latch, the divisor latch access bit needs to be set and
|
|
after setting up the baud rate divisor latch, it nees to be cleared to allow
|
|
a regular transmission. This process can be seen in Listing \ref{lst:16550-transmit}
|
|
\lstinputlisting[language=C,frame=trBL,
|
|
breaklines=true, breakautoindent=true, formfeed=\newpage,
|
|
label={lst:16550-transmit}, caption={16550 INIT routines and single char transmission},
|
|
columns=flexible, style=cstyle, firstline=71, lastline=106]
|
|
{code/16550/transmit/src/main.c}
|
|
|
|
The output of this code on the address, data and control bus as well as on the
|
|
SOUT lane of the 16550 UART can be seen in Figure \ref{fig:16550A}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[width=\textwidth, angle=0]{meas/20200211_first_trans.png}
|
|
\caption{Transmission of character A via the 16550 UART}
|
|
\label{fig:16550A}
|
|
\end{figure}
|
|
|
|
\paragraph{Echo code}
|
|
|
|
The echo code permanently polls the 16550 UART wether a character has been
|
|
received, and if yes, reads it from the receiver holding register and writes it
|
|
back to the tx holding register. The output of this code can be seen in Figure
|
|
\ref{fig:232_echo}. The initialisation is practically the same for the
|
|
echo code as well as the read and write routines in Listing
|
|
\ref{lst:16550-general}.
|
|
|
|
\lstinputlisting[language=C,frame=trBL,
|
|
breaklines=true, breakautoindent=true, formfeed=\newpage,
|
|
label={lst:16550-echo}, caption={16550 character echo},
|
|
columns=flexible, style=cstyle, firstline=76, lastline=109]
|
|
{code/16550/echo/src/main.c}
|
|
|
|
\subsubsection{Final Module}
|
|
|
|
The final module can be seen in Figure \ref{fig:16550_mod} with the pc16550 UART
|
|
in the center and the MAX-232 above.
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[width=\textwidth, angle=0]{pics/uart}
|
|
\caption{The final uart module with the pc16550 uart in the center}
|
|
\label{fig:16550_mod}
|
|
\end{figure}
|