aboutsummaryrefslogtreecommitdiff
path: root/kernel/drivers/chardev.c
diff options
context:
space:
mode:
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;
+}