mouse.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #pragma once
  2. #include "../../common/glib.h"
  3. #define MOUSE_INTR_VECTOR 0x2c // 鼠标的中断向量号
  4. #define KEYBOARD_COMMAND_SEND_TO_MOUSE 0xd4 // 键盘控制器向鼠标设备发送数据的命令
  5. #define MOUSE_GET_ID 0xf2 // 获取鼠标的ID
  6. #define MOUSE_SET_SAMPLING_RATE 0xf3 // 设置鼠标的采样率
  7. #define MOUSE_ENABLE 0xf4 // 允许鼠标设备发送数据包
  8. #define MOUSE_DISABLE 0xf5 // 禁止鼠标设备发送数据包
  9. #define MOUSE_SET_DEFAULT_SAMPLING_RATE 0xf6 // 设置使用默认采样率100hz,分辨率4px/mm
  10. #define MOUSE_RESEND_LAST_PACKET 0xfe // 重新发送上一条数据包
  11. #define MOUSE_RESET 0xff // 重启鼠标
  12. #define KEYBOARD_COMMAND_ENABLE_MOUSE_PORT 0xa8 // 通过键盘控制器开启鼠标端口的命令
  13. #define mouse_buffer_size 120
  14. #define PORT_KEYBOARD_DATA 0x60
  15. #define PORT_KEYBOARD_STATUS 0x64
  16. #define PORT_KEYBOARD_CONTROL 0x64
  17. #define KEYBOARD_COMMAND_WRITE 0x60 // 向键盘发送配置命令
  18. #define KEYBOARD_COMMAND_READ 0x20 // 读取键盘的配置值
  19. #define KEYBOARD_PARAM_INIT 0x47 // 初始化键盘控制器的配置值
  20. // ========= 检测键盘控制器输入/输出缓冲区是否已满
  21. #define KEYBOARD_FLAG_OUTBUF_FULL 0x01 // 键盘的输出缓冲区已满标志位
  22. #define KEYBOARD_FLAG_INBUF_FULL 0x02 // 键盘的输入缓冲区已满标志位
  23. // 等待向键盘控制器写入信息完成
  24. #define wait_keyboard_write() while (io_in8(PORT_KEYBOARD_STATUS) & KEYBOARD_FLAG_INBUF_FULL)
  25. // 等待从键盘控制器读取信息完成
  26. #define wait_keyboard_read() while (io_in8(PORT_KEYBOARD_STATUS) & KEYBOARD_FLAG_OUTBUF_FULL)
  27. #define SUCCESS 0
  28. #define EINVALID_ARGUMENT -1
  29. #define EFAIL -2
  30. // =========== 定义鼠标数据包 ==============
  31. // 其中,x、y方向的移动值用9位二进制补码表示(算上byte0中的符号位)
  32. // 目前只用到8位,(精度要求没那么高)
  33. struct mouse_packet_3bytes
  34. {
  35. unsigned char byte0; // 第0字节
  36. // [y溢出,x溢出,y符号位, x符号位, 1, 鼠标中键, 鼠标右键,鼠标左键]
  37. char movement_x;
  38. char movement_y;
  39. };
  40. // ID = 3 或 ID = 4时,采用4bytes数据包
  41. struct mouse_packet_4bytes
  42. {
  43. unsigned char byte0; // 第0字节
  44. // [y溢出,x溢出,y符号位, x符号位, 1, 鼠标中键, 鼠标右键,鼠标左键]
  45. char movement_x;
  46. char movement_y;
  47. char byte3; // 当鼠标ID=3时,表示z移动值
  48. // 当鼠标ID=4时,表示:[0, 0, 鼠标第5键, 鼠标第4键, Z3, Z2, Z1, Z0]
  49. // 其中,[Z3,Z0]表示鼠标滚轮滚动方向
  50. // Z3~Z0: 0:无滚动, 1:垂直向上滚动, F:垂直向下滚动, 2:水平向右滚动, E:水平向左滚动
  51. };
  52. /**
  53. * @brief 键盘循环队列缓冲区结构体
  54. *
  55. */
  56. struct mouse_input_buffer
  57. {
  58. unsigned char *ptr_head;
  59. unsigned char *ptr_tail;
  60. int count;
  61. unsigned char buffer[mouse_buffer_size];
  62. };
  63. /**
  64. * @brief 初始化鼠标驱动程序
  65. *
  66. */
  67. void mouse_init();
  68. /**
  69. * @brief 卸载鼠标驱动程序
  70. *
  71. */
  72. void mouse_exit();
  73. /**
  74. * @brief 设置鼠标采样率
  75. *
  76. * @param hz 采样率
  77. */
  78. int mouse_set_sample_rate(unsigned int hz);
  79. /**
  80. * @brief 获取鼠标数据包
  81. *
  82. * @param packet 数据包的返回值
  83. * @return int 错误码
  84. */
  85. int mouse_get_packet(void *packet);
  86. void analyze_mousecode();