PIC question. (fwd)

ollie lho ollie at sis.com.tw
Wed Oct 23 22:09:01 CEST 2002


On Thu, 2002-10-24 at 09:58, Adam Sulmicki wrote:
> > Is it possible that your BIOS reprogrammed the keyboard controller
> > in the wrong way ??
> 
> it is possible, in fact it the only unchecked list on my To Check
> List:
> 	PIC not getting (re) programmed		CHECK
> 	PIC interrupt mask is wrong		CHECK
> 	IF  flag being cleared			CHECK
> 	keyboard controller			????
> 
> so I guess that leaves the keyboard controller only.
> That brings me to the point, what sort of references did you
> use to write
> 
> 	cvs-freebios/freebios/src/pc80/keyboard.c
>

Here is the more solid and well documented version which is used in our 
internal version of etherboot.

void pc_keyboard_init()
{
	volatile unsigned char regval;

	/* ------------------- controller side ----------------------*/
	printf("reset keyboard \n");
	/* send cmd = 0xAA, self test 8042 */
	outb(0xaa, 0x64);

	/* empty input buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x02))
		post_code(0);
	/* empty output buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x01) == 0)
		post_code(1);

	/* read self-test result, 0x55 should be returned form 0x60 */
	if ((regval = inb(0x60) != 0x55))
		printf("self test failed\n");

	/* send cmd = 0xAA, keyboard interface test */
	outb(0xab, 0x64);

	/* empty input buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x02))
		post_code(0);
	/* empty output buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x01) == 0)
		post_code(1);

	/* read keyboard interface test result, 0x00 should be returned form
0x60 */
	if ((regval = inb(0x60) != 0x00))
		printf("keyboard interface test failed\n");

	/* Enable Keyboard clock */
	outb(0xae, 0x64);
	outb(0xa8, 0x64);

	/* ------------------- keyboard side ------------------------*/
	/* reset kerboard and self test  (keyboard side) */
	outb(0xff, 0x60);
	/* empty inut buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x02))
		post_code(4);
	/* empty output buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x01) == 0)
		post_code(5);
	/* keyboard should return ACK */
	if ((regval = inb(0x60) != 0xfa))
		printf("keyboard self test failed\n");

	while ((inb(0x64) & 0x01) == 0)
		post_code(6);
	if ((regval = inb(0x60) != 0xaa))
		printf("keyboard self test failed\n");

	/* Disable keyboard */
	outb(0xf5, 0x60);
	/* empty inut buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x02))
		post_code(4);
	/* empty output buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x01) == 0)
		post_code(5);
	/* keyboard should return ACK */
	if ((regval = inb(0x60) != 0xfa))
		printf("disable keyboard failed\n");

	/* Write Keyboard Mode */
	outb(0x60, 0x64);
	while ((inb(0x64) & 0x02))
		post_code(2);
	/* send cmd: scan code convert, disable mouse, enable IRQ 1 */
	outb(0x61, 0x60);
	while ((inb(0x64) & 0x02))
		post_code(3);

	/* Enable keyboard */
	outb(0xf4, 0x60);
	/* empty inut buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x02))
		post_code(4);
	/* empty output buffer or any other command/data will be lost */
	while ((inb(0x64) & 0x01) == 0)
		post_code(5);
	/* keyboard should return ACK */
	if ((regval = inb(0x60) != 0xfa))
		printf("enable keyboard failed\n");
}





More information about the coreboot mailing list