Project

General

Profile

Statistics
| Revision:

root / lab3 / lab3.c @ 9

History | View | Annotate | Download (5.78 KB)

1
#include <lcom/lcf.h>
2
#include <minix/sysutil.h>
3

    
4
#include <lcom/lab3.h>
5

    
6
#include <stdbool.h>
7
#include "i8254.h"
8
#include <stdint.h>
9
#include "i8042.h"
10
#include "keyboard.h"
11
//#include <timer.c>
12

    
13

    
14
/* #define IRQ_KB 1
15
#define DELAY_US 20000
16
#define EXIT_CODE 0x81
17
#define I_O_BUFFER 0x60 */
18

    
19
uint32_t cnt=0;
20
 uint32_t scancode;
21
int flag=0;
22

    
23
int main(int argc, char *argv[]) {
24
  // sets the language of LCF messages (can be either EN-US or PT-PT)
25
  lcf_set_language("EN-US");
26

    
27
  // enables to log function invocations that are being "wrapped" by LCF
28
  // [comment this out if you don't want/need it]
29
  lcf_trace_calls("/home/lcom/labs/lab3/trace.txt");
30

    
31
  // enables to save the output of printf function calls on a file
32
  // [comment this out if you don't want/need it]
33
  lcf_log_output("/home/lcom/labs/lab3/output.txt");
34

    
35
  // handles control over to LCF
36
  // [LCF handles command line arguments and invokes the right function]
37
  if (lcf_start(argc, argv))
38
    return 1;
39

    
40
  // LCF clean up tasks
41
  // [must be the last statement before return]
42
  lcf_cleanup();
43

    
44
  return 0;
45
}
46

    
47

    
48

    
49
int(kbd_test_scan)() {
50
  /* To be completed by the students */
51
  int ipc_status;
52
  uint8_t r, bit_no = 0;
53
  message msg;
54
  int hook_id = bit_no;
55
/*   uint8_t scan_arr[2] = {0, 0};
56

57
  int flag = 0; */
58

    
59
  printf("%d\n",
60
         sys_irqsetpolicy(IRQ_KB, IRQ_REENABLE | IRQ_EXCLUSIVE, &hook_id));
61
  /* sys_outb(0x64, 0x20);
62
  sys_inb(0x64, &scancode);
63
  printf("%x\n", scancode);
64
  if (scancode & 0x10) {
65
    scancode = (scancode & 0xEF);
66
  }
67

68
  printf("%x\n", scancode);
69
  sys_outb(0x64, 0x60);
70
  sys_outb(0x64, scancode); */
71

    
72
  printf("%x\n", scancode);
73
  //kbc_ih();
74
  printf("\n");
75
  while (scancode !=
76
         EXIT_CODE)
77
  { /* You may want to use a different condition */
78
    /* Get a request message. */
79
    // printf("1\n");
80
    // printf("cont:%d, time:%d\n\n",cont/60,time);
81
    if ((r = driver_receive(ANY, &msg, &ipc_status)) != 0) {
82
      printf("driver_receive failed with: %d", r);
83
      continue;
84
    }
85
    if (is_ipc_notify(ipc_status)) { /* received notification */
86
      switch (_ENDPOINT_P(msg.m_source)) {
87
      case HARDWARE: /* hardware interrupt notification */
88
        if (msg.m_notify.interrupts & BIT(0)) { /* subscribed interrupt */
89

    
90
          kbc_ih();
91
          }
92

    
93
        
94
        // printf("msg:%x\n",msg.m_notify.interrupts);
95
        break;
96
      default:
97
        // printf("2\n");
98
        break; /* no other notifications expected: do nothing */
99
      }
100
    } else {
101
      // printf("3\n"); /* received a standard message, not a notification */
102
      /* no standard messages expected: do nothing */
103
    }
104
  }
105
  kbd_print_no_sysinb(cnt);
106
  if (sys_irqrmpolicy(&hook_id) != 0)
107
    return 1;
108

    
109
  return 0;
110
}
111

    
112
int(kbd_test_poll)() {
113
  /* To be completed by the students */
114
  uint32_t key=0;
115
  uint8_t scan_arr[2] = {0, 0};
116
  //int flag = 0;
117
  //uint32_t cnt=0;
118

    
119
  while(scancode != EXIT_CODE)
120
  {
121
    tickdelay(micros_to_ticks(DELAY_US));
122
    #ifdef LAB3 
123
    cnt++; 
124
    #endif
125
    sys_inb(IN_BUF, &scancode);
126
          if (scancode & O_BUFFER_FULL) {
127
            #ifdef LAB3 
128
            cnt++;
129
             #endif
130
            sys_inb(I_O_BUFFER, &scancode);
131
          if (scancode != TWO_BYTES && flag == 0) {
132
            scan_arr[0] = scancode;
133
            kbd_print_scancode(!(scancode & PAR_ERR), 1, scan_arr);
134
          }
135

    
136
          else if (scancode == TWO_BYTES) {
137
            scan_arr[0] = scancode;
138
            flag = 1;
139
          }
140

    
141
          else if (flag == 1) {
142
            scan_arr[1] = scancode;
143
            kbd_print_scancode(!(scancode & PAR_ERR), 2, scan_arr);
144
            flag = 0;
145
          }
146
        }
147
  }
148
  sys_outb(IN_BUF, READ_CMD);        
149
  sys_outb(IN_BUF, I_O_BUFFER);
150

    
151
  #ifdef LAB3 
152
    cnt++; 
153
  #endif
154

    
155
  sys_inb(I_O_BUFFER,&key); 
156

    
157
  sys_outb(IN_BUF,I_O_BUFFER);        //enable interrupts again
158
  sys_outb(I_O_BUFFER,  key |  BIT(0));  
159

    
160
  kbd_print_no_sysinb(cnt);
161
  return 0;
162
}
163

    
164
int(kbd_test_timed_scan)(uint8_t n) {
165
  /* To be completed by the students */
166
/*   uint8_t scan_arr[2] = {0, 0};
167
  int flag=0; */
168
   int ipc_status;
169
  message msg;
170
  uint8_t r;
171
  uint8_t bit_no_timer = 0, bit_no_kbd = 1;
172
  int hook_id_kbd=bit_no_kbd, hook_id_timer=bit_no_timer;
173
  int cont=0;//cnt=0;
174
  
175
  sys_irqsetpolicy(IRQ_TIMER,IRQ_REENABLE,&hook_id_timer);
176
  sys_irqsetpolicy(IRQ_KB, IRQ_REENABLE | IRQ_EXCLUSIVE, &hook_id_kbd);
177
  kbc_ih();
178
  while( (cont/DEFAULT_FREQ)<n && scancode !=EXIT_CODE) //se não atingir o tempo de espera nem a tecla for ESC
179
 { 
180
   /* You may want to use a different condition */
181
     /* Get a request message. */
182
     // printf("1\n");
183
     //printf("cont:%d, time:%d\n\n",cont/60,time);
184
     if ( (r = driver_receive(ANY, &msg, &ipc_status)) != 0 ) 
185
     { 
186
        printf("driver_receive failed with: %d", r);
187
       continue;
188
    }
189
    if (is_ipc_notify(ipc_status)) { 
190
        switch (_ENDPOINT_P(msg.m_source)) {
191
            case HARDWARE:                                 
192
                if (msg.m_notify.interrupts  & BIT(bit_no_timer)) { 
193
                   cont++;
194
                   if(cont%DEFAULT_FREQ==0)
195
                   timer_print_elapsed_time();
196
                   //printf("cont:%d\n",cont);
197
               }
198
               if (msg.m_notify.interrupts  & BIT(bit_no_kbd)) 
199
               { 
200
                    
201
                  kbc_ih();
202
                   cont=0;
203
               }
204
                //printf("msg:%x\n",msg.m_notify.interrupts);
205
                break;
206
            default:
207
                //printf("2\n");
208
                break; /* no other notifications expected: do nothing */        
209
        }
210
    } 
211
     // printf("3\n"); /* received a standard message, not a notification */
212
        /* no standard messages expected: do nothing */
213
    
214
 
215
 }
216
  kbd_print_no_sysinb(cnt);
217
  
218
  if(sys_irqrmpolicy(&hook_id_timer)!=0) return 1;
219
  if(sys_irqrmpolicy(&hook_id_kbd)!=0) return 1;
220
  
221
    
222
    return 0;
223

    
224

    
225
  //printf("%s is not yet implemented!\n", __func__);
226

    
227
 
228
}