diff options
Diffstat (limited to 'drivers/mouse.c')
-rw-r--r-- | drivers/mouse.c | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/drivers/mouse.c b/drivers/mouse.c deleted file mode 100644 index 23619a0..0000000 --- a/drivers/mouse.c +++ /dev/null @@ -1,144 +0,0 @@ -#include <cpu/idt.h> -#include <drivers/mouse.h> -#include <fs/devfs.h> -#include <fs/fifo.h> -#include <fs/vfs.h> -#include <stdint.h> - -uint8_t mouse_cycle = 0; // unsigned char -uint8_t mouse_uint8_t[3]; // signed char -uint8_t mouse_x = 0; // signed char -uint8_t mouse_y = 0; // signed char -vfs_inode_t *mouse_inode; -vfs_fd_t *mouse_fd; - -struct mouse_event { - uint8_t buttons; - uint8_t x; - uint8_t y; -}; - -int fs_mouse_write(uint8_t *buffer, uint64_t offset, uint64_t len, - vfs_fd_t *fd) { - int rc = fifo_object_write(buffer, offset, len, fd->inode->internal_object); - FIFO_FILE *f = fd->inode->internal_object; - mouse_inode->has_data = f->has_data; - return rc; -} - -int fs_mouse_read(uint8_t *buffer, uint64_t offset, uint64_t len, - vfs_fd_t *fd) { - FIFO_FILE *f = fd->inode->internal_object; - if (!mouse_inode->has_data) - return 0; - int rc = fifo_object_read(buffer, offset, len, f); - mouse_inode->has_data = f->has_data; - return rc; -} - -void add_mouse(void) { - mouse_inode = devfs_add_file("/mouse", fs_mouse_read, fs_mouse_write, NULL, 0, - 0, FS_TYPE_CHAR_DEVICE); - mouse_inode->internal_object = create_fifo_object(); - // Don't look at this - int fd = vfs_open("/dev/mouse", O_RDWR, 0); - mouse_fd = get_vfs_fd(fd); - get_current_task()->file_descriptors[fd] = NULL; -} - -__attribute__((interrupt)) void what(registers_t *r) { EOI(0xe); } - -__attribute__((interrupt)) void int_mouse(registers_t *r) { - (void)r; - EOI(12); - switch (mouse_cycle) { - case 0: - mouse_uint8_t[0] = inb(0x60); - if(!(mouse_uint8_t[0] & (1 << 3))) { - mouse_cycle = 0; - return; - } - mouse_cycle++; - break; - case 1: - mouse_uint8_t[1] = inb(0x60); - mouse_cycle++; - break; - case 2: - mouse_uint8_t[2] = inb(0x60); - mouse_x = mouse_uint8_t[1]; - mouse_y = mouse_uint8_t[2]; - mouse_cycle = 0; - struct mouse_event e; - e.buttons = mouse_uint8_t[0]; - e.x = mouse_x; - e.y = mouse_y; - raw_vfs_pwrite(mouse_fd, &e, sizeof(e), 0); - break; - } -} - -void mouse_wait(uint8_t a_type) { - uint32_t _time_out = 100000; - if (a_type == 0) { - while (_time_out--) { - if ((inb(0x64) & 1) == 1) { - return; - } - } - return; - } else { - while (_time_out--) { - if ((inb(0x64) & 2) == 0) { - return; - } - } - return; - } -} - -void mouse_write(uint8_t a_write) { - // Wait to be able to send a command - mouse_wait(1); - // Tell the mouse we are sending a command - outb(0x64, 0xD4); - // Wait for the final part - mouse_wait(1); - // Finally write - outb(0x60, a_write); -} - -uint8_t mouse_read() { - // Get's response from mouse - mouse_wait(0); - return inb(0x60); -} - -void install_mouse(void) { - uint8_t _status; // unsigned char - asm("cli"); - // Enable the auxiliary mouse device - mouse_wait(1); - outb(0x64, 0xA8); - - // Enable the interrupts - mouse_wait(1); - outb(0x64, 0x20); - mouse_wait(0); - _status = (inb(0x60) | 2); - mouse_wait(1); - outb(0x64, 0x60); - mouse_wait(1); - outb(0x60, _status); - - // Tell the mouse to use default settings - mouse_write(0xF6); - mouse_read(); // Acknowledge - - // Enable the mouse - mouse_write(0xF4); - mouse_read(); // Acknowledge - - install_handler(int_mouse, INT_32_INTERRUPT_GATE(0x3), 12 + 0x20); - install_handler(what, INT_32_INTERRUPT_GATE(0x3), 0xe + 0x20); -} |