aboutsummaryrefslogtreecommitdiff
path: root/kernel/drivers/chardev.c
diff options
context:
space:
mode:
authornthnluu <nate1299@me.com>2024-01-28 21:20:27 -0500
committernthnluu <nate1299@me.com>2024-01-28 21:20:27 -0500
commitc63f340d90800895f007de64b7d2d14624263331 (patch)
tree2c0849fa597dd6da831c8707b6f2603403778d7b /kernel/drivers/chardev.c
Created student weenix repository
Diffstat (limited to 'kernel/drivers/chardev.c')
-rw-r--r--kernel/drivers/chardev.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/kernel/drivers/chardev.c b/kernel/drivers/chardev.c
new file mode 100644
index 0000000..b8eb146
--- /dev/null
+++ b/kernel/drivers/chardev.c
@@ -0,0 +1,43 @@
+#include "drivers/chardev.h"
+#include "drivers/memdevs.h"
+#include "drivers/tty/tty.h"
+#include "kernel.h"
+#include "util/debug.h"
+
+static list_t chardevs = LIST_INITIALIZER(chardevs);
+
+void chardev_init()
+{
+ tty_init();
+ memdevs_init();
+}
+
+long chardev_register(chardev_t *dev)
+{
+ if (!dev || (NULL_DEVID == dev->cd_id) || !(dev->cd_ops))
+ {
+ return -1;
+ }
+ list_iterate(&chardevs, cd, chardev_t, cd_link)
+ {
+ if (dev->cd_id == cd->cd_id)
+ {
+ return -1;
+ }
+ }
+ list_insert_tail(&chardevs, &dev->cd_link);
+ return 0;
+}
+
+chardev_t *chardev_lookup(devid_t id)
+{
+ list_iterate(&chardevs, cd, chardev_t, cd_link)
+ {
+ KASSERT(NULL_DEVID != cd->cd_id);
+ if (id == cd->cd_id)
+ {
+ return cd;
+ }
+ }
+ return NULL;
+}