static ssize_t read_mouse(struct file * file, char * buffer, size_t count, loff_t *ppos) { ssize_t i; if (count < 3) return -EINVAL; if (!mouse.ready) return -EAGAIN; ATIXL_MSE_DISABLE_UPDATE(); /* Allowed interrupts to occur during data gathering - shouldn't hurt */ put_user((char)(~mouse.latch_buttons&7) | 0x80 , buffer); if (mouse.dx < -127) mouse.dx = -127; if (mouse.dx > 127) mouse.dx = 127; put_user((char)mouse.dx, buffer + 1); if (mouse.dy < -127) mouse.dy = -127; if (mouse.dy > 127) mouse.dy = 127; put_user((char)-mouse.dy, buffer + 2); for(i = 3; i < count; i++) put_user(0x00, buffer + i); mouse.dx = 0; mouse.dy = 0; mouse.latch_buttons = mouse.buttons; mouse.ready = 0; ATIXL_MSE_ENABLE_UPDATE(); return i; /* i data bytes returned */ }
void mouse_interrupt(int irq, void *dev_id, struct pt_regs * regs) { char dx, dy, buttons; ATIXL_MSE_DISABLE_UPDATE(); /* Note that interrupts are still enabled */ outb(ATIXL_MSE_READ_X, ATIXL_MSE_CONTROL_PORT); /* Select IR1 - X movement */ dx = inb( ATIXL_MSE_DATA_PORT); outb(ATIXL_MSE_READ_Y, ATIXL_MSE_CONTROL_PORT); /* Select IR2 - Y movement */ dy = inb( ATIXL_MSE_DATA_PORT); outb(ATIXL_MSE_READ_BUTTONS, ATIXL_MSE_CONTROL_PORT); /* Select IR0 - Button Status */ buttons = inb( ATIXL_MSE_DATA_PORT); busmouse_add_movementbuttons(msedev, dx, -dy, buttons); ATIXL_MSE_ENABLE_UPDATE(); }
void mouse_interrupt(int unused) { char dx, dy, buttons; ATIXL_MSE_DISABLE_UPDATE(); /* Note that interrupts are still enabled */ outb(ATIXL_MSE_READ_X, ATIXL_MSE_CONTROL_PORT); /* Select IR1 - X movement */ dx = inb( ATIXL_MSE_DATA_PORT); outb(ATIXL_MSE_READ_Y, ATIXL_MSE_CONTROL_PORT); /* Select IR2 - Y movement */ dy = inb( ATIXL_MSE_DATA_PORT); outb(ATIXL_MSE_READ_BUTTONS, ATIXL_MSE_CONTROL_PORT); /* Select IR0 - Button Status */ buttons = inb( ATIXL_MSE_DATA_PORT); if (dx != 0 || dy != 0 || buttons != mouse.latch_buttons) { mouse.latch_buttons |= buttons; mouse.dx += dx; mouse.dy += dy; mouse.ready = 1; wake_up_interruptible(&mouse.wait); } ATIXL_MSE_ENABLE_UPDATE(); }
void mouse_interrupt(int irq, void *dev_id, struct pt_regs * regs) { char dx, dy, buttons; ATIXL_MSE_DISABLE_UPDATE(); /* Note that interrupts are still enabled */ outb(ATIXL_MSE_READ_X, ATIXL_MSE_CONTROL_PORT); /* Select IR1 - X movement */ dx = inb( ATIXL_MSE_DATA_PORT); outb(ATIXL_MSE_READ_Y, ATIXL_MSE_CONTROL_PORT); /* Select IR2 - Y movement */ dy = inb( ATIXL_MSE_DATA_PORT); outb(ATIXL_MSE_READ_BUTTONS, ATIXL_MSE_CONTROL_PORT); /* Select IR0 - Button Status */ buttons = inb( ATIXL_MSE_DATA_PORT); if (dx != 0 || dy != 0 || buttons != mouse.latch_buttons) { add_mouse_randomness((buttons << 16) + (dy << 8) + dx); mouse.latch_buttons |= buttons; mouse.dx += dx; mouse.dy += dy; mouse.ready = 1; wake_up_interruptible(&mouse.wait); if (mouse.fasync) kill_fasync(mouse.fasync, SIGIO); } ATIXL_MSE_ENABLE_UPDATE(); }