summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/console/vt.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/console/vt.c')
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/vt.c348
1 files changed, 0 insertions, 348 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/vt.c b/c/src/lib/libbsp/i386/pc386/console/vt.c
deleted file mode 100644
index 022cb5d461..0000000000
--- a/c/src/lib/libbsp/i386/pc386/console/vt.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * linux/drivers/char/vt.c
- *
- * Copyright (C) 1992 obz under the linux copyright
- *
- * Dynamic diacritical handling - aeb@cwi.nl - Dec 1993
- * Dynamic keymap and string allocation - aeb@cwi.nl - May 1994
- * Restrict VT switching via ioctl() - grif@cs.ucr.edu - Dec 1995
- * Some code moved for less code duplication - Andi Kleen - Mar 1997
- *
- *
- * by: Rosimildo da Silva --
- * Ported to RTEMS to provide the basic interface to the console
- * driver. Removed all stuff not required, such as VT_, Fonts, etc.
- */
-
-#include <string.h> /* memcpy */
-#include <sys/types.h>
-#include <errno.h>
-
-#include <bsp.h>
-#include <i386_io.h>
-#include <rtems.h>
-#include <rtems/kd.h>
-#include <rtems/keyboard.h>
-
-/*
- * Console (vt and kd) routines, as defined by USL SVR4 manual, and by
- * experimentation and study of X386 SYSV handling.
- *
- * One point of difference: SYSV vt's are /dev/vtX, which X >= 0, and
- * /dev/console is a separate ttyp. Under Linux, /dev/tty0 is /dev/console,
- * and the vc start at /dev/ttyX, X >= 1. We maintain that here, so we will
- * always treat our set of vt as numbered 1..MAX_NR_CONSOLES (corresponding to
- * ttys 0..MAX_NR_CONSOLES-1). Explicitly naming VT 0 is illegal, but using
- * /dev/tty0 (fg_console) as a target is legal, since an implicit aliasing
- * to the current console is done by the main ioctl code.
- */
-
-struct vt_struct *vt_cons[MAX_NR_CONSOLES];
-
-/* Keyboard type: Default is KB_101, but can be set by machine
- * specific code.
- */
-unsigned char keyboard_type = KB_101;
-
-/*
- * Generates sound of some frequency for some number of clock ticks
- *
- * If freq is 0, will turn off sound, else will turn it on for that time.
- * If msec is 0, will return immediately, else will sleep for msec time, then
- * turn sound off.
- *
- * We also return immediately, which is what was implied within the X
- * comments - KDMKTONE doesn't put the process to sleep.
- */
-
-#if defined(__i386__) || defined(__alpha__) || defined(__powerpc__) \
- || (defined(__mips__) && !defined(CONFIG_SGI))
-
-static void
-kd_nosound(unsigned long ignored)
-{
- /* disable counter 2 */
- outb(inb_p(0x61)&0xFC, 0x61);
- return;
-}
-
-static void
-_kd_mksound(unsigned int hz, unsigned int ticks)
-{
- unsigned int count = 0;
- rtems_interrupt_lock_context lock_context;
-
- if (hz > 20 && hz < 32767)
- count = 1193180 / hz;
-
- rtems_interrupt_lock_acquire(&rtems_i386_i8254_access_lock, &lock_context);
-/* del_timer(&sound_timer); */
- if (count) {
- /* enable counter 2 */
- outb_p(inb_p(0x61)|3, 0x61);
- /* set command for counter 2, 2 byte write */
- outb_p(0xB6, TIMER_MODE);
- /* select desired HZ */
- outb_p(count & 0xff, TIMER_CNTR2);
- outb((count >> 8) & 0xff, TIMER_CNTR2);
-
-/*
- if (ticks) {
- sound_timer.expires = jiffies+ticks;
- add_timer(&sound_timer);
- }
-*/
- } else
- kd_nosound(0);
-
- rtems_interrupt_lock_release(&rtems_i386_i8254_access_lock, &lock_context);
- return;
-}
-
-#else
-
-void
-_kd_mksound(unsigned int hz, unsigned int ticks)
-{
-}
-
-#endif
-
-void (*kd_mksound)(unsigned int hz, unsigned int ticks) = _kd_mksound;
-
-#define i (tmp.kb_index)
-#define s (tmp.kb_table)
-#define v (tmp.kb_value)
-static inline int
-do_kdsk_ioctl(int cmd, struct kbentry *user_kbe, int perm, struct kbd_struct *kbd)
-{
- struct kbentry tmp;
- ushort *key_map, val;
-
- tmp = *user_kbe;
- if (i >= NR_KEYS) /* s cannot be >= MAX_NR_KEYMAPS */
- return -EINVAL;
-
- switch (cmd) {
- case KDGKBENT:
- key_map = key_maps[s];
- if (key_map) {
- val = U(key_map[i]);
- if (kbd->kbdmode != VC_UNICODE && KTYP(val) >= NR_TYPES)
- val = K_HOLE;
- } else
- val = (i ? K_HOLE : K_NOSUCHMAP);
- user_kbe->kb_value = val;
- return 0;
-
- case KDSKBENT:
- return -EINVAL;
- }
- return 0;
-}
-#undef i
-#undef s
-#undef v
-
-#define HZ 100
-
-static inline int
-do_kbkeycode_ioctl(int cmd, struct kbkeycode *user_kbkc, int perm)
-{
- struct kbkeycode tmp;
- int kc = 0;
-
- tmp = *user_kbkc;
- switch (cmd) {
- case KDGETKEYCODE:
- kc = getkeycode(tmp.scancode);
- if (kc >= 0)
- user_kbkc->keycode = kc;
- break;
- case KDSETKEYCODE:
- if (!perm)
- return -EPERM;
- kc = setkeycode(tmp.scancode, tmp.keycode);
- break;
- }
- return kc;
-}
-
-static inline int
-do_kdgkb_ioctl(int cmd, struct kbsentry *user_kdgkb, int perm)
-{
- return -EINVAL;
-}
-
-/*
- * We handle the console-specific ioctl's here. We allow the
- * capability to modify any console, not just the fg_console.
- */
-int vt_ioctl( unsigned int cmd, unsigned long arg)
-{
- int perm;
- unsigned int console;
- unsigned char ucval;
- struct kbd_struct * kbd;
-
- console = 0;
- /*
- * To have permissions to do most of the vt ioctls, we either have
- * to be the owner of the tty, or super-user.
- */
- perm = 1;
- kbd = kbd_table + console;
- switch (cmd) {
- case KIOCSOUND:
- if (!perm)
- return -EPERM;
- if (arg)
- arg = 1193180 / arg;
- kd_mksound(arg, 0);
- return 0;
-
- case KDMKTONE:
- if (!perm)
- return -EPERM;
- {
- unsigned int ticks, count;
-
- /*
- * Generate the tone for the appropriate number of ticks.
- * If the time is zero, turn off sound ourselves.
- */
- ticks = HZ * ((arg >> 16) & 0xffff) / 1000;
- count = ticks ? (arg & 0xffff) : 0;
- if (count)
- count = 1193180 / count;
- kd_mksound(count, ticks);
- return 0;
- }
-
- case KDGKBTYPE:
- /*
- * this is naive.
- */
- ucval = keyboard_type;
- goto setchar;
-
- case KDSETMODE:
- case KDGETMODE:
- return -EINVAL;
-
- case KDSKBMODE:
- if (!perm)
- return -EPERM;
- switch(arg) {
- case K_RAW:
- kbd->kbdmode = VC_RAW;
- break;
- case K_MEDIUMRAW:
- kbd->kbdmode = VC_MEDIUMRAW;
- break;
- case K_XLATE:
- kbd->kbdmode = VC_XLATE;
- compute_shiftstate();
- break;
- case K_UNICODE:
- kbd->kbdmode = VC_UNICODE;
- compute_shiftstate();
- break;
- default:
- return -EINVAL;
- }
- return 0;
-
- case KDGKBMODE:
- ucval = ((kbd->kbdmode == VC_RAW) ? K_RAW :
- (kbd->kbdmode == VC_MEDIUMRAW) ? K_MEDIUMRAW :
- (kbd->kbdmode == VC_UNICODE) ? K_UNICODE :
- K_XLATE);
- goto setint;
-
- /* this could be folded into KDSKBMODE, but for compatibility
- reasons it is not so easy to fold KDGKBMETA into KDGKBMODE */
- case KDSKBMETA:
- switch(arg) {
- case K_METABIT:
- clr_vc_kbd_mode(kbd, VC_META);
- break;
- case K_ESCPREFIX:
- set_vc_kbd_mode(kbd, VC_META);
- break;
- default:
- return -EINVAL;
- }
- return 0;
-
- case KDGKBMETA:
- ucval = (vc_kbd_mode(kbd, VC_META) ? K_ESCPREFIX : K_METABIT);
- setint:
- *(int *)arg = ucval;
- return 0;
-
- case KDGETKEYCODE:
- case KDSETKEYCODE:
- return do_kbkeycode_ioctl(cmd, (struct kbkeycode *)arg, perm);
-
- case KDGKBENT:
- case KDSKBENT:
- return do_kdsk_ioctl(cmd, (struct kbentry *)arg, perm, kbd);
-
- case KDGKBDIACR:
- {
- struct kbdiacrs *a = (struct kbdiacrs *)arg;
- a->kb_cnt = accent_table_size;
- memcpy( a->kbdiacr, accent_table, accent_table_size*sizeof(struct kbdiacr) );
- return 0;
- }
-
- case KDSKBDIACR:
- {
- struct kbdiacrs *a = (struct kbdiacrs *)arg;
- unsigned int ct;
-
- if (!perm)
- return -EPERM;
- ct = a->kb_cnt;
- if (ct >= MAX_DIACR)
- return -EINVAL;
- accent_table_size = ct;
- memcpy(accent_table, a->kbdiacr, ct*sizeof(struct kbdiacr));
- return 0;
- }
-
- /* the ioctls below read/set the flags usually shown in the leds */
- /* don't use them - they will go away without warning */
- case KDGKBLED:
- ucval = kbd->ledflagstate | (kbd->default_ledflagstate << 4);
- goto setchar;
-
- case KDSKBLED:
- if (!perm)
- return -EPERM;
- if (arg & ~0x77)
- return -EINVAL;
- kbd->ledflagstate = (arg & 7);
- kbd->default_ledflagstate = ((arg >> 4) & 7);
- set_leds();
- return 0;
-
- /* the ioctls below only set the lights, not the functions */
- /* for those, see KDGKBLED and KDSKBLED above */
- case KDGETLED:
- ucval = getledstate();
- setchar:
- *(char*)arg = ucval;
- return 0;
-
- case KDSETLED:
- if (!perm)
- return -EPERM;
- setledstate(kbd, arg);
- return 0;
-
- default:
- return -EINVAL;
- }
-}