Changeset a7efdec in mainline


Ignore:
Timestamp:
2009-03-12T17:49:42Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b6f2ebc
Parents:
099aa78
Message:

split chardev_t into indev_t and outdev_t

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/console/chardev.c

    r099aa78 ra7efdec  
    3838#include <synch/spinlock.h>
    3939
    40 /** Initialize character device.
     40/** Initialize input character device.
    4141 *
    42  * @param chardev Character device.
    43  * @param op Implementation of character device operations.
     42 * @param indev Input character device.
     43 * @param op    Implementation of input character device operations.
     44 *
    4445 */
    45 void chardev_initialize(char *name, chardev_t *chardev,
    46                         chardev_operations_t *op)
     46void indev_initialize(char *name, indev_t *indev,
     47    indev_operations_t *op)
    4748{
    48         chardev->name = name;
    49 
    50         waitq_initialize(&chardev->wq);
    51         spinlock_initialize(&chardev->lock, "chardev");
    52         chardev->counter = 0;
    53         chardev->index = 0;
    54         chardev->op = op;
     49        indev->name = name;
     50        waitq_initialize(&indev->wq);
     51        spinlock_initialize(&indev->lock, "indev");
     52        indev->counter = 0;
     53        indev->index = 0;
     54        indev->op = op;
    5555}
    5656
    5757/** Push character read from input character device.
    5858 *
    59  * @param chardev Character device.
    60  * @param ch Character being pushed.
     59 * @param indev Input character device.
     60 * @param ch    Character being pushed.
     61 *
    6162 */
    62 void chardev_push_character(chardev_t *chardev, uint8_t ch)
     63void indev_push_character(indev_t *indev, uint8_t ch)
    6364{
    64         spinlock_lock(&chardev->lock);
    65         chardev->counter++;
    66         if (chardev->counter == CHARDEV_BUFLEN - 1) {
    67                 /* buffer full => disable device interrupt */
    68                 chardev->op->suspend(chardev);
     65        ASSERT(indev);
     66       
     67        spinlock_lock(&indev->lock);
     68        if (indev->counter == INDEV_BUFLEN - 1) {
     69                /* Buffer full */
     70                spinlock_unlock(&indev->lock);
     71                return;
    6972        }
    7073       
    71         chardev->buffer[chardev->index++] = ch;
    72         chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */
    73         waitq_wakeup(&chardev->wq, WAKEUP_FIRST);
    74         spinlock_unlock(&chardev->lock);
     74        indev->counter++;
     75        indev->buffer[indev->index++] = ch;
     76       
     77        /* Index modulo size of buffer */
     78        indev->index = indev->index % INDEV_BUFLEN;
     79        waitq_wakeup(&indev->wq, WAKEUP_FIRST);
     80        spinlock_unlock(&indev->lock);
     81}
     82
     83/** Initialize output character device.
     84 *
     85 * @param outdev Output character device.
     86 * @param op     Implementation of output character device operations.
     87 *
     88 */
     89void outdev_initialize(char *name, outdev_t *outdev,
     90    outdev_operations_t *op)
     91{
     92        outdev->name = name;
     93        spinlock_initialize(&outdev->lock, "outdev");
     94        outdev->op = op;
    7595}
    7696
Note: See TracChangeset for help on using the changeset viewer.