diff options
Diffstat (limited to 'kernel/drivers/chardev.c')
-rw-r--r-- | kernel/drivers/chardev.c | 43 |
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; +} |