Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 510 → Rev 511

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