Subversion Repositories HelenOS

Rev

Rev 4296 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4296 Rev 4420
Line 33... Line 33...
33
 */
33
 */
34
 
34
 
35
#include <console/chardev.h>
35
#include <console/chardev.h>
36
#include <synch/waitq.h>
36
#include <synch/waitq.h>
37
#include <synch/spinlock.h>
37
#include <synch/spinlock.h>
-
 
38
#include <print.h>
-
 
39
#include <func.h>
-
 
40
#include <arch.h>
38
 
41
 
39
/** Initialize input character device.
42
/** Initialize input character device.
40
 *
43
 *
41
 * @param indev Input character device.
44
 * @param indev Input character device.
42
 * @param op    Implementation of input character device operations.
45
 * @param op    Implementation of input character device operations.
Line 77... Line 80...
77
    indev->index = indev->index % INDEV_BUFLEN;
80
    indev->index = indev->index % INDEV_BUFLEN;
78
    waitq_wakeup(&indev->wq, WAKEUP_FIRST);
81
    waitq_wakeup(&indev->wq, WAKEUP_FIRST);
79
    spinlock_unlock(&indev->lock);
82
    spinlock_unlock(&indev->lock);
80
}
83
}
81
 
84
 
-
 
85
/** Pop character from input character device.
-
 
86
 *
-
 
87
 * @param indev Input character device.
-
 
88
 *
-
 
89
 * @return Character read.
-
 
90
 *
-
 
91
 */
-
 
92
wchar_t indev_pop_character(indev_t *indev)
-
 
93
{
-
 
94
    if (atomic_get(&haltstate)) {
-
 
95
        /* If we are here, we are hopefully on the processor that
-
 
96
         * issued the 'halt' command, so proceed to read the character
-
 
97
         * directly from input
-
 
98
         */
-
 
99
        if (check_poll(indev))
-
 
100
            return indev->op->poll(indev);
-
 
101
       
-
 
102
        /* No other way of interacting with user */
-
 
103
        interrupts_disable();
-
 
104
       
-
 
105
        if (CPU)
-
 
106
            printf("cpu%u: ", CPU->id);
-
 
107
        else
-
 
108
            printf("cpu: ");
-
 
109
       
-
 
110
        printf("halted (no polling input)\n");
-
 
111
        cpu_halt();
-
 
112
    }
-
 
113
   
-
 
114
    waitq_sleep(&indev->wq);
-
 
115
    ipl_t ipl = interrupts_disable();
-
 
116
    spinlock_lock(&indev->lock);
-
 
117
    wchar_t ch = indev->buffer[(indev->index - indev->counter) % INDEV_BUFLEN];
-
 
118
    indev->counter--;
-
 
119
    spinlock_unlock(&indev->lock);
-
 
120
    interrupts_restore(ipl);
-
 
121
   
-
 
122
    return ch;
-
 
123
}
-
 
124
 
82
/** Initialize output character device.
125
/** Initialize output character device.
83
 *
126
 *
84
 * @param outdev Output character device.
127
 * @param outdev Output character device.
85
 * @param op     Implementation of output character device operations.
128
 * @param op     Implementation of output character device operations.
86
 *
129
 *
Line 91... Line 134...
91
    outdev->name = name;
134
    outdev->name = name;
92
    spinlock_initialize(&outdev->lock, "outdev");
135
    spinlock_initialize(&outdev->lock, "outdev");
93
    outdev->op = op;
136
    outdev->op = op;
94
}
137
}
95
 
138
 
-
 
139
bool check_poll(indev_t *indev)
-
 
140
{
-
 
141
    if (indev == NULL)
-
 
142
        return false;
-
 
143
   
-
 
144
    if (indev->op == NULL)
-
 
145
        return false;
-
 
146
   
-
 
147
    return (indev->op->poll != NULL);
-
 
148
}
-
 
149
 
96
/** @}
150
/** @}
97
 */
151
 */