Ignore:
File:
1 edited

Legend:

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

    r39e1b9a r28a5ebd  
    4242#include <typedefs.h>
    4343#include <arch/asm.h>
    44 #include <memw.h>
     44#include <mem.h>
    4545#include <str.h>
    4646#include <console/chardev.h>
     
    6969        uint8_t *backbuf;
    7070        ioport8_t *base;
    71         mbstate_t mbstate;
    7271} ega_instance_t;
    7372
    74 static void ega_write(outdev_t *, const char *, size_t);
     73static void ega_putuchar(outdev_t *, char32_t);
    7574static void ega_redraw(outdev_t *);
    7675
    7776static outdev_operations_t egadev_ops = {
    78         .write = ega_write,
     77        .write = ega_putuchar,
    7978        .redraw = ega_redraw,
    8079        .scroll_up = NULL,
     
    539538}
    540539
    541 static void _putuchar(ega_instance_t *instance, char32_t ch)
    542 {
     540static 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
    543546        switch (ch) {
    544547        case '\n':
     
    561564        ega_check_cursor(instance);
    562565        ega_move_cursor(instance);
    563 }
    564 
    565 static void ega_write(outdev_t *dev, const char *s, size_t n)
     566
     567        irq_spinlock_unlock(&instance->lock, true);
     568}
     569
     570static void ega_redraw(outdev_t *dev)
    566571{
    567572        ega_instance_t *instance = (ega_instance_t *) dev->data;
     
    569574        irq_spinlock_lock(&instance->lock, true);
    570575
    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);
    576 
    577         irq_spinlock_unlock(&instance->lock, true);
    578 }
    579 
    580 static void ega_redraw_internal(ega_instance_t *instance)
    581 {
    582576        memcpy(instance->addr, instance->backbuf, EGA_VRAM_SIZE);
    583577        ega_move_cursor(instance);
    584578        ega_show_cursor(instance);
    585 }
    586 
    587 static 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);
     579
    593580        irq_spinlock_unlock(&instance->lock, true);
    594 }
    595 
    596 /** EGA was mapped or unmapped.
    597  *
    598  * @param arg EGA instance
    599  */
    600 static 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         }
    609581}
    610582
     
    649621        instance->parea.unpriv = false;
    650622        instance->parea.mapped = false;
    651         instance->parea.mapped_changed = ega_mapped_changed;
    652         instance->parea.arg = (void *) instance;
    653623        ddi_parea_register(&instance->parea);
    654624
Note: See TracChangeset for help on using the changeset viewer.