comconsole.c revision 199767f8919635c4928607450d9e0abb932109ce
/*-
* Copyright (c) 1998 Michael Smith (msmith@freebsd.org)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <stand.h>
#include <bootstrap.h>
#include "libi386.h"
#ifndef COMSPEED
#define COMSPEED 9600
#endif
#define COM1_IOADDR 0x3f8
#define COM2_IOADDR 0x2f8
#define COM3_IOADDR 0x3e8
#define COM4_IOADDR 0x2e8
#define STOP1 0x00
#define STOP2 0x04
#define PARODD 0x00
#define PAREN 0x08
#define PAREVN 0x10
#define PARMARK 0x20
struct serial {
int speed; /* baud rate */
int ioaddr;
};
const void *value);
static int comc_mode_set(struct env_var *, int, const void *);
static int comc_cd_set(struct env_var *, int, const void *);
static int comc_rtsdtr_set(struct env_var *, int, const void *);
"ttya",
"serial port a",
0,
};
"ttyb",
"serial port b",
0,
};
"ttyc",
"serial port c",
0,
};
"ttyd",
"serial port d",
0,
};
static void
{
char name[20];
char value[20];
/*
* Assume that the speed was set by an earlier boot loader if
* comconsole is already the preferred console.
*/
}
}
}
port->rtsdtr_off = 0;
}
}
}
comc_setup(cp);
}
static int
{
comc_setup(cp);
(C_PRESENTIN | C_PRESENTOUT))
return (CMD_OK);
return (CMD_ERROR);
}
static void
{
int wait;
break;
}
}
static int
{
}
static int
{
}
static char *
{
char par;
par = 'e';
par = 'o';
else
par = 'n';
return (buf);
}
static int
{
int n;
int speed;
int lcr;
char *ep;
if (n > 0)
speed = n;
else
return (CMD_ERROR);
if (*ep == ',')
ep++;
else
return (CMD_ERROR);
switch (n) {
break;
break;
default:
return (CMD_ERROR);
}
if (*ep == ',')
ep++;
else
return (CMD_ERROR);
switch (*ep++) {
case 'n':
break;
break;
break;
default:
return (CMD_ERROR);
}
if (*ep == ',')
ep++;
else
return (CMD_ERROR);
switch (*ep++) {
case '1':
break;
break;
default:
return (CMD_ERROR);
}
/* handshake is ignored, but we check syntax anyhow */
if (*ep == ',')
ep++;
else
return (CMD_ERROR);
switch (*ep++) {
case '-':
case 'h':
case 's':
break;
default:
return (CMD_ERROR);
}
if (*ep != '\0')
return (CMD_ERROR);
return (CMD_OK);
}
static struct console *
get_console(char *name)
{
switch(name[3]) {
break;
break;
break;
break;
}
return (cp);
}
static int
{
return (CMD_ERROR);
return (CMD_ERROR);
return (CMD_ERROR);
comc_setup(cp);
return (CMD_OK);
}
static int
{
return (CMD_ERROR);
return (CMD_ERROR);
else
return (CMD_ERROR);
comc_setup(cp);
return (CMD_OK);
}
static int
{
return (CMD_ERROR);
return (CMD_ERROR);
sp->rtsdtr_off = 0;
else
return (CMD_ERROR);
comc_setup(cp);
return (CMD_OK);
}
/*
* Input: bus:dev:func[:bar]. If bar is not specified, it is 0x10.
* Output: bar[24:16] bus[15:8] dev[7:3] func[2:0]
*/
static uint32_t
comc_parse_pcidev(const char *string)
{
#ifdef NO_PCI
(void)string;
return (0);
#else
char *p, *p1;
int pres;
return (0);
p1 = ++p;
return (0);
p1 = ++p;
return (0);
if (*p == ':') {
p1 = ++p;
return (0);
} else
bar = 0x10;
return (locator);
#endif
}
static int
{
#ifdef NO_PCI
(void)cp;
(void)locator;
return (CMD_ERROR);
#else
char intbuf[64];
return (CMD_ERROR);
}
if (!PCI_BAR_IO(port)) {
return (CMD_ERROR);
}
port &= PCIM_BAR_IO_BASE;
comc_setup(cp);
return (CMD_OK);
#endif
}
static int
{
int error;
return (CMD_ERROR);
printf("Invalid pcidev\n");
return (CMD_ERROR);
}
return (error);
}
return (CMD_OK);
}
static void
{
static int TRY_COUNT = 1000000;
int tries;
return;
tries = 0;
do
} else
}
static int
{
/* XXX there should be more sanity checking. */
if (divisor == 0)
return (COMSPEED);
return (COMC_DIV2BPS(divisor));
}