15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* serial.c - serial device interface */
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GRUB  --  GRand Unified Bootloader
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is free software; you can redistribute it and/or modify
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  it under the terms of the GNU General Public License as published by
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  the Free Software Foundation; either version 2 of the License, or
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  (at your option) any later version.
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is distributed in the hope that it will be useful,
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GNU General Public License for more details.
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  You should have received a copy of the GNU General Public License
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  along with this program; if not, write to the Free Software
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef SUPPORT_SERIAL
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <shared.h>
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <serial.h>
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <term.h>
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <terminfo.h>
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* An input buffer.  */
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic char input_buf[8];
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int npending = 0;
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int serial_x;
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int serial_y;
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int keep_track = 1;
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Hardware-dependent definitions.  */
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef GRUB_UTIL
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The structure for speed vs. divisor.  */
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct divisor
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int speed;
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short div;
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Store the port number of a serial unit.  */
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned short serial_hw_port = 0;
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The table which lists common configurations.  */
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct divisor divisor_tab[] =
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { 2400,   0x0030 },
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { 4800,   0x0018 },
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { 9600,   0x000C },
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { 19200,  0x0006 },
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { 38400,  0x0003 },
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { 57600,  0x0002 },
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { 115200, 0x0001 }
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  };
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Read a byte from a port.  */
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic inline unsigned char
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinb (unsigned short port)
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned char value;
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  asm volatile ("inb	%w1, %0" : "=a" (value) : "Nd" (port));
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  asm volatile ("outb	%%al, $0x80" : : );
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return value;
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Write a byte to a port.  */
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic inline void
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectoutb (unsigned short port, unsigned char value)
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  asm volatile ("outb	%b0, %w1" : : "a" (value), "Nd" (port));
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  asm volatile ("outb	%%al, $0x80" : : );
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Fetch a key.  */
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_fetch (void)
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (inb (serial_hw_port + UART_LSR) & UART_DATA_READY)
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return inb (serial_hw_port + UART_RX);
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return -1;
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Put a chararacter.  */
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_put (int c)
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int timeout = 100000;
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Wait until the transmitter holding register is empty.  */
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while ((inb (serial_hw_port + UART_LSR) & UART_EMPTY_TRANSMITTER) == 0)
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (--timeout == 0)
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* There is something wrong. But what can I do?  */
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return;
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (serial_hw_port + UART_TX, c);
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_delay (void)
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (0x80, 0);
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Return the port number for the UNITth serial device.  */
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned short
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_get_port (int unit)
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* The BIOS data area.  */
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  const unsigned short *addr = (const unsigned short *) 0x0400;
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return addr[unit];
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Initialize a serial device. PORT is the port number for a serial device.
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   SPEED is a DTE-DTE speed which must be one of these: 2400, 4800, 9600,
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   19200, 38400, 57600 and 115200. WORD_LEN is the word length to be used
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   for the device. Likewise, PARITY is the type of the parity and
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   STOP_BIT_LEN is the length of the stop bit. The possible values for
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   WORD_LEN, PARITY and STOP_BIT_LEN are defined in the header file as
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   macros.  */
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_init (unsigned short port, unsigned int speed,
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		int word_len, int parity, int stop_bit_len)
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int i;
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short div = 0;
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned char status = 0;
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Turn off the interrupt.  */
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (port + UART_IER, 0);
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Set DLAB.  */
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (port + UART_LCR, UART_DLAB);
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Set the baud rate.  */
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < sizeof (divisor_tab) / sizeof (divisor_tab[0]); i++)
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (divisor_tab[i].speed == speed)
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	div = divisor_tab[i].div;
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	break;
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      }
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (div == 0)
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return 0;
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (port + UART_DLL, div & 0xFF);
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (port + UART_DLH, div >> 8);
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Set the line status.  */
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  status |= parity | word_len | stop_bit_len;
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (port + UART_LCR, status);
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Enable the FIFO.  */
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (port + UART_FCR, UART_ENABLE_FIFO);
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Turn on DTR, RTS, and OUT2.  */
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  outb (port + UART_MCR, UART_ENABLE_MODEM);
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Store the port number.  */
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  serial_hw_port = port;
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Drain the input buffer.  */
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (serial_checkkey () != -1)
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    (void) serial_getkey ();
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Get rid of TERM_NEED_INIT from the serial terminal.  */
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; term_table[i].name; i++)
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (grub_strcmp (term_table[i].name, "serial") == 0)
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	term_table[i].flags &= ~TERM_NEED_INIT;
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	break;
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      }
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* FIXME: should check if the serial terminal was found.  */
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return 1;
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* ! GRUB_UTIL */
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Generic definitions.  */
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_translate_key_sequence (void)
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  const struct
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char key;
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char ascii;
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  }
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  three_code_table[] =
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {'A', 16},
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {'B', 14},
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {'C', 6},
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {'D', 2},
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {'F', 5},
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {'H', 1},
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {'4', 4}
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    };
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  const struct
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    short key;
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char ascii;
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  }
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  four_code_table[] =
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {('1' | ('~' << 8)), 1},
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {('3' | ('~' << 8)), 4},
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {('5' | ('~' << 8)), 7},
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      {('6' | ('~' << 8)), 3},
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    };
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* The buffer must start with ``ESC [''.  */
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (*((unsigned short *) input_buf) != ('\e' | ('[' << 8)))
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return;
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (npending >= 3)
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      int i;
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      for (i = 0;
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   i < sizeof (three_code_table) / sizeof (three_code_table[0]);
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   i++)
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (three_code_table[i].key == input_buf[2])
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  {
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    input_buf[0] = three_code_table[i].ascii;
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    npending -= 2;
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    grub_memmove (input_buf + 1, input_buf + 3, npending - 1);
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    return;
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  }
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (npending >= 4)
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      int i;
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      short key = *((short *) (input_buf + 2));
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      for (i = 0;
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   i < sizeof (four_code_table) / sizeof (four_code_table[0]);
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   i++)
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (four_code_table[i].key == key)
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  {
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    input_buf[0] = four_code_table[i].ascii;
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    npending -= 3;
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    grub_memmove (input_buf + 1, input_buf + 4, npending - 1);
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    return;
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  }
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint fill_input_buf (int nowait)
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int i;
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < 10000 && npending < sizeof (input_buf); i++)
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      int c;
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      c = serial_hw_fetch ();
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (c >= 0)
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  input_buf[npending++] = c;
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* Reset the counter to zero, to wait for the same interval.  */
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  i = 0;
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (nowait)
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	break;
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Translate some key sequences.  */
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  serial_translate_key_sequence ();
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return npending;
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The serial version of getkey.  */
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_getkey (void)
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int c;
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (! fill_input_buf (0))
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ;
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  c = input_buf[0];
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  npending--;
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_memmove (input_buf, input_buf + 1, npending);
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return c;
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The serial version of checkkey.  */
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_checkkey (void)
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (fill_input_buf (1))
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return input_buf[0];
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return -1;
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The serial version of grub_putchar.  */
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_putchar (int c)
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Keep track of the cursor.  */
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (keep_track)
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* The serial terminal doesn't have VGA fonts.  */
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      switch (c)
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_UL:
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_ULCORNER;
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_UR:
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_URCORNER;
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_LL:
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_LLCORNER;
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_LR:
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_LRCORNER;
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_HORIZ:
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_HLINE;
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_VERT:
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_VLINE;
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_LEFT:
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_LARROW;
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_RIGHT:
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_RARROW;
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_UP:
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_UARROW;
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case DISP_DOWN:
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ACS_DARROW;
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	default:
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      switch (c)
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case '\r':
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  serial_x = 0;
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case '\n':
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  serial_y++;
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case '\b':
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case 127:
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (serial_x > 0)
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    serial_x--;
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case '\a':
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	default:
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (serial_x >= 79)
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      serial_putchar ('\r');
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      serial_putchar ('\n');
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  serial_x++;
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  serial_hw_put (c);
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_getxy (void)
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return (serial_x << 8) | serial_y;
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_gotoxy (int x, int y)
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  keep_track = 0;
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  ti_cursor_address (x, y);
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  keep_track = 1;
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  serial_x = x;
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  serial_y = y;
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_cls (void)
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  keep_track = 0;
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  ti_clear_screen ();
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  keep_track = 1;
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  serial_x = serial_y = 0;
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_setcolorstate (color_state state)
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  keep_track = 0;
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (state == COLOR_STATE_HIGHLIGHT)
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ti_enter_standout_mode ();
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  else
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ti_exit_standout_mode ();
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  keep_track = 1;
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* SUPPORT_SERIAL */
435