OSDev.org
https://forum.osdev.org/

Something wrong with KEYBOARD driver
https://forum.osdev.org/viewtopic.php?f=1&t=16817
Page 1 of 1

Author:  negcit.K [ Wed Apr 16, 2008 2:05 am ]
Post subject:  Something wrong with KEYBOARD driver

I have written a keyboard driver file, keyboard.c, that just do nothing but display the general_protection interrupt information.
i want it to handle a keybaord interrupt but it only handled the general_protection interrupt which is not my except. Now i have no ideal how to fix it well, and i really need your help. Thanks.

there is the code i wrote:

Scancode set 2 is what i wanna take.
I set the idt of IRQ1 in the file trap.c set_trap_gate(0x21,keyboard_interrupt)
And i do enable the IRQ1 in the function con_write(). outb_p(inb_p(0x21)&0xfd, 0x21);
And i do set the interrupt bit in main function init.c sti();


Code:
#include <keyboard.h>
#include <asm/io.h>


static unsigned char scancode;
static unsigned char brkflag;
static unsigned char mode;
static unsigned char e0;
static unsigned char key;
static unsigned char leds;


unsigned char key_map[] = {
/*0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f*/
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 9 ,'`',/*00-0F*/
  0x0,0x0,0x0,0x0,0x0,'q','1',0x0,0x0,0x0,'z','s','a','w','2',0x0,/*10-1F*/
  0x0,'c','x','d','e','4','3',0x0,0x0,32, 'v','f','t','r','5',0x0,/*20-2F*/
  0x0,'n','b','k','g','y','6',0x0,0x0,0x0,'m','j','u','7','8',0x0,/*30-3F*/
  0x0,',','k','i','o','0','9',0x0,0x0,'.','/','l',';','p','-',0x0,/*40-4F*/
  0x0,0x0,'\'',0x0,'[','=',0x0,0x0,0x0,0x0,13,']',0x0,'\\',0x0,0x0,/*50-5F*/
  0x0,0x0,0x0,0x0,0x0,0x0, 8 ,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,/*60-6F*/
  '0','.','2','5','6','8',0x0,0x0,0x0,'+','3','1','*','9',0x0,0x0,/*70-7F*/
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};/*80-8F*/

unsigned char shift_map[] = {
/*0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f*/
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 9 ,'~',/*00-0F*/
  0x0,0x0,0x0,0x0,0x0,'Q','!',0x0,0x0,0x0,'Z','S','A','W','@',0x0,/*10-1F*/
  0x0,'C','X','D','E','$','#',0x0,0x0,32, 'V','F','T','R','%',0x0,/*20-2F*/
  0x0,'N','B','K','G','Y','^',0x0,0x0,0x0,'M','J','U','&','*',0x0,/*30-3F*/
  0x0,'<','K','I','O',')','(',0x0,0x0,'>','?','L',':','p','_',0x0,/*40-4F*/
  0x0,0x0,'\"',0x0,'{','+',0x0,0x0,0x0,0x0,13,'}',0x0,'|',0x0,0x0,/*50-5F*/
  0x0,0x0,0x0,0x0,0x0,0x0, 8 ,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,/*60-6F*/
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,/*70-7F*/
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};/*80-8F*/

unsigned char alt_map[] = {
/*0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f*/
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 9 ,'`',/*00-0F*/
  0x0,0x0,0x0,0x0,0x0,'q','1',0x0,0x0,0x0,'z','s','a','w','2',0x0,/*10-1F*/
  0x0,'c','x','d','e','4','3',0x0,0x0,32, 'v','f','t','r','5',0x0,/*20-2F*/
  0x0,'n','b','k','g','y','6',0x0,0x0,0x0,'m','j','u','7','8',0x0,/*30-3F*/
  0x0,',','k','i','o','0','9',0x0,0x0,'.','/','l',';','p','-',0x0,/*40-4F*/
  0x0,0x0,'\'',0x0,'[','=',0x0,0x0,0x0,0x0,13,']',0x0,'\\',0x0,0x0,/*50-5F*/
  0x0,0x0,0x0,0x0,0x0,0x0, 8 ,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,/*60-6F*/
  '0','.','2','5','6','8',0x0,0x0,0x0,'+','3','1','*','9',0x0,0x0,/*70-7F*/
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};/*80-8F*/



static void kb_wait(void);

static void non(void)
{
  /* just doing nothing */
}

static void fun(void)
{
  /* Not implement */
}

static void prt(void)
{
  unsigned char *map;
 
  if (mode & (RALT | LALT))
    map = alt_map;
  else if (mode & (RSHIFT | LSHIFT))
    map = shift_map;
  else
    map = key_map;
 
  key = *(map + scancode);
 
  if (mode & (LCTRL | RCTRL | CAPS_STATE))
    if (key >= 'a' && key <= '}')
      key -= 32;
  if (mode & (LCTRL | RCTRL))
      if (key >= 64 && key <= 64 + 32)
   key -= 64;
   
  printk("%c",key);
}

static void ctl(void)
{
  unsigned char temp;
  temp = LCTRL;

  if (e0 & E0)
    temp <<= 1;

  mode |= temp;
}

static void alt(void)
{
  unsigned char temp;

  if (e0 & E0)
    temp <<= 1;
 
  mode |= temp;
}

static void sft(void)
{
  if (scancode == 0x12)
    mode |= LSHIFT;
  else if (scancode == 0x59)
    mode |= RSHIFT;
}

static void cur(void)
{
  /*Not implement*/
}

static void set_leds(void)
{
  kb_wait();
  outb(0xed, 0x60);   /* set leds command */
  kb_wait();
  outb(leds, 0x60);   /* send param */
}

static void sroll(void)
{
  leds ^= SCROLL_LOCK;
  set_leds();
}

static void num_lock(void)
{
  leds ^= NUM_LOCK;
  set_leds();
}

static void cap(void)
{
  leds ^= CAPS_LOCK;
     set_leds();
}

static void kb_wait(void)
{
  while (inb(0x64) & 0x02)
    ;
}



void keyboard_interrupt(void)
{
  unsigned char a;

  void (*kfun_table[])(void) = {
    /*0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f*/
    non,fun,non,fun,fun,fun,fun,fun,non,fun,fun,fun,fun,prt,prt,non,/*00-0F*/
    non,alt,alt,non,ctl,prt,prt,non,non,non,prt,prt,prt,prt,prt,non,/*10-1F*/
    non,prt,prt,prt,prt,prt,prt,non,non,prt,prt,prt,prt,prt,prt,prt,/*20-2F*/
    non,prt,prt,prt,prt,prt,prt,non,non,non,prt,prt,prt,prt,prt,prt,/*30-3F*/
    non,prt,prt,prt,prt,prt,prt,non,non,prt,prt,prt,prt,prt,prt,prt,/*40-4F*/
    non,non,prt,non,prt,prt,non,non,cap,sft,prt,prt,non,prt,non,non,/*50-5F*/
    non,non,non,non,non,non,prt,non,non,cur,non,cur,cur,non,non,non,/*60-6F*/
    cur,cur,cur,cur,cur,cur,cur,cur,cur,cur,cur,cur,cur,cur,cur,cur,/*70-7F*/
    non,non,non,fun,non,non,non,non,non,non,non,non,non,non,non,non /*80-8F*/
  };

  scancode = inb(0x60);

  if (brkflag && scancode == 0x11) {
    if (e0 & E0) {
      mode &= ~RALT;
      e0   &= ~E0;
    }else
      mode &= ~LALT;
    brkflag = 0;
  }else if (brkflag && scancode == 0x14) {
    if (e0 & E0) {
      mode &= ~RCTRL;
      e0   &= ~E0;
    }else
      mode &= ~LCTRL;
    brkflag = 0;
  }else if (brkflag) {
    e0 = 0;
    brkflag = 0;
  }else if (scancode == 0xe0)
    e0 |= E0;
  else if (scancode == 0xe1)
    e0 |= E1;
  else if (scancode == 0xF0)       /* set brkflag  */
    brkflag = 1;
  else
    (*kfun_table[scancode])();

  a = inb(0x61);      /* disable KB   *
  outb(a|0x80, 0x61);      /* enable  KB   */
  outb(a&0x7f, 0x61);      /* E O I        */
       
   
               
     
 
printk("%c",key);
 

}




and the macro values of mode, leds, e0 are defined at keyboard.h

Code:
#ifndef KEYBOARD_H
#define KEYBOADR_H

/* macro of mode */
#define LSHIFT      0x01
#define RSHIFT      0x02
#define LCTRL       0x04
#define RCTRL       0x08
#define LALT        0x10
#define RALT        0x20
#define CAPS_STATE  0x40
#define CAPS        0x80

/* macro of leds */
#define SCROLL_LOCK 0x01
#define NUM_LOCK    0x02
#define CAPS_LOCK   0x04


/* macro of eo */
#define E0          0x01
#define E1          0x02



void keyboard_interrupt(void);         
           


#endif  /*keyboard.h*/




Thanks a lot for you reading here.

Author:  Combuster [ Wed Apr 16, 2008 6:36 am ]
Post subject: 

[wiki]Category:FAQ[/wiki] - I suggest you try that first.

Author:  edfed [ Wed Apr 16, 2008 7:10 am ]
Post subject: 

before to be able to manage a keyboard from PM, you sould reprogramm the PIC to point to the vector you want for keybord.

in PM, the 16 first interrupts are for internal errors managment.

i'm pretty sure that each time you hit a key, it generate the error n°9 coprossessor segment overun (IRQ 9).

Code:
if you want to know more about it, please seek documentations and yeahhh!
remapirq:
        mov     al,11h
        out     20h,al
        out     0a0h,al
        mov     al,32       
        out     21h,al
        mov     al,40
        out     0a1h,al
        mov     al,4
        out     21h,al
        mov     al,2
        out     0a1h,al
        mov     al,1
        out     21h,al
        out     0a1h,al
        mov     al,0fbh
        out     21h,al
        mov     al,0ffh
        out     0a1h,al
        ret

Author:  negcit.K [ Thu Apr 17, 2008 2:08 am ]
Post subject: 

Combuster wrote:
...

Which part do you want me to search?


Quote:
before to be able to manage a keyboard from PM, you sould reprogramm the PIC to point to the vector you want for keybord.

I dit it

Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/