Initial revision
This commit is contained in:
56
drivers/tty/Makefile
Normal file
56
drivers/tty/Makefile
Normal file
@@ -0,0 +1,56 @@
|
||||
# Makefile for terminal driver (TTY)
|
||||
DRIVER = tty
|
||||
|
||||
# directories
|
||||
u = /usr
|
||||
i = $u/include
|
||||
s = $i/sys
|
||||
m = $i/minix
|
||||
b = $i/ibm
|
||||
d = $u/src/drivers
|
||||
|
||||
# programs, flags, etc.
|
||||
MAKE = exec make
|
||||
CC = exec cc
|
||||
CFLAGS = -I$i
|
||||
LDFLAGS = -i
|
||||
LIBS = -lsys -lutils -ltimers
|
||||
|
||||
OBJ = tty.o console.o vidcopy.o keyboard.o
|
||||
# rs232.o
|
||||
|
||||
# build local binary
|
||||
all build: $(DRIVER)
|
||||
cd keymaps && $(MAKE) -$(MAKEFLAGS) $@
|
||||
$(DRIVER): $(OBJ)
|
||||
$(CC) -o $@ $(LDFLAGS) $(OBJ) $(LIBS)
|
||||
install -S 256w $(DRIVER)
|
||||
|
||||
# install with other drivers
|
||||
install: /usr/sbin/drivers/$(DRIVER)
|
||||
cd keymaps && $(MAKE) -$(MAKEFLAGS) $@
|
||||
/usr/sbin/drivers/$(DRIVER): $(DRIVER)
|
||||
install -o root -cs $? $@
|
||||
|
||||
# clean up local files
|
||||
clean:
|
||||
cd keymaps && $(MAKE) -$(MAKEFLAGS) $@
|
||||
rm -f $(DRIVER) *.o *.bak
|
||||
|
||||
|
||||
|
||||
# dependencies
|
||||
a = $d/drivers.h $b/interrupt.h $b/bios.h \
|
||||
$i/ansi.h $i/string.h $i/limits.h $i/stddef.h $i/errno.h \
|
||||
$m/config.h $m/type.h $m/com.h $m/callnr.h $m/const.h $s/types.h \
|
||||
$m/syslib.h $s/types.h \
|
||||
$m/utils.h $m/serverassert.h $m/devio.h
|
||||
|
||||
tty.o: $a
|
||||
console.o: $a
|
||||
vidcopy.o: # nothing
|
||||
keyboard.o: $a
|
||||
rs232.o: $a $i/termios.h $i/signal.h
|
||||
|
||||
|
||||
|
||||
1083
drivers/tty/console.c
Normal file
1083
drivers/tty/console.c
Normal file
File diff suppressed because it is too large
Load Diff
600
drivers/tty/keyboard.c
Normal file
600
drivers/tty/keyboard.c
Normal file
@@ -0,0 +1,600 @@
|
||||
/* Keyboard driver for PC's and AT's.
|
||||
*
|
||||
* Changes:
|
||||
* Jul 13, 2004 processes can observe function keys (Jorrit N. Herder)
|
||||
* Jun 15, 2004 removed wreboot(), except panic dumps (Jorrit N. Herder)
|
||||
* Feb 04, 1994 loadable keymaps (Marcus Hampel)
|
||||
*/
|
||||
|
||||
#include "../drivers.h"
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <minix/callnr.h>
|
||||
#include <minix/com.h>
|
||||
#include <minix/keymap.h>
|
||||
#include "tty.h"
|
||||
#include "keymaps/us-std.src"
|
||||
#include "../../kernel/kernel.h"
|
||||
#include "../../kernel/proc.h"
|
||||
|
||||
/* Standard and AT keyboard. (PS/2 MCA implies AT throughout.) */
|
||||
#define KEYBD 0x60 /* I/O port for keyboard data */
|
||||
|
||||
/* AT keyboard. */
|
||||
#define KB_COMMAND 0x64 /* I/O port for commands on AT */
|
||||
#define KB_STATUS 0x64 /* I/O port for status on AT */
|
||||
#define KB_ACK 0xFA /* keyboard ack response */
|
||||
#define KB_OUT_FULL 0x01 /* status bit set when keypress char pending */
|
||||
#define KB_IN_FULL 0x02 /* status bit set when not ready to receive */
|
||||
#define LED_CODE 0xED /* command to keyboard to set LEDs */
|
||||
#define MAX_KB_ACK_RETRIES 0x1000 /* max #times to wait for kb ack */
|
||||
#define MAX_KB_BUSY_RETRIES 0x1000 /* max #times to loop while kb busy */
|
||||
#define KBIT 0x80 /* bit used to ack characters to keyboard */
|
||||
|
||||
/* Miscellaneous. */
|
||||
#define ESC_SCAN 0x01 /* reboot key when panicking */
|
||||
#define SLASH_SCAN 0x35 /* to recognize numeric slash */
|
||||
#define RSHIFT_SCAN 0x36 /* to distinguish left and right shift */
|
||||
#define HOME_SCAN 0x47 /* first key on the numeric keypad */
|
||||
#define INS_SCAN 0x52 /* INS for use in CTRL-ALT-INS reboot */
|
||||
#define DEL_SCAN 0x53 /* DEL for use in CTRL-ALT-DEL reboot */
|
||||
|
||||
#define CONSOLE 0 /* line number for console */
|
||||
#define KB_IN_BYTES 32 /* size of keyboard input buffer */
|
||||
PRIVATE char ibuf[KB_IN_BYTES]; /* input buffer */
|
||||
PRIVATE char *ihead = ibuf; /* next free spot in input buffer */
|
||||
PRIVATE char *itail = ibuf; /* scan code to return to TTY */
|
||||
PRIVATE int icount; /* # codes in buffer */
|
||||
|
||||
PRIVATE int esc; /* escape scan code detected? */
|
||||
PRIVATE int alt_l; /* left alt key state */
|
||||
PRIVATE int alt_r; /* right alt key state */
|
||||
PRIVATE int alt; /* either alt key */
|
||||
PRIVATE int ctrl_l; /* left control key state */
|
||||
PRIVATE int ctrl_r; /* right control key state */
|
||||
PRIVATE int ctrl; /* either control key */
|
||||
PRIVATE int shift_l; /* left shift key state */
|
||||
PRIVATE int shift_r; /* right shift key state */
|
||||
PRIVATE int shift; /* either shift key */
|
||||
PRIVATE int num_down; /* num lock key depressed */
|
||||
PRIVATE int caps_down; /* caps lock key depressed */
|
||||
PRIVATE int scroll_down; /* scroll lock key depressed */
|
||||
PRIVATE int locks[NR_CONS]; /* per console lock keys state */
|
||||
|
||||
/* Lock key active bits. Chosen to be equal to the keyboard LED bits. */
|
||||
#define SCROLL_LOCK 0x01
|
||||
#define NUM_LOCK 0x02
|
||||
#define CAPS_LOCK 0x04
|
||||
|
||||
PRIVATE char numpad_map[] =
|
||||
{'H', 'Y', 'A', 'B', 'D', 'C', 'V', 'U', 'G', 'S', 'T', '@'};
|
||||
|
||||
/* Variables and definition for observed function keys. */
|
||||
PRIVATE int fkey_obs[12]; /* observers for F1-F12 */
|
||||
PRIVATE int sfkey_obs[12]; /* observers for SHIFT F1-F12 */
|
||||
|
||||
FORWARD _PROTOTYPE( int kb_ack, (void) );
|
||||
FORWARD _PROTOTYPE( int kb_wait, (void) );
|
||||
FORWARD _PROTOTYPE( int func_key, (int scode) );
|
||||
FORWARD _PROTOTYPE( int scan_keyboard, (void) );
|
||||
FORWARD _PROTOTYPE( unsigned make_break, (int scode) );
|
||||
FORWARD _PROTOTYPE( void set_leds, (void) );
|
||||
FORWARD _PROTOTYPE( void kb_read, (struct tty *tp) );
|
||||
FORWARD _PROTOTYPE( unsigned map_key, (int scode) );
|
||||
|
||||
|
||||
/*===========================================================================*
|
||||
* map_key0 *
|
||||
*===========================================================================*/
|
||||
/* Map a scan code to an ASCII code ignoring modifiers. */
|
||||
#define map_key0(scode) \
|
||||
((unsigned) keymap[(scode) * MAP_COLS])
|
||||
|
||||
|
||||
/*===========================================================================*
|
||||
* map_key *
|
||||
*===========================================================================*/
|
||||
PRIVATE unsigned map_key(scode)
|
||||
int scode;
|
||||
{
|
||||
/* Map a scan code to an ASCII code. */
|
||||
|
||||
int caps, column, lk;
|
||||
u16_t *keyrow;
|
||||
|
||||
if (scode == SLASH_SCAN && esc) return '/'; /* don't map numeric slash */
|
||||
|
||||
keyrow = &keymap[scode * MAP_COLS];
|
||||
|
||||
caps = shift;
|
||||
lk = locks[ccurrent];
|
||||
if ((lk & NUM_LOCK) && HOME_SCAN <= scode && scode <= DEL_SCAN) caps = !caps;
|
||||
if ((lk & CAPS_LOCK) && (keyrow[0] & HASCAPS)) caps = !caps;
|
||||
|
||||
if (alt) {
|
||||
column = 2;
|
||||
if (ctrl || alt_r) column = 3; /* Ctrl + Alt == AltGr */
|
||||
if (caps) column = 4;
|
||||
} else {
|
||||
column = 0;
|
||||
if (caps) column = 1;
|
||||
if (ctrl) column = 5;
|
||||
}
|
||||
return keyrow[column] & ~HASCAPS;
|
||||
}
|
||||
|
||||
/*===========================================================================*
|
||||
* kbd_hw_int *
|
||||
*===========================================================================*/
|
||||
PUBLIC void do_interrupt(m_ptr)
|
||||
message *m_ptr;
|
||||
{
|
||||
/* A keyboard interrupt has occurred. Process it. */
|
||||
int scode;
|
||||
static timer_t timer; /* timer must be static! */
|
||||
|
||||
/* Fetch the character from the keyboard hardware and acknowledge it. */
|
||||
scode = scan_keyboard();
|
||||
|
||||
/* Store the scancode in memory so the task can get at it later. */
|
||||
if (icount < KB_IN_BYTES) {
|
||||
*ihead++ = scode;
|
||||
if (ihead == ibuf + KB_IN_BYTES) ihead = ibuf;
|
||||
icount++;
|
||||
tty_table[ccurrent].tty_events = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* kb_read *
|
||||
*==========================================================================*/
|
||||
PRIVATE void kb_read(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
/* Process characters from the circular keyboard buffer. */
|
||||
|
||||
char buf[3];
|
||||
int scode;
|
||||
unsigned ch;
|
||||
|
||||
tp = &tty_table[ccurrent]; /* always use the current console */
|
||||
|
||||
while (icount > 0) {
|
||||
scode = *itail++; /* take one key scan code */
|
||||
if (itail == ibuf + KB_IN_BYTES) itail = ibuf;
|
||||
icount--;
|
||||
|
||||
/* Function keys are being used for debug dumps. */
|
||||
if (func_key(scode)) continue;
|
||||
|
||||
/* Perform make/break processing. */
|
||||
ch = make_break(scode);
|
||||
|
||||
if (ch <= 0xFF) {
|
||||
/* A normal character. */
|
||||
buf[0] = ch;
|
||||
(void) in_process(tp, buf, 1);
|
||||
} else
|
||||
if (HOME <= ch && ch <= INSRT) {
|
||||
/* An ASCII escape sequence generated by the numeric pad. */
|
||||
buf[0] = ESC;
|
||||
buf[1] = '[';
|
||||
buf[2] = numpad_map[ch - HOME];
|
||||
(void) in_process(tp, buf, 3);
|
||||
} else
|
||||
if (ch == ALEFT) {
|
||||
/* Choose lower numbered console as current console. */
|
||||
select_console(ccurrent - 1);
|
||||
set_leds();
|
||||
} else
|
||||
if (ch == ARIGHT) {
|
||||
/* Choose higher numbered console as current console. */
|
||||
select_console(ccurrent + 1);
|
||||
set_leds();
|
||||
} else
|
||||
if (AF1 <= ch && ch <= AF12) {
|
||||
/* Alt-F1 is console, Alt-F2 is ttyc1, etc. */
|
||||
select_console(ch - AF1);
|
||||
set_leds();
|
||||
} else
|
||||
if (CF1 <= ch && ch <= CF12) {
|
||||
switch(ch) {
|
||||
case CF3: toggle_scroll(); break; /* hardware <-> software */
|
||||
case CF7: sigchar(&tty_table[CONSOLE], SIGQUIT); break;
|
||||
case CF8: sigchar(&tty_table[CONSOLE], SIGINT); break;
|
||||
case CF9: sigchar(&tty_table[CONSOLE], SIGKILL); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================*
|
||||
* make_break *
|
||||
*===========================================================================*/
|
||||
PRIVATE unsigned make_break(scode)
|
||||
int scode; /* scan code of key just struck or released */
|
||||
{
|
||||
/* This routine can handle keyboards that interrupt only on key depression,
|
||||
* as well as keyboards that interrupt on key depression and key release.
|
||||
* For efficiency, the interrupt routine filters out most key releases.
|
||||
*/
|
||||
int ch, make, escape;
|
||||
static int CAD_count = 0;
|
||||
|
||||
/* Check for CTRL-ALT-DEL, and if found, halt the computer. This would
|
||||
* be better done in keyboard() in case TTY is hung, except control and
|
||||
* alt are set in the high level code.
|
||||
*/
|
||||
if (ctrl && alt && (scode == DEL_SCAN || scode == INS_SCAN))
|
||||
{
|
||||
if (++CAD_count == 3) sys_abort(RBT_HALT);
|
||||
sys_kill(INIT_PROC_NR, SIGABRT);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* High-order bit set on key release. */
|
||||
make = (scode & KEY_RELEASE) == 0; /* true if pressed */
|
||||
|
||||
ch = map_key(scode &= ASCII_MASK); /* map to ASCII */
|
||||
|
||||
escape = esc; /* Key is escaped? (true if added since the XT) */
|
||||
esc = 0;
|
||||
|
||||
switch (ch) {
|
||||
case CTRL: /* Left or right control key */
|
||||
*(escape ? &ctrl_r : &ctrl_l) = make;
|
||||
ctrl = ctrl_l | ctrl_r;
|
||||
break;
|
||||
case SHIFT: /* Left or right shift key */
|
||||
*(scode == RSHIFT_SCAN ? &shift_r : &shift_l) = make;
|
||||
shift = shift_l | shift_r;
|
||||
break;
|
||||
case ALT: /* Left or right alt key */
|
||||
*(escape ? &alt_r : &alt_l) = make;
|
||||
alt = alt_l | alt_r;
|
||||
break;
|
||||
case CALOCK: /* Caps lock - toggle on 0 -> 1 transition */
|
||||
if (caps_down < make) {
|
||||
locks[ccurrent] ^= CAPS_LOCK;
|
||||
set_leds();
|
||||
}
|
||||
caps_down = make;
|
||||
break;
|
||||
case NLOCK: /* Num lock */
|
||||
if (num_down < make) {
|
||||
locks[ccurrent] ^= NUM_LOCK;
|
||||
set_leds();
|
||||
}
|
||||
num_down = make;
|
||||
break;
|
||||
case SLOCK: /* Scroll lock */
|
||||
if (scroll_down < make) {
|
||||
locks[ccurrent] ^= SCROLL_LOCK;
|
||||
set_leds();
|
||||
}
|
||||
scroll_down = make;
|
||||
break;
|
||||
case EXTKEY: /* Escape keycode */
|
||||
esc = 1; /* Next key is escaped */
|
||||
return(-1);
|
||||
default: /* A normal key */
|
||||
if (make) return(ch);
|
||||
}
|
||||
|
||||
/* Key release, or a shift type key. */
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================*
|
||||
* set_leds *
|
||||
*===========================================================================*/
|
||||
PRIVATE void set_leds()
|
||||
{
|
||||
/* Set the LEDs on the caps, num, and scroll lock keys */
|
||||
int s;
|
||||
if (!kenv.pc_at) return; /* PC/XT doesn't have LEDs */
|
||||
|
||||
kb_wait(); /* wait for buffer empty */
|
||||
if ((s=sys_outb(KEYBD, LED_CODE)) != OK)
|
||||
printf("Warning, sys_outb couldn't prepare for LED values: %d\n", s);
|
||||
/* prepare keyboard to accept LED values */
|
||||
kb_ack(); /* wait for ack response */
|
||||
|
||||
kb_wait(); /* wait for buffer empty */
|
||||
if ((s=sys_outb(KEYBD, locks[ccurrent])) != OK)
|
||||
printf("Warning, sys_outb couldn't give LED values: %d\n", s);
|
||||
/* give keyboard LED values */
|
||||
kb_ack(); /* wait for ack response */
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* kb_wait *
|
||||
*==========================================================================*/
|
||||
PRIVATE int kb_wait()
|
||||
{
|
||||
/* Wait until the controller is ready; return zero if this times out. */
|
||||
|
||||
int retries, status, temp;
|
||||
int s;
|
||||
|
||||
retries = MAX_KB_BUSY_RETRIES + 1; /* wait until not busy */
|
||||
do {
|
||||
s = sys_inb(KB_STATUS, &status);
|
||||
if (status & KB_OUT_FULL) {
|
||||
s = sys_inb(KEYBD, &temp); /* discard value */
|
||||
}
|
||||
if (! (status & (KB_IN_FULL|KB_OUT_FULL)) )
|
||||
break; /* wait until ready */
|
||||
} while (--retries != 0); /* continue unless timeout */
|
||||
return(retries); /* zero on timeout, positive if ready */
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* kb_ack *
|
||||
*==========================================================================*/
|
||||
PRIVATE int kb_ack()
|
||||
{
|
||||
/* Wait until kbd acknowledges last command; return zero if this times out. */
|
||||
|
||||
int retries, s;
|
||||
u8_t u8val;
|
||||
|
||||
retries = MAX_KB_ACK_RETRIES + 1;
|
||||
do {
|
||||
s = sys_inb(KEYBD, &u8val);
|
||||
if (u8val == KB_ACK)
|
||||
break; /* wait for ack */
|
||||
} while(--retries != 0); /* continue unless timeout */
|
||||
|
||||
return(retries); /* nonzero if ack received */
|
||||
}
|
||||
|
||||
/*===========================================================================*
|
||||
* kb_init *
|
||||
*===========================================================================*/
|
||||
PUBLIC void kb_init(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
/* Initialize the keyboard driver. */
|
||||
static int count = 0;
|
||||
int i;
|
||||
|
||||
tp->tty_devread = kb_read; /* input function */
|
||||
set_leds(); /* turn off numlock led */
|
||||
scan_keyboard(); /* discard leftover keystroke */
|
||||
|
||||
/* The following initialization should only run once. */
|
||||
if (! count ++) {
|
||||
|
||||
/* Clear the function key observers array. Also see func_key(). */
|
||||
for (i=0; i<12; i++) {
|
||||
fkey_obs[i] = NONE; /* F1-F12 observers */
|
||||
sfkey_obs[i] = NONE; /* Shift F1-F12 observers */
|
||||
}
|
||||
|
||||
/* Set interrupt handler and enable keyboard IRQ. */
|
||||
if ((i=sys_irqsetpolicy(KEYBOARD_IRQ, IRQ_REENABLE, SELF, 0, 0, 0)) != OK)
|
||||
server_panic("TTY", "Couldn't set keyboard IRQ policy", i);
|
||||
if ((i=sys_irqenable(KEYBOARD_IRQ)) != OK)
|
||||
server_panic("TTY", "Couldn't enable keyboard IRQs", i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================*
|
||||
* kbd_loadmap *
|
||||
*===========================================================================*/
|
||||
PUBLIC int kbd_loadmap(m)
|
||||
message *m;
|
||||
{
|
||||
/* Load a new keymap. */
|
||||
int result;
|
||||
result = sys_vircopy(m->PROC_NR, D, (vir_bytes) m->ADDRESS,
|
||||
SELF, D, (vir_bytes) keymap,
|
||||
(vir_bytes) sizeof(keymap));
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================*
|
||||
* do_fkey_ctl *
|
||||
*===========================================================================*/
|
||||
PUBLIC void do_fkey_ctl(m_ptr)
|
||||
message *m_ptr; /* pointer to the request message */
|
||||
{
|
||||
/* This procedure allows processes to register a function key to receive
|
||||
* notifications if it is pressed. At most one binding per key can exist.
|
||||
*/
|
||||
int fkey = m_ptr->FKEY_CODE; /* get function key code */
|
||||
unsigned code;
|
||||
int *observers = NULL;
|
||||
int index = -1;
|
||||
int result;
|
||||
|
||||
/* See if this key can be observed; get the observers array and index. */
|
||||
if (SF1 == fkey) result = EINVAL; /* Shift-F1 is TTY reserved */
|
||||
if (F1 <= fkey && fkey <= F12) { /* F1-F12 */
|
||||
observers = fkey_obs;
|
||||
index = fkey - F1;
|
||||
} else if (SF2 <= fkey && fkey <= SF12) { /* Shift F1-F12 */
|
||||
observers = sfkey_obs;
|
||||
index = fkey - SF1;
|
||||
}
|
||||
|
||||
/* Handle the request if an observers array was set above. */
|
||||
if (observers) {
|
||||
if (m_ptr->FKEY_ENABLE) { /* try to register an observer */
|
||||
if (observers[index] == NONE) {
|
||||
observers[index] = m_ptr->m_source;
|
||||
result = OK; /* done, new observer registered */
|
||||
} else {
|
||||
result = EBUSY; /* function key already bound */
|
||||
}
|
||||
} else { /* unregister an observer */
|
||||
if (observers[index] == m_ptr->m_source) {
|
||||
observers[index] = NONE;
|
||||
result = OK; /* done, observer unregistered */
|
||||
} else {
|
||||
result = EPERM; /* can only remove own binding */
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result = EINVAL; /* key cannot be observed */
|
||||
}
|
||||
|
||||
/* Almost done, return result to caller. */
|
||||
m_ptr->m_type = result;
|
||||
send(m_ptr->m_source, m_ptr);
|
||||
}
|
||||
|
||||
/*===========================================================================*
|
||||
* func_key *
|
||||
*===========================================================================*/
|
||||
PRIVATE int func_key(scode)
|
||||
int scode; /* scan code for a function key */
|
||||
{
|
||||
/* This procedure traps function keys for debugging purposes. Observers of
|
||||
* function keys are kept in a global array. If a subject (a key) is pressed
|
||||
* the observer is notified of the event. Initialization of the arrays is done
|
||||
* in kb_init, where NONE is set to indicate there is no interest in the key.
|
||||
* Returns FALSE on a key release or if the key is not observable.
|
||||
*/
|
||||
message m;
|
||||
int *observers = NULL;
|
||||
unsigned fkey;
|
||||
int index = -1;
|
||||
int i,s;
|
||||
struct proc proc;
|
||||
|
||||
/* Ignore key releases. If this is a key press, get full key code. */
|
||||
if (scode & KEY_RELEASE) return(FALSE); /* key release */
|
||||
fkey = map_key(scode); /* include modifiers */
|
||||
|
||||
/* Key pressed, now see if there is an observer for the pressed key.
|
||||
* F1-F12 observers are in fkey_obs array.
|
||||
* SHIFT F1-F12 observers are in sfkey_req array.
|
||||
* CTRL F1-F12 reserved (see kb_read)
|
||||
* ALT F1-F12 reserved (see kb_read)
|
||||
* Other combinations are not in use. Note that Alt+Shift+F1-F12 is yet
|
||||
* defined in <minix/keymap.h>, but other modifier combinations are not.
|
||||
*/
|
||||
if (SF1 == fkey) {
|
||||
printf("\n");
|
||||
printf("System information. Known function key mappings to request debug dumps:\n");
|
||||
printf("-------------------------------------------------------------------------\n");
|
||||
for (i=0; i<12; i++) {
|
||||
|
||||
printf(" %sF%d: ", i+1<10? " ":"", i+1);
|
||||
if (fkey_obs[i] != NONE) {
|
||||
if ((s=sys_getproc(&proc, fkey_obs[i]))!=OK)
|
||||
printf("sys_getproc: %d\n", s);
|
||||
printf("%-14.14s", proc.p_name);
|
||||
} else {
|
||||
printf("%-14.14s", "<none>");
|
||||
}
|
||||
|
||||
printf(" %sShift-F%d: ", i+1<10? " ":"", i+1);
|
||||
if (sfkey_obs[i] != NONE) {
|
||||
if ((s=sys_getproc(&proc, sfkey_obs[i]))!=OK)
|
||||
printf("sys_getproc: %d\n", s);
|
||||
printf("%-14.14s", proc.p_name);
|
||||
} else {
|
||||
printf("%-14.14s", "<none>");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
printf("Press one of the registered function keys to trigger a debug dump.\n");
|
||||
printf("\n");
|
||||
}
|
||||
else if (F1 <= fkey && fkey <= F12) { /* F1-F12 */
|
||||
observers = &fkey_obs[0];
|
||||
index = fkey - F1;
|
||||
} else if (SF2 <= fkey && fkey <= SF12) { /* Shift F2-F12 */
|
||||
observers = &sfkey_obs[0];
|
||||
index = fkey - SF1;
|
||||
}
|
||||
if (! observers) return(FALSE); /* not observable */
|
||||
|
||||
/* See if an observer is registered and send it a message. */
|
||||
if (observers[index] != NONE) {
|
||||
m.m_type = FKEY_PRESSED;
|
||||
m.FKEY_NUM = index+1;
|
||||
m.FKEY_CODE = fkey;
|
||||
if (OK != (s=nb_send(observers[index], &m))) {
|
||||
printf("WARNING: F%d key notification to process %d failed: %d.\n",
|
||||
index+1, observers[index], s);
|
||||
}
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* scan_keyboard *
|
||||
*==========================================================================*/
|
||||
PRIVATE int scan_keyboard()
|
||||
{
|
||||
/* Fetch the character from the keyboard hardware and acknowledge it. */
|
||||
pvb_pair_t byte_in[2], byte_out[2];
|
||||
|
||||
byte_in[0].port = KEYBD; /* get the scan code for the key struck */
|
||||
byte_in[1].port = PORT_B; /* strobe the keyboard to ack the char */
|
||||
sys_vinb(byte_in, 2); /* request actual input */
|
||||
|
||||
pv_set(byte_out[0], PORT_B, byte_in[1].value | KBIT); /* strobe bit high */
|
||||
pv_set(byte_out[1], PORT_B, byte_in[1].value); /* then strobe low */
|
||||
sys_voutb(byte_out, 2); /* request actual output */
|
||||
|
||||
return(byte_in[0].value); /* return scan code */
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* do_panic_dumps *
|
||||
*==========================================================================*/
|
||||
PUBLIC void do_panic_dumps(m)
|
||||
message *m; /* request message to TTY */
|
||||
{
|
||||
/* Wait for keystrokes for printing debugging info and reboot. */
|
||||
|
||||
int quiet, code;
|
||||
|
||||
/* A panic! Allow debug dumps until user wants to shutdown. */
|
||||
printf("\nHit ESC to reboot, DEL to shutdown, F-keys for debug dumps\n");
|
||||
|
||||
(void) scan_keyboard(); /* ack any old input */
|
||||
quiet = scan_keyboard();/* quiescent value (0 on PC, last code on AT)*/
|
||||
for (;;) {
|
||||
tick_delay(10);
|
||||
/* See if there are pending request for output, but don't block.
|
||||
* Diagnostics can span multiple printf()s, so do it in a loop.
|
||||
*/
|
||||
while (nb_receive(ANY, m) == OK) {
|
||||
switch(m->m_type) {
|
||||
case NEW_KMESS: do_new_kmess(m); break;
|
||||
case DIAGNOSTICS: do_diagnostics(m); break;
|
||||
default: ; /* do nothing */
|
||||
}
|
||||
tick_delay(1); /* allow more */
|
||||
}
|
||||
code = scan_keyboard();
|
||||
if (code != quiet) {
|
||||
/* A key has been pressed. */
|
||||
switch (code) { /* possibly abort MINIX */
|
||||
case ESC_SCAN: sys_abort(RBT_REBOOT); return;
|
||||
case DEL_SCAN: sys_abort(RBT_HALT); return;
|
||||
}
|
||||
(void) func_key(code); /* check for function key */
|
||||
quiet = scan_keyboard();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
81
drivers/tty/keymaps/Makefile
Normal file
81
drivers/tty/keymaps/Makefile
Normal file
@@ -0,0 +1,81 @@
|
||||
# Generate binary keymaps.
|
||||
|
||||
LK = /usr/lib/keymaps
|
||||
|
||||
.SUFFIXES: .src .map
|
||||
|
||||
.src.map:
|
||||
$(CC) -DKEYSRC=\"$<\" genmap.c
|
||||
./a.out > $@
|
||||
@rm -f a.out
|
||||
|
||||
all: \
|
||||
french.map \
|
||||
german.map \
|
||||
italian.map \
|
||||
japanese.map \
|
||||
latin-am.map \
|
||||
olivetti.map \
|
||||
polish.map \
|
||||
scandinavn.map \
|
||||
spanish.map \
|
||||
uk.map \
|
||||
us-std.map \
|
||||
us-swap.map \
|
||||
|
||||
install: \
|
||||
$(LK) \
|
||||
$(LK)/french.map \
|
||||
$(LK)/german.map \
|
||||
$(LK)/italian.map \
|
||||
$(LK)/japanese.map \
|
||||
$(LK)/latin-am.map \
|
||||
$(LK)/olivetti.map \
|
||||
$(LK)/polish.map \
|
||||
$(LK)/scandinavn.map \
|
||||
$(LK)/spanish.map \
|
||||
$(LK)/uk.map \
|
||||
$(LK)/us-std.map \
|
||||
$(LK)/us-swap.map \
|
||||
|
||||
clean:
|
||||
rm -f a.out *.map
|
||||
|
||||
$(LK):
|
||||
install -d $@
|
||||
|
||||
$(LK)/french.map: french.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/german.map: german.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/italian.map: italian.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/japanese.map: japanese.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/latin-am.map: latin-am.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/olivetti.map: olivetti.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/polish.map: polish.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/scandinavn.map: scandinavn.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/spanish.map: spanish.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/uk.map: uk.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/us-std.map: us-std.map
|
||||
install -c $? $@
|
||||
|
||||
$(LK)/us-swap.map: us-swap.map
|
||||
install -c $? $@
|
||||
135
drivers/tty/keymaps/french.src
Normal file
135
drivers/tty/keymaps/french.src
Normal file
@@ -0,0 +1,135 @@
|
||||
/* Keymap for the French keyboard. */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
|
||||
/* 02 - '1' */ '&', '1', A('1'), '&', '1', C('A'),
|
||||
/* 03 - '2' */ 0202, '2', A('2'), '~', '2', C('B'),
|
||||
/* 04 - '3' */ '"', '3', A('3'), '#', '3', C('C'),
|
||||
/* 05 - '4' */ '\'', '4', A('4'), '{', '4', C('D'),
|
||||
/* 06 - '5' */ '(', '5', A('5'), '[', '5', C('E'),
|
||||
/* 07 - '6' */ '-', '6', A('6'), '|', '6', C('F'),
|
||||
/* 08 - '7' */ 0212, '7', A('7'), '`', '7', C('G'),
|
||||
/* 09 - '8' */ '_', '8', A('8'), '\\', '8', C('H'),
|
||||
/* 10 - '9' */ 0207, '9', A('9'), '^', '9', C('I'),
|
||||
/* 11 - '0' */ 0205, '0', A('0'), '@', '0', C('J'),
|
||||
/* 12 - '-' */ ')', 0370, A(')'), ']', '-', C('K'),
|
||||
/* 13 - '=' */ '=', '+', A('='), '}', '=', C('L'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
|
||||
/* 16 - 'q' */ L('a'), 'A', A('a'), 'a', 'Q', C('A'),
|
||||
/* 17 - 'w' */ L('z'), 'Z', A('z'), 'z', 'W', C('Z'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
|
||||
/* 26 - '[' */ '^', '"', A('^'), '^', '[', C('^'),
|
||||
/* 27 - ']' */ '$', 0234, A('$'), '$', ']', C('$'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('q'), 'Q', A('q'), 'q', 'A', C('Q'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
|
||||
/* 39 - ';' */ L('m'), 'M', A('m'), 'm', 'M', C('M'),
|
||||
/* 40 - '\'' */ 0227, '%', A('%'), 0227, '\\', C('G'),
|
||||
/* 41 - '`' */ 0375, 0375, 0375, 0375, '`', C('['),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '`' */ '*', 0346, A('*'), '*', '`', C('*'),
|
||||
/* 44 - 'z' */ L('w'), 'W', A('w'), 'w', 'Z', C('W'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
|
||||
/* 50 - 'm' */ ',', '?', A(','), ',', 'm', C('@'),
|
||||
/* 51 - ',' */ ';', '.', A(';'), ';', ',', C('@'),
|
||||
/* 52 - '.' */ ':', '/', A(':'), ':', '.', C('@'),
|
||||
/* 53 - '/' */ '!', '$'/*025*/,A('!'), '!', '/', C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), '<', '>', C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
58
drivers/tty/keymaps/genmap.c
Normal file
58
drivers/tty/keymaps/genmap.c
Normal file
@@ -0,0 +1,58 @@
|
||||
/* genmap - output binary keymap Author: Marcus Hampel
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
#include <minix/keymap.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include KEYSRC
|
||||
|
||||
u8_t comprmap[4 + NR_SCAN_CODES * MAP_COLS * 9/8 * 2 + 1];
|
||||
|
||||
void tell(const char *s)
|
||||
{
|
||||
write(2, s, strlen(s));
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
u8_t *cm, *fb;
|
||||
u16_t *km;
|
||||
int n;
|
||||
|
||||
/* Compress the keymap. */
|
||||
memcpy(comprmap, KEY_MAGIC, 4);
|
||||
cm = comprmap + 4;
|
||||
n = 8;
|
||||
for (km = keymap; km < keymap + NR_SCAN_CODES * MAP_COLS; km++) {
|
||||
if (n == 8) {
|
||||
/* Allocate a new flag byte. */
|
||||
fb = cm;
|
||||
*cm++ = 0;
|
||||
n= 0;
|
||||
}
|
||||
*cm++ = (*km & 0x00FF); /* Low byte. */
|
||||
if (*km & 0xFF00) {
|
||||
*cm++ = (*km >> 8); /* High byte only when set. */
|
||||
*fb |= (1 << n); /* Set a flag if so. */
|
||||
}
|
||||
n++;
|
||||
}
|
||||
|
||||
/* Don't store trailing zeros. */
|
||||
while (cm > comprmap && cm[-1] == 0) cm--;
|
||||
|
||||
/* Emit the compressed keymap. */
|
||||
if (write(1, comprmap, cm - comprmap) < 0) {
|
||||
int err = errno;
|
||||
|
||||
tell("genmap: ");
|
||||
tell(strerror(err));
|
||||
tell("\n");
|
||||
exit(1);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
135
drivers/tty/keymaps/german.src
Normal file
135
drivers/tty/keymaps/german.src
Normal file
@@ -0,0 +1,135 @@
|
||||
/* Keymap for German MF-2 keyboard. */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code unsh Shift Alt AltGr Alt+Sh Strg */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), 0375, '@', C('@'),
|
||||
/* 04 - '3' */ '3', 025, A('3'), 0374, '#', C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
|
||||
/* 07 - '6' */ '6', '&', A('6'), '6', '^', C('^'),
|
||||
/* 08 - '7' */ '7', '/', A('7'), '{', '&', C('G'),
|
||||
/* 09 - '8' */ '8', '(', A('8'), '[', '*', C('H'),
|
||||
/* 10 - '9' */ '9', ')', A('9'), ']', '(', C('I'),
|
||||
/* 11 - '0' */ '0', '=', A('0'), '}', ')', C('@'),
|
||||
/* 12 - '-' */ 0341, '?', 0341, '\\', '_', C('_'),
|
||||
/* 13 - '=' */ '\'', '`', A('\''),'=', '+', C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), '@', 'Q', C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
|
||||
/* 21 - 'y' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
|
||||
/* 26 - '[' */ L(0201),0232, 0201, '[', '{', C('['),
|
||||
/* 27 - ']' */ '+', '*', A('+'), '~', ']', C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 29 - Strg;-) */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
|
||||
/* 39 - ';' */ L(0224),0231, 0224, ';', ':', C('@'),
|
||||
/* 40 - '\'' */ L(0204),0216, 0204, '\'', '"', C('@'),
|
||||
/* 41 - '`' */ '^', 0370, A('^'), '`', '~', C('^'),
|
||||
/* 42 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ '#', '\'', A('#'), '\\', '|', C('\\'),
|
||||
/* 44 - 'z' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), 0346, 'M', C('M'),
|
||||
/* 51 - ',' */ ',', ';', A(','), ',', '<', C('@'),
|
||||
/* 52 - '.' */ '.', ':', A('.'), '.', '>', C('@'),
|
||||
/* 53 - '/' */ '-', '_', A('-'), '/', '?', C('_'),
|
||||
/* 54 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
137
drivers/tty/keymaps/italian.src
Normal file
137
drivers/tty/keymaps/italian.src
Normal file
@@ -0,0 +1,137 @@
|
||||
/* Keymap for Italian keyboard. */
|
||||
/* Modified by Ernesto Del Prete in October 1997 */
|
||||
/* ernesto@cclix1.polito.it or s84508@cclix1.polito.it */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), '2', '@', C('@'),
|
||||
/* 04 - '3' */ '3', 0234, A('3'), '3', 0234, C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
|
||||
/* 07 - '6' */ '6', '&', A('6'), '6', '&', C('F'),
|
||||
/* 08 - '7' */ '7', '/', A('7'), '7', '/', C('G'),
|
||||
/* 09 - '8' */ '8', '(', A('8'), '8', '(', C('H'),
|
||||
/* 10 - '9' */ '9', ')', A('9'), '8', ')', C('I'),
|
||||
/* 11 - '0' */ '0', '=', A('0'), '0', '=', C('@'),
|
||||
/* 12 - '-' */ '\'', '?', A('\''),'`', '?', C('@'),
|
||||
/* 13 - '=' */ 0215, '^', A('|'), 0215, '^', C('^'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), 'q', 'Q', C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
|
||||
/* 26 - '[' */ 0212, 0202, 0212, '[', '{', C('['),
|
||||
/* 27 - ']' */ '+', '*', A('+'), ']', '}', C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
|
||||
/* 39 - ';' */ 0225, 0207, 0225, '@', '@', C('@'),
|
||||
/* 40 - '\'' */ 0205, 0370, 0205, '#', 0276, C('@'),
|
||||
/* 41 - '`' */ '\\', '|', A('\\'),0176, '|', C('\\'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ 0227, 025, 0227, 0227, 025, C('@'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), 'm', 'M', C('M'),
|
||||
/* 51 - ',' */ ',', ';', A(','), ',', ';', C('@'),
|
||||
/* 52 - '.' */ '.', ':', A('.'), '.', ':', C('@'),
|
||||
/* 53 - '/' */ '-', '_', A('-'), '-', '_', C('_'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('M'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
157
drivers/tty/keymaps/japanese.src
Normal file
157
drivers/tty/keymaps/japanese.src
Normal file
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Keymap for Japanese 106 keyboard.
|
||||
* Dec. 31 1995
|
||||
* Toshiya Ogawa <ogw@shizuokanet.or.jp>
|
||||
* <GCD02425@niftyserve.or.jp>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Japanese 106 keyboard has following additional 5 scan codes
|
||||
* compared to US standard 101 keyboard.
|
||||
*
|
||||
* scan-code keytop effect in this keymap
|
||||
* -------------------------------------------------------
|
||||
* 112(0x70) KANA (ignored)
|
||||
* 115(0x73) BackSlash mapped to '\\' and '_'
|
||||
* 121(0x79) HENKAN (ignored)
|
||||
* 123(0x7B) MU-HENKAN (ignored)
|
||||
* 125(0x7D) YEN mapped to '\\' and '|'
|
||||
*/
|
||||
|
||||
#if (NR_SCAN_CODES != 0x80)
|
||||
#error NR_SCAN_CODES mis-match
|
||||
#endif
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('B'),
|
||||
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
|
||||
/* 07 - '6' */ '6', '&', A('6'), A('6'), A('&'), C('F'),
|
||||
/* 08 - '7' */ '7', '\'', A('7'), A('7'), A('\''),C('G'),
|
||||
/* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'),
|
||||
/* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'),
|
||||
/* 11 - '0' */ '0', '~', A('0'), A('0'), A('~'), C('@'),
|
||||
/* 12 - '-' */ '-', '=', A('-'), A('-'), A('='), C('@'),
|
||||
/* 13 - '^' */ '^', '~', A('^'), A('^'), A('~'), C('^'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
|
||||
/* 26 - '@' */ '@', '`', A('@'), A('@'), A('`'), C('@'),
|
||||
/* 27 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
|
||||
/* 28 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
|
||||
/* 39 - ';' */ ';', '+', A(';'), A(';'), A('+'), C('@'),
|
||||
/* 40 - ':' */ ':', '*', A(':'), A(':'), A('*'), C('@'),
|
||||
/* 41 - KANJI */ 0, 0, 0, 0, 0, 0,
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
|
||||
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
|
||||
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
|
||||
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - KANA */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - '\\' */ '\\', '_', A('\\'),A('\\'),A('_'), C('_'),
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - HENKAN */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - MU-HENKAN*/ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - YEN */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
153
drivers/tty/keymaps/latin-am.src
Normal file
153
drivers/tty/keymaps/latin-am.src
Normal file
@@ -0,0 +1,153 @@
|
||||
/***
|
||||
Keymap for Latin American keyboard. v1.02
|
||||
Victor A. Rodriguez - El bit Fantasma - Bit-Man@Tasa.Com.AR
|
||||
|
||||
The Latin American keyboard makes differences between the left and
|
||||
right ALT keys (the right one is so called ALT GR), and uses accent.
|
||||
|
||||
Release History
|
||||
===============
|
||||
v1.00 Initial version
|
||||
v1.01 Extended ASCII characters replaced by hex. equivalents
|
||||
v1.02 NR_SCAN_CODES has grown to 0x80, required by Toshiya Ogawa
|
||||
(ogw@shizuokanet.or.jp) and added by Kees J.Bot (kjb@cs.vu.nl)
|
||||
in MINIX 1.7.2
|
||||
***/
|
||||
|
||||
#if (NR_SCAN_CODES != 0x80)
|
||||
#error NR_SCAN_CODES mis-match
|
||||
#endif
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('@'),
|
||||
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
|
||||
/* 07 - '6' */ '6', '&', A('6'), A('6'), A('$'), C('^'),
|
||||
/* 08 - '7' */ '7', '/', A('7'), A('7'), A('/'), C('G'),
|
||||
/* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'),
|
||||
/* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'),
|
||||
/* 11 - '0' */ '0', '=', A('0'), A('0'), A('='), C('@'),
|
||||
/* 12 - '-' */ '\'', '?', A('\''), 0x5c, A('?'), C('?'),
|
||||
/* 13 - '¨' */ 0xa8, 0xad, A(0xa8),A(0xa8),A(0xad), C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), 0x40, A('Q'), C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
|
||||
/* 26 - 'ï' */ 0xef, 0xf9, A(0xef),A(0xef),A(0xf9),C(0xef),
|
||||
/* 27 - '+' */ '+', '*', A('+'), 0x7e, A('*'), C('+'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
|
||||
/* 39 - '¤' */ L(0xa4),0xa5, A(0xa4),A(0xa4),A(0xa5),C('@'),
|
||||
/* 40 - '{' */ '{', '[', A('{'), 0x5e, A('['), C('@'),
|
||||
/* 41 - '|' */ '|', 0xf8, A('|'), 0xaa, A('\''),C('@'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '}' */ 0x7d, 0x5d, A('<'), 0x60, A('>'), C('<'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
|
||||
/* 51 - ',' */ ',', ';', A(','), A(','), A(';'), C('@'),
|
||||
/* 52 - '.' */ '.', ':', A('.'), A('.'), A(':'), C('@'),
|
||||
/* 53 - '/' */ '-', '_', A('-'), A('-'), A('_'), C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
|
||||
/* 74 - '-' */ '-', '-', '-', '-', '-', '-',
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
|
||||
/* 78 - '+' */ '+', '+', '+', '+', '+', '+',
|
||||
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), A('>'), A('>'), C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
135
drivers/tty/keymaps/olivetti.src
Normal file
135
drivers/tty/keymaps/olivetti.src
Normal file
@@ -0,0 +1,135 @@
|
||||
/* Keymap for the Olivetti M24. */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('B'),
|
||||
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
|
||||
/* 07 - '6' */ '6', '&', A('6'), A('6'), A('&'), C('F'),
|
||||
/* 08 - '7' */ '7', '\'', A('7'), A('7'), A('\''),C('G'),
|
||||
/* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'),
|
||||
/* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'),
|
||||
/* 11 - '0' */ '0', '_', A('0'), A('0'), A('_'), C('@'),
|
||||
/* 12 - '-' */ '-', '=', A('-'), A('-'), A('='), C('@'),
|
||||
/* 13 - '=' */ '^', '~', A('^'), A('^'), A('~'), C('^'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
|
||||
/* 26 - '[' */ '@', '`', A('@'), A('@'), A('`'), C('@'),
|
||||
/* 27 - ']' */ '[', '{', A('['), A('['), A('{'), C('['),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
|
||||
/* 39 - ';' */ ';', '+', A(';'), A(';'), A('+'), C('@'),
|
||||
/* 40 - '\'' */ ':', '*', A(':'), A(':'), A('*'), C('@'),
|
||||
/* 41 - '`' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
|
||||
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
|
||||
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
|
||||
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ C('S'), C('S'), C('S'), C('S'), C('S'), C('S'),
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
|
||||
/* 84 - Enter */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 85 - ??? */ LEFT, 014, A(014), A(014), A(014), 014,
|
||||
/* 86 - ??? */ 0212, 0212, 0212, 0212, 0212, 0212,
|
||||
/* 87 - F11 */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ DOWN, DOWN, DOWN, DOWN, DOWN, DOWN,
|
||||
/* 90 - ??? */ RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT,
|
||||
/* 91 - ??? */ UP, UP, UP, UP, UP, UP,
|
||||
/* 92 - ??? */ LEFT, LEFT, LEFT, LEFT, LEFT, LEFT,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
140
drivers/tty/keymaps/polish.src
Normal file
140
drivers/tty/keymaps/polish.src
Normal file
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Keymap for US MF-2 keyboard. + Polish national letters.
|
||||
* Modified by Antek Sawicki <tenox@tenox.tc>
|
||||
* Charset: ISO-8859-2 - [Polska Norma PN-93 T-42118]
|
||||
*/
|
||||
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
|
||||
/* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'),
|
||||
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
|
||||
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
|
||||
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
|
||||
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
|
||||
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
|
||||
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
|
||||
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
|
||||
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A(0xea),A(0xea),A(0xca),C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A(0xf3),A(0xf3),A(0xd3),C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
|
||||
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
|
||||
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A(0xb1),A(0xb1),A(0xa1),C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A(0xb6),A(0xb6),A(0xa6),C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A(0xb3),A(0xb3),A(0xa3),C('L'),
|
||||
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
|
||||
/* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'),
|
||||
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A(0xbf),A(0xbf),A(0xaf),C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A(0xbc),A(0xbc),A(0xac),C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A(0xe6),A(0xe6),A(0xc6),C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A(0xf1),A(0xf1),A(0xd1),C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
|
||||
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
|
||||
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
|
||||
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
138
drivers/tty/keymaps/scandinavn.src
Normal file
138
drivers/tty/keymaps/scandinavn.src
Normal file
@@ -0,0 +1,138 @@
|
||||
/* Keymap for Scandinavian keyboard.
|
||||
* by Oliver Reitalu, nolx@nolx.tartu.ee
|
||||
* preliminary version, 8 Sept 1996
|
||||
*/
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code unsh Shift Alt AltGr Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), '@', '@', C('@'),
|
||||
/* 04 - '3' */ '3', '#', A('3'), 156, '#', C('C'),
|
||||
/* 05 - '4' */ '4', ' ', A('4'), '$', '$', C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
|
||||
/* 07 - '6' */ '6', '&', A('6'), '6', '^', C('^'),
|
||||
/* 08 - '7' */ '7', '/', A('7'), '{', '&', C('G'),
|
||||
/* 09 - '8' */ '8', '(', A('8'), '[', '*', C('H'),
|
||||
/* 10 - '9' */ '9', ')', A('9'), ']', '(', C('I'),
|
||||
/* 11 - '0' */ '0', '=', A('0'), '}', ')', C('@'),
|
||||
/* 12 - '_' */ '+', '?', 0341, '\\', '_', C('_'),
|
||||
/* 13 - '=' */ '\'', '`', A('\''),'=', '+', C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), '@', 'Q', C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
|
||||
/* 26 - '[' */ L(134), 143, 0201, '[', '{', C('['),
|
||||
/* 27 - ']' */ '\"', '^', A('+'), '~', ']', C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
|
||||
/* 39 - ';' */ L(0224),0231, 0224, ';', ':', C('@'),
|
||||
/* 40 - '\'' */ L(0204),0216, 0204, '\'', '"', C('@'),
|
||||
/* 41 - '`' */ L(21), 171, A('^'), '`', '~', C('^'),
|
||||
/* 42 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ 39, '*', A('#'), '\\', '|', C('\\'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), 0346, 'M', C('M'),
|
||||
/* 51 - ',' */ ',', ';', A(','), ',', '<', C('@'),
|
||||
/* 52 - '.' */ '.', ':', A('.'), '.', '>', C('@'),
|
||||
/* 53 - '/' */ '-', '_', A('-'), '/', '?', C('_'),
|
||||
/* 54 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
138
drivers/tty/keymaps/spanish.src
Normal file
138
drivers/tty/keymaps/spanish.src
Normal file
@@ -0,0 +1,138 @@
|
||||
/* Keymap for Spanish MF-2 keyboard. */
|
||||
/* Modified by Javier Garcia Martin jawa@inf.deusto.es */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */
|
||||
/*
|
||||
====================================================================
|
||||
*/
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), '|', '!', C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), '@', '"', C('@'),
|
||||
/* 04 - '3' */ '3', 0372, A('3'), '#', 0372, C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
|
||||
/* 07 - '6' */ '6', '&', A('6'), 0252, '&', C('F'),
|
||||
/* 08 - '7' */ '7', '/', A('7'), '{', '/', C('G'),
|
||||
/* 09 - '8' */ '8', '(', A('8'), '(', '(', C('H'),
|
||||
/* 10 - '9' */ '9', ')', A('9'), ')', ')', C('I'),
|
||||
/* 11 - '0' */ '0', '=', A('0'), '=', '=', C('@'),
|
||||
/* 12 - '-' */ '\'', '?', A('\''),'?', '?', C('_'),
|
||||
/* 13 - '=' */ 0255, 0250, A(0255),0250, 0250, C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), 'q', 'Q', C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
|
||||
/* 26 - '[' */ '`', '^', A('`'),'[', '^', C('['),
|
||||
/* 27 - ']' */ '+', '*', A('+'), ']', '*', C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
|
||||
/* 39 - ';' */ L(0244),0245, A(0244),0244, 0245, C('@'),
|
||||
/* 40 - '\'' */ '\'', '"', A('\''),'{', '"', C('@'),
|
||||
/* 41 - '`' */ 0247, 0246, A(0247),'\\', 0246, C('@'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ L(0207),0200, A(0207),'}', 0200, C('@'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), 'm', 'M', C('M'),
|
||||
/* 51 - ',' */ ',', ';', A(','), ',', ';', C('@'),
|
||||
/* 52 - '.' */ '.', ':', A('.'), '.', ':', C('@'),
|
||||
/* 53 - '/' */ '-', '_', A('-'), '-', '_', C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('M'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), '<', '>', C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
135
drivers/tty/keymaps/uk.src
Normal file
135
drivers/tty/keymaps/uk.src
Normal file
@@ -0,0 +1,135 @@
|
||||
/* Keymap for standard UK keyboard. Author: Darren Mason */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
|
||||
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('@'), C('@'),
|
||||
/* 04 - '3' */ '3', 156, A('3'), A('3'), A(156), C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
|
||||
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
|
||||
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
|
||||
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
|
||||
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
|
||||
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
|
||||
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
|
||||
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
|
||||
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
|
||||
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
|
||||
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
|
||||
/* 40 - '\'' */ '\'', '@', A('\''),A('\''),A('"'), C('@'),
|
||||
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '#' */ '#', '~', A('#'), A('#'), A('~'), C('#'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
|
||||
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
|
||||
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
|
||||
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '\\', '|', A('\\'),A('|'), A('|'), C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
135
drivers/tty/keymaps/us-std.src
Normal file
135
drivers/tty/keymaps/us-std.src
Normal file
@@ -0,0 +1,135 @@
|
||||
/* Keymap for US MF-2 keyboard. */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
|
||||
/* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'),
|
||||
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
|
||||
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
|
||||
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
|
||||
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
|
||||
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
|
||||
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
|
||||
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
|
||||
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
|
||||
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
|
||||
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
|
||||
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
|
||||
/* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'),
|
||||
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
|
||||
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
|
||||
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
|
||||
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
135
drivers/tty/keymaps/us-swap.src
Normal file
135
drivers/tty/keymaps/us-swap.src
Normal file
@@ -0,0 +1,135 @@
|
||||
/* Keymap for US MF-2 keyboard with the Caps Lock and Control key swapped. */
|
||||
|
||||
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
|
||||
|
||||
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
|
||||
/* ==================================================================== */
|
||||
/* 00 - none */ 0, 0, 0, 0, 0, 0,
|
||||
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
|
||||
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
|
||||
/* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'),
|
||||
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
|
||||
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
|
||||
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
|
||||
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
|
||||
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
|
||||
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
|
||||
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
|
||||
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
|
||||
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
|
||||
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
|
||||
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
|
||||
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
|
||||
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
|
||||
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
|
||||
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
|
||||
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
|
||||
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
|
||||
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
|
||||
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
|
||||
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
|
||||
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
|
||||
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
|
||||
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
|
||||
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
|
||||
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 29 - Ctrl */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
|
||||
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
|
||||
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
|
||||
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
|
||||
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
|
||||
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
|
||||
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
|
||||
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
|
||||
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
|
||||
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
|
||||
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
|
||||
/* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'),
|
||||
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
|
||||
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
|
||||
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
|
||||
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
|
||||
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
|
||||
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
|
||||
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
|
||||
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
|
||||
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
|
||||
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
|
||||
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
|
||||
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
|
||||
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
|
||||
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
|
||||
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
|
||||
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
|
||||
/* 58 - CapsLck */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
|
||||
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
|
||||
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
|
||||
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
|
||||
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
|
||||
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
|
||||
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
|
||||
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
|
||||
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
|
||||
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
|
||||
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
|
||||
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
|
||||
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
|
||||
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
|
||||
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
|
||||
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
|
||||
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
|
||||
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
|
||||
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
|
||||
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
|
||||
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
|
||||
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
|
||||
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
|
||||
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
|
||||
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
|
||||
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
|
||||
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
|
||||
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'),
|
||||
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
|
||||
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
|
||||
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
|
||||
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
|
||||
/*127 - ??? */ 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
448
drivers/tty/pty.c
Normal file
448
drivers/tty/pty.c
Normal file
@@ -0,0 +1,448 @@
|
||||
/* pty.c - pseudo terminal driver Author: Kees J. Bot
|
||||
* 30 Dec 1995
|
||||
* PTYs can be seen as a bidirectional pipe with TTY
|
||||
* input and output processing. For example a simple rlogin session:
|
||||
*
|
||||
* keyboard -> rlogin -> in.rld -> /dev/ptypX -> /dev/ttypX -> shell
|
||||
* shell -> /dev/ttypX -> /dev/ptypX -> in.rld -> rlogin -> screen
|
||||
*
|
||||
* This file takes care of copying data between the tty/pty device pairs and
|
||||
* the open/read/write/close calls on the pty devices. The TTY task takes
|
||||
* care of the input and output processing (interrupt, backspace, raw I/O,
|
||||
* etc.) using the pty_read() and pty_write() functions as the "keyboard" and
|
||||
* "screen" functions of the ttypX devices.
|
||||
* Be careful when reading this code, the terms "reading" and "writing" are
|
||||
* used both for the tty and the pty end of the pseudo tty. Writes to one
|
||||
* end are to be read at the other end and vice-versa.
|
||||
*/
|
||||
|
||||
#include "../drivers.h"
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
#include <minix/com.h>
|
||||
#include <minix/callnr.h>
|
||||
#include "tty.h"
|
||||
#include "proc.h"
|
||||
|
||||
#if NR_PTYS > 0
|
||||
|
||||
/* PTY bookkeeping structure, one per pty/tty pair. */
|
||||
typedef struct pty {
|
||||
tty_t *tty; /* associated TTY structure */
|
||||
char state; /* flags: busy, closed, ... */
|
||||
|
||||
/* Read call on /dev/ptypX. */
|
||||
char rdrepcode; /* reply code, TASK_REPLY or REVIVE */
|
||||
char rdcaller; /* process making the call (usually FS) */
|
||||
char rdproc; /* process that wants to read from the pty */
|
||||
vir_bytes rdvir; /* virtual address in readers address space */
|
||||
int rdleft; /* # bytes yet to be read */
|
||||
int rdcum; /* # bytes written so far */
|
||||
|
||||
/* Write call to /dev/ptypX. */
|
||||
char wrrepcode; /* reply code, TASK_REPLY or REVIVE */
|
||||
char wrcaller; /* process making the call (usually FS) */
|
||||
char wrproc; /* process that wants to write to the pty */
|
||||
vir_bytes wrvir; /* virtual address in writers address space */
|
||||
int wrleft; /* # bytes yet to be written */
|
||||
int wrcum; /* # bytes written so far */
|
||||
|
||||
/* Output buffer. */
|
||||
int ocount; /* # characters in the buffer */
|
||||
char *ohead, *otail; /* head and tail of the circular buffer */
|
||||
char obuf[128]; /* buffer for bytes going to the pty reader */
|
||||
} pty_t;
|
||||
|
||||
#define PTY_ACTIVE 0x01 /* pty is open/active */
|
||||
#define TTY_CLOSED 0x02 /* tty side has closed down */
|
||||
#define PTY_CLOSED 0x04 /* pty side has closed down */
|
||||
|
||||
PRIVATE pty_t pty_table[NR_PTYS]; /* PTY bookkeeping */
|
||||
|
||||
|
||||
FORWARD _PROTOTYPE( void pty_write, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void pty_echo, (tty_t *tp, int c) );
|
||||
FORWARD _PROTOTYPE( void pty_start, (pty_t *pp) );
|
||||
FORWARD _PROTOTYPE( void pty_finish, (pty_t *pp) );
|
||||
FORWARD _PROTOTYPE( void pty_read, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void pty_close, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void pty_icancel, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void pty_ocancel, (tty_t *tp) );
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* do_pty *
|
||||
*==========================================================================*/
|
||||
PUBLIC void do_pty(tp, m_ptr)
|
||||
tty_t *tp;
|
||||
message *m_ptr;
|
||||
{
|
||||
/* Perform an open/close/read/write call on a /dev/ptypX device. */
|
||||
pty_t *pp = tp->tty_priv;
|
||||
int r;
|
||||
|
||||
switch (m_ptr->m_type) {
|
||||
case DEV_READ:
|
||||
/* Check, store information on the reader, do I/O. */
|
||||
if (pp->state & TTY_CLOSED) {
|
||||
r = 0;
|
||||
break;
|
||||
}
|
||||
if (pp->rdleft != 0) {
|
||||
r = EIO;
|
||||
break;
|
||||
}
|
||||
if (m_ptr->COUNT <= 0) {
|
||||
r = EINVAL;
|
||||
break;
|
||||
}
|
||||
if (numap_local(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS,
|
||||
m_ptr->COUNT) == 0) {
|
||||
r = EFAULT;
|
||||
break;
|
||||
}
|
||||
pp->rdrepcode = TASK_REPLY;
|
||||
pp->rdcaller = m_ptr->m_source;
|
||||
pp->rdproc = m_ptr->PROC_NR;
|
||||
pp->rdvir = (vir_bytes) m_ptr->ADDRESS;
|
||||
pp->rdleft = m_ptr->COUNT;
|
||||
pty_start(pp);
|
||||
handle_events(tp);
|
||||
if (pp->rdleft == 0) return; /* already done */
|
||||
|
||||
if (m_ptr->TTY_FLAGS & O_NONBLOCK) {
|
||||
r = EAGAIN; /* don't suspend */
|
||||
pp->rdleft = pp->rdcum = 0;
|
||||
} else {
|
||||
r = SUSPEND; /* do suspend */
|
||||
pp->rdrepcode = REVIVE;
|
||||
}
|
||||
break;
|
||||
|
||||
case DEV_WRITE:
|
||||
/* Check, store information on the writer, do I/O. */
|
||||
if (pp->state & TTY_CLOSED) {
|
||||
r = EIO;
|
||||
break;
|
||||
}
|
||||
if (pp->wrleft != 0) {
|
||||
r = EIO;
|
||||
break;
|
||||
}
|
||||
if (m_ptr->COUNT <= 0) {
|
||||
r = EINVAL;
|
||||
break;
|
||||
}
|
||||
if (numap_local(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS,
|
||||
m_ptr->COUNT) == 0) {
|
||||
r = EFAULT;
|
||||
break;
|
||||
}
|
||||
pp->wrrepcode = TASK_REPLY;
|
||||
pp->wrcaller = m_ptr->m_source;
|
||||
pp->wrproc = m_ptr->PROC_NR;
|
||||
pp->wrvir = (vir_bytes) m_ptr->ADDRESS;
|
||||
pp->wrleft = m_ptr->COUNT;
|
||||
handle_events(tp);
|
||||
if (pp->wrleft == 0) return; /* already done */
|
||||
|
||||
if (m_ptr->TTY_FLAGS & O_NONBLOCK) { /* don't suspend */
|
||||
r = pp->wrcum > 0 ? pp->wrcum : EAGAIN;
|
||||
pp->wrleft = pp->wrcum = 0;
|
||||
} else {
|
||||
pp->wrrepcode = REVIVE; /* do suspend */
|
||||
r = SUSPEND;
|
||||
}
|
||||
break;
|
||||
|
||||
case DEV_OPEN:
|
||||
r = pp->state != 0 ? EIO : OK;
|
||||
pp->state |= PTY_ACTIVE;
|
||||
break;
|
||||
|
||||
case DEV_CLOSE:
|
||||
r = OK;
|
||||
if (pp->state & TTY_CLOSED) {
|
||||
pp->state = 0;
|
||||
} else {
|
||||
pp->state |= PTY_CLOSED;
|
||||
sigchar(tp, SIGHUP);
|
||||
}
|
||||
break;
|
||||
|
||||
case CANCEL:
|
||||
if (m_ptr->PROC_NR == pp->rdproc) {
|
||||
/* Cancel a read from a PTY. */
|
||||
pp->rdleft = pp->rdcum = 0;
|
||||
}
|
||||
if (m_ptr->PROC_NR == pp->wrproc) {
|
||||
/* Cancel a write to a PTY. */
|
||||
pp->wrleft = pp->wrcum = 0;
|
||||
}
|
||||
r = EINTR;
|
||||
break;
|
||||
|
||||
default:
|
||||
r = EINVAL;
|
||||
}
|
||||
tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_write *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_write(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
/* (*dev_write)() routine for PTYs. Transfer bytes from the writer on
|
||||
* /dev/ttypX to the output buffer.
|
||||
*/
|
||||
pty_t *pp = tp->tty_priv;
|
||||
int count, ocount;
|
||||
phys_bytes user_phys;
|
||||
|
||||
/* PTY closed down? */
|
||||
if (pp->state & PTY_CLOSED) {
|
||||
if (tp->tty_outleft > 0) {
|
||||
tty_reply(tp->tty_outrepcode, tp->tty_outcaller,
|
||||
tp->tty_outproc, EIO);
|
||||
tp->tty_outleft = tp->tty_outcum = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* While there is something to do. */
|
||||
for (;;) {
|
||||
ocount = buflen(pp->obuf) - pp->ocount;
|
||||
count = bufend(pp->obuf) - pp->ohead;
|
||||
if (count > ocount) count = ocount;
|
||||
if (count > tp->tty_outleft) count = tp->tty_outleft;
|
||||
if (count == 0 || tp->tty_inhibited) break;
|
||||
|
||||
/* Copy from user space to the PTY output buffer. */
|
||||
user_phys = proc_vir2phys(proc_addr(tp->tty_outproc), tp->tty_out_vir);
|
||||
phys_copy(user_phys, vir2phys(pp->ohead), (phys_bytes) count);
|
||||
|
||||
/* Perform output processing on the output buffer. */
|
||||
out_process(tp, pp->obuf, pp->ohead, bufend(pp->obuf), &count, &ocount);
|
||||
if (count == 0) break;
|
||||
|
||||
/* Assume echoing messed up by output. */
|
||||
tp->tty_reprint = TRUE;
|
||||
|
||||
/* Bookkeeping. */
|
||||
pp->ocount += ocount;
|
||||
if ((pp->ohead += ocount) >= bufend(pp->obuf))
|
||||
pp->ohead -= buflen(pp->obuf);
|
||||
pty_start(pp);
|
||||
tp->tty_out_vir += count;
|
||||
tp->tty_outcum += count;
|
||||
if ((tp->tty_outleft -= count) == 0) {
|
||||
/* Output is finished, reply to the writer. */
|
||||
tty_reply(tp->tty_outrepcode, tp->tty_outcaller,
|
||||
tp->tty_outproc, tp->tty_outcum);
|
||||
tp->tty_outcum = 0;
|
||||
}
|
||||
}
|
||||
pty_finish(pp);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_echo *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_echo(tp, c)
|
||||
tty_t *tp;
|
||||
int c;
|
||||
{
|
||||
/* Echo one character. (Like pty_write, but only one character, optionally.) */
|
||||
|
||||
pty_t *pp = tp->tty_priv;
|
||||
int count, ocount;
|
||||
|
||||
ocount = buflen(pp->obuf) - pp->ocount;
|
||||
if (ocount == 0) return; /* output buffer full */
|
||||
count = 1;
|
||||
*pp->ohead = c; /* add one character */
|
||||
|
||||
out_process(tp, pp->obuf, pp->ohead, bufend(pp->obuf), &count, &ocount);
|
||||
if (count == 0) return;
|
||||
|
||||
pp->ocount += ocount;
|
||||
if ((pp->ohead += ocount) >= bufend(pp->obuf)) pp->ohead -= buflen(pp->obuf);
|
||||
pty_start(pp);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_start *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_start(pp)
|
||||
pty_t *pp;
|
||||
{
|
||||
/* Transfer bytes written to the output buffer to the PTY reader. */
|
||||
int count;
|
||||
phys_bytes user_phys;
|
||||
|
||||
/* While there are things to do. */
|
||||
for (;;) {
|
||||
count = bufend(pp->obuf) - pp->otail;
|
||||
if (count > pp->ocount) count = pp->ocount;
|
||||
if (count > pp->rdleft) count = pp->rdleft;
|
||||
if (count == 0) break;
|
||||
|
||||
/* Copy from the output buffer to the readers address space. */
|
||||
user_phys = proc_vir2phys(proc_addr(pp->rdproc), pp->rdvir);
|
||||
phys_copy(vir2phys(pp->otail), user_phys, (phys_bytes) count);
|
||||
|
||||
/* Bookkeeping. */
|
||||
pp->ocount -= count;
|
||||
if ((pp->otail += count) == bufend(pp->obuf)) pp->otail = pp->obuf;
|
||||
pp->rdvir += count;
|
||||
pp->rdcum += count;
|
||||
pp->rdleft -= count;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_finish *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_finish(pp)
|
||||
pty_t *pp;
|
||||
{
|
||||
/* Finish the read request of a PTY reader if there is at least one byte
|
||||
* transferred.
|
||||
*/
|
||||
|
||||
if (pp->rdcum > 0) {
|
||||
tty_reply(pp->rdrepcode, pp->rdcaller, pp->rdproc, pp->rdcum);
|
||||
pp->rdleft = pp->rdcum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_read *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_read(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
/* Offer bytes from the PTY writer for input on the TTY. (Do it one byte at
|
||||
* a time, 99% of the writes will be for one byte, so no sense in being smart.)
|
||||
*/
|
||||
pty_t *pp = tp->tty_priv;
|
||||
phys_bytes user_phys;
|
||||
char c;
|
||||
|
||||
if (pp->state & PTY_CLOSED) {
|
||||
if (tp->tty_inleft > 0) {
|
||||
tty_reply(tp->tty_inrepcode, tp->tty_incaller, tp->tty_inproc,
|
||||
tp->tty_incum);
|
||||
tp->tty_inleft = tp->tty_incum = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
while (pp->wrleft > 0) {
|
||||
/* Transfer one character to 'c'. */
|
||||
user_phys = proc_vir2phys(proc_addr(pp->wrproc), pp->wrvir);
|
||||
phys_copy(user_phys, vir2phys(&c), 1L);
|
||||
|
||||
/* Input processing. */
|
||||
if (in_process(tp, &c, 1) == 0) break;
|
||||
|
||||
/* PTY writer bookkeeping. */
|
||||
pp->wrvir++;
|
||||
pp->wrcum++;
|
||||
if (--pp->wrleft == 0) {
|
||||
tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc, pp->wrcum);
|
||||
pp->wrcum = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_close *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_close(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
/* The tty side has closed, so shut down the pty side. */
|
||||
pty_t *pp = tp->tty_priv;
|
||||
|
||||
if (!(pp->state & PTY_ACTIVE)) return;
|
||||
|
||||
if (pp->rdleft > 0) {
|
||||
tty_reply(pp->rdrepcode, pp->rdcaller, pp->rdproc, 0);
|
||||
pp->rdleft = pp->rdcum = 0;
|
||||
}
|
||||
|
||||
if (pp->wrleft > 0) {
|
||||
tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc, EIO);
|
||||
pp->wrleft = pp->wrcum = 0;
|
||||
}
|
||||
|
||||
if (pp->state & PTY_CLOSED) pp->state = 0; else pp->state |= TTY_CLOSED;
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_icancel *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_icancel(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
/* Discard waiting input. */
|
||||
pty_t *pp = tp->tty_priv;
|
||||
|
||||
if (pp->wrleft > 0) {
|
||||
tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc,
|
||||
pp->wrcum + pp->wrleft);
|
||||
pp->wrleft = pp->wrcum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_ocancel *
|
||||
*==========================================================================*/
|
||||
PRIVATE void pty_ocancel(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
/* Drain the output buffer. */
|
||||
pty_t *pp = tp->tty_priv;
|
||||
|
||||
pp->ocount = 0;
|
||||
pp->otail = pp->ohead;
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* pty_init *
|
||||
*==========================================================================*/
|
||||
PUBLIC void pty_init(tp)
|
||||
tty_t *tp;
|
||||
{
|
||||
pty_t *pp;
|
||||
int line;
|
||||
|
||||
/* Associate PTY and TTY structures. */
|
||||
line = tp - &tty_table[NR_CONS + NR_RS_LINES];
|
||||
pp = tp->tty_priv = &pty_table[line];
|
||||
pp->tty = tp;
|
||||
|
||||
/* Set up output queue. */
|
||||
pp->ohead = pp->otail = pp->obuf;
|
||||
|
||||
/* Fill in TTY function hooks. */
|
||||
tp->tty_devread = pty_read;
|
||||
tp->tty_devwrite = pty_write;
|
||||
tp->tty_echo = pty_echo;
|
||||
tp->tty_icancel = pty_icancel;
|
||||
tp->tty_ocancel = pty_ocancel;
|
||||
tp->tty_close = pty_close;
|
||||
}
|
||||
#endif /* NR_PTYS > 0 */
|
||||
930
drivers/tty/rs232.c
Normal file
930
drivers/tty/rs232.c
Normal file
@@ -0,0 +1,930 @@
|
||||
#define USER_SPACE 1
|
||||
|
||||
#include <minix/config.h>
|
||||
/*==========================================================================*
|
||||
* rs232.c - serial driver for 8250 and 16450 UARTs *
|
||||
* Added support for Atari ST M68901 and YM-2149 --kub *
|
||||
*==========================================================================*/
|
||||
|
||||
#include "../drivers.h"
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
#include "tty.h"
|
||||
|
||||
#if USER_SPACE
|
||||
typedef u16_t port_t;
|
||||
#endif
|
||||
|
||||
#if NR_RS_LINES > 0
|
||||
|
||||
#if (MACHINE != IBM_PC) && (MACHINE != ATARI)
|
||||
#error /* rs232.c only supports PC and Atari ST */
|
||||
#endif
|
||||
|
||||
#if (MACHINE == ATARI)
|
||||
#include "staddr.h"
|
||||
#include "stsound.h"
|
||||
#include "stmfp.h"
|
||||
#if (NR_RS_LINES > 1)
|
||||
#error /* Only one physical RS232 line available */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (MACHINE == IBM_PC) /* PC/AT 8250/16450 chip combination */
|
||||
|
||||
/* 8250 constants. */
|
||||
#define UART_FREQ 115200L /* timer frequency */
|
||||
|
||||
/* Interrupt enable bits. */
|
||||
#define IE_RECEIVER_READY 1
|
||||
#define IE_TRANSMITTER_READY 2
|
||||
#define IE_LINE_STATUS_CHANGE 4
|
||||
#define IE_MODEM_STATUS_CHANGE 8
|
||||
|
||||
/* Interrupt status bits. */
|
||||
#define IS_MODEM_STATUS_CHANGE 0
|
||||
#define IS_TRANSMITTER_READY 2
|
||||
#define IS_RECEIVER_READY 4
|
||||
#define IS_LINE_STATUS_CHANGE 6
|
||||
|
||||
/* Line control bits. */
|
||||
#define LC_2STOP_BITS 0x04
|
||||
#define LC_PARITY 0x08
|
||||
#define LC_PAREVEN 0x10
|
||||
#define LC_BREAK 0x40
|
||||
#define LC_ADDRESS_DIVISOR 0x80
|
||||
|
||||
/* Line status bits. */
|
||||
#define LS_OVERRUN_ERR 2
|
||||
#define LS_PARITY_ERR 4
|
||||
#define LS_FRAMING_ERR 8
|
||||
#define LS_BREAK_INTERRUPT 0x10
|
||||
#define LS_TRANSMITTER_READY 0x20
|
||||
|
||||
/* Modem control bits. */
|
||||
#define MC_DTR 1
|
||||
#define MC_RTS 2
|
||||
#define MC_OUT2 8 /* required for PC & AT interrupts */
|
||||
|
||||
/* Modem status bits. */
|
||||
#define MS_CTS 0x10
|
||||
#define MS_RLSD 0x80 /* Received Line Signal Detect */
|
||||
#define MS_DRLSD 0x08 /* RLSD Delta */
|
||||
|
||||
#else /* MACHINE == ATARI */ /* Atari ST 68901 USART */
|
||||
|
||||
/* Most of the USART constants are already defined in stmfp.h . The local
|
||||
* definitions made here are for keeping C code changes smaller. --kub
|
||||
*/
|
||||
|
||||
#define UART_FREQ 19200L /* timer frequency */
|
||||
|
||||
/* Line status bits. */
|
||||
#define LS_OVERRUN_ERR R_OE
|
||||
#define LS_PARITY_ERR R_PE
|
||||
#define LS_FRAMING_ERR R_FE
|
||||
#define LS_BREAK_INTERRUPT R_BREAK
|
||||
|
||||
/* Modem status bits. */
|
||||
#define MS_CTS IO_SCTS /* 0x04 */
|
||||
|
||||
#endif /* MACHINE == ATARI */
|
||||
|
||||
#define DATA_BITS_SHIFT 8 /* amount data bits shifted in mode */
|
||||
#define DEF_BAUD 1200 /* default baud rate */
|
||||
|
||||
#define RS_IBUFSIZE 1024 /* RS232 input buffer size */
|
||||
#define RS_OBUFSIZE 1024 /* RS232 output buffer size */
|
||||
|
||||
/* Input buffer watermarks.
|
||||
* The external device is asked to stop sending when the buffer
|
||||
* exactly reaches high water, or when TTY requests it. Sending restarts
|
||||
* when the input buffer empties below the low watermark.
|
||||
*/
|
||||
#define RS_ILOWWATER (1 * RS_IBUFSIZE / 4)
|
||||
#define RS_IHIGHWATER (3 * RS_IBUFSIZE / 4)
|
||||
|
||||
/* Output buffer low watermark.
|
||||
* TTY is notified when the output buffer empties below the low watermark, so
|
||||
* it may continue filling the buffer if doing a large write.
|
||||
*/
|
||||
#define RS_OLOWWATER (1 * RS_OBUFSIZE / 4)
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
|
||||
/* Macros to handle flow control.
|
||||
* Interrupts must be off when they are used.
|
||||
* Time is critical - already the function call for outb() is annoying.
|
||||
* If outb() can be done in-line, tests to avoid it can be dropped.
|
||||
* istart() tells external device we are ready by raising RTS.
|
||||
* istop() tells external device we are not ready by dropping RTS.
|
||||
* DTR is kept high all the time (it probably should be raised by open and
|
||||
* dropped by close of the device).
|
||||
* OUT2 is also kept high all the time.
|
||||
*/
|
||||
#define istart(rs) \
|
||||
(outb((rs)->modem_ctl_port, MC_OUT2 | MC_RTS | MC_DTR), \
|
||||
(rs)->idevready = TRUE)
|
||||
#define istop(rs) \
|
||||
(outb((rs)->modem_ctl_port, MC_OUT2 | MC_DTR), \
|
||||
(rs)->idevready = FALSE)
|
||||
|
||||
/* Macro to tell if device is ready. The rs->cts field is set to MS_CTS if
|
||||
* CLOCAL is in effect for a line without a CTS wire.
|
||||
*/
|
||||
#define devready(rs) ((inb(rs->modem_status_port) | rs->cts) & MS_CTS)
|
||||
|
||||
/* Macro to tell if transmitter is ready. */
|
||||
#define txready(rs) (inb(rs->line_status_port) & LS_TRANSMITTER_READY)
|
||||
|
||||
/* Macro to tell if carrier has dropped.
|
||||
* The RS232 Carrier Detect (CD) line is usually connected to the 8250
|
||||
* Received Line Signal Detect pin, reflected by bit MS_RLSD in the Modem
|
||||
* Status Register. The MS_DRLSD bit tells if MS_RLSD has just changed state.
|
||||
* So if MS_DRLSD is set and MS_RLSD cleared, we know that carrier has just
|
||||
* dropped.
|
||||
*/
|
||||
#define devhup(rs) \
|
||||
((inb(rs->modem_status_port) & (MS_RLSD|MS_DRLSD)) == MS_DRLSD)
|
||||
|
||||
#else /* MACHINE == ATARI */
|
||||
|
||||
/* Macros to handle flow control.
|
||||
* Time is critical - already the function call for lock()/restore() is
|
||||
* annoying.
|
||||
* istart() tells external device we are ready by raising RTS.
|
||||
* istop() tells external device we are not ready by dropping RTS.
|
||||
* DTR is kept high all the time (it probably should be raised by open and
|
||||
* dropped by close of the device). NOTE: The modem lines are active low.
|
||||
*/
|
||||
#define set_porta(msk,val) { register int s = lock(); \
|
||||
SOUND->sd_selr = YM_IOA; \
|
||||
SOUND->sd_wdat = \
|
||||
SOUND->sd_rdat & (msk) | (val); \
|
||||
restore(s); }
|
||||
#define istart(rs) { set_porta( ~(PA_SRTS|PA_SDTR),0 ); \
|
||||
(rs)->idevready = TRUE; }
|
||||
#define istop(rs) { set_porta( ~PA_SDTR, PA_SRTS ); \
|
||||
(rs)->idevready = FALSE; }
|
||||
|
||||
/* Macro to tell if device is ready. The rs->cts field is set to MS_CTS if
|
||||
* CLOCAL is in effect for a line without a CTS wire.
|
||||
*/
|
||||
#define devready(rs) ((~MFP->mf_gpip | rs->cts) & MS_CTS)
|
||||
|
||||
/* Transmitter ready test */
|
||||
#define txready(rs) (MFP->mf_tsr & (T_EMPTY | T_UE))
|
||||
|
||||
#endif /* MACHINE == ATARI */
|
||||
|
||||
/* Types. */
|
||||
typedef unsigned char bool_t; /* boolean */
|
||||
|
||||
/* RS232 device structure, one per device. */
|
||||
typedef struct rs232 {
|
||||
tty_t *tty; /* associated TTY structure */
|
||||
|
||||
int icount; /* number of bytes in the input buffer */
|
||||
char *ihead; /* next free spot in input buffer */
|
||||
char *itail; /* first byte to give to TTY */
|
||||
bool_t idevready; /* nonzero if we are ready to receive (RTS) */
|
||||
char cts; /* normally 0, but MS_CTS if CLOCAL is set */
|
||||
|
||||
unsigned char ostate; /* combination of flags: */
|
||||
#define ODONE 1 /* output completed (< output enable bits) */
|
||||
#define ORAW 2 /* raw mode for xoff disable (< enab. bits) */
|
||||
#define OWAKEUP 4 /* tty_wakeup() pending (asm code only) */
|
||||
#define ODEVREADY MS_CTS /* external device hardware ready (CTS) */
|
||||
#define OQUEUED 0x20 /* output buffer not empty */
|
||||
#define OSWREADY 0x40 /* external device software ready (no xoff) */
|
||||
#define ODEVHUP MS_RLSD /* external device has dropped carrier */
|
||||
#define OSOFTBITS (ODONE | ORAW | OWAKEUP | OQUEUED | OSWREADY)
|
||||
/* user-defined bits */
|
||||
#if (OSOFTBITS | ODEVREADY | ODEVHUP) == OSOFTBITS
|
||||
/* a weak sanity check */
|
||||
#error /* bits are not unique */
|
||||
#endif
|
||||
unsigned char oxoff; /* char to stop output */
|
||||
bool_t inhibited; /* output inhibited? (follows tty_inhibited) */
|
||||
bool_t drain; /* if set drain output and reconfigure line */
|
||||
int ocount; /* number of bytes in the output buffer */
|
||||
char *ohead; /* next free spot in output buffer */
|
||||
char *otail; /* next char to output */
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
port_t xmit_port; /* i/o ports */
|
||||
port_t recv_port;
|
||||
port_t div_low_port;
|
||||
port_t div_hi_port;
|
||||
port_t int_enab_port;
|
||||
port_t int_id_port;
|
||||
port_t line_ctl_port;
|
||||
port_t modem_ctl_port;
|
||||
port_t line_status_port;
|
||||
port_t modem_status_port;
|
||||
#endif
|
||||
|
||||
unsigned char lstatus; /* last line status */
|
||||
unsigned char pad; /* ensure alignment for 16-bit ints */
|
||||
unsigned framing_errors; /* error counts (no reporting yet) */
|
||||
unsigned overrun_errors;
|
||||
unsigned parity_errors;
|
||||
unsigned break_interrupts;
|
||||
|
||||
irq_hook_t hook; /* interrupt hook */
|
||||
|
||||
char ibuf[RS_IBUFSIZE]; /* input buffer */
|
||||
char obuf[RS_OBUFSIZE]; /* output buffer */
|
||||
} rs232_t;
|
||||
|
||||
PUBLIC rs232_t rs_lines[NR_RS_LINES];
|
||||
|
||||
/* Table and macro to translate an RS232 line number to its rs_lines entry. */
|
||||
PRIVATE rs232_t *p_rs_addr[NR_RS_LINES];
|
||||
|
||||
#define rs_addr(line) (p_rs_addr[line])
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
/* 8250 base addresses. */
|
||||
PRIVATE port_t addr_8250[] = {
|
||||
0x3F8, /* COM1 */
|
||||
0x2F8, /* COM2 */
|
||||
0x3E8, /* COM3 */
|
||||
0x2E8, /* COM4 */
|
||||
};
|
||||
#endif
|
||||
|
||||
FORWARD _PROTOTYPE( int rs232_handler, (irq_hook_t *hook) );
|
||||
FORWARD _PROTOTYPE( void in_int, (rs232_t *rs) );
|
||||
FORWARD _PROTOTYPE( void line_int, (rs232_t *rs) );
|
||||
FORWARD _PROTOTYPE( void modem_int, (rs232_t *rs) );
|
||||
FORWARD _PROTOTYPE( void rs_write, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void rs_echo, (tty_t *tp, int c) );
|
||||
FORWARD _PROTOTYPE( void rs_ioctl, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void rs_config, (rs232_t *rs) );
|
||||
FORWARD _PROTOTYPE( void rs_read, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void rs_icancel, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void rs_ocancel, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void rs_ostart, (rs232_t *rs) );
|
||||
FORWARD _PROTOTYPE( void rs_break, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void rs_close, (tty_t *tp) );
|
||||
FORWARD _PROTOTYPE( void out_int, (rs232_t *rs) );
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_write *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_write(tp)
|
||||
register tty_t *tp;
|
||||
{
|
||||
/* (*devwrite)() routine for RS232. */
|
||||
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
int count, ocount;
|
||||
phys_bytes user_phys;
|
||||
|
||||
if (rs->inhibited != tp->tty_inhibited) {
|
||||
/* Inhibition state has changed. */
|
||||
lock();
|
||||
rs->ostate |= OSWREADY;
|
||||
if (tp->tty_inhibited) rs->ostate &= ~OSWREADY;
|
||||
unlock();
|
||||
rs->inhibited = tp->tty_inhibited;
|
||||
}
|
||||
|
||||
if (rs->drain) {
|
||||
/* Wait for the line to drain then reconfigure and continue output. */
|
||||
if (rs->ocount > 0) return;
|
||||
rs->drain = FALSE;
|
||||
rs_config(rs);
|
||||
}
|
||||
|
||||
/* While there is something to do. */
|
||||
for (;;) {
|
||||
ocount = buflen(rs->obuf) - rs->ocount;
|
||||
count = bufend(rs->obuf) - rs->ohead;
|
||||
if (count > ocount) count = ocount;
|
||||
if (count > tp->tty_outleft) count = tp->tty_outleft;
|
||||
if (count == 0 || tp->tty_inhibited) break;
|
||||
|
||||
/* Copy from user space to the RS232 output buffer. */
|
||||
user_phys = proc_vir2phys(proc_addr(tp->tty_outproc), tp->tty_out_vir);
|
||||
phys_copy(user_phys, vir2phys(rs->ohead), (phys_bytes) count);
|
||||
|
||||
/* Perform output processing on the output buffer. */
|
||||
out_process(tp, rs->obuf, rs->ohead, bufend(rs->obuf), &count, &ocount);
|
||||
if (count == 0) break;
|
||||
|
||||
/* Assume echoing messed up by output. */
|
||||
tp->tty_reprint = TRUE;
|
||||
|
||||
/* Bookkeeping. */
|
||||
lock(); /* protect interrupt sensitive rs->ocount */
|
||||
rs->ocount += ocount;
|
||||
rs_ostart(rs);
|
||||
unlock();
|
||||
if ((rs->ohead += ocount) >= bufend(rs->obuf))
|
||||
rs->ohead -= buflen(rs->obuf);
|
||||
tp->tty_out_vir += count;
|
||||
tp->tty_outcum += count;
|
||||
if ((tp->tty_outleft -= count) == 0) {
|
||||
/* Output is finished, reply to the writer. */
|
||||
tty_reply(tp->tty_outrepcode, tp->tty_outcaller,
|
||||
tp->tty_outproc, tp->tty_outcum);
|
||||
tp->tty_outcum = 0;
|
||||
}
|
||||
}
|
||||
if (tp->tty_outleft > 0 && tp->tty_termios.c_ospeed == B0) {
|
||||
/* Oops, the line has hung up. */
|
||||
tty_reply(tp->tty_outrepcode, tp->tty_outcaller, tp->tty_outproc, EIO);
|
||||
tp->tty_outleft = tp->tty_outcum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_echo *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_echo(tp, c)
|
||||
tty_t *tp; /* which TTY */
|
||||
int c; /* character to echo */
|
||||
{
|
||||
/* Echo one character. (Like rs_write, but only one character, optionally.) */
|
||||
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
int count, ocount;
|
||||
|
||||
ocount = buflen(rs->obuf) - rs->ocount;
|
||||
if (ocount == 0) return; /* output buffer full */
|
||||
count = 1;
|
||||
*rs->ohead = c; /* add one character */
|
||||
|
||||
out_process(tp, rs->obuf, rs->ohead, bufend(rs->obuf), &count, &ocount);
|
||||
if (count == 0) return;
|
||||
|
||||
lock();
|
||||
rs->ocount += ocount;
|
||||
rs_ostart(rs);
|
||||
unlock();
|
||||
if ((rs->ohead += ocount) >= bufend(rs->obuf)) rs->ohead -= buflen(rs->obuf);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_ioctl *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_ioctl(tp)
|
||||
tty_t *tp; /* which TTY */
|
||||
{
|
||||
/* Reconfigure the line as soon as the output has drained. */
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
|
||||
rs->drain = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_config *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_config(rs)
|
||||
rs232_t *rs; /* which line */
|
||||
{
|
||||
/* Set various line control parameters for RS232 I/O.
|
||||
* If DataBits == 5 and StopBits == 2, 8250 will generate 1.5 stop bits.
|
||||
* The 8250 can't handle split speed, so we use the input speed.
|
||||
*/
|
||||
|
||||
tty_t *tp = rs->tty;
|
||||
int divisor;
|
||||
int line_controls;
|
||||
static struct speed2divisor {
|
||||
speed_t speed;
|
||||
int divisor;
|
||||
} s2d[] = {
|
||||
#if (MACHINE == IBM_PC)
|
||||
{ B50, UART_FREQ / 50 },
|
||||
#endif
|
||||
{ B75, UART_FREQ / 75 },
|
||||
{ B110, UART_FREQ / 110 },
|
||||
{ B134, UART_FREQ * 10 / 1345 },
|
||||
{ B150, UART_FREQ / 150 },
|
||||
{ B200, UART_FREQ / 200 },
|
||||
{ B300, UART_FREQ / 300 },
|
||||
{ B600, UART_FREQ / 600 },
|
||||
{ B1200, UART_FREQ / 1200 },
|
||||
#if (MACHINE == IBM_PC)
|
||||
{ B1800, UART_FREQ / 1800 },
|
||||
#endif
|
||||
{ B2400, UART_FREQ / 2400 },
|
||||
{ B4800, UART_FREQ / 4800 },
|
||||
{ B9600, UART_FREQ / 9600 },
|
||||
{ B19200, UART_FREQ / 19200 },
|
||||
#if (MACHINE == IBM_PC)
|
||||
{ B38400, UART_FREQ / 38400 },
|
||||
{ B57600, UART_FREQ / 57600 },
|
||||
{ B115200, UART_FREQ / 115200L },
|
||||
#endif
|
||||
};
|
||||
struct speed2divisor *s2dp;
|
||||
|
||||
/* RS232 needs to know the xoff character, and if CTS works. */
|
||||
rs->oxoff = tp->tty_termios.c_cc[VSTOP];
|
||||
rs->cts = (tp->tty_termios.c_cflag & CLOCAL) ? MS_CTS : 0;
|
||||
|
||||
/* Look up the 8250 rate divisor from the output speed. */
|
||||
divisor = 0;
|
||||
for (s2dp = s2d; s2dp < s2d + sizeof(s2d)/sizeof(s2d[0]); s2dp++) {
|
||||
if (s2dp->speed == tp->tty_termios.c_ospeed) divisor = s2dp->divisor;
|
||||
}
|
||||
if (divisor == 0) return; /* B0? */
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
/* Compute line control flag bits. */
|
||||
line_controls = 0;
|
||||
if (tp->tty_termios.c_cflag & PARENB) {
|
||||
line_controls |= LC_PARITY;
|
||||
if (!(tp->tty_termios.c_cflag & PARODD)) line_controls |= LC_PAREVEN;
|
||||
}
|
||||
if (divisor >= (UART_FREQ / 110)) line_controls |= LC_2STOP_BITS;
|
||||
line_controls |= (tp->tty_termios.c_cflag & CSIZE) >> 2;
|
||||
|
||||
/* Lock out interrupts while setting the speed. The receiver register is
|
||||
* going to be hidden by the div_low register, but the input interrupt
|
||||
* handler relies on reading it to clear the interrupt and avoid looping
|
||||
* forever.
|
||||
*/
|
||||
lock();
|
||||
|
||||
/* Select the baud rate divisor registers and change the rate. */
|
||||
outb(rs->line_ctl_port, LC_ADDRESS_DIVISOR);
|
||||
outb(rs->div_low_port, divisor);
|
||||
outb(rs->div_hi_port, divisor >> 8);
|
||||
|
||||
/* Change the line controls and reselect the usual registers. */
|
||||
outb(rs->line_ctl_port, line_controls);
|
||||
|
||||
rs->ostate = devready(rs) | ORAW | OSWREADY; /* reads modem_ctl_port */
|
||||
if ((tp->tty_termios.c_lflag & IXON) && rs->oxoff != _POSIX_VDISABLE)
|
||||
rs->ostate &= ~ORAW;
|
||||
|
||||
unlock();
|
||||
|
||||
#else /* MACHINE == ATARI */
|
||||
|
||||
line_controls = U_Q16;
|
||||
if (tp->tty_termios.c_cflag & PARENB) {
|
||||
line_controls |= U_PAR;
|
||||
if (!(tp->tty_termios.c_cflag & PARODD)) line_controls |= U_EVEN;
|
||||
}
|
||||
line_controls |= (divisor >= (UART_FREQ / 110)) ? U_ST2 : U_ST1;
|
||||
|
||||
switch (tp->tty_termios.c_cflag & CSIZE) { /* XXX - are U_Dn like CSn? */
|
||||
case CS5: line_controls |= U_D5; break;
|
||||
case CS5: line_controls |= U_D6; break;
|
||||
case CS5: line_controls |= U_D7; break;
|
||||
case CS5: line_controls |= U_D8; break;
|
||||
}
|
||||
lock();
|
||||
MFP->mf_ucr = line_controls;
|
||||
MFP->mf_tddr = divisor;
|
||||
unlock();
|
||||
#endif /* MACHINE == ATARI */
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_init *
|
||||
*==========================================================================*/
|
||||
PUBLIC void rs_init(tp)
|
||||
tty_t *tp; /* which TTY */
|
||||
{
|
||||
/* Initialize RS232 for one line. */
|
||||
|
||||
register rs232_t *rs;
|
||||
int line;
|
||||
#if (MACHINE == IBM_PC)
|
||||
port_t this_8250;
|
||||
int irq;
|
||||
long v;
|
||||
#endif
|
||||
|
||||
/* Associate RS232 and TTY structures. */
|
||||
line = tp - &tty_table[NR_CONS];
|
||||
rs = tp->tty_priv = &rs_lines[line];
|
||||
rs->tty = tp;
|
||||
|
||||
/* Set up input queue. */
|
||||
rs->ihead = rs->itail = rs->ibuf;
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
/* Precalculate port numbers for speed. Magic numbers in the code (once). */
|
||||
this_8250 = addr_8250[line];
|
||||
rs->xmit_port = this_8250 + 0;
|
||||
rs->recv_port = this_8250 + 0;
|
||||
rs->div_low_port = this_8250 + 0;
|
||||
rs->div_hi_port = this_8250 + 1;
|
||||
rs->int_enab_port = this_8250 + 1;
|
||||
rs->int_id_port = this_8250 + 2;
|
||||
rs->line_ctl_port = this_8250 + 3;
|
||||
rs->modem_ctl_port = this_8250 + 4;
|
||||
rs->line_status_port = this_8250 + 5;
|
||||
rs->modem_status_port = this_8250 + 6;
|
||||
#endif
|
||||
|
||||
/* Set up the hardware to a base state, in particular
|
||||
* o turn off DTR (MC_DTR) to try to stop the external device.
|
||||
* o be careful about the divisor latch. Some BIOS's leave it enabled
|
||||
* here and that caused trouble (no interrupts) in version 1.5 by
|
||||
* hiding the interrupt enable port in the next step, and worse trouble
|
||||
* (continual interrupts) in an old version by hiding the receiver
|
||||
* port in the first interrupt. Call rs_ioctl() early to avoid this.
|
||||
* o disable interrupts at the chip level, to force an edge transition
|
||||
* on the 8259 line when interrupts are next enabled and active.
|
||||
* RS232 interrupts are guaranteed to be disabled now by the 8259
|
||||
* mask, but there used to be trouble if the mask was set without
|
||||
* handling a previous interrupt.
|
||||
*/
|
||||
istop(rs); /* sets modem_ctl_port */
|
||||
rs_config(rs);
|
||||
#if (MACHINE == IBM_PC)
|
||||
outb(rs->int_enab_port, 0);
|
||||
#endif
|
||||
|
||||
/* Clear any harmful leftover interrupts. An output interrupt is harmless
|
||||
* and will occur when interrupts are enabled anyway. Set up the output
|
||||
* queue using the status from clearing the modem status interrupt.
|
||||
*/
|
||||
#if (MACHINE == IBM_PC)
|
||||
inb(rs->line_status_port);
|
||||
inb(rs->recv_port);
|
||||
#endif
|
||||
rs->ostate = devready(rs) | ORAW | OSWREADY; /* reads modem_ctl_port */
|
||||
rs->ohead = rs->otail = rs->obuf;
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
/* Enable interrupts for both interrupt controller and device. */
|
||||
irq = (line & 1) == 0 ? RS232_IRQ : SECONDARY_IRQ;
|
||||
|
||||
put_irq_handler(&rs->hook, irq, rs232_handler);
|
||||
enable_irq(&rs->hook);
|
||||
outb(rs->int_enab_port, IE_LINE_STATUS_CHANGE | IE_MODEM_STATUS_CHANGE
|
||||
| IE_RECEIVER_READY | IE_TRANSMITTER_READY);
|
||||
#else /* MACHINE == ATARI */
|
||||
/* Initialize the 68901 chip, then enable interrupts. */
|
||||
MFP->mf_scr = 0x00;
|
||||
MFP->mf_tcdcr |= T_Q004;
|
||||
MFP->mf_rsr = R_ENA;
|
||||
MFP->mf_tsr = T_ENA;
|
||||
MFP->mf_aer = (MFP->mf_aer | (IO_SCTS|IO_SDCD)) ^
|
||||
(MFP->mf_gpip & (IO_SCTS|IO_SDCD));
|
||||
MFP->mf_ddr = (MFP->mf_ddr & ~ (IO_SCTS|IO_SDCD));
|
||||
MFP->mf_iera |= (IA_RRDY|IA_RERR|IA_TRDY|IA_TERR);
|
||||
MFP->mf_imra |= (IA_RRDY|IA_RERR|IA_TRDY|IA_TERR);
|
||||
MFP->mf_ierb |= (IB_SCTS|IB_SDCD);
|
||||
MFP->mf_imrb |= (IB_SCTS|IB_SDCD);
|
||||
#endif /* MACHINE == ATARI */
|
||||
|
||||
/* Fill in TTY function hooks. */
|
||||
tp->tty_devread = rs_read;
|
||||
tp->tty_devwrite = rs_write;
|
||||
tp->tty_echo = rs_echo;
|
||||
tp->tty_icancel = rs_icancel;
|
||||
tp->tty_ocancel = rs_ocancel;
|
||||
tp->tty_ioctl = rs_ioctl;
|
||||
tp->tty_break = rs_break;
|
||||
tp->tty_close = rs_close;
|
||||
|
||||
/* Tell external device we are ready. */
|
||||
istart(rs);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_icancel *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_icancel(tp)
|
||||
tty_t *tp; /* which TTY */
|
||||
{
|
||||
/* Cancel waiting input. */
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
|
||||
lock();
|
||||
rs->icount = 0;
|
||||
rs->itail = rs->ihead;
|
||||
istart(rs);
|
||||
unlock();
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_ocancel *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_ocancel(tp)
|
||||
tty_t *tp; /* which TTY */
|
||||
{
|
||||
/* Cancel pending output. */
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
|
||||
lock();
|
||||
rs->ostate &= ~(ODONE | OQUEUED);
|
||||
rs->ocount = 0;
|
||||
rs->otail = rs->ohead;
|
||||
unlock();
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_read *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_read(tp)
|
||||
tty_t *tp; /* which tty */
|
||||
{
|
||||
/* Process characters from the circular input buffer. */
|
||||
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
int icount, count, ostate;
|
||||
|
||||
if (!(tp->tty_termios.c_cflag & CLOCAL)) {
|
||||
/* Send a SIGHUP if hangup detected. */
|
||||
lock();
|
||||
ostate = rs->ostate;
|
||||
rs->ostate &= ~ODEVHUP; /* save ostate, clear DEVHUP */
|
||||
unlock();
|
||||
if (ostate & ODEVHUP) {
|
||||
sigchar(tp, SIGHUP);
|
||||
tp->tty_termios.c_ospeed = B0; /* Disable further I/O. */
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
while ((count = rs->icount) > 0) {
|
||||
icount = bufend(rs->ibuf) - rs->itail;
|
||||
if (count > icount) count = icount;
|
||||
|
||||
/* Perform input processing on (part of) the input buffer. */
|
||||
if ((count = in_process(tp, rs->itail, count)) == 0) break;
|
||||
|
||||
lock(); /* protect interrupt sensitive variables */
|
||||
rs->icount -= count;
|
||||
if (!rs->idevready && rs->icount < RS_ILOWWATER) istart(rs);
|
||||
unlock();
|
||||
if ((rs->itail += count) == bufend(rs->ibuf)) rs->itail = rs->ibuf;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_ostart *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_ostart(rs)
|
||||
rs232_t *rs; /* which rs line */
|
||||
{
|
||||
/* Tell RS232 there is something waiting in the output buffer. */
|
||||
|
||||
rs->ostate |= OQUEUED;
|
||||
if (txready(rs)) out_int(rs);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_break *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_break(tp)
|
||||
tty_t *tp; /* which tty */
|
||||
{
|
||||
/* Generate a break condition by setting the BREAK bit for 0.4 sec. */
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
int line_controls;
|
||||
|
||||
line_controls = inb(rs->line_ctl_port);
|
||||
outb(rs->line_ctl_port, line_controls | LC_BREAK);
|
||||
milli_delay(400); /* ouch */
|
||||
outb(rs->line_ctl_port, line_controls);
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* rs_close *
|
||||
*==========================================================================*/
|
||||
PRIVATE void rs_close(tp)
|
||||
tty_t *tp; /* which tty */
|
||||
{
|
||||
/* The line is closed; optionally hang up. */
|
||||
rs232_t *rs = tp->tty_priv;
|
||||
|
||||
if (tp->tty_termios.c_cflag & HUPCL) {
|
||||
outb(rs->modem_ctl_port, MC_OUT2 | MC_RTS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Low level (interrupt) routines. */
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
/*==========================================================================*
|
||||
* rs232_handler *
|
||||
*==========================================================================*/
|
||||
PRIVATE int rs232_handler(hook)
|
||||
irq_hook_t *hook;
|
||||
{
|
||||
/* Interrupt hander for RS232. */
|
||||
|
||||
register rs232_t *rs = structof(rs232_t, hook, hook);
|
||||
|
||||
while (TRUE) {
|
||||
/* Loop to pick up ALL pending interrupts for device.
|
||||
* This usually just wastes time unless the hardware has a buffer
|
||||
* (and then we have to worry about being stuck in the loop too long).
|
||||
* Unfortunately, some serial cards lock up without this.
|
||||
*/
|
||||
switch (inb(rs->int_id_port)) {
|
||||
case IS_RECEIVER_READY:
|
||||
in_int(rs);
|
||||
continue;
|
||||
case IS_TRANSMITTER_READY:
|
||||
out_int(rs);
|
||||
continue;
|
||||
case IS_MODEM_STATUS_CHANGE:
|
||||
modem_int(rs);
|
||||
continue;
|
||||
case IS_LINE_STATUS_CHANGE:
|
||||
line_int(rs);
|
||||
continue;
|
||||
}
|
||||
return(1); /* reenable serial interrupt */
|
||||
}
|
||||
}
|
||||
#endif /* MACHINE == IBM_PC */
|
||||
|
||||
#if (MACHINE == ATARI)
|
||||
/*==========================================================================*
|
||||
* siaint *
|
||||
*==========================================================================*/
|
||||
PRIVATE void siaint(type)
|
||||
int type; /* interrupt type */
|
||||
{
|
||||
/* siaint is the rs232 interrupt procedure for Atari ST's. For ST there are
|
||||
* as much as 5 interrupt lines used for rs232. The trap type byte left on the
|
||||
* stack by the assembler interrupt handler identifies the interrupt cause.
|
||||
*/
|
||||
|
||||
register unsigned char code;
|
||||
register rs232_t *rs = &rs_lines[0];
|
||||
int s = lock();
|
||||
|
||||
switch (type & 0x00FF)
|
||||
{
|
||||
case 0x00: /* receive buffer full */
|
||||
in_int(rs);
|
||||
break;
|
||||
case 0x01: /* receive error */
|
||||
line_int(rs);
|
||||
break;
|
||||
case 0x02: /* transmit buffer empty */
|
||||
out_int(rs);
|
||||
break;
|
||||
case 0x03: /* transmit error */
|
||||
code = MFP->mf_tsr;
|
||||
if (code & ~(T_ENA | T_UE | T_EMPTY))
|
||||
{
|
||||
printf("sia: transmit error: status=%x\r\n", code);
|
||||
/* MFP->mf_udr = lastchar; */ /* retry */
|
||||
}
|
||||
break;
|
||||
case 0x04: /* modem lines change */
|
||||
modem_int(rs);
|
||||
break;
|
||||
}
|
||||
restore(s);
|
||||
}
|
||||
#endif /* MACHINE == ATARI */
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* in_int *
|
||||
*==========================================================================*/
|
||||
PRIVATE void in_int(rs)
|
||||
register rs232_t *rs; /* line with input interrupt */
|
||||
{
|
||||
/* Read the data which just arrived.
|
||||
* If it is the oxoff char, clear OSWREADY, else if OSWREADY was clear, set
|
||||
* it and restart output (any char does this, not just xon).
|
||||
* Put data in the buffer if room, otherwise discard it.
|
||||
* Set a flag for the clock interrupt handler to eventually notify TTY.
|
||||
*/
|
||||
|
||||
int c;
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
c = inb(rs->recv_port);
|
||||
#else /* MACHINE == ATARI */
|
||||
c = MFP->mf_udr;
|
||||
#endif
|
||||
|
||||
if (!(rs->ostate & ORAW)) {
|
||||
if (c == rs->oxoff) {
|
||||
rs->ostate &= ~OSWREADY;
|
||||
} else
|
||||
if (!(rs->ostate & OSWREADY)) {
|
||||
rs->ostate |= OSWREADY;
|
||||
if (txready(rs)) out_int(rs);
|
||||
}
|
||||
}
|
||||
|
||||
if (rs->icount == buflen(rs->ibuf)) return; /* input buffer full, discard */
|
||||
|
||||
if (++rs->icount == RS_IHIGHWATER && rs->idevready) istop(rs);
|
||||
*rs->ihead = c;
|
||||
if (++rs->ihead == bufend(rs->ibuf)) rs->ihead = rs->ibuf;
|
||||
if (rs->icount == 1) {
|
||||
rs->tty->tty_events = 1;
|
||||
force_timeout();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* line_int *
|
||||
*==========================================================================*/
|
||||
PRIVATE void line_int(rs)
|
||||
register rs232_t *rs; /* line with line status interrupt */
|
||||
{
|
||||
/* Check for and record errors. */
|
||||
|
||||
#if (MACHINE == IBM_PC)
|
||||
rs->lstatus = inb(rs->line_status_port);
|
||||
#else /* MACHINE == ATARI */
|
||||
rs->lstatus = MFP->mf_rsr;
|
||||
MFP->mf_rsr &= R_ENA;
|
||||
rs->pad = MFP->mf_udr; /* discard char in case of LS_OVERRUN_ERR */
|
||||
#endif /* MACHINE == ATARI */
|
||||
if (rs->lstatus & LS_FRAMING_ERR) ++rs->framing_errors;
|
||||
if (rs->lstatus & LS_OVERRUN_ERR) ++rs->overrun_errors;
|
||||
if (rs->lstatus & LS_PARITY_ERR) ++rs->parity_errors;
|
||||
if (rs->lstatus & LS_BREAK_INTERRUPT) ++rs->break_interrupts;
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* modem_int *
|
||||
*==========================================================================*/
|
||||
PRIVATE void modem_int(rs)
|
||||
register rs232_t *rs; /* line with modem interrupt */
|
||||
{
|
||||
/* Get possibly new device-ready status, and clear ODEVREADY if necessary.
|
||||
* If the device just became ready, restart output.
|
||||
*/
|
||||
|
||||
#if (MACHINE == ATARI)
|
||||
/* Set active edge interrupt so that next change causes a new interrupt */
|
||||
MFP->mf_aer = (MFP->mf_aer | (IO_SCTS|IO_SDCD)) ^
|
||||
(MFP->mf_gpip & (IO_SCTS|IO_SDCD));
|
||||
#endif
|
||||
|
||||
if (devhup(rs)) {
|
||||
rs->ostate |= ODEVHUP;
|
||||
rs->tty->tty_events = 1;
|
||||
force_timeout();
|
||||
}
|
||||
|
||||
if (!devready(rs))
|
||||
rs->ostate &= ~ODEVREADY;
|
||||
else if (!(rs->ostate & ODEVREADY)) {
|
||||
rs->ostate |= ODEVREADY;
|
||||
if (txready(rs)) out_int(rs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*==========================================================================*
|
||||
* out_int *
|
||||
*==========================================================================*/
|
||||
PRIVATE void out_int(rs)
|
||||
register rs232_t *rs; /* line with output interrupt */
|
||||
{
|
||||
/* If there is output to do and everything is ready, do it (local device is
|
||||
* known ready).
|
||||
* Notify TTY when the buffer goes empty.
|
||||
*/
|
||||
|
||||
if (rs->ostate >= (ODEVREADY | OQUEUED | OSWREADY)) {
|
||||
/* Bit test allows ORAW and requires the others. */
|
||||
#if (MACHINE == IBM_PC)
|
||||
outb(rs->xmit_port, *rs->otail);
|
||||
#else /* MACHINE == ATARI */
|
||||
MFP->mf_udr = *rs->otail;
|
||||
#endif
|
||||
if (++rs->otail == bufend(rs->obuf)) rs->otail = rs->obuf;
|
||||
if (--rs->ocount == 0) {
|
||||
rs->ostate ^= (ODONE | OQUEUED); /* ODONE on, OQUEUED off */
|
||||
rs->tty->tty_events = 1;
|
||||
force_timeout();
|
||||
} else
|
||||
if (rs->ocount == RS_OLOWWATER) { /* running low? */
|
||||
rs->tty->tty_events = 1;
|
||||
force_timeout();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* NR_RS_LINES > 0 */
|
||||
|
||||
1812
drivers/tty/tty.c
Normal file
1812
drivers/tty/tty.c
Normal file
File diff suppressed because it is too large
Load Diff
154
drivers/tty/tty.h
Normal file
154
drivers/tty/tty.h
Normal file
@@ -0,0 +1,154 @@
|
||||
/* tty.h - Terminals */
|
||||
|
||||
#include <timers.h>
|
||||
|
||||
|
||||
#define TTY_IN_BYTES 256 /* tty input queue size */
|
||||
#define TAB_SIZE 8 /* distance between tab stops */
|
||||
#define TAB_MASK 7 /* mask to compute a tab stop position */
|
||||
|
||||
#define ESC '\33' /* escape */
|
||||
|
||||
#define O_NOCTTY 00400 /* from <fcntl.h>, or cc will choke */
|
||||
#define O_NONBLOCK 04000
|
||||
|
||||
struct tty;
|
||||
typedef _PROTOTYPE( void (*devfun_t), (struct tty *tp) );
|
||||
typedef _PROTOTYPE( void (*devfunarg_t), (struct tty *tp, int c) );
|
||||
|
||||
typedef struct tty {
|
||||
int tty_events; /* set when TTY should inspect this line */
|
||||
int tty_index; /* index into TTY table */
|
||||
|
||||
/* Input queue. Typed characters are stored here until read by a program. */
|
||||
u16_t *tty_inhead; /* pointer to place where next char goes */
|
||||
u16_t *tty_intail; /* pointer to next char to be given to prog */
|
||||
int tty_incount; /* # chars in the input queue */
|
||||
int tty_eotct; /* number of "line breaks" in input queue */
|
||||
devfun_t tty_devread; /* routine to read from low level buffers */
|
||||
devfun_t tty_icancel; /* cancel any device input */
|
||||
int tty_min; /* minimum requested #chars in input queue */
|
||||
timer_t tty_tmr; /* the timer for this tty */
|
||||
|
||||
/* Output section. */
|
||||
devfun_t tty_devwrite; /* routine to start actual device output */
|
||||
devfunarg_t tty_echo; /* routine to echo characters input */
|
||||
devfun_t tty_ocancel; /* cancel any ongoing device output */
|
||||
devfun_t tty_break; /* let the device send a break */
|
||||
|
||||
/* Terminal parameters and status. */
|
||||
int tty_position; /* current position on the screen for echoing */
|
||||
char tty_reprint; /* 1 when echoed input messed up, else 0 */
|
||||
char tty_escaped; /* 1 when LNEXT (^V) just seen, else 0 */
|
||||
char tty_inhibited; /* 1 when STOP (^S) just seen (stops output) */
|
||||
char tty_pgrp; /* slot number of controlling process */
|
||||
char tty_openct; /* count of number of opens of this tty */
|
||||
|
||||
/* Information about incomplete I/O requests is stored here. */
|
||||
char tty_inrepcode; /* reply code, TASK_REPLY or REVIVE */
|
||||
char tty_incaller; /* process that made the call (usually FS) */
|
||||
char tty_inproc; /* process that wants to read from tty */
|
||||
vir_bytes tty_in_vir; /* virtual address where data is to go */
|
||||
int tty_inleft; /* how many chars are still needed */
|
||||
int tty_incum; /* # chars input so far */
|
||||
int tty_instatus; /* status of last sys_vircopy() action */
|
||||
char tty_outrepcode; /* reply code, TASK_REPLY or REVIVE */
|
||||
char tty_outcaller; /* process that made the call (usually FS) */
|
||||
char tty_outproc; /* process that wants to write to tty */
|
||||
vir_bytes tty_out_vir; /* virtual address where data comes from */
|
||||
int tty_outleft; /* # chars yet to be output */
|
||||
int tty_outcum; /* # chars output so far */
|
||||
int tty_outstatus; /* status of last sys_vircopy() action */
|
||||
char tty_iocaller; /* process that made the call (usually FS) */
|
||||
char tty_ioproc; /* process that wants to do an ioctl */
|
||||
int tty_ioreq; /* ioctl request code */
|
||||
vir_bytes tty_iovir; /* virtual address of ioctl buffer */
|
||||
|
||||
/* Miscellaneous. */
|
||||
devfun_t tty_ioctl; /* set line speed, etc. at the device level */
|
||||
devfun_t tty_close; /* tell the device that the tty is closed */
|
||||
void *tty_priv; /* pointer to per device private data */
|
||||
struct termios tty_termios; /* terminal attributes */
|
||||
struct winsize tty_winsize; /* window size (#lines and #columns) */
|
||||
|
||||
u16_t tty_inbuf[TTY_IN_BYTES];/* tty input buffer */
|
||||
} tty_t;
|
||||
|
||||
/* Memory allocated in tty.c, so extern here. */
|
||||
extern tty_t tty_table[NR_CONS+NR_RS_LINES+NR_PTYS];
|
||||
extern int ccurrent; /* currently visible console */
|
||||
|
||||
/* Values for the fields. */
|
||||
#define NOT_ESCAPED 0 /* previous character is not LNEXT (^V) */
|
||||
#define ESCAPED 1 /* previous character was LNEXT (^V) */
|
||||
#define RUNNING 0 /* no STOP (^S) has been typed to stop output */
|
||||
#define STOPPED 1 /* STOP (^S) has been typed to stop output */
|
||||
|
||||
/* Fields and flags on characters in the input queue. */
|
||||
#define IN_CHAR 0x00FF /* low 8 bits are the character itself */
|
||||
#define IN_LEN 0x0F00 /* length of char if it has been echoed */
|
||||
#define IN_LSHIFT 8 /* length = (c & IN_LEN) >> IN_LSHIFT */
|
||||
#define IN_EOT 0x1000 /* char is a line break (^D, LF) */
|
||||
#define IN_EOF 0x2000 /* char is EOF (^D), do not return to user */
|
||||
#define IN_ESC 0x4000 /* escaped by LNEXT (^V), no interpretation */
|
||||
|
||||
/* Times and timeouts. */
|
||||
#define force_timeout() ((void) (0))
|
||||
|
||||
/* Memory allocated in tty.c, so extern here. */
|
||||
extern timer_t *tty_timers; /* queue of TTY timers */
|
||||
extern clock_t tty_next_timeout; /* next TTY timeout */
|
||||
|
||||
/* Number of elements and limit of a buffer. */
|
||||
#define buflen(buf) (sizeof(buf) / sizeof((buf)[0]))
|
||||
#define bufend(buf) ((buf) + buflen(buf))
|
||||
|
||||
/* Memory allocated in tty.c, so extern here. */
|
||||
extern struct kenviron kenv; /* kernel environment (a.o.: pc_at, ega) */
|
||||
|
||||
|
||||
/* Function prototypes for TTY driver. */
|
||||
/* tty.c */
|
||||
_PROTOTYPE( void handle_events, (struct tty *tp) );
|
||||
_PROTOTYPE( void sigchar, (struct tty *tp, int sig) );
|
||||
_PROTOTYPE( void tty_task, (void) );
|
||||
_PROTOTYPE( int in_process, (struct tty *tp, char *buf, int count) );
|
||||
_PROTOTYPE( void out_process, (struct tty *tp, char *bstart, char *bpos,
|
||||
char *bend, int *icount, int *ocount) );
|
||||
_PROTOTYPE( void tty_wakeup, (clock_t now) );
|
||||
_PROTOTYPE( void tty_reply, (int code, int replyee, int proc_nr,
|
||||
int status) );
|
||||
_PROTOTYPE( void tty_devnop, (struct tty *tp) );
|
||||
|
||||
/* rs232.c */
|
||||
_PROTOTYPE( void rs_init, (struct tty *tp) );
|
||||
|
||||
#if (CHIP == INTEL)
|
||||
/* console.c */
|
||||
_PROTOTYPE( void kputc, (int c) );
|
||||
_PROTOTYPE( void cons_stop, (void) );
|
||||
_PROTOTYPE( void do_new_kmess, (message *m) );
|
||||
_PROTOTYPE( void do_diagnostics, (message *m) );
|
||||
_PROTOTYPE( void scr_init, (struct tty *tp) );
|
||||
_PROTOTYPE( void toggle_scroll, (void) );
|
||||
_PROTOTYPE( int con_loadfont, (message *m) );
|
||||
_PROTOTYPE( void select_console, (int cons_line) );
|
||||
|
||||
/* keyboard.c */
|
||||
_PROTOTYPE( void kb_init, (struct tty *tp) );
|
||||
_PROTOTYPE( int kbd_loadmap, (message *m) );
|
||||
_PROTOTYPE( void do_panic_dumps, (message *m) );
|
||||
_PROTOTYPE( void do_fkey_ctl, (message *m) );
|
||||
_PROTOTYPE( void do_interrupt, (message *m) );
|
||||
|
||||
/* pty.c */
|
||||
_PROTOTYPE( void do_pty, (struct tty *tp, message *m_ptr) );
|
||||
_PROTOTYPE( void pty_init, (struct tty *tp) );
|
||||
|
||||
/* vidcopy.s */
|
||||
_PROTOTYPE( void vid_vid_copy, (unsigned src, unsigned dst, unsigned count));
|
||||
_PROTOTYPE( void mem_vid_copy, (u16_t *src, unsigned dst, unsigned count));
|
||||
|
||||
#endif /* (CHIP == INTEL) */
|
||||
|
||||
|
||||
160
drivers/tty/vidcopy.s
Normal file
160
drivers/tty/vidcopy.s
Normal file
@@ -0,0 +1,160 @@
|
||||
#
|
||||
! This file contains two specialized assembly code routines to update the
|
||||
! video memory. The routines can copy from user to video memory, or from
|
||||
! video to video memory.
|
||||
|
||||
! sections
|
||||
|
||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
||||
|
||||
! exported functions
|
||||
|
||||
.define _mem_vid_copy ! copy data to video ram
|
||||
.define _vid_vid_copy ! move data in video ram
|
||||
|
||||
! The routines only guarantee to preserve the registers the C compiler
|
||||
! expects to be preserved (ebx, esi, edi, ebp, esp, segment registers, and
|
||||
! direction bit in the flags).
|
||||
|
||||
.sect .text
|
||||
!*===========================================================================*
|
||||
!* mem_vid_copy *
|
||||
!*===========================================================================*
|
||||
! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count);
|
||||
!
|
||||
! Copy count characters from kernel memory to video memory. Src is an ordinary
|
||||
! pointer to a word, but dst and count are character (word) based video offset
|
||||
! and count. If src is null then screen memory is blanked by filling it with
|
||||
! blank_color.
|
||||
|
||||
_mem_vid_copy:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
push esi
|
||||
push edi
|
||||
push es
|
||||
mov esi, 8(ebp) ! source
|
||||
mov edi, 12(ebp) ! destination
|
||||
mov edx, 16(ebp) ! count
|
||||
mov es, (_vid_seg) ! segment containing video memory
|
||||
cld ! make sure direction is up
|
||||
mvc_loop:
|
||||
and edi, (_vid_mask) ! wrap address
|
||||
mov ecx, edx ! one chunk to copy
|
||||
mov eax, (_vid_size)
|
||||
sub eax, edi
|
||||
cmp ecx, eax
|
||||
jbe 0f
|
||||
mov ecx, eax ! ecx = min(ecx, vid_size - edi)
|
||||
0: sub edx, ecx ! count -= ecx
|
||||
shl edi, 1 ! byte address
|
||||
add edi, (_vid_off) ! in video memory
|
||||
test esi, esi ! source == 0 means blank the screen
|
||||
jz mvc_blank
|
||||
mvc_copy:
|
||||
rep ! copy words to video memory
|
||||
o16 movs
|
||||
jmp mvc_test
|
||||
mvc_blank:
|
||||
mov eax, (_blank_color) ! ax = blanking character
|
||||
rep
|
||||
o16 stos ! copy blanks to video memory
|
||||
!jmp mvc_test
|
||||
mvc_test:
|
||||
sub edi, (_vid_off)
|
||||
shr edi, 1 ! back to a word address
|
||||
test edx, edx
|
||||
jnz mvc_loop
|
||||
mvc_done:
|
||||
pop es
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
|
||||
!*===========================================================================*
|
||||
!* vid_vid_copy *
|
||||
!*===========================================================================*
|
||||
! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count);
|
||||
!
|
||||
! Copy count characters from video memory to video memory. Handle overlap.
|
||||
! Used for scrolling, line or character insertion and deletion. Src, dst
|
||||
! and count are character (word) based video offsets and count.
|
||||
|
||||
_vid_vid_copy:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
push esi
|
||||
push edi
|
||||
push es
|
||||
mov esi, 8(ebp) ! source
|
||||
mov edi, 12(ebp) ! destination
|
||||
mov edx, 16(ebp) ! count
|
||||
mov es, (_vid_seg) ! segment containing video memory
|
||||
cmp esi, edi ! copy up or down?
|
||||
jb vvc_down
|
||||
vvc_up:
|
||||
cld ! direction is up
|
||||
vvc_uploop:
|
||||
and esi, (_vid_mask) ! wrap addresses
|
||||
and edi, (_vid_mask)
|
||||
mov ecx, edx ! one chunk to copy
|
||||
mov eax, (_vid_size)
|
||||
sub eax, esi
|
||||
cmp ecx, eax
|
||||
jbe 0f
|
||||
mov ecx, eax ! ecx = min(ecx, vid_size - esi)
|
||||
0: mov eax, (_vid_size)
|
||||
sub eax, edi
|
||||
cmp ecx, eax
|
||||
jbe 0f
|
||||
mov ecx, eax ! ecx = min(ecx, vid_size - edi)
|
||||
0: sub edx, ecx ! count -= ecx
|
||||
call vvc_copy ! copy video words
|
||||
test edx, edx
|
||||
jnz vvc_uploop ! again?
|
||||
jmp vvc_done
|
||||
vvc_down:
|
||||
std ! direction is down
|
||||
lea esi, -1(esi)(edx*1) ! start copying at the top
|
||||
lea edi, -1(edi)(edx*1)
|
||||
vvc_downloop:
|
||||
and esi, (_vid_mask) ! wrap addresses
|
||||
and edi, (_vid_mask)
|
||||
mov ecx, edx ! one chunk to copy
|
||||
lea eax, 1(esi)
|
||||
cmp ecx, eax
|
||||
jbe 0f
|
||||
mov ecx, eax ! ecx = min(ecx, esi + 1)
|
||||
0: lea eax, 1(edi)
|
||||
cmp ecx, eax
|
||||
jbe 0f
|
||||
mov ecx, eax ! ecx = min(ecx, edi + 1)
|
||||
0: sub edx, ecx ! count -= ecx
|
||||
call vvc_copy
|
||||
test edx, edx
|
||||
jnz vvc_downloop ! again?
|
||||
cld ! C compiler expects up
|
||||
!jmp vvc_done
|
||||
vvc_done:
|
||||
pop es
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
! Copy video words. (Inner code of both the up and downcopying loop.)
|
||||
vvc_copy:
|
||||
shl esi, 1
|
||||
shl edi, 1 ! byte addresses
|
||||
add esi, (_vid_off)
|
||||
add edi, (_vid_off) ! in video memory
|
||||
rep
|
||||
eseg o16 movs ! copy video words
|
||||
sub esi, (_vid_off)
|
||||
sub edi, (_vid_off)
|
||||
shr esi, 1
|
||||
shr edi, 1 ! back to word addresses
|
||||
ret
|
||||
|
||||
Reference in New Issue
Block a user