psmouse.c
上传用户:qddsws
上传日期:2022-06-22
资源大小:723k
文件大小:3k
源码类别:

操作系统开发

开发平台:

C/C++

  1. #include <devices/psmouse.h>
  2. struct Ps2Mouse* ctx; 
  3. int px;
  4. static int volatile int_pending_mouse;
  5. void __init_device init_psmouse (struct device* dev) {
  6. /* Agafats del gpm_Imps2 (Linux mouse driver), serveixen per establir el sample rate*/
  7. static byte s1[] = { 0xF3, 0xC8, 0xF3, 0x64, 0xF3, 0x50, 0 };
  8. static byte s2[] = { 0xF6, 0xE6, 0xF4, 0xF3, 0x64, 0xE8, 0x03, 0 };
  9. const byte* ch;
  10. int wait;
  11. dev->command=(void*)&psmouse_command;
  12. kprint ("Registered ISA Device:");
  13. kprint (dev->name);
  14. kprint (" n");
  15. /*Activem IRQ 1 and 12 (keyboard, mouse) */
  16. kbdWrite(KEYB_CTRL, KCTRL_WRITE_CMD_BYTE);
  17. kbdWrite(KEYB_PORT, KCTRL_SYS | KCTRL_TRANSLATE_XT | KCTRL_IRQ1 | KCTRL_IRQ12 );
  18. /* Activem el port PS/2 Auxiliar (MOUSE) */
  19. kbdWrite(KEYB_CTRL, KCTRL_ENABLE_AUX);
  20. for (ch = s1; *ch; ch++){
  21. kbdWrite(KEYB_CTRL, KCTRL_WRITE_AUX);
  22. kbdWriteRead(KEYB_PORT, *ch, KEYB_ACK);
  23. }
  24. for (ch = s2; *ch; ch++){
  25. kbdWrite(KEYB_CTRL, KCTRL_WRITE_AUX);
  26. kbdWriteRead(KEYB_PORT, *ch, KEYB_ACK);
  27. }
  28. for(wait = 0; wait < 3000; wait++);
  29. kbdWrite(KEYB_CTRL, KCTRL_WRITE_AUX);
  30. kbdWriteRead(KEYB_PORT, AUX_ENABLE, KEYB_ACK);
  31. ctx=(struct Ps2Mouse*)kmalloc(sizeof(struct Ps2Mouse));
  32. /*La mouse comen鏰 al centre de la pantalla
  33.  */
  34. ctx->xmin = 0;
  35. ctx->ymin = 0;
  36. ctx->xmax = 800;
  37. ctx->ymax = 600;
  38. ctx->x = (ctx->xmin + ctx->xmax) / 2 ;
  39. ctx->y = (ctx->ymin + ctx->ymax) / 2 ;
  40. ctx->buttons=0;
  41.       AddInt (44,(void*)rsi_mouse,0);  
  42.         unmaskIRQ(ALL);
  43. __asm__ volatile ("sti");
  44.     
  45. px=0;
  46. }
  47. void bottom_mouse_rsi () {
  48. int_pending_mouse=1;
  49. }
  50. void get_mouse_coord() {
  51. byte Stat,Data;
  52. byte mouse_buf[3];
  53. int dx,dy,but;
  54. Stat = inportb(KEYB_CTRL);
  55. if ((Stat & 0x01) != 0) {
  56. Data = kbdRead();
  57. mouse_buf[0]=Data;
  58. Data = kbdRead();
  59. mouse_buf[1]=Data;
  60. Data = kbdRead();
  61. mouse_buf[2]=Data;
  62. if (MOUSE==3) Data = kbdRead(); 
  63. but= (mouse_buf[0] & 0x02)>>1| (mouse_buf[0] & 0x01) << 1;
  64. dx = (mouse_buf[0] & 0x10) ? mouse_buf[1] - 256 : mouse_buf[1];
  65. dy = (mouse_buf[0] & 0x20) ? -(mouse_buf[2] - 256) : -mouse_buf[2];
  66. ctx->x += dx;
  67. ctx->y += dy;
  68. if(ctx->x > ctx->xmax) ctx->x = ctx->xmin;
  69. if(ctx->x < ctx->xmin) ctx->x = ctx->xmax;
  70. if(ctx->y > ctx->ymax) ctx->y = ctx->ymax;
  71. if(ctx->y < ctx->ymin) ctx->y = ctx->ymin;
  72. ctx->buttons = but;
  73. }
  74. int_pending_mouse=0;
  75. }
  76. void psmouse_command(unsigned long cmd, void* param) {
  77. char text[200];
  78. switch (cmd) {
  79. case GET_MOUSE_COORDINATES:
  80. if (int_pending_mouse==1) {
  81. get_mouse_coord();
  82. memcpy(param,ctx,sizeof(struct Ps2Mouse));
  83. }
  84. else {
  85. ((struct Ps2Mouse*)param)->buttons=0;
  86. }
  87. break;
  88. }
  89. }