Skip to content

Commit 1085fbc

Browse files
committed
[drivers][keyboard] Precompute scancode to ASCII mapping
1 parent 22f7b52 commit 1085fbc

File tree

4 files changed

+30
-24
lines changed

4 files changed

+30
-24
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ debug_kernel: $(kernel_core)
8787
xxd $<
8888

8989
qemu: $(image_vmdk)
90-
cpulimit -f -l 10 -- qemu-system-x86_64 -smp 1 -m 128M -hda $< -no-shutdown -no-reboot
90+
cpulimit -f -l 100 -- qemu-system-x86_64 -smp 1 -m 128M -hda $< -no-shutdown -no-reboot
9191

9292
qemu_debug: $(image_vmdk)
9393
qemu-system-x86_64 -smp 1 -m 128M -hda $< -no-shutdown -no-reboot -d cpu,exec,in_asm

src/drivers/keyboard/keyboard.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,12 @@ unsigned char read_data_reply() {
138138
#define KEYBOARD_BUFFER_SIZE 64
139139
int keyboard_buffer[KEYBOARD_BUFFER_SIZE+3];
140140

141+
void keyboard_scanner_handler_init();
141142
int keyboard_scanner_handle_buffer(int keyboard_buffer_queue[]);
142143

143144
void keyboard_scanner_init() {
144145
ASSERT( queue_init(keyboard_buffer, KEYBOARD_BUFFER_SIZE) );
146+
keyboard_scanner_handler_init();
145147
}
146148

147149
int keyboard_scanner_step() {

src/drivers/keyboard/scancode_handler.c

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ static const unsigned char KEYBOARD_ASCII_MAPH_OTHERS[] = {
171171
KEYBOARD_SC_RPF0_blackslash, '\\'
172172
};
173173

174-
174+
static unsigned char KEYBOARD_ASCII_MAPPING[256];
175175
static char last_ascii;
176176
static int last_ascii_available = 0;
177177
static char tmp_juggad_is_f0 = 0;
@@ -185,6 +185,28 @@ char keyboard_scanner_ascii_get() {
185185
return last_ascii;
186186
}
187187

188+
void keyboard_scanner_handler_init() {
189+
for (int i = 0; i < sizeof(KEYBOARD_ASCII_MAPPING); ++i) {
190+
KEYBOARD_ASCII_MAPPING[i] = 0;
191+
}
192+
for(int i = 0;i<sizeof(KEYBOARD_ASCII_MAPH_AZ);i++) {
193+
unsigned char code = KEYBOARD_ASCII_MAPH_AZ[i];
194+
unsigned char c = 'a'+i;
195+
KEYBOARD_ASCII_MAPPING[code]=c;
196+
}
197+
for(int i = 0;i<sizeof(KEYBOARD_ASCII_MAPH_09);i++) {
198+
unsigned char code = KEYBOARD_ASCII_MAPH_09[i];
199+
unsigned char c = '0'+i;
200+
KEYBOARD_ASCII_MAPPING[code]=c;
201+
}
202+
if(last_ascii_available) return 1;
203+
for(int i = 0;i<sizeof(KEYBOARD_ASCII_MAPH_OTHERS);i+=2) {
204+
unsigned char code = KEYBOARD_ASCII_MAPH_OTHERS[i];
205+
unsigned char c = KEYBOARD_ASCII_MAPH_OTHERS[i+1];
206+
KEYBOARD_ASCII_MAPPING[code]=c;
207+
}
208+
}
209+
188210
int keyboard_scanner_handle_buffer(int keyboard_buffer[]) {
189211
// For now just taking care of some of the key press and disgarding others.
190212
int len = queue_size(keyboard_buffer);
@@ -203,28 +225,9 @@ int keyboard_scanner_handle_buffer(int keyboard_buffer[]) {
203225
return 1;
204226
}
205227

206-
for(int i = 0;i<sizeof(KEYBOARD_ASCII_MAPH_AZ);i++) {
207-
if(KEYBOARD_ASCII_MAPH_AZ[i]==c0) {
208-
last_ascii = 'a'+i;
209-
last_ascii_available = 1;
210-
break;
211-
}
212-
}
213-
if(last_ascii_available) return 1;
214-
for(int i = 0;i<sizeof(KEYBOARD_ASCII_MAPH_09);i++) {
215-
if(KEYBOARD_ASCII_MAPH_09[i]==c0) {
216-
last_ascii = '0'+i;
217-
last_ascii_available = 1;
218-
break;
219-
}
220-
}
221-
if(last_ascii_available) return 1;
222-
for(int i = 0;i<sizeof(KEYBOARD_ASCII_MAPH_OTHERS);i+=2) {
223-
if(KEYBOARD_ASCII_MAPH_OTHERS[i]==c0) {
224-
last_ascii = KEYBOARD_ASCII_MAPH_OTHERS[i+1];
225-
last_ascii_available = 1;
226-
break;
227-
}
228+
if(KEYBOARD_ASCII_MAPPING[c0]>0) {
229+
last_ascii = KEYBOARD_ASCII_MAPPING[c0];
230+
last_ascii_available = 1;
228231
}
229232
if(last_ascii_available) return 1;
230233
return 0;

src/kernel/core.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <lib/utils/output.h>
44
#include <lib/utils/input.h>
55
#include <lib/utils/panic.h>
6+
#include <lib/utils/time.h>
67

78
#include "kernel/essentials.c"
89
#include "kernel/interrupts.c"

0 commit comments

Comments
 (0)