diff options
| author | Michal Idziorek <m.i@gmx.at> | 2015-05-17 20:40:29 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2015-05-17 20:40:29 +0200 |
| commit | 042e25e19b5fc0cec1d47440c26246c886cf39f6 (patch) | |
| tree | 9f3e49ccae2ec8a48fdb34d264da3adef06f64bf /driver/keyboard.c | |
| parent | d98828d08eb1f6c1394f38a1df69c73fef0cfefa (diff) | |
started big cleanup!
Diffstat (limited to 'driver/keyboard.c')
| -rw-r--r-- | driver/keyboard.c | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/driver/keyboard.c b/driver/keyboard.c new file mode 100644 index 0000000..4366127 --- /dev/null +++ b/driver/keyboard.c @@ -0,0 +1,226 @@ +#include <stdbool.h> + +#define FOOLOS_MODULE_NAME "keyboard" + +#include "x86.h" + +/// idiots keyboard driver //// +// http://www.computer-engineering.org/ps2keyboard/scancodes1.html + +static bool ctrl_l=false; +static bool shift_l=false; +static bool shift_r=false; +static bool capslock=false; + +static void (*put)(uint8_t c); + +void keyboard_init(void (*func)(uint8_t c)) +{ + put=func; +} + +void keyboard_handle(uint8_t in) +{ + + uint8_t make_alpha[]={ + 0x1e, // A + 0x30, // B + 0x2e, // C + 0x20, // D + 0x12, // E + 0x21, // F + 0x22, // G + 0x23, // H + 0x17, // I + 0x24, // J + 0x25, // K + 0x26, // L + 0x32, // M + 0x31, // N + 0x18, // O + 0x19, // P + 0x10, // Q + 0x13, // R + 0x1F, // S + 0x14, // T + 0x16, // U + 0x2F, // V + 0x11, // W + 0x2D, // X + 0x15, // Y + 0x2c, // Z + }; + + uint8_t break_alpha[]={ + 0x9e, // A + 0xb0, // B + 0xae, // C + 0xa0, // D + 0x92, // E + 0xa1, // F + 0xa2, // G + 0xa3, // H + 0x97, // I + 0xa4, // J + 0xa5, // K + 0xa6, // L + 0xb2, // M + 0xb1, // N + 0x98, // O + 0x99, // P + 0x90, // Q + 0x93, // R + 0x9F, // S + 0x94, // T + 0x96, // U + 0xaF, // V + 0x91, // W + 0xaD, // X + 0x95, // Y + 0xac, // Z + }; + + uint8_t break_num[]={ + + 0x8b, //0 + 0x82, + 0x83, + 0x84, + 0x85, + 0x86, + 0x87, + 0x88, + 0x89, + 0x8a, // 9 + + }; + + + + + + uint8_t break_key_enter=0x9c; + uint8_t break_key_space=0xb9; + uint8_t break_key_backspace=0x8e; + + uint8_t make_key_shift_l=0x2a; + uint8_t break_key_shift_l=0xaa; + + uint8_t make_key_shift_r=0x36; + uint8_t break_key_shift_r=0xb6; + + uint8_t break_caps_lock=0xba; + uint8_t break_slash=0xb5; + + uint8_t make_ctrl_l=0x1d; + uint8_t break_ctrl_l=0x9d; + + if(make_key_shift_l==in)shift_l=true; + if(break_key_shift_l==in)shift_l=false;; + + if(make_key_shift_r==in)shift_r=true; + if(break_key_shift_r==in)shift_r=false;; + + if(make_ctrl_l==in)ctrl_l=true; + if(break_ctrl_l==in)ctrl_l=false; + + if(break_caps_lock==in)capslock=!capslock; + + + char ascii; + + bool match=false; + // optimize this! + if(ctrl_l) + { + if(in==0xa0) + { + ascii=4; //end of transmission ctrl-d + match=true; + } + } + if(break_slash==in) + { + ascii='/'; + match=true; + } + else if(break_key_space==in) + { + ascii=' '; + match=true; + } + else if(in==0xB4) + { + ascii='.'; + match=true; + } + else if(in==0xB3) + { + ascii=','; + match=true; + } + else if(in==0x8D) + { + ascii='+'; + match=true; + } + else if(in==0x8C) + { + ascii='-'; + match=true; + } + else if(in==0x9A) + { + ascii='['; + match=true; + } + else if(in==0x9B) + { + ascii=']'; + match=true; + } + else if(break_key_backspace==in) + { + ascii=0x08; + match=true; + } + + else if(break_key_enter==in) + { + ascii='\n'; + match=true; + } + + else for(int i=0;i<26;i++) + { + if(match)break; + if(break_alpha[i]==in) + { + ascii=('a'+i); + + if(shift_l||shift_r||capslock) // capslock makes trouble :( + { + ascii=('A'+i); + } + match=true; + break; + } + } + + for(int i=0;i<10;i++) + { + if(break_num[i]==in) + { + ascii=('0'+i); + match=true; + break; + } + } + + + if(match) + { + put(ascii); + } + +} |
