PatchworkOS
Loading...
Searching...
No Matches
ps2_mouse.c
Go to the documentation of this file.
1#include <kernel/drivers/ps2/ps2_mouse.h>
2
3#include <kernel/cpu/irq.h>
5#include <kernel/log/log.h>
6
7#include <stdlib.h>
8
9static mouse_t* mouse;
10
12{
13 mouse_buttons_t buttons = (packet->flags & PS2_PACKET_BUTTON_RIGHT ? MOUSE_RIGHT : 0) |
15 (packet->flags & PS2_PACKET_BUTTON_LEFT ? MOUSE_LEFT : 0);
16
17 mouse_push(mouse, buttons, packet->deltaX, -packet->deltaY);
18}
19
20static void ps2_mouse_irq(irq_t irq, void* data)
21{
22 (void)irq; // Unused
23
25
26 uint8_t byte;
27 if (PS2_READ(&byte) == ERR)
28 {
29 LOG_WARN("failed to scan PS/2 mouse\n");
30 return;
31 }
32
33 switch (context->index)
34 {
36 {
37 context->packet.flags = byte;
38
39 if (!(context->packet.flags & PS2_PACKET_ALWAYS_ONE))
40 {
41 LOG_WARN("mouse packet out of sync flags=0x%02X\n", context->packet.flags);
42 context->index = PS2_PACKET_FLAGS;
43 return;
44 }
45
46 if (context->packet.flags & PS2_PACKET_X_OVERFLOW)
47 {
48 LOG_WARN("mouse packet x overflow flags=0x%02X\n", context->packet.flags);
49 }
50
51 if (context->packet.flags & PS2_PACKET_Y_OVERFLOW)
52 {
53 LOG_WARN("mouse packet y overflow flags=0x%02X\n", context->packet.flags);
54 }
55
56 context->index = PS2_PACKET_DELTA_X;
57 }
58 break;
60 {
61 context->packet.deltaX = byte;
62 context->index = PS2_PACKET_DELTA_Y;
63 }
64 break;
66 {
67 context->packet.deltaY = (int8_t)byte;
68 context->index = PS2_PACKET_FLAGS;
69
70 if (context->packet.flags & PS2_PACKET_X_SIGN)
71 {
72 context->packet.deltaX |= 0xFF00;
73 }
74
75 if (context->packet.flags & PS2_PACKET_Y_SIGN)
76 {
77 context->packet.deltaY |= 0xFF00;
78 }
79
81 }
82 break;
83 }
84}
85
87{
89 if (mouse == NULL)
90 {
91 LOG_ERR("failed to create PS/2 mouse\n");
92 return ERR;
93 }
94
96 if (context == NULL)
97 {
99 LOG_ERR("failed to allocate memory for PS/2 mouse IRQ context\n");
100 return ERR;
101 }
102 context->index = 0;
103
105 {
106 LOG_ERR("failed to set default PS/2 mouse settings\n");
107 free(context);
109 return ERR;
110 }
111
113 return 0;
114}
static fd_t data
Definition dwm.c:21
void irq_install(irq_t irq, irq_callback_func_t func, void *data)
Install an IRQ handler.
Definition irq.c:39
irq_t
IRQ numbers.
Definition irq.h:23
@ IRQ_PS2_SECOND_DEVICE
Definition irq.h:36
@ IRQ_PS2_FIRST_DEVICE
Definition irq.h:25
mouse_t * mouse_new(const char *name)
Allocate and initialize a mouse structure.
Definition mouse.c:81
void mouse_free(mouse_t *mouse)
Free and deinitialize a mouse structure.
Definition mouse.c:141
void mouse_push(mouse_t *mouse, mouse_buttons_t buttons, int64_t deltaX, int64_t deltaY)
Push a new mouse event to the mouse event queue.
Definition mouse.c:147
uint64_t ps2_mouse_init(ps2_device_info_t *info)
Initialize a PS/2 mouse device.
Definition ps2_mouse.c:86
@ PS2_PACKET_DELTA_Y
Definition ps2_mouse.h:51
@ PS2_PACKET_DELTA_X
Definition ps2_mouse.h:50
@ PS2_PACKET_FLAGS
Definition ps2_mouse.h:49
@ PS2_PACKET_X_SIGN
Definition ps2_mouse.h:24
@ PS2_PACKET_X_OVERFLOW
Definition ps2_mouse.h:26
@ PS2_PACKET_Y_OVERFLOW
Definition ps2_mouse.h:27
@ PS2_PACKET_ALWAYS_ONE
Definition ps2_mouse.h:23
@ PS2_PACKET_BUTTON_RIGHT
Definition ps2_mouse.h:21
@ PS2_PACKET_BUTTON_MIDDLE
Definition ps2_mouse.h:22
@ PS2_PACKET_BUTTON_LEFT
Definition ps2_mouse.h:20
@ PS2_PACKET_Y_SIGN
Definition ps2_mouse.h:25
#define PS2_DEV_CMD(device, command)
Send a command to a PS/2 device without reading response.
Definition ps2.h:279
#define PS2_READ(data)
Read data from PS/2 controller.
Definition ps2.h:198
@ PS2_DEV_FIRST
First PS/2 port.
Definition ps2.h:128
@ PS2_DEV_CMD_SET_DEFAULTS
Definition ps2.h:117
#define LOG_ERR(format,...)
Definition log.h:89
#define LOG_WARN(format,...)
Definition log.h:88
mouse_buttons_t
Mouse buttons enum.
Definition mouse.h:31
@ MOUSE_RIGHT
Right mouse button.
Definition mouse.h:33
@ MOUSE_MIDDLE
Middle mouse button.
Definition mouse.h:34
@ MOUSE_LEFT
Left mouse button.
Definition mouse.h:35
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
static fb_info_t info
Definition gop.c:41
static void ps2_mouse_irq(irq_t irq, void *data)
Definition ps2_mouse.c:20
static mouse_t * mouse
Definition ps2_mouse.c:9
static void ps2_mouse_handle_packet(const ps2_mouse_packet_t *packet)
Definition ps2_mouse.c:11
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
__INT8_TYPE__ int8_t
Definition stdint.h:10
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
char name[MAX_NAME]
Definition fb.h:44
Mouse structure.
Definition mouse.h:31
PS/2 device information structure.
Definition ps2.h:149
PS/2 mouse IRQ context.
Definition ps2_mouse.h:60
ps2_mouse_packet_index_t index
Current packet byte index.
Definition ps2_mouse.h:61
ps2_mouse_packet_t packet
Current packet being assembled.
Definition ps2_mouse.h:62
PS/2 mouse packet structure.
Definition ps2_mouse.h:36
ps2_mouse_packet_flags_t flags
Packet flags.
Definition ps2_mouse.h:37
int16_t deltaY
Y-axis movement.
Definition ps2_mouse.h:39
int16_t deltaX
X-axis movement.
Definition ps2_mouse.h:38