Project

General

Profile

Statistics
| Revision:

root / lab3 / lab3.c @ 9

History | View | Annotate | Download (5.78 KB)

1 4 up20180614
#include <lcom/lcf.h>
2
#include <minix/sysutil.h>
3
4
#include <lcom/lab3.h>
5
6
#include <stdbool.h>
7 8 up20180614
#include "i8254.h"
8 4 up20180614
#include <stdint.h>
9 9 up20180614
#include "i8042.h"
10
#include "keyboard.h"
11 4 up20180614
//#include <timer.c>
12
13 7 up20180614
14 9 up20180614
/* #define IRQ_KB 1
15 4 up20180614
#define DELAY_US 20000
16
#define EXIT_CODE 0x81
17 9 up20180614
#define I_O_BUFFER 0x60 */
18 4 up20180614
19 9 up20180614
uint32_t cnt=0;
20
 uint32_t scancode;
21
int flag=0;
22 4 up20180614
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 6 up20180614
    return 1;
39 4 up20180614
40
  // LCF clean up tasks
41
  // [must be the last statement before return]
42
  lcf_cleanup();
43
44
  return 0;
45
}
46
47
48 9 up20180614
49 4 up20180614
int(kbd_test_scan)() {
50
  /* To be completed by the students */
51
  int ipc_status;
52 5 up20180614
  uint8_t r, bit_no = 0;
53 4 up20180614
  message msg;
54 5 up20180614
  int hook_id = bit_no;
55 9 up20180614
/*   uint8_t scan_arr[2] = {0, 0};
56 8 up20180614

57 9 up20180614
  int flag = 0; */
58 4 up20180614
59 5 up20180614
  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 7 up20180614
  //kbc_ih();
74 5 up20180614
  printf("\n");
75 6 up20180614
  while (scancode !=
76 8 up20180614
         EXIT_CODE)
77
  { /* You may want to use a different condition */
78 5 up20180614
    /* 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 4 up20180614
    }
85
    if (is_ipc_notify(ipc_status)) { /* received notification */
86 5 up20180614
      switch (_ENDPOINT_P(msg.m_source)) {
87
      case HARDWARE: /* hardware interrupt notification */
88
        if (msg.m_notify.interrupts & BIT(0)) { /* subscribed interrupt */
89
90 9 up20180614
          kbc_ih();
91 5 up20180614
          }
92
93 9 up20180614
94 5 up20180614
        // 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 4 up20180614
    } else {
101 5 up20180614
      // printf("3\n"); /* received a standard message, not a notification */
102
      /* no standard messages expected: do nothing */
103 4 up20180614
    }
104 5 up20180614
  }
105 7 up20180614
  kbd_print_no_sysinb(cnt);
106 5 up20180614
  if (sys_irqrmpolicy(&hook_id) != 0)
107
    return 1;
108 4 up20180614
109
  return 0;
110
}
111
112
int(kbd_test_poll)() {
113
  /* To be completed by the students */
114 8 up20180614
  uint32_t key=0;
115 6 up20180614
  uint8_t scan_arr[2] = {0, 0};
116 9 up20180614
  //int flag = 0;
117
  //uint32_t cnt=0;
118
119 6 up20180614
  while(scancode != EXIT_CODE)
120
  {
121
    tickdelay(micros_to_ticks(DELAY_US));
122 7 up20180614
    #ifdef LAB3
123
    cnt++;
124
    #endif
125 9 up20180614
    sys_inb(IN_BUF, &scancode);
126
          if (scancode & O_BUFFER_FULL) {
127 7 up20180614
            #ifdef LAB3
128
            cnt++;
129
             #endif
130 9 up20180614
            sys_inb(I_O_BUFFER, &scancode);
131
          if (scancode != TWO_BYTES && flag == 0) {
132 6 up20180614
            scan_arr[0] = scancode;
133 9 up20180614
            kbd_print_scancode(!(scancode & PAR_ERR), 1, scan_arr);
134 6 up20180614
          }
135 4 up20180614
136 9 up20180614
          else if (scancode == TWO_BYTES) {
137 6 up20180614
            scan_arr[0] = scancode;
138
            flag = 1;
139
          }
140
141
          else if (flag == 1) {
142
            scan_arr[1] = scancode;
143 9 up20180614
            kbd_print_scancode(!(scancode & PAR_ERR), 2, scan_arr);
144 6 up20180614
            flag = 0;
145
          }
146
        }
147
  }
148 9 up20180614
  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 7 up20180614
  kbd_print_no_sysinb(cnt);
161 8 up20180614
  return 0;
162 4 up20180614
}
163
164
int(kbd_test_timed_scan)(uint8_t n) {
165
  /* To be completed by the students */
166 9 up20180614
/*   uint8_t scan_arr[2] = {0, 0};
167
  int flag=0; */
168 8 up20180614
   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 9 up20180614
  int cont=0;//cnt=0;
174 8 up20180614
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 9 up20180614
                  kbc_ih();
202 8 up20180614
                   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 9 up20180614
215 8 up20180614
 }
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 4 up20180614
}