Page 1 of 1
Mouse problem (SOLVED)
Posted: Sun Jul 15, 2007 11:16 am
by salil_bhagurkar
I am writing the code for ps2 mouse.
When i issue the (0xa8) enable aux command my keyboard gets disabled after the mouse irq. I don't get the mouse irq (handler does not run).
Could anybody give me some documentation links to ps2 mouse programming?
Posted: Mon Jul 16, 2007 5:13 am
by digo_rp
you have to enable IRQ12 in kbc
mouse_wait(1);
outb_p(0x64, 0x20);
mouse_wait(0);
_status=(inb_p(0x60) | 2);
mouse_wait(1);
outb_p(0x64, 0x60);
mouse_wait(1);
outb_p(0x60, _status);
Posted: Mon Jul 16, 2007 11:18 am
by salil_bhagurkar
Could you please tell give me more detail code and links documentation?
Posted: Mon Jul 16, 2007 12:06 pm
by exkor
Posted: Mon Jul 16, 2007 12:15 pm
by salil_bhagurkar
Oh i forgot that we can search the forum!... I am not lazy... I have made several attempts to write mouse code... Besides, when i have noting to do other than osdev all day how can i be lazy?
Posted: Mon Jul 16, 2007 1:20 pm
by exkor
sorry
for the code you can search
www.google.com/codesearch &
www.koders.com
and look sources of the SolarOS
http://www.oby.ro/
look "OS Construction" forum here
http://board.flatassembler.net/
http://bos.asmhackers.net/docs/mouse/
sources here have install_mouse function & mention aux device in comments
I think you need to enable both IRQ1 & IRQ12 thru kbd ports like digo_rp suggested
edited: docs:
http://www.nondot.org/sabre/os/articles ... ceDevices/
http://www.osdever.net/cottontail/#Mouse
http://en.wikipedia.org/wiki/Computer_mouse
http://www.computer-engineering.org/ps2mouse/ - good link but it doesn't work for me at the moment, never trust internet, always save
there is pdf called "active PS/2 multiplexing"
Posted: Tue Jul 17, 2007 10:41 am
by salil_bhagurkar
Okay i used the code of mystran from the forums...
Here it is:
Code: Select all
void MouseIRQ()
{
//LocalData.status = GetByte();
//LocalData.xcoord = GetByte();
//LocalData.ycoord = GetByte();
printdev("\nMouse irq");
// readable = 1;
}
int KBD_wait_write() {
unsigned int timeout = 100000;
unsigned char c;
while(--timeout) {
c = inb(0x64);
if(!(c & 2)) {
return 0;
}
}
return -1;
}
int KBD_write(unsigned char byte) {
if(!KBD_wait_write()) {
outb(0x60, byte);
return 0;
}
else return -1;
}
int KBD_write_cmd(unsigned char byte) {
if(!KBD_wait_write()) {
outb(0x64, byte);
return 0;
}
else return -1;
}
int KBD_write_aux(unsigned char byte) {
if(KBD_write_cmd(0xD4) || KBD_write(byte)) return -1;
else return 0;
}
// return unsigned char if success, -1 if fails
int KBD_read() {
unsigned int timeout = 100000;
unsigned char c;
while(--timeout) {
c = inb(0x64);
if(c & 1) {
c = inb(0x60);
return (unsigned) c;
}
}
return -1;
}
int KBD_wait_ack() {
unsigned int timeout = 100000;
while(--timeout) {
unsigned char c = KBD_read();
if(c == 0xFA) return 0; // got ack, we're happy
if(!c) {
// if we get 0, spend some time and retry
int i;
for(i = 0; i < 1000; i++) outb(0x80,0x80);
continue;
} else {
printdev("console_input: 0x%2x while expecting ACK\n", c);
return -1;
}
}
return -1;
}
// init the mouse
static int console_mouse_imps2;
int InitMouse()
{
if(KBD_write_cmd(0xA9) || KBD_read() != 0x00) {
printdev("PS/2 mouse interface test failed.\n");
return -1;
}
// enable PS/2 mouse
KBD_write_cmd(0xA8);
{
// fetch command word
if(KBD_write_cmd(0x20)) return -1;
int cb = KBD_read();
if(cb < 0) return -1;
// set bit1 (aux interrupt),
// store the resulting new command word
if(KBD_write_cmd(0x60)) return -1;
if(KBD_write(cb |= 0x2)) return -1; // <-- only need to set aux-int bit <--
}
// Send set defaults
if(KBD_write_aux(0xF6) || KBD_wait_ack()) return -1;
// Enable data reporting
if(KBD_write_aux(0xF4) || KBD_wait_ack()) return -1;
request_irq(12,MouseIRQ);
enable_irq(12);
while(1);
}
I have not initiated the keyboard IRQ. I am in a while loop and i am checking for the mouse irq by moving the mouse (and clicking also). But i don't get any IRQ.
Posted: Wed Jul 18, 2007 12:04 pm
by salil_bhagurkar
Ok the problem is solved...
The code was giving only one IRQ on IRQ12
The change that i made was:
1.Added an EOI -- outb(0x20,0x20) I dont't know why for the first pic...found it on the forum. So now u send EOI to both pics
2.Added EnableKeyboard and DisableKeyboard in the IRQ handler...
Both mouse and kbd are successfully working...