/kernel/trunk/generic/include/console/chardev.h |
---|
34,10 → 34,16 |
#include <synch/waitq.h> |
#include <synch/spinlock.h> |
#define CHARDEV_BUFLEN 10 |
#define CHARDEV_BUFLEN 512 |
typedef void (* ready_func_t)(void); |
/* Character device operations interface. */ |
struct chardev_operations { |
void (* suspend)(void); /**< Suspend pushing characters. */ |
void (* resume)(void); /**< Resume pushing characters. */ |
}; |
typedef struct chardev_operations chardev_operations_t; |
/** Character input device. */ |
struct chardev { |
waitq_t wq; |
45,9 → 51,10 |
__u8 buffer[CHARDEV_BUFLEN]; |
count_t counter; |
index_t index; |
ready_func_t ready_func; /**< Function to re-enable input from the device. */ |
chardev_operations_t *op; /**< Implementation of chardev operations. */ |
}; |
extern void chardev_initialize(chardev_t *chardev, ready_func_t r); |
extern void chardev_initialize(chardev_t *chardev, chardev_operations_t *op); |
void chardev_push_character(chardev_t *chardev, __u8 ch); |
#endif /* __CHARDEV_H__ */ |
/kernel/trunk/generic/src/console/console.c |
---|
82,7 → 82,7 |
spinlock_unlock(&chardev->lock); |
interrupts_restore(ipl); |
chardev->ready_func(); |
chardev->op->resume(); |
return ch; |
} |
/kernel/trunk/generic/src/console/chardev.c |
---|
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); |
} |