// SPDX-License-Identifier: GPL-2.0 /* * Serial port routines for use during early boot reporting. This code is * included from both the compressed kernel and the regular kernel.
*/ #include"boot.h"
#define DEFAULT_SERIAL_PORT 0x3f8 /* ttyS0 */
#define DLAB 0x80
#define TXR 0 /* Transmit register (WRITE) */ #define RXR 0 /* Receive register (READ) */ #define IER 1 /* Interrupt Enable */ #define IIR 2 /* Interrupt ID */ #define FCR 2 /* FIFO control */ #define LCR 3 /* Line control */ #define MCR 4 /* Modem control */ #define LSR 5 /* Line Status */ #define MSR 6 /* Modem Status */ #define DLL 0 /* Divisor Latch Low */ #define DLH 1 /* Divisor latch High */
#define DEFAULT_BAUD 9600
staticvoid early_serial_init(int port, int baud)
{ unsignedchar c; unsigned divisor;
outb(0x3, port + LCR); /* 8n1 */
outb(0, port + IER); /* no interrupt */
outb(0, port + FCR); /* no fifo */
outb(0x3, port + MCR); /* DTR + RTS */
divisor = 115200 / baud;
c = inb(port + LCR);
outb(c | DLAB, port + LCR);
outb(divisor & 0xff, port + DLL);
outb((divisor >> 8) & 0xff, port + DLH);
outb(c & ~DLAB, port + LCR);
early_serial_base = port;
}
staticvoid parse_earlyprintk(void)
{ int baud = DEFAULT_BAUD; char arg[32]; int pos = 0; int port = 0;
if (cmdline_find_option("earlyprintk", arg, sizeof(arg)) > 0) { char *e;
if (!strncmp(arg, "serial", 6)) {
port = DEFAULT_SERIAL_PORT;
pos += 6;
}
if (arg[pos] == ',')
pos++;
/* * make sure we have * "serial,0x3f8,115200" * "serial,ttyS0,115200" * "ttyS0,115200"
*/ if (pos == 7 && !strncmp(arg + pos, "0x", 2)) {
port = simple_strtoull(arg + pos, &e, 16); if (port == 0 || arg + pos == e)
port = DEFAULT_SERIAL_PORT; else
pos = e - arg;
} elseif (!strncmp(arg + pos, "ttyS", 4)) { staticconstint bases[] = { 0x3f8, 0x2f8 }; int idx = 0;
staticvoid parse_console_uart8250(void)
{ char optstr[64], *options; int baud = DEFAULT_BAUD; int port = 0;
/* * console=uart8250,io,0x3f8,115200n8 * need to make sure it is last one console !
*/ if (cmdline_find_option("console", optstr, sizeof(optstr)) <= 0) return;
options = optstr;
if (!strncmp(options, "uart8250,io,", 12))
port = simple_strtoull(options + 12, &options, 0); elseif (!strncmp(options, "uart,io,", 8))
port = simple_strtoull(options + 8, &options, 0); else return;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.