Installing an interrupt handler in init_hardware() without
removing it is bad. Other small changes, too. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@358 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
279d2a69e9
commit
2d3138349f
@ -40,6 +40,8 @@
|
|||||||
* order for this interrupt to be enabled, both the 5th interrupt of
|
* order for this interrupt to be enabled, both the 5th interrupt of
|
||||||
* the second controller AND the 3rd interrupt of the first controller
|
* the second controller AND the 3rd interrupt of the first controller
|
||||||
* (cascade mode) should be unmasked.
|
* (cascade mode) should be unmasked.
|
||||||
|
* This is all done inside install_io_interrupt_handler(), no need to
|
||||||
|
* worry about it anymore
|
||||||
* The controller uses 3 consecutive interrupts to inform the computer
|
* The controller uses 3 consecutive interrupts to inform the computer
|
||||||
* that it has new data. On the first the data register holds the status
|
* that it has new data. On the first the data register holds the status
|
||||||
* byte, on the second the X offset, and on the 3rd the Y offset.
|
* byte, on the second the X offset, and on the 3rd the Y offset.
|
||||||
@ -270,7 +272,7 @@ static void write_command_byte(unsigned char b)
|
|||||||
*/
|
*/
|
||||||
static void write_aux_byte(unsigned char b)
|
static void write_aux_byte(unsigned char b)
|
||||||
{
|
{
|
||||||
wait_write_ctrl();
|
wait_write_ctrl();
|
||||||
out8(PS2_CTRL_WRITE_AUX, PS2_PORT_CTRL);
|
out8(PS2_CTRL_WRITE_AUX, PS2_PORT_CTRL);
|
||||||
wait_write_data();
|
wait_write_data();
|
||||||
out8(b, PS2_PORT_DATA);
|
out8(b, PS2_PORT_DATA);
|
||||||
@ -284,50 +286,19 @@ static void write_aux_byte(unsigned char b)
|
|||||||
*/
|
*/
|
||||||
static unsigned char read_data_byte()
|
static unsigned char read_data_byte()
|
||||||
{
|
{
|
||||||
wait_read_data();
|
wait_read_data();
|
||||||
return in8(PS2_PORT_DATA);
|
return in8(PS2_PORT_DATA);
|
||||||
} // read_data_byte
|
} // read_data_byte
|
||||||
|
|
||||||
/*
|
|
||||||
* mouse_dev_init:
|
|
||||||
* Called by the kernel to setup the device. Initializes the driver.
|
|
||||||
* Parameters:
|
|
||||||
* kernel_args*, ignored
|
|
||||||
* Return value:
|
|
||||||
* int, 0 if successful, negative error value otherwise
|
|
||||||
*/
|
|
||||||
status_t init_hardware()
|
status_t init_hardware()
|
||||||
{
|
{
|
||||||
dprintf("Initializing PS/2 mouse\n");
|
/* XXX this driver does not have enough source code to
|
||||||
|
* disable the mouse hardware again, so I can't add
|
||||||
// init device driver
|
* the detection here
|
||||||
memset(&md_int, 0, sizeof(mouse_data));
|
*/
|
||||||
|
dprintf("Should detect PS/2 mouse here, always assuming we have it\n");
|
||||||
// register interrupt handler
|
|
||||||
install_io_interrupt_handler(INT_PS2_MOUSE,
|
|
||||||
&handle_mouse_interrupt, NULL, 0);
|
|
||||||
|
|
||||||
// must enable the cascade interrupt
|
|
||||||
arch_int_enable_io_interrupt(INT_CASCADE);
|
|
||||||
|
|
||||||
// enable auxilary device, IRQs and PS/2 mouse
|
|
||||||
write_command_byte(PS2_CMD_DEV_INIT);
|
|
||||||
write_aux_byte(PS2_CMD_ENABLE_MOUSE);
|
|
||||||
|
|
||||||
// controller should send ACK if mouse was detected
|
|
||||||
if(read_data_byte() != PS2_RES_ACK) {
|
|
||||||
dprintf("No PS/2 mouse found\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dprintf("A PS/2 mouse has been successfully detected\n");
|
|
||||||
|
|
||||||
// create the mouse semaphore, used for synchronization between
|
|
||||||
// the interrupt handler and the read() operation
|
|
||||||
mouse_sem = create_sem(0, "ps2_mouse_sem");
|
|
||||||
if(mouse_sem < 0)
|
|
||||||
panic("failed to create PS/2 mouse semaphore!\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} // mouse_dev_init
|
} // mouse_dev_init
|
||||||
|
|
||||||
@ -352,9 +323,40 @@ device_hooks *find_device(const char *name)
|
|||||||
|
|
||||||
status_t init_driver()
|
status_t init_driver()
|
||||||
{
|
{
|
||||||
|
/* XXX parts of this do belong into init_hardware */
|
||||||
|
|
||||||
|
dprintf("Initializing PS/2 mouse\n");
|
||||||
|
|
||||||
|
// init device driver
|
||||||
|
memset(&md_int, 0, sizeof(mouse_data));
|
||||||
|
|
||||||
|
// register interrupt handler
|
||||||
|
install_io_interrupt_handler(INT_PS2_MOUSE,
|
||||||
|
&handle_mouse_interrupt, NULL, 0);
|
||||||
|
|
||||||
|
// enable auxilary device, IRQs and PS/2 mouse
|
||||||
|
write_command_byte(PS2_CMD_DEV_INIT);
|
||||||
|
write_aux_byte(PS2_CMD_ENABLE_MOUSE);
|
||||||
|
|
||||||
|
// controller should send ACK if mouse was detected
|
||||||
|
if(read_data_byte() != PS2_RES_ACK) {
|
||||||
|
dprintf("No PS/2 mouse found\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintf("A PS/2 mouse has been successfully detected\n");
|
||||||
|
|
||||||
|
// create the mouse semaphore, used for synchronization between
|
||||||
|
// the interrupt handler and the read() operation
|
||||||
|
mouse_sem = create_sem(0, "ps2_mouse_sem");
|
||||||
|
if(mouse_sem < 0)
|
||||||
|
panic("failed to create PS/2 mouse semaphore!\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void uninit_driver()
|
void uninit_driver()
|
||||||
{
|
{
|
||||||
|
remove_io_interrupt_handler(INT_PS2_MOUSE, &handle_mouse_interrupt, NULL);
|
||||||
|
dprintf("removed PS/2 mouse interrupt handler\n");
|
||||||
}
|
}
|
||||||
|
@ -78,9 +78,7 @@
|
|||||||
#define PS2_RES_RESEND 0xFE
|
#define PS2_RES_RESEND 0xFE
|
||||||
|
|
||||||
// interrupts
|
// interrupts
|
||||||
#define INT_BASE 0x20
|
|
||||||
#define INT_PS2_MOUSE 0x0C
|
#define INT_PS2_MOUSE 0x0C
|
||||||
#define INT_CASCADE 0x02
|
|
||||||
|
|
||||||
#define PACKET_SIZE 3
|
#define PACKET_SIZE 3
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user