PatchworkOS
Loading...
Searching...
No Matches
ps2_kbd.c
Go to the documentation of this file.
1#include <kernel/drivers/ps2/ps2_kbd.h>
3
4#include <kernel/cpu/irq.h>
6#include <kernel/log/log.h>
7
8#include <stdlib.h>
9
10static kbd_t* kbd;
11
12static void ps2_kbd_irq(irq_t irq, void* data)
13{
14 (void)irq; // Unused
15
16 ps2_kbd_irq_context_t* context = data;
17
18 ps2_device_response_t response;
19 if (PS2_READ(&response) == ERR)
20 {
21 LOG_WARN("failed to read PS/2 keyboard response\n");
22 return;
23 }
24
25 switch (response)
26 {
30 LOG_ERR("unexpected PS/2 keyboard response: %d\n", response);
31 return;
33 context->isExtended = true;
34 return;
36 context->isRelease = true;
37 return;
38 default:
39 break;
40 }
41
42 ps2_scancode_t scancode = (ps2_scancode_t)response;
44
45 keycode_t code = ps2_scancode_to_keycode(scancode, context->isExtended);
46 kbd_push(kbd, type, code);
47
48 context->isExtended = false;
49 context->isRelease = false;
50}
51
53{
55 {
56 LOG_ERR("failed to set PS/2 keyboard scan code set\n");
57 return ERR;
58 }
59
60 kbd = kbd_new(info->name);
61 if (kbd == NULL)
62 {
63 LOG_ERR("failed to create PS/2 keyboard\n");
64 return ERR;
65 }
66
68 if (context == NULL)
69 {
71 LOG_ERR("failed to allocate memory for PS/2 keyboard IRQ context\n");
72 return ERR;
73 }
74 context->isExtended = false;
75 context->isRelease = false;
76
78 return 0;
79}
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
void kbd_push(kbd_t *kbd, kbd_event_type_t type, keycode_t code)
Push a keyboard event to the keyboard event queue.
Definition kbd.c:172
void kbd_free(kbd_t *kbd)
Free and deinitialize a keyboard structure.
Definition kbd.c:147
kbd_t * kbd_new(const char *name)
Allocate and initialize a keyboard structure.
Definition kbd.c:85
uint64_t ps2_kbd_init(ps2_device_info_t *info)
Initialize a PS/2 keyboard device.
Definition ps2_kbd.c:52
#define PS2_SCAN_CODE_SET
PS/2 scan code set to use.
Definition ps2_scanmap.h:18
keycode_t ps2_scancode_to_keycode(ps2_scancode_t scancode, bool isExtended)
Convert a PS/2 scancode to a generic keycode.
uint8_t ps2_scancode_t
PS/2 scancode.
Definition ps2_scanmap.h:23
#define PS2_DEV_SUB_CMD(device, command, subCommand)
Send a command and a subcommand to a PS/2 device.
Definition ps2.h:311
#define PS2_READ(data)
Read data from PS/2 controller.
Definition ps2.h:198
ps2_device_response_t
PS/2 device command responses.
Definition ps2.h:182
@ PS2_DEV_FIRST
First PS/2 port.
Definition ps2.h:128
@ PS2_DEV_CMD_SET_SCANCODE_SET
Definition ps2.h:112
@ PS2_DEV_RESPONSE_RESEND
Definition ps2.h:184
@ PS2_DEV_RESPONSE_ACK
Definition ps2.h:183
@ PS2_DEV_RESPONSE_BAT_OK
Definition ps2.h:185
@ PS2_DEV_RESPONSE_KBD_EXTENDED
Indicates that the following byte is an extended scancode.
Definition ps2.h:186
@ PS2_DEV_RESPONSE_KBD_RELEASE
Indicates that the following byte is a key release code.
Definition ps2.h:187
#define LOG_ERR(format,...)
Definition log.h:89
#define LOG_WARN(format,...)
Definition log.h:88
keycode_t
Keyboard keycode type.
Definition kbd.h:27
kbd_event_type_t
Keyboard event type.
Definition kbd.h:286
@ KBD_RELEASE
Key release event.
Definition kbd.h:288
@ KBD_PRESS
Key press event.
Definition kbd.h:287
#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_kbd_irq(irq_t irq, void *data)
Definition ps2_kbd.c:12
static kbd_t * kbd
Definition ps2_kbd.c:10
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
char name[MAX_NAME]
Definition fb.h:44
Keyboard structure.
Definition kbd.h:31
PS/2 device information structure.
Definition ps2.h:149
State for the PS/2 keyboard interrupt handler.
Definition ps2_kbd.h:17