ps2_keyboard.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #pragma once
  2. #include "../../common/glib.h"
  3. #define PS2_KEYBOARD_INTR_VECTOR 0x21 // 键盘的中断向量号
  4. // 定义键盘循环队列缓冲区大小为100bytes
  5. #define ps2_keyboard_buffer_size 8
  6. #define KEYBOARD_CMD_RESET_BUFFER 1
  7. /**
  8. * @brief 键盘循环队列缓冲区结构体
  9. *
  10. */
  11. struct ps2_keyboard_input_buffer
  12. {
  13. unsigned char *ptr_head;
  14. unsigned char *ptr_tail;
  15. int count;
  16. unsigned char buffer[ps2_keyboard_buffer_size];
  17. };
  18. #define PORT_PS2_KEYBOARD_DATA 0x60
  19. #define PORT_PS2_KEYBOARD_STATUS 0x64
  20. #define PORT_PS2_KEYBOARD_CONTROL 0x64
  21. #define PS2_KEYBOARD_COMMAND_WRITE 0x60 // 向键盘发送配置命令
  22. #define PS2_KEYBOARD_COMMAND_READ 0x20 // 读取键盘的配置值
  23. #define PS2_KEYBOARD_PARAM_INIT 0x47 // 初始化键盘控制器的配置值
  24. // ========= 检测键盘控制器输入/输出缓冲区是否已满
  25. #define PS2_KEYBOARD_FLAG_OUTBUF_FULL 0x01 // 键盘的输出缓冲区已满标志位
  26. #define PS2_KEYBOARD_FLAG_INBUF_FULL 0x02 // 键盘的输入缓冲区已满标志位
  27. // 等待向键盘控制器写入信息完成
  28. #define wait_ps2_keyboard_write() while (io_in8(PORT_PS2_KEYBOARD_STATUS) & PS2_KEYBOARD_FLAG_INBUF_FULL)
  29. // 等待从键盘控制器读取信息完成
  30. #define wait_ps2_keyboard_read() while (io_in8(PORT_PS2_KEYBOARD_STATUS) & PS2_KEYBOARD_FLAG_OUTBUF_FULL)
  31. extern struct vfs_file_operations_t ps2_keyboard_fops;
  32. /**
  33. * @brief 初始化键盘驱动程序的函数
  34. *
  35. */
  36. void ps2_keyboard_init();
  37. /**
  38. * @brief 键盘驱动卸载函数
  39. *
  40. */
  41. void ps2_keyboard_exit();
  42. /**
  43. * @brief 解析键盘扫描码
  44. *
  45. */
  46. void ps2_keyboard_analyze_keycode();
  47. /**
  48. * @brief 从缓冲队列中获取键盘扫描码
  49. * @return 键盘扫描码
  50. * 若缓冲队列为空则返回-1
  51. */
  52. int ps2_keyboard_get_scancode();