#include "asm_x86.h" #include "keyboard.h" #include "syscalls.h" #include "log.h" #include "e1000.h" #include "kmalloc.h" #include static bool ctrl_l=false; static bool shift_l=false; static bool shift_r=false; static bool capslock=false; static uint32_t kb_stream; static char num_syms[]={')','!','@','#','$','%','^','&','*','('}; int hex_to_dec(char c) { if(c>='0'&&c<='9')return c-'0'; return c+10-'a'; } static void put(uint8_t c) { /* 0000 8a b1 aa 7e 4d 00 52 54 00 12 34 56 08 00 45 00 0010 00 54 1e c0 00 00 40 01 da 1f c0 a8 00 14 c0 a8 0020 00 65 00 00 ce 07 1f 02 03 b0 bf 79 a9 5b 00 00 0030 00 00 df 9d 08 00 00 00 00 00 10 11 12 13 14 15 0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 0060 36 37 */ static char data_raw[]="8ab1aa7e4d005254001234560800450000541ec000004001da1fc0a80014c0a800650000ce071f0203b0bf79a95b00000000df9d080000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637"; static uint8_t data[256];//=kballoc(1); int i=0; while(data_raw[i]!=0) { uint8_t val=hex_to_dec(data_raw[i])*16+hex_to_dec(data_raw[i+1]); data[i/2]=val; i+=2; } if(c=='p')e1000_sendPacket(data,i/2); // packet // if(c=='s')e1000_init(0); // start // if(c=='i')e1000_irq(11); // interrupt // if(c=='u')e1000_linkup(); // up //if(c=='d')e1000_linkdown(); // down syscall_generic(SYSCALL_WRITE,kb_stream, (char *)&c , 1, 0); } void keyboard_init(uint32_t s) { kb_stream=s; } void keyboard_handle(uint8_t in) { // klog("kb_in 0x%x",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 break_key_esc=0x81; uint8_t break_key_tab=0x8f; 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='/'; if(shift_l||shift_r||capslock) ascii='?'; match=true; } else if(break_key_space==in) { ascii=' '; match=true; } else if(in==0xB4) { ascii='.'; if(shift_l||shift_r||capslock) ascii='<'; match=true; } else if(in==0xB3) { ascii=','; if(shift_l||shift_r||capslock) ascii='>'; match=true; } else if(in==0x8D) { ascii='='; if(shift_l||shift_r||capslock) ascii='+'; match=true; } else if(in==0x8C) { ascii='-'; if(shift_l||shift_r||capslock) ascii='_'; match=true; } else if(in==0x9A) { ascii='['; if(shift_l||shift_r||capslock) ascii='{'; match=true; } else if(in==0x9B) { ascii=']'; if(shift_l||shift_r||capslock) ascii='}'; match=true; } else if(in==0xab) { ascii='\\'; if(shift_l||shift_r||capslock) ascii='|'; match=true; } else if(break_key_backspace==in) { ascii=0x08; match=true; } else if(break_key_esc==in) { ascii=0x1b; match=true; } else if(break_key_enter==in) { ascii='\n'; match=true; } else if(break_key_tab==in) { ascii='\t'; 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); if(shift_l||shift_r||capslock) // capslock makes trouble :( { ascii=num_syms[i]; } match=true; break; } } if(match) { put(ascii); } }