usr/src/grub/grub-0.97/stage2/serial.c
author Christopher Siden <chris.siden@delphix.com>
Mon, 21 May 2012 12:11:39 -0700
changeset 13700 2889e2596bd6
parent 8044 b3af80bbf173
permissions -rw-r--r--
2619 asynchronous destruction of ZFS file systems 2747 SPA versioning with zfs feature flags Reviewed by: Matt Ahrens <[email protected]> Reviewed by: George Wilson <[email protected]> Reviewed by: Richard Lowe <[email protected]> Reviewed by: Dan Kruchinin <[email protected]> Approved by: Eric Schrock <[email protected]>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/* serial.c - serial device interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *  GRUB  --  GRand Unified Bootloader
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 *  Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 *  This program is free software; you can redistribute it and/or modify
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *  it under the terms of the GNU General Public License as published by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *  the Free Software Foundation; either version 2 of the License, or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 *  (at your option) any later version.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 *  This program is distributed in the hope that it will be useful,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 *  GNU General Public License for more details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 *  You should have received a copy of the GNU General Public License
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 *  along with this program; if not, write to the Free Software
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
#ifdef SUPPORT_SERIAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
#include <shared.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
#include <serial.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
#include <term.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#include <terminfo.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/* An input buffer.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
static char input_buf[8];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
static int npending = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
static int serial_x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
static int serial_y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
static int keep_track = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
/* Hardware-dependent definitions.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#ifndef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
/* The structure for speed vs. divisor.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
struct divisor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
  int speed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
  unsigned short div;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
/* Store the port number of a serial unit.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
static unsigned short serial_hw_port = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
/* The table which lists common configurations.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
static struct divisor divisor_tab[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
    { 2400,   0x0030 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
    { 4800,   0x0018 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
    { 9600,   0x000C },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
    { 19200,  0x0006 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
    { 38400,  0x0003 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
    { 57600,  0x0002 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
    { 115200, 0x0001 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
  };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
/* Read a byte from a port.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
static inline unsigned char
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
inb (unsigned short port)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
  unsigned char value;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
  asm volatile ("inb	%w1, %0" : "=a" (value) : "Nd" (port));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
  asm volatile ("outb	%%al, $0x80" : : );
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
  return value;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
/* Write a byte to a port.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
static inline void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
outb (unsigned short port, unsigned char value)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
  asm volatile ("outb	%b0, %w1" : : "a" (value), "Nd" (port));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
  asm volatile ("outb	%%al, $0x80" : : );
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
/* Fetch a key.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
serial_hw_fetch (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
  if (inb (serial_hw_port + UART_LSR) & UART_DATA_READY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
    return inb (serial_hw_port + UART_RX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
  return -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
/* Put a chararacter.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
serial_hw_put (int c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
  int timeout = 100000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
  /* Wait until the transmitter holding register is empty.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
  while ((inb (serial_hw_port + UART_LSR) & UART_EMPTY_TRANSMITTER) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
      if (--timeout == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	/* There is something wrong. But what can I do?  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
  outb (serial_hw_port + UART_TX, c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
serial_hw_delay (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
  outb (0x80, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
/* Return the port number for the UNITth serial device.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
unsigned short
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
serial_hw_get_port (int unit)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
  /* The BIOS data area.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
  const unsigned short *addr = (const unsigned short *) 0x0400;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
  return addr[unit];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
/* Initialize a serial device. PORT is the port number for a serial device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
   SPEED is a DTE-DTE speed which must be one of these: 2400, 4800, 9600,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
   19200, 38400, 57600 and 115200. WORD_LEN is the word length to be used
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
   for the device. Likewise, PARITY is the type of the parity and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
   STOP_BIT_LEN is the length of the stop bit. The possible values for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
   WORD_LEN, PARITY and STOP_BIT_LEN are defined in the header file as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
   macros.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
serial_hw_init (unsigned short port, unsigned int speed,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		int word_len, int parity, int stop_bit_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
  unsigned short div = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
  unsigned char status = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
  /* Turn off the interrupt.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
  outb (port + UART_IER, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
  /* Set DLAB.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
  outb (port + UART_LCR, UART_DLAB);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
  /* Set the baud rate.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
  for (i = 0; i < sizeof (divisor_tab) / sizeof (divisor_tab[0]); i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
    if (divisor_tab[i].speed == speed)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	div = divisor_tab[i].div;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
  if (div == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
    return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
  outb (port + UART_DLL, div & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
  outb (port + UART_DLH, div >> 8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
  /* Set the line status.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
  status |= parity | word_len | stop_bit_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
  outb (port + UART_LCR, status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
  /* Enable the FIFO.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
  outb (port + UART_FCR, UART_ENABLE_FIFO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
  /* Turn on DTR, RTS, and OUT2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
  outb (port + UART_MCR, UART_ENABLE_MODEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
  /* Store the port number.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
  serial_hw_port = port;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
  /* Drain the input buffer.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
  while (serial_checkkey () != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
    (void) serial_getkey ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
  /* Get rid of TERM_NEED_INIT from the serial terminal.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
  for (i = 0; term_table[i].name; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
    if (grub_strcmp (term_table[i].name, "serial") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	term_table[i].flags &= ~TERM_NEED_INIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
  /* FIXME: should check if the serial terminal was found.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
#endif /* ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
/* Generic definitions.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
serial_translate_key_sequence (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
  const struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
    char key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
    char ascii;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
  three_code_table[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
      {'A', 16},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
      {'B', 14},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
      {'C', 6},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
      {'D', 2},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
      {'F', 5},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
      {'H', 1},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
      {'4', 4}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
    };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
  const struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
    short key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
    char ascii;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
  four_code_table[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
      {('1' | ('~' << 8)), 1},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
      {('3' | ('~' << 8)), 4},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
      {('5' | ('~' << 8)), 7},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
      {('6' | ('~' << 8)), 3},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
    };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
  /* The buffer must start with ``ESC [''.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
  if (*((unsigned short *) input_buf) != ('\e' | ('[' << 8)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
  if (npending >= 3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
      for (i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	   i < sizeof (three_code_table) / sizeof (three_code_table[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	   i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	if (three_code_table[i].key == input_buf[2])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	    input_buf[0] = three_code_table[i].ascii;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	    npending -= 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	    grub_memmove (input_buf + 1, input_buf + 3, npending - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
  if (npending >= 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
      short key = *((short *) (input_buf + 2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
      for (i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	   i < sizeof (four_code_table) / sizeof (four_code_table[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	   i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	if (four_code_table[i].key == key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	    input_buf[0] = four_code_table[i].ascii;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	    npending -= 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	    grub_memmove (input_buf + 1, input_buf + 4, npending - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
static
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
int fill_input_buf (int nowait)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
  for (i = 0; i < 10000 && npending < sizeof (input_buf); i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
      int c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
      c = serial_hw_fetch ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
      if (c >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	  input_buf[npending++] = c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	  /* Reset the counter to zero, to wait for the same interval.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	  i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
      if (nowait)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
  /* Translate some key sequences.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
  serial_translate_key_sequence ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
  return npending;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
/* The serial version of getkey.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
serial_getkey (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
  int c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
  while (! fill_input_buf (0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
    ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
  c = input_buf[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
  npending--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
  grub_memmove (input_buf, input_buf + 1, npending);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
  return c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
/* The serial version of checkkey.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
serial_checkkey (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
  if (fill_input_buf (1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
    return input_buf[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
  return -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
/* The serial version of grub_putchar.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
serial_putchar (int c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
  /* Keep track of the cursor.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
  if (keep_track)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
      /* The serial terminal doesn't have VGA fonts.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
      switch (c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	case DISP_UL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	  c = ACS_ULCORNER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	case DISP_UR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	  c = ACS_URCORNER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	case DISP_LL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	  c = ACS_LLCORNER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	case DISP_LR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	  c = ACS_LRCORNER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	case DISP_HORIZ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	  c = ACS_HLINE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	case DISP_VERT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	  c = ACS_VLINE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	case DISP_LEFT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	  c = ACS_LARROW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	case DISP_RIGHT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	  c = ACS_RARROW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	case DISP_UP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	  c = ACS_UARROW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	case DISP_DOWN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	  c = ACS_DARROW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
      switch (c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	case '\r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	  serial_x = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	case '\n':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	  serial_y++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	case '\b':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	case 127:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	  if (serial_x > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	    serial_x--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	case '\a':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	  if (serial_x >= 79)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	      serial_putchar ('\r');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	      serial_putchar ('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	  serial_x++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
  serial_hw_put (c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
serial_getxy (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
  return (serial_x << 8) | serial_y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
serial_gotoxy (int x, int y)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
  keep_track = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
  ti_cursor_address (x, y);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
  keep_track = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
  serial_x = x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
  serial_y = y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
serial_cls (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
  keep_track = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
  ti_clear_screen ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
  keep_track = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
  serial_x = serial_y = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
serial_setcolorstate (color_state state)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
  keep_track = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
  if (state == COLOR_STATE_HIGHLIGHT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
    ti_enter_standout_mode ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
    ti_exit_standout_mode ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
  keep_track = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
#endif /* SUPPORT_SERIAL */