BarryServer : Git

All the code for all my projects
// BarryServer : Git / Orion / commit / 1628fcfdfdf2978ed9ccac96ee7d13bb3dc43a01 / drivers / mouse

// Related

Orion

Barry Keyboard/Mouse drivers + POSIX names for structs 1628fcf (2 years, 4 months ago)
diff --git a/drivers/mouse/mouse.c b/drivers/mouse/mouse.c
new file mode 100644
index 0000000..f32264e
--- /dev/null
+++ b/drivers/mouse/mouse.c
@@ -0,0 +1,116 @@
+/*
+ * This file contains the mouse driver.  It generates the /dev/mouse device
+ * file, which can be read and returns a structure of the mouse data.
+ */
+
+#include <sys/mouse.h>
+#include "../drivers.h"
+#include "../../proc/proc.h"
+#include "../../io.h"
+
+size_t mouse_read(File *file, char *buf, size_t size, off_t offset);
+
+FileOps mouseFileOps = {
+	.read = mouse_read,
+};
+
+Driver mouseDriver = {
+	.major = 11,
+	.ops = &mouseFileOps,
+	.next = NULL,
+};
+
+unsigned char mouseCycle = 0;
+char mouseByte[3], mouseX = 0, mouseY = 0;
+
+/* Handle the mouse interrupt */
+static void
+mouse_handler(InterruptFrame *frame)
+{
+	mouseByte[mouseCycle++] = inb(0x60);
+	if (mouseCycle < 3)
+		return;
+	mouseCycle = 0;
+	mouseX = mouseByte[1];
+	mouseY = mouseByte[2];
+
+//	kprintf("Mouse at [%d,%d]", mouseX, mouseY);
+}
+
+/* Wait on the mouse */
+static inline void
+mouse_io_wait(int type)
+{
+	int time = 100000;
+	if (!type) {
+		while (time--)
+			if ((inb(0x64) & 1) == 1)
+				return;
+	} else {
+		while (time--)
+			if ((inb(0x64) & 2) == 0)
+				return;
+	}
+}
+
+/* Write to the mouse */
+static inline void
+mouse_io_write(char byte)
+{
+	mouse_io_wait(1);
+	outb(0x64, 0xD4);
+	mouse_io_wait(1);
+	outb(0x60, byte);
+}
+
+/* Read from the mouse */
+static inline char
+mouse_io_read(void)
+{
+	mouse_io_wait(0);
+	return inb(0x60);
+}
+
+/* Initialise the mouse */
+void
+init_mouse(void)
+{
+	register_driver(&mouseDriver);
+	mknod("/dev/mouse", S_IFCHR | 0666, MKDEV(mouseDriver.major, 0));
+	register_interrupt(12, mouse_handler);
+
+	char status;
+	mouse_io_wait(1);
+	outb(0x64, 0xA8);
+
+	/* Enable interrupts */
+	mouse_io_wait(1);
+	outb(0x64, 0x20);
+	mouse_io_wait(0);
+	status = inb(0x60) | 2;
+	mouse_io_wait(1);
+	outb(0x64, 0x60);
+	mouse_io_wait(1);
+	outb(0x60, status);
+
+	/* Use default settings */
+	mouse_io_write(0xF6);
+	mouse_io_read();
+
+	/* Enable the mouse */
+	mouse_io_write(0xF4);
+	mouse_io_read();
+}
+
+/* Read the mouse device */
+size_t
+mouse_read(File *file, char *buf, size_t size, off_t offset)
+{
+	size_t count = 0;
+	while (count < size) {
+		*(buf + count++) = mouseByte[0];
+		*(buf + count++) = mouseX;
+		*(buf + count++) = mouseY;
+	}
+	return count;
+}