keyboard.c revision 97748
1151937Sjkim/*-
2151937Sjkim * Copyright (c) 1997 S�ren Schmidt
3151937Sjkim * All rights reserved.
4151937Sjkim *
5151937Sjkim * Redistribution and use in source and binary forms, with or without
6151937Sjkim * modification, are permitted provided that the following conditions
7217365Sjkim * are met:
8229989Sjkim * 1. Redistributions of source code must retain the above copyright
9151937Sjkim *    notice, this list of conditions and the following disclaimer
10151937Sjkim *    in this position and unchanged.
11217365Sjkim * 2. Redistributions in binary form must reproduce the above copyright
12217365Sjkim *    notice, this list of conditions and the following disclaimer in the
13217365Sjkim *    documentation and/or other materials provided with the distribution.
14217365Sjkim * 3. The name of the author may not be used to endorse or promote products
15217365Sjkim *    derived from this software without specific prior written permission
16217365Sjkim *
17217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18217365Sjkim * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19217365Sjkim * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20217365Sjkim * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21217365Sjkim * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22217365Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23217365Sjkim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24217365Sjkim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25151937Sjkim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26217365Sjkim * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27217365Sjkim */
28217365Sjkim
29151937Sjkim#include <sys/cdefs.h>
30217365Sjkim__FBSDID("$FreeBSD: head/lib/libvgl/keyboard.c 97748 2002-06-02 20:05:59Z schweikh $");
31217365Sjkim
32217365Sjkim#include <stdio.h>
33217365Sjkim#include <sys/types.h>
34217365Sjkim#include <sys/ioctl.h>
35217365Sjkim#include <termios.h>
36217365Sjkim#include <sys/time.h>
37217365Sjkim#include <sys/fbio.h>
38217365Sjkim#include <sys/kbio.h>
39217365Sjkim#include "vgl.h"
40217365Sjkim
41217365Sjkimstatic struct termios VGLKeyboardTty;
42217365Sjkimstatic int VGLKeyboardMode = -1;
43151937Sjkim
44151937Sjkimint
45151937SjkimVGLKeyboardInit(int mode)
46151937Sjkim{
47193341Sjkim  static struct termios term;
48193341Sjkim
49151937Sjkim  ioctl(0, KDGKBMODE, &VGLKeyboardMode);
50151937Sjkim  tcgetattr(0, &VGLKeyboardTty);
51151937Sjkim
52151937Sjkim  term = VGLKeyboardTty;
53151937Sjkim  cfmakeraw(&term);
54151937Sjkim  term.c_iflag = IGNPAR | IGNBRK;
55151937Sjkim  term.c_oflag = OPOST | ONLCR;
56151937Sjkim  term.c_cflag = CREAD | CS8;
57151937Sjkim  term.c_lflag &= ~(ICANON | ECHO | ISIG);
58151937Sjkim  term.c_cc[VTIME] = 0;
59151937Sjkim  term.c_cc[VMIN] = 0;
60151937Sjkim  cfsetispeed(&term, 9600);
61151937Sjkim  cfsetospeed(&term, 9600);
62151937Sjkim  tcsetattr(0, TCSANOW | TCSAFLUSH, &term);
63151937Sjkim
64151937Sjkim  switch (mode) {
65151937Sjkim  case VGL_RAWKEYS:
66151937Sjkim    ioctl(0, KDSKBMODE, K_RAW);
67151937Sjkim    break;
68151937Sjkim  case VGL_CODEKEYS:
69151937Sjkim    ioctl(0, KDSKBMODE, K_CODE);
70151937Sjkim    break;
71151937Sjkim  case VGL_XLATEKEYS:
72151937Sjkim    ioctl(0, KDSKBMODE, K_XLATE);
73151937Sjkim    break;
74151937Sjkim  }
75151937Sjkim  return 0;
76151937Sjkim}
77151937Sjkim
78151937Sjkimvoid
79151937SjkimVGLKeyboardEnd()
80151937Sjkim{
81151937Sjkim  if (VGLKeyboardMode != -1) {
82151937Sjkim    ioctl(0, KDSKBMODE, VGLKeyboardMode);
83151937Sjkim    tcsetattr(0, TCSANOW | TCSAFLUSH, &VGLKeyboardTty);
84151937Sjkim  }
85151937Sjkim}
86151937Sjkim
87151937Sjkimint
88151937SjkimVGLKeyboardGetCh()
89151937Sjkim{
90151937Sjkim  unsigned char ch = 0;
91151937Sjkim
92151937Sjkim  read (0, &ch, 1);
93151937Sjkim  return (int)ch;
94151937Sjkim}
95151937Sjkim