The mouse driver doesn't work! It happen nothing, but the keyboard stop working.
This is the code of the mouse driver:
Code: Select all
int x = 80, y = 80;
unsigned char data[3];
unsigned char mouse_type;
static volatile int button[3] = {0, 0, 0};
void left_button_down(int x, int y)
{
}
void left_button_up(int x, int y)
{
}
void right_button_down(int x, int y)
{
asm("sti");
outportb(0x64, 0xFE);
asm("cli");
asm("hlt");
}
void right_button_up(int x, int y)
{
}
void middle_button_down(int x, int y)
{
}
void middle_button_up(int x, int y)
{
}
void pos_mouse(int x, int y)
{
}
inline void mouse_wait(unsigned char a_type)
{
unsigned int _time_out = 100000;
if(a_type == 0)
{
while(_time_out--)
{
if((inportb(0x64) & 1) == 1)
{
return;
}
}
return;
}
else
{
while(_time_out--)
{
if((inportb(0x64) & 2) == 0)
{
return;
}
}
return;
}
}
inline void mouse_write(unsigned char a_write)
{
//Aspetta di essere in grado di mandare un segnale
mouse_wait(1);
//Diciamo al mouse che gli stiamo mandando un comando
outportb(0x64, 0xD4);
//Aspetta per la parte finale
mouse_wait(1);
//Alla fine scrivi
outportb(0x60, a_write);
}
unsigned char mouse_read(void)
{
//Aspetta e poi prende la risposta dal mouse
mouse_wait(0);
return inportb(0x60);
}
void ps2_mouse(void)
{
printf("MOUSE INT\n");
data[0] = inportb(0x60);
data[1] = inportb(0x60);
data[2] = inportb(0x60);
if ((data[0] & 0x01) != button[0])
{
button[0] ^= 1;
if (button[0]) left_button_down(x, y);
else left_button_up(x, y);
}
if ((data[0] & 0x04) != button[1])
{
button[1] ^= 1;
if (button[1]) middle_button_down(x, y);
else middle_button_up(x, y);
}
if ((data[0] & 0x02) != button[2])
{
button[2] ^= 1;
if (button[2]) right_button_down(x, y);
else right_button_up(x, y);
}
if (data[0] & 0x10)
x += (int)((256 - data[1]) * -1);
else
x += (int)data[1];
if (data[0] & 0x20)
y += (int) (256 - data[2]);
else
y += (int)(data[2] * -1);
if (y > 184) y = 184;
else if (y < 0) y = 0;
if (x > 311) x = 311;
else if (x < 0) x = 0;
pos_mouse(x, y);
}
void mouse_install(void)
{
unsigned char _status;
//Abilita il dispositivo aux mouse
mouse_wait(1);
outportb(0x64, 0xA8);
//Abilita gli interrupts
mouse_wait(1);
outportb(0x64, 0x20);
mouse_wait(0);
_status = (inportb(0x60) | 2);
mouse_wait(1);
outportb(0x64, 0x60);
mouse_wait(1);
outportb(0x60, _status);
//Diciamo al mouse di utilizzare le opzioni di default
mouse_write(0xF6);
mouse_read();
//Abilita il mouse
mouse_write(0xF4);
mouse_read();
//Installa l'irq handler per il mouse
add_irq(ps2_mouse, 12);
abilita_irq(4, 0xA1);
}
Code: Select all
unsigned char irq_number[8] = {
0xfe,
0xfd,
0xfb,
0xf7,
0xef,
0xdf,
0xbf,
0x7f
};
void Init8259(void)
{
int i;
static const unsigned irq0_int = 0x20, irq8_int = 0x28;
/* Initialization Control Word #1 (ICW1) */
outportb(0x20, 0x11);
outportb(0xA0, 0x11);
/* Initialization Control Word #2 (ICW2) */
//route IRQs 0-7 to INTs 20h-27h
outportb(0x21, irq0_int);
// route IRQs 8-15 to INTs 28h-2Fh
outportb(0xA1, irq8_int);
/* Initialization Control Word #3 (ICW3) */
outportb(0x21, 0x04);
outportb(0xA1, 0x02);
/* Initialization Control Word #4 (ICW4) */
outportb(0x21, 0x01);
outportb(0xA1, 0x01);
for(i=0; i <= 7; i++)
disabilita_irq(i, 0x21);
for(i=0; i <= 7; i++)
disabilita_irq(i, 0xA1);
}
void abilita_irq(unsigned char irq_num, unsigned char port_num)
{
char dato;
dato = inportb(port_num);
dato = dato & irq_number[irq_num];
outportb(port_num, dato);
}
void disabilita_irq(unsigned char irq_num, unsigned char port_num)
{
char dato;
dato = inportb(port_num);
dato = dato | (1<<irq_num);
outportb(port_num, dato);
}