Working PS/2 keyboard driver
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m19s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m19s
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#include <irq/irq.h>
|
||||
#include <libk/list.h>
|
||||
#include <libk/rbtree.h>
|
||||
#include <libk/std.h>
|
||||
#include <mm/liballoc.h>
|
||||
#include <sync/spin_lock.h>
|
||||
@@ -10,8 +10,7 @@
|
||||
#include <amd64/intr.h>
|
||||
#endif
|
||||
|
||||
struct irq* irq_table[0x100];
|
||||
|
||||
static struct rb_node_link* irq_tree = NULL;
|
||||
static spin_lock_t irqs_lock = SPIN_LOCK_INIT;
|
||||
|
||||
bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num) {
|
||||
@@ -25,17 +24,27 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num) {
|
||||
irq->irq_num = irq_num;
|
||||
|
||||
spin_lock (&irqs_lock);
|
||||
irq_table[irq_num] = irq;
|
||||
rbtree_insert (struct irq, &irq_tree, &irq->irq_tree_link, irq_tree_link, irq_num);
|
||||
spin_unlock (&irqs_lock);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct irq* irq_find (uint32_t irq_num) {
|
||||
void irq_detach (uint32_t irq_num) {
|
||||
struct irq* irq = irq_find (irq_num);
|
||||
|
||||
spin_lock (&irqs_lock);
|
||||
rbtree_delete (&irq_tree, &irq->irq_tree_link);
|
||||
spin_unlock (&irqs_lock);
|
||||
|
||||
struct irq* irq = irq_table[irq_num];
|
||||
free (irq);
|
||||
}
|
||||
|
||||
struct irq* irq_find (uint32_t irq_num) {
|
||||
struct irq* irq = NULL;
|
||||
|
||||
spin_lock (&irqs_lock);
|
||||
rbtree_find (struct irq, &irq_tree, irq_num, irq, irq_tree_link, irq_num);
|
||||
spin_unlock (&irqs_lock);
|
||||
|
||||
return irq;
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
#ifndef _KERNEL_IRQ_IRQ_H
|
||||
#define _KERNEL_IRQ_IRQ_H
|
||||
|
||||
#include <libk/list.h>
|
||||
#include <libk/rbtree.h>
|
||||
#include <libk/std.h>
|
||||
|
||||
typedef void (*irq_func_t) (void* arg, void* regs);
|
||||
|
||||
struct irq {
|
||||
struct list_node_link irqs_link;
|
||||
uint32_t irq_num;
|
||||
struct rb_node_link irq_tree_link;
|
||||
|
||||
irq_func_t func;
|
||||
void* arg;
|
||||
uint32_t irq_num;
|
||||
};
|
||||
|
||||
bool irq_attach (irq_func_t, void* arg, uint32_t irq_num);
|
||||
void irq_detach (uint32_t irq_num);
|
||||
struct irq* irq_find (uint32_t irq_num);
|
||||
|
||||
#endif // _KERNEL_IRQ_IRQ_H
|
||||
|
||||
Reference in New Issue
Block a user