Subversion Repositories HelenOS-historic

Rev

Rev 510 | Rev 532 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 510 Rev 511
Line 25... Line 25...
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
29
#include <console/chardev.h>
29
#include <console/chardev.h>
-
 
30
#include <putchar.h>
30
#include <synch/waitq.h>
31
#include <synch/waitq.h>
31
#include <synch/spinlock.h>
32
#include <synch/spinlock.h>
32
 
33
 
33
/** Initialize character device. */
34
/** Initialize character device.
-
 
35
 *
-
 
36
 * @param chardev Character device.
-
 
37
 * @param op Implementation of character device operations.
-
 
38
 */
34
void chardev_initialize(chardev_t *chardev, ready_func_t r)
39
void chardev_initialize(chardev_t *chardev, chardev_operations_t *op)
35
{
40
{
36
    waitq_initialize(&chardev->wq);
41
    waitq_initialize(&chardev->wq);
37
    spinlock_initialize(&chardev->lock);
42
    spinlock_initialize(&chardev->lock);
38
    chardev->counter = 0;
43
    chardev->counter = 0;
39
    chardev->index = 0;
44
    chardev->index = 0;
-
 
45
    chardev->op = op;
-
 
46
}
-
 
47
 
-
 
48
/** Push character read from input character device.
-
 
49
 *
-
 
50
 * @param chardev Character device.
-
 
51
 * @param ch Character being pushed.
-
 
52
 */
-
 
53
void chardev_push_character(chardev_t *chardev, __u8 ch)
-
 
54
{
-
 
55
        spinlock_lock(&chardev->lock);
40
    chardev->ready_func = r;
56
    chardev->counter++;
-
 
57
    if (chardev->counter == CHARDEV_BUFLEN - 1) {
-
 
58
        /* buffer full => disable device interrupt */
-
 
59
        chardev->op->suspend();
-
 
60
    }
-
 
61
 
-
 
62
    putchar(ch);
-
 
63
        chardev->buffer[chardev->index++] = ch;
-
 
64
        chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */
-
 
65
        waitq_wakeup(&chardev->wq, WAKEUP_FIRST);
-
 
66
        spinlock_unlock(&chardev->lock);
41
}
67
}