Project

General

Profile

Statistics
| Revision:

root / lab3 / keyboard.c @ 15

History | View | Annotate | Download (2.46 KB)

1
#include "keyboard.h"
2

    
3
uint8_t scan_code=0;            // make code or break code
4
int keyboard_id = KEYBOARD_IRQ;         // KEYBOARD_IRQ is defined in interrupt.h in .minix-src folder
5
uint32_t cnt = 0;                                                                        // counter of sys_inb calls
6
                                        
7
int (util_sys_inb)(int port, uint8_t *value) { //transform 8 bit into 32 bit
8

    
9
  uint32_t new_val;                           //initializing 32 bit variable
10

    
11
  if(sys_inb(port,&new_val)!=0){              //verifies if there is an error
12
      printf("Error in util_sys_inb\n");
13
      return 1;
14
  }
15
  *value=new_val & 0xFF;                      //dereferencing "value"
16
  #ifdef LAB3
17
  cnt++;
18
  #endif
19
  
20
  return 0;
21
}
22

    
23
void (kbc_ih)(void){
24
  uint8_t status_reg;
25

    
26
  if(util_sys_inb(STATUS_REG,&status_reg)!=0){ //checks if there is an error
27
    printf("Error reading status register in the keyboard interruption\n");
28
    return;
29
  }
30
  if(((status_reg & STAT_REG_OBF)==0) ||((status_reg&(STAT_REG_PAR|STAT_REG_TIMEOUT))!=0)|| ((status_reg&STAT_REG_AUX)!=0)){ //checks if there is a parity or timeout error (mask -> 0xC0, bit 7 and 6 set), checks if output buffer is empty and checks if there is data coming from the mouse
31
    printf("Parity/Timeout error or output buffer is empty or data coming from the mouse\n");
32
    return;
33
  }
34
  if(util_sys_inb(OUTPUT_BUF,&scan_code)!=0){//checks if there is an error
35
    printf("Error reading output buffer in the keyboard interruption\n");
36
    return;
37
  }
38

    
39
}
40

    
41

    
42
int (kbc_subscribe_int)(uint8_t *bit_no) {    //similar function to that of timer_subscribe_int
43
    *bit_no = BIT(keyboard_id);
44
    if(sys_irqsetpolicy(KEYBOARD_IRQ,(IRQ_REENABLE|IRQ_EXCLUSIVE),&keyboard_id)==1){  //operation to subscribe int
45
        printf("Error subscribing int\n");
46
        return 1;
47
    }
48
  return 0;
49
}
50

    
51
int (kbc_unsubscribe_int)() {           //similar function to that of timer_unsubscribe_int
52
  if(sys_irqrmpolicy(&keyboard_id)==1){
53
      printf("Error unsubscribing int\n");
54
      return 1;
55
  }
56
  return 0;
57
}
58

    
59
int (reenable_interrupt)()
60
{
61
  uint8_t command;
62

    
63
  if(sys_outb(STATUS_REG,READ_COMMAND)!=0){
64
    printf("Error writing read-command\n");
65
    return 1;
66
  }
67

    
68
  if(util_sys_inb(OUTPUT_BUF, &command)!=0){
69
    printf("Error reading output buffer in enable_interrupt\n");
70
    return 1;
71
  }
72

    
73
  command = command | INT_ENABLE;
74

    
75
  if(sys_outb(STATUS_REG,OUTPUT_BUF)!=0){
76
    printf("Error writing output buffer\n");
77
    return 1;
78
  }
79

    
80
  if(sys_outb(OUTPUT_BUF,command)!=0){
81
    printf("Error writing new buffer status\n");
82
    return 1;
83
  }
84

    
85
  return 0;
86
}