27,15 → 27,41 |
*/ |
|
#include <console/chardev.h> |
#include <putchar.h> |
#include <synch/waitq.h> |
#include <synch/spinlock.h> |
|
/** Initialize character device. */ |
void chardev_initialize(chardev_t *chardev, ready_func_t r) |
/** Initialize character device. |
* |
* @param chardev Character device. |
* @param op Implementation of character device operations. |
*/ |
void chardev_initialize(chardev_t *chardev, chardev_operations_t *op) |
{ |
waitq_initialize(&chardev->wq); |
spinlock_initialize(&chardev->lock); |
chardev->counter = 0; |
chardev->index = 0; |
chardev->ready_func = r; |
chardev->op = op; |
} |
|
/** Push character read from input character device. |
* |
* @param chardev Character device. |
* @param ch Character being pushed. |
*/ |
void chardev_push_character(chardev_t *chardev, __u8 ch) |
{ |
spinlock_lock(&chardev->lock); |
chardev->counter++; |
if (chardev->counter == CHARDEV_BUFLEN - 1) { |
/* buffer full => disable device interrupt */ |
chardev->op->suspend(); |
} |
|
putchar(ch); |
chardev->buffer[chardev->index++] = ch; |
chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */ |
waitq_wakeup(&chardev->wq, WAKEUP_FIRST); |
spinlock_unlock(&chardev->lock); |
} |