plan 9 kernel history: overview | file list | diff list

alphapc/kbd.c (diff list | history)

1999/0415/sys/src/9/alphapc/kbd.c:62,671999/0514/sys/src/9/alphapc/kbd.c:62,71 (short | long)
1999/0415    
[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1', 
[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11, 
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1999/0514    
[0x60]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x68]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x70]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x78]	No,	View,	No,	KF|14,	No,	No,	No,	No, 
1999/0415    
}; 
 
uchar kbtabshift[] = 
1999/0415/sys/src/9/alphapc/kbd.c:78,831999/0514/sys/src/9/alphapc/kbd.c:82,91
1999/0415    
[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1', 
[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11, 
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1999/0514    
[0x60]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x68]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x70]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x78]	No,	KF|14,	No,	KF|14,	No,	No,	No,	No, 
1999/0415    
}; 
 
uchar kbtabesc1[] = 
1999/0415/sys/src/9/alphapc/kbd.c:94,991999/0514/sys/src/9/alphapc/kbd.c:102,111
1999/0415    
[0x48]	Up,	Pgup,	No,	Left,	No,	Right,	No,	End, 
[0x50]	Down,	Pgdown,	Ins,	Del,	No,	No,	No,	No, 
[0x58]	No,	No,	No,	No,	No,	No,	No,	No, 
1999/0514    
[0x60]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x68]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x70]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x78]	No,	KF|14,	No,	No,	No,	No,	No,	No, 
1999/0415    
}; 
 
enum 
1999/0415/sys/src/9/alphapc/kbd.c:379,3851999/0514/sys/src/9/alphapc/kbd.c:391,397
1999/0415    
void 
kbdinit(void) 
{ 
	int c, x; 
1999/0514    
	int c; 
1999/0415    
 
	kbdq = qopen(4*1024, 0, 0, 0); 
	if(kbdq == nil) 
1999/0415/sys/src/9/alphapc/kbd.c:390,3991999/0514/sys/src/9/alphapc/kbd.c:402,409
1999/0415    
 
	/* wait for a quiescent controller */ 
	while((c = inb(Status)) & (Outbusy | Inready)) 
		if(c & Inready) { 
			x = inb(Data); 
			USED(x); 
		} 
1999/0514    
		if(c & Inready) 
			inb(Data); 
1999/0415    
 
	/* get current controller command byte */ 
	outb(Cmd, 0x20); 
1999/0514/sys/src/9/alphapc/kbd.c:25,312000/0108/sys/src/9/alphapc/kbd.c:25,31 (short | long)
1999/0415    
 
	PF=		Spec|0x20,	/* num pad function key */ 
	View=		Spec|0x00,	/* view (shift window up) */ 
	KF=		Spec|0x40,	/* function key */ 
2000/0108    
	KF=		0xF000,	/* function key (begin Unicode private space) */ 
1999/0415    
	Shift=		Spec|0x60, 
	Break=		Spec|0x61, 
	Ctrl=		Spec|0x62, 
1999/0514/sys/src/9/alphapc/kbd.c:39,542000/0108/sys/src/9/alphapc/kbd.c:39,59
1999/0415    
	Up=		KF|14, 
	Pgup=		KF|15, 
	Print=		KF|16, 
	Left=		View, 
	Right=		View, 
2000/0108    
	Left=		KF|17, 
	Right=		KF|18, 
1999/0415    
	End=		'\r', 
	Down=		View, 
	Pgdown=		View, 
2000/0108    
	Pgdown=		KF|19, 
1999/0415    
	Ins=		KF|20, 
2000/0108    
	Scroll=	KF|21, 
1999/0415    
	Del=		0x7F, 
}; 
 
uchar kbtab[] =  
2000/0108    
/* 
 * The codes at 0x79 and 0x81 are produed by the PFU Happy Hacking keyboard. 
 * A 'standard' keyboard doesn't produce anything above 0x58. 
 */ 
Rune kbtab[] =  
1999/0415    
{ 
[0x00]	No,	0x1b,	'1',	'2',	'3',	'4',	'5',	'6', 
[0x08]	'7',	'8',	'9',	'0',	'-',	'=',	'\b',	'\t', 
1999/0514/sys/src/9/alphapc/kbd.c:58,642000/0108/sys/src/9/alphapc/kbd.c:63,69
1999/0415    
[0x28]	'\'',	'`',	Shift,	'\\',	'z',	'x',	'c',	'v', 
[0x30]	'b',	'n',	'm',	',',	'.',	'/',	Shift,	'*', 
[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5, 
[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	KF|12,	'7', 
2000/0108    
[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7', 
1999/0415    
[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1', 
[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11, 
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1999/0514/sys/src/9/alphapc/kbd.c:65,742000/0108/sys/src/9/alphapc/kbd.c:70,79
1999/0514    
[0x60]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x68]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x70]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x78]	No,	View,	No,	KF|14,	No,	No,	No,	No, 
2000/0108    
[0x78]	No,	View,	No,	Up,	No,	No,	No,	No, 
1999/0415    
}; 
 
uchar kbtabshift[] = 
2000/0108    
Rune kbtabshift[] = 
1999/0415    
{ 
[0x00]	No,	0x1b,	'!',	'@',	'#',	'$',	'%',	'^', 
[0x08]	'&',	'*',	'(',	')',	'_',	'+',	'\b',	'\t', 
1999/0514/sys/src/9/alphapc/kbd.c:78,842000/0108/sys/src/9/alphapc/kbd.c:83,89
1999/0415    
[0x28]	'"',	'~',	Shift,	'|',	'Z',	'X',	'C',	'V', 
[0x30]	'B',	'N',	'M',	'<',	'>',	'?',	Shift,	'*', 
[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5, 
[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	KF|12,	'7', 
2000/0108    
[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7', 
1999/0415    
[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1', 
[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11, 
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1999/0514/sys/src/9/alphapc/kbd.c:85,942000/0108/sys/src/9/alphapc/kbd.c:90,99
1999/0514    
[0x60]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x68]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x70]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x78]	No,	KF|14,	No,	KF|14,	No,	No,	No,	No, 
2000/0108    
[0x78]	No,	Up,	No,	Up,	No,	No,	No,	No, 
1999/0415    
}; 
 
uchar kbtabesc1[] = 
2000/0108    
Rune kbtabesc1[] = 
1999/0415    
{ 
[0x00]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x08]	No,	No,	No,	No,	No,	No,	No,	No, 
1999/0514/sys/src/9/alphapc/kbd.c:105,1112000/0108/sys/src/9/alphapc/kbd.c:110,116
1999/0514    
[0x60]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x68]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x70]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x78]	No,	KF|14,	No,	No,	No,	No,	No,	No, 
2000/0108    
[0x78]	No,	Up,	No,	No,	No,	No,	No,	No, 
1999/0415    
}; 
 
enum 
1999/0514/sys/src/9/alphapc/kbd.c:231,2372000/0108/sys/src/9/alphapc/kbd.c:236,242
1999/0415    
	static int esc1, esc2; 
	static int alt, caps, ctl, num, shift; 
	static int collecting, nk; 
	static uchar kc[5]; 
2000/0108    
	static Rune kc[5]; 
1999/0415    
	int keyup; 
 
	/* 
1999/0514/sys/src/9/alphapc/kbd.c:314,3202000/0108/sys/src/9/alphapc/kbd.c:319,325
1999/0415    
	/* 
 	 *  normal character 
	 */ 
	if(!(c & Spec)){ 
2000/0108    
	if(!(c & (Spec|KF))){ 
1999/0415    
		if(ctl){ 
			if(alt && c == Del) 
				exit(0); 
2000/0108/sys/src/9/alphapc/kbd.c:389,3982000/0401/sys/src/9/alphapc/kbd.c:389,418 (short | long)
1999/0415    
		return; 
	} 
	auxputc = putc; 
	intrenable(VectorAUX, i8042intr, 0, BUSUNKNOWN); 
2000/0401    
	intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux"); 
1999/0415    
	iunlock(&i8042lock); 
} 
 
2000/0401    
static void 
setscan(int code) 
{ 
	char *err = "setscan: set scan code failed\n"; 
 
	outb(Data, 0xF0); 
	if(inready() < 0 || inb(Data) != 0xFA || outready() < 0) { 
		print(err); 
		return; 
	} 
	outb(Data, code); 
	if(inready() < 0) { 
		print(err); 
		return; 
	} 
	inb(Data); 
	if(outready() < 0) 
		print(err); 
} 
 
1999/0415    
void 
kbdinit(void) 
{ 
2000/0108/sys/src/9/alphapc/kbd.c:403,4102000/0401/sys/src/9/alphapc/kbd.c:423,433
1999/0415    
		panic("kbdinit"); 
	qnoblock(kbdq, 1); 
 
	intrenable(VectorKBD, i8042intr, 0, BUSUNKNOWN); 
2000/0401    
	ioalloc(Data, 1, 0, "kbd"); 
	ioalloc(Cmd, 1, 0, "kbd"); 
1999/0415    
 
2000/0401    
	intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd"); 
 
1999/0415    
	/* wait for a quiescent controller */ 
	while((c = inb(Status)) & (Outbusy | Inready)) 
1999/0514    
		if(c & Inready) 
2000/0108/sys/src/9/alphapc/kbd.c:429,4322000/0401/sys/src/9/alphapc/kbd.c:452,456
1999/0415    
		print("kbd init failed\n"); 
	outb(Data, ccc); 
	outready(); 
2000/0401    
	setscan(0x02); 
1999/0415    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)