keyboard.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "keyboard.h"
  2. #include "ports.h"
  3. #include "../cpu/isr.h"
  4. #include "screen.h"
  5. static void keyboard_callback(registers_t regs) {
  6. /* The PIC leaves us the scancode in port 0x60 */
  7. u8 scancode = port_byte_in(0x60);
  8. char *sc_ascii;
  9. int_to_ascii(scancode, sc_ascii);
  10. kprint("Keyboard scancode: ");
  11. kprint(sc_ascii);
  12. kprint(", ");
  13. print_letter(scancode);
  14. kprint("\n");
  15. }
  16. void init_keyboard() {
  17. register_interrupt_handler(IRQ1, keyboard_callback);
  18. }
  19. void print_letter(u8 scancode) {
  20. switch (scancode) {
  21. case 0x0:
  22. kprint("ERROR");
  23. break;
  24. case 0x1:
  25. kprint("ESC");
  26. break;
  27. case 0x2:
  28. kprint("1");
  29. break;
  30. case 0x3:
  31. kprint("2");
  32. break;
  33. case 0x4:
  34. kprint("3");
  35. break;
  36. case 0x5:
  37. kprint("4");
  38. break;
  39. case 0x6:
  40. kprint("5");
  41. break;
  42. case 0x7:
  43. kprint("6");
  44. break;
  45. case 0x8:
  46. kprint("7");
  47. break;
  48. case 0x9:
  49. kprint("8");
  50. break;
  51. case 0x0A:
  52. kprint("9");
  53. break;
  54. case 0x0B:
  55. kprint("0");
  56. break;
  57. case 0x0C:
  58. kprint("-");
  59. break;
  60. case 0x0D:
  61. kprint("+");
  62. break;
  63. case 0x0E:
  64. kprint("Backspace");
  65. break;
  66. case 0x0F:
  67. kprint("Tab");
  68. break;
  69. case 0x10:
  70. kprint("Q");
  71. break;
  72. case 0x11:
  73. kprint("W");
  74. break;
  75. case 0x12:
  76. kprint("E");
  77. break;
  78. case 0x13:
  79. kprint("R");
  80. break;
  81. case 0x14:
  82. kprint("T");
  83. break;
  84. case 0x15:
  85. kprint("Y");
  86. break;
  87. case 0x16:
  88. kprint("U");
  89. break;
  90. case 0x17:
  91. kprint("I");
  92. break;
  93. case 0x18:
  94. kprint("O");
  95. break;
  96. case 0x19:
  97. kprint("P");
  98. break;
  99. case 0x1A:
  100. kprint("[");
  101. break;
  102. case 0x1B:
  103. kprint("]");
  104. break;
  105. case 0x1C:
  106. kprint("ENTER");
  107. break;
  108. case 0x1D:
  109. kprint("LCtrl");
  110. break;
  111. case 0x1E:
  112. kprint("A");
  113. break;
  114. case 0x1F:
  115. kprint("S");
  116. break;
  117. case 0x20:
  118. kprint("D");
  119. break;
  120. case 0x21:
  121. kprint("F");
  122. break;
  123. case 0x22:
  124. kprint("G");
  125. break;
  126. case 0x23:
  127. kprint("H");
  128. break;
  129. case 0x24:
  130. kprint("J");
  131. break;
  132. case 0x25:
  133. kprint("K");
  134. break;
  135. case 0x26:
  136. kprint("L");
  137. break;
  138. case 0x27:
  139. kprint(";");
  140. break;
  141. case 0x28:
  142. kprint("'");
  143. break;
  144. case 0x29:
  145. kprint("`");
  146. break;
  147. case 0x2A:
  148. kprint("LShift");
  149. break;
  150. case 0x2B:
  151. kprint("\\");
  152. break;
  153. case 0x2C:
  154. kprint("Z");
  155. break;
  156. case 0x2D:
  157. kprint("X");
  158. break;
  159. case 0x2E:
  160. kprint("C");
  161. break;
  162. case 0x2F:
  163. kprint("V");
  164. break;
  165. case 0x30:
  166. kprint("B");
  167. break;
  168. case 0x31:
  169. kprint("N");
  170. break;
  171. case 0x32:
  172. kprint("M");
  173. break;
  174. case 0x33:
  175. kprint(",");
  176. break;
  177. case 0x34:
  178. kprint(".");
  179. break;
  180. case 0x35:
  181. kprint("/");
  182. break;
  183. case 0x36:
  184. kprint("Rshift");
  185. break;
  186. case 0x37:
  187. kprint("Keypad *");
  188. break;
  189. case 0x38:
  190. kprint("LAlt");
  191. break;
  192. case 0x39:
  193. kprint("Spc");
  194. break;
  195. default:
  196. /* 'keuyp' event corresponds to the 'keydown' + 0x80
  197. * it may still be a scancode we haven't implemented yet */
  198. if (scancode - 0x80 <= 0x39) {
  199. kprint("key up ");
  200. print_letter(scancode - 0x80);
  201. } else kprint("Unknown");
  202. break;
  203. }
  204. }