Advertisement
zergon321

keyboard.c

Dec 10th, 2020
1,445
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.05 KB | None | 0 0
  1. /**
  2.  * @file   keyboard.c
  3.  * @author Pavel <pavel@pavel-VirtualBox>
  4.  * @author zergon321 <maximgradan@gmail.com>
  5.  * @date   Mon Oct 26 09:32:37 2020
  6.  *
  7.  * @brief Инициализация клавиатуры  
  8.  *
  9.  *
  10.  */
  11. #include <x86/x86.h>
  12. #include <portable/console.h>
  13. #include <portable/types.h>
  14. #include <x86/idt.h>
  15. #include <portable/keyboard.h>
  16. /**
  17.  * проверка подключения клавиатуры
  18.  *
  19.  */
  20.  
  21. extern void a_keyboard_interrupt();
  22.  
  23. /**
  24.  * @brief Таблица соответствия скан-кодов
  25.  * клавиш печатным символам.
  26.  *
  27.  */
  28. byte keyboard_map[128] =
  29. {
  30.     0,  27, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */
  31.   '9', '0', '-', '=', '\b', /* Backspace */
  32.   '\t',         /* Tab */
  33.   'q', 'w', 'e', 'r',   /* 19 */
  34.   't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* Enter key */
  35.     0,          /* 29   - Control */
  36.   'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* 39 */
  37.  '\'', '`',   0,        /* Left shift */
  38.  '\\', 'z', 'x', 'c', 'v', 'b', 'n',            /* 49 */
  39.   'm', ',', '.', '/',   0,              /* Right shift */
  40.   '*',
  41.     0,  /* Alt */
  42.   ' ',  /* Space bar */
  43.     0,  /* Caps lock */
  44.     0,  /* 59 - F1 key ... > */
  45.     0,   0,   0,   0,   0,   0,   0,   0,
  46.     0,  /* < ... F10 */
  47.     0,  /* 69 - Num lock*/
  48.     0,  /* Scroll Lock */
  49.     0,  /* Home key */
  50.     0,  /* Up Arrow */
  51.     0,  /* Page Up */
  52.   '-',
  53.     0,  /* Left Arrow */
  54.     0,
  55.     0,  /* Right Arrow */
  56.   '+',
  57.     0,  /* 79 - End key*/
  58.     0,  /* Down Arrow */
  59.     0,  /* Page Down */
  60.     0,  /* Insert Key */
  61.     0,  /* Delete Key */
  62.     0,   0,   0,
  63.     0,  /* F11 Key */
  64.     0,  /* F12 Key */
  65.     0,  /* All other keys are undefined */
  66. };
  67.  
  68. /**
  69.  * @brief Буфер клавиатуры, в который записываются
  70.  * скан-коды нажатых клавиш.
  71.  *
  72.  */
  73. byte keyboard_buffer[MAX_KEYBUFFER];
  74. /**
  75.  * @brief Позиция в буфере клавиатуры.
  76.  * При заполнении сбрасывается в 0.
  77.  *
  78.  */
  79. int keybuffer_pos = 0;
  80.  
  81. /**
  82.  * @brief Инициализирует клавиатуру, проверяя
  83.  * её наличие в системе, назначая системное
  84.  * прерывание для обработки нажатия клавиши
  85.  * и включая линию IRQ клавиатуры.
  86.  *
  87.  *
  88.  */
  89. void init_keyboard() {
  90.   uchar data;
  91.   write_port(0x64, 0xAA);
  92.   data = read_port(0x60);
  93.   if (data == 0x55)
  94.     kprint("Кeyboard is enabled\n");
  95.   else
  96.     kprint("No keyboard\n");
  97.  
  98.   // Записать дескриптор клавиатуры в IDT.
  99.   idtSetDescriptor(0x21, (uint)a_keyboard_interrupt, kernel_code, INTERRUPT_GATE | DPL0);
  100.   // Включить линию IRQ клавиатуры.
  101.   //  write_port(0x21, 0xFD);
  102.   enable_irq(1);
  103. }
  104.  
  105. /**
  106.  * @brief Возвращает соответствующий
  107.  * скан-коду клавиши печатный символ.
  108.  *
  109.  * @param scan_code скан-код нажатой клавиши.
  110.  * @return char - печатный символ.
  111.  */
  112. char key_map(int scan_code) {
  113.   if (scan_code > 127 || scan_code < 0) {
  114.     return 0;
  115.   }
  116.  
  117.   return keyboard_map[scan_code];
  118. }
  119.  
  120. /**
  121.  * @brief Обрабатывает нажатие клавиши
  122.  * и записывает её скан-код в буфер.
  123.  *
  124.  */
  125. void keyboard_interrupt() {
  126.   uchar status;
  127.   char key_code;
  128.  
  129.   //write_port(0x20, 0x20);
  130.  
  131.   status = read_port(0x64);
  132.  
  133.   if (status & 0x01) {
  134.     key_code = read_port(0x60);
  135.  
  136.     if (key_code >= 0) {
  137.       keyboard_buffer[keybuffer_pos++] = key_code;
  138.  
  139.       if (keybuffer_pos > MAX_KEYBUFFER) {
  140.         keybuffer_pos = 0;
  141.       }
  142.  
  143.       if (key_code = PAGE_UP_CODE) {
  144.         screen_up();
  145.         return;
  146.       }
  147.  
  148.       if (key_code = PAGE_DOWN_CODE) {
  149.         screen_down();
  150.         return;
  151.       }
  152.  
  153.       char symbol = key_map(key_code);
  154.  
  155.       if (symbol != '\0') {
  156.         char str[2] = {symbol, '\0'};
  157.  
  158.         //kprint("0x%x", key_code);
  159.       }
  160.  
  161.       kprint("0x%x", key_code);
  162.     }
  163.   }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement