OSDev PS / 2鼠标不起作用移动鼠标时,IRQ 12不会触发

问题描述

我正在编写一个操作系统。我已经写了“一些”键盘驱动程序,我想提供一些鼠标支持,也许是光标。我阅读了一些关于ps / 2鼠标的指南,尤其是关于osdev Wiki的指南,并从Sanik的站点复制了一堆代码来开始。 (https://forum.osdev.org/viewtopic.php?t=10247

但是我无法使鼠标响应。我初始化了鼠标并设置了irq12,但是输出不一致。这是代码

void mouse_install()
{
  unsigned char _status;  //unsigned char
    
    mouse_write(0xFF);
    mouse_read();

 
  //Enable the interrupts
  mouse_wait(1);
  outb(0x64,0x20);
  mouse_wait(0);
   _status=inb(0x60);          
   _status = (_status | 2) ;
  mouse_wait(1);
  outb(0x64,0x60);
  mouse_wait(1);
  outb(0x60,_status);
 mouse_read();
 
 
 
  //Enable the mouse
  mouse_write(0xF4);
  mouse_read();  //AckNowledge

}

设置中断后,我直接从内核调用函数。我知道irq可以工作是因为键盘可以工作。下一个代码是鼠标处理程序。收到mouse_x之后,我叫一个printf。

void irq12_handler(interrupt_frame_t* frame) //struct regs *a_r (not used but just there)
{
    
  switch(mouse_cycle)
  {
    case 0:
      mouse_byte[0]=inb(0x60);
      mouse_cycle++;
      break;
    case 1:
      mouse_byte[1]=inb(0x60);
      mouse_cycle++;
      break;
    case 2:
      mouse_byte[2]=inb(0x60);
      
      
      mouse_x = mouse_byte[1];
      mouse_y = mouse_byte[2];
      
     
      
      mouse_cycle=0;
      break;
  }
    
  printf(mouse_x);
  
  default_irq_handler(frame); // <- This is just outb(0x20,0x20); outb(0xA0,0x20);
  
}

问题是在初始化时我得到了3个输出,而移动鼠标时我没有得到更多输出。但是,当我第一次编写此代码时,它确实起作用了。当我移动鼠标时,我得到了很多输出值,但是下次我在不更改任何代码的情况下对其进行编译时,它停止工作,这很有趣。

可能是什么问题?我正在QEmu上运行它。如果您要求,我可以发布更多代码

编辑:这是输出

enter image description here

编辑:Printf代码

当心非常糟糕的代码

void printf(const char* format,...) 
{
    char * str = format;
    
    char ite;
    int numargs = 0;
    for(int z = 0; z < len(str); z++)
    {
        if(str[z+1] != '%')
            {
                numargs++;
            }
    }
    
    va_list listPointer;

    va_start( listPointer,numargs );
    
    
    for(int z = 0; z < strlen(str); z++)
    {
        ite = str[z];
        
        if(ite == '%')
        {
            switch(str[z+1])
            {
                case 's':
                {
                    char* arg = va_arg( listPointer,char* );
                    
                    for(int b = 0; b < strlen(arg); b++ )
                    {
                        drawchar(arg[b],0xffffffff,0x00000000);
                    
                    }
                    
                    break;
                }
                case 'd':
                {
                    int arg = va_arg( listPointer,int );
                    
                    char * conv;
                    itoa(arg,conv,10);
                    
                    for(int b = 0; b < strlen(conv); b++ )
                    {
                        drawchar(conv[b],0x00000000);
                    
                    }
                    
                    break;
                }
                
            }
            
            
            
            
            
            z++;
        }
        else
        {
            drawchar(ite,0x00000000);
        }
        
        
    }

       //drawstring(current,0x00000000);
    
}


编辑:请求将printf(mouse_x)更改为printf(“%d”,mouse_x)

enter image description here

重要修改

我只是做了很少的更改,并且没有更改与鼠标代码相关的任何内容,但是得到了以下输出

enter image description here

这是我移动鼠标时得到的输出。这很有趣,因为我什么都没做。以前不起作用的代码现在可以正常工作,并且将来可能会被破坏。

编辑:我再次运行代码,但无法获得相同的输出。帮助。

编辑:我想我知道问题所在。如果要运行该程序,并在其运行时单击qemu屏幕,这样我就可以捕获输入内容,检测到鼠标并在屏幕上打印一些垃圾。问题是,如果在单击屏幕之前等待一会儿,我认为未检测到鼠标,因此在qemu中未将其模拟为ps / 2鼠标,因此未初始化。我该如何解决这个问题。

编辑:这些是带有printf(“%d”,mouse_x)的输出,它们更有意义

enter image description here

这些是鼠标的deltaX,这意味着它可以正常工作。问题在于鼠标连接到计算机的时间。我该如何解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)