Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 510 → Rev 511

/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);
}