Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/drivers/ega/ega.c

    r28a5ebd r39e1b9a  
    4242#include <typedefs.h>
    4343#include <arch/asm.h>
    44 #include <mem.h>
     44#include <memw.h>
    4545#include <str.h>
    4646#include <console/chardev.h>
     
    6969        uint8_t *backbuf;
    7070        ioport8_t *base;
     71        mbstate_t mbstate;
    7172} ega_instance_t;
    7273
    73 static void ega_putuchar(outdev_t *, char32_t);
     74static void ega_write(outdev_t *, const char *, size_t);
    7475static void ega_redraw(outdev_t *);
    7576
    7677static outdev_operations_t egadev_ops = {
    77         .write = ega_putuchar,
     78        .write = ega_write,
    7879        .redraw = ega_redraw,
    7980        .scroll_up = NULL,
     
    538539}
    539540
    540 static void ega_putuchar(outdev_t *dev, char32_t ch)
    541 {
    542         ega_instance_t *instance = (ega_instance_t *) dev->data;
    543 
    544         irq_spinlock_lock(&instance->lock, true);
    545 
     541static void _putuchar(ega_instance_t *instance, char32_t ch)
     542{
    546543        switch (ch) {
    547544        case '\n':
     
    564561        ega_check_cursor(instance);
    565562        ega_move_cursor(instance);
     563}
     564
     565static void ega_write(outdev_t *dev, const char *s, size_t n)
     566{
     567        ega_instance_t *instance = (ega_instance_t *) dev->data;
     568
     569        irq_spinlock_lock(&instance->lock, true);
     570
     571        size_t offset = 0;
     572        char32_t ch;
     573
     574        while ((ch = str_decode_r(s, &offset, n, U_SPECIAL, &instance->mbstate)))
     575                _putuchar(instance, ch);
    566576
    567577        irq_spinlock_unlock(&instance->lock, true);
    568578}
    569579
    570 static void ega_redraw(outdev_t *dev)
    571 {
    572         ega_instance_t *instance = (ega_instance_t *) dev->data;
    573 
    574         irq_spinlock_lock(&instance->lock, true);
    575 
     580static void ega_redraw_internal(ega_instance_t *instance)
     581{
    576582        memcpy(instance->addr, instance->backbuf, EGA_VRAM_SIZE);
    577583        ega_move_cursor(instance);
    578584        ega_show_cursor(instance);
    579 
     585}
     586
     587static void ega_redraw(outdev_t *dev)
     588{
     589        ega_instance_t *instance = (ega_instance_t *) dev->data;
     590
     591        irq_spinlock_lock(&instance->lock, true);
     592        ega_redraw_internal(instance);
    580593        irq_spinlock_unlock(&instance->lock, true);
     594}
     595
     596/** EGA was mapped or unmapped.
     597 *
     598 * @param arg EGA instance
     599 */
     600static void ega_mapped_changed(void *arg)
     601{
     602        ega_instance_t *instance = (ega_instance_t *) arg;
     603
     604        if (!instance->parea.mapped) {
     605                irq_spinlock_lock(&instance->lock, true);
     606                ega_redraw_internal(instance);
     607                irq_spinlock_unlock(&instance->lock, true);
     608        }
    581609}
    582610
     
    621649        instance->parea.unpriv = false;
    622650        instance->parea.mapped = false;
     651        instance->parea.mapped_changed = ega_mapped_changed;
     652        instance->parea.arg = (void *) instance;
    623653        ddi_parea_register(&instance->parea);
    624654
Note: See TracChangeset for help on using the changeset viewer.