问题描述
我正在编写一个操作系统。我已经写了“一些”键盘驱动程序,我想提供一些鼠标支持,也许是光标。我阅读了一些关于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上运行它。如果您要求,我可以发布更多代码。
编辑:这是输出
编辑: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)
重要修改:
我只是做了很少的更改,并且没有更改与鼠标代码相关的任何内容,但是得到了以下输出
这是我移动鼠标时得到的输出。这很有趣,因为我什么都没做。以前不起作用的代码现在可以正常工作,并且将来可能会被破坏。
编辑:我想我知道问题所在。如果要运行该程序,并在其运行时单击qemu屏幕,这样我就可以捕获输入内容,检测到鼠标并在屏幕上打印一些垃圾。问题是,如果在单击屏幕之前等待一会儿,我认为未检测到鼠标,因此在qemu中未将其模拟为ps / 2鼠标,因此未初始化。我该如何解决这个问题。
编辑:这些是带有printf(“%d”,mouse_x)的输出,它们更有意义
这些是鼠标的deltaX,这意味着它可以正常工作。问题在于鼠标连接到计算机的时间。我该如何解决这个问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)