From b980ab94c2a793918283fa888b2ca07e5a79caaa Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 5 Jan 2023 23:29:03 -0300 Subject: [PATCH] generic mouse interface --- src/arch/x86_64/main.c | 2 + src/include/kernel/devman.h | 1 + src/include/kernel/mouse.h | 28 +++++++++++++ src/sys/mouse.c | 84 +++++++++++++++++++++++++++++++++++++ src/video/consoledev.c | 2 +- 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/include/kernel/mouse.h create mode 100644 src/sys/mouse.c diff --git a/src/arch/x86_64/main.c b/src/arch/x86_64/main.c index 589a13c7..e571c7f7 100644 --- a/src/arch/x86_64/main.c +++ b/src/arch/x86_64/main.c @@ -90,6 +90,8 @@ void kmain(){ smp_init(); keyboard_init(); + + mouse_init(); ps2_init(); diff --git a/src/include/kernel/devman.h b/src/include/kernel/devman.h index 00ced8f6..96a7704e 100644 --- a/src/include/kernel/devman.h +++ b/src/include/kernel/devman.h @@ -11,6 +11,7 @@ #define MAJOR_FB 5 #define MAJOR_KB 6 #define MAJOR_E9OUT 7 +#define MAJOR_MOUSE 8 typedef struct{ int (*read)(int* error, int minor, void* buff, size_t count, size_t offset); diff --git a/src/include/kernel/mouse.h b/src/include/kernel/mouse.h new file mode 100644 index 00000000..4cff1067 --- /dev/null +++ b/src/include/kernel/mouse.h @@ -0,0 +1,28 @@ +#ifndef _MOUSE_H_INCLUDE +#define _MOUSE_H_INCLUDE + +#define MOUSE_FLAG_RB 1 +#define MOUSE_FLAG_MB 2 +#define MOUSE_FLAG_LB 4 +#define MOUSE_FLAG_B4 8 +#define MOUSE_FLAG_B5 16 + +#include +#include + +typedef struct { + int flags; + int x,y,z; +} mousepacket_t; + +typedef struct { + ringbuffer_t buffer; + event_t event; + int flags; +} mouse_t; + +void mouse_init(); +int mouse_getnew(); +void mouse_packet(int, mousepacket_t); + +#endif diff --git a/src/sys/mouse.c b/src/sys/mouse.c new file mode 100644 index 00000000..3dea6343 --- /dev/null +++ b/src/sys/mouse.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include + +#define MOUSE_COUNT 32 + +static int mouseinuse; + +mouse_t mouse[MOUSE_COUNT]; +ringbuffer_t devbuffer; + +void mouse_packet(int id, mousepacket_t packet){ + ringbuffer_write(&devbuffer, &packet, sizeof(mousepacket_t)); + ringbuffer_write(&mouse[id].buffer, &packet, sizeof(mousepacket_t)); + event_signal(&mouse[id].event, false); +} + +int mouse_getnew(){ + + int id; + + for(id = 0; id < 32; ++id) + if(((mouseinuse >> id) & 1) == 0) + break; + + if(id == 32) + return -1; + + mouseinuse |= 1 << id; + + return id; + +} + +static int read(int *error, int minor, void* buff, size_t count, size_t offset){ + count /= sizeof(mousepacket_t); + if(count == 0){ + *error = EINVAL; + return -1; + } + + arch_interrupt_disable(); + + count = ringbuffer_read(&devbuffer, buff, count*sizeof(mousepacket_t)); + + arch_interrupt_enable(); + + *error = 0; + return count; + +} + +static int poll(int minor, pollfd* fd){ + + if((fd->events & POLLIN) && devbuffer.read != devbuffer.write) + fd->revents |= POLLIN; + + + return 0; +} + + +static devcalls calls = { + .read = read, + .poll = poll +}; + +void mouse_init(){ + + for(uintmax_t i = 0; i < MOUSE_COUNT; ++i){ + if(ringbuffer_init(&mouse[i].buffer, sizeof(mousepacket_t)*100)) + _panic("Out of memory!", NULL); + } + + if(ringbuffer_init(&devbuffer, sizeof(mousepacket_t)*100)) + _panic("Out of memory", NULL); + + if(devman_newdevice("mouse", TYPE_CHARDEV, MAJOR_MOUSE, 0, &calls)) + _panic("Failed to create mouse device", NULL); + + +} diff --git a/src/video/consoledev.c b/src/video/consoledev.c index b1d36e05..3bf60aca 100644 --- a/src/video/consoledev.c +++ b/src/video/consoledev.c @@ -278,7 +278,7 @@ static int poll(int minor, pollfd* fd){ } -devcalls calls = { +static devcalls calls = { read, write, isatty, isseekable, ioctl, poll };