Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/fb/fb.c

    rc263c77 rc0699467  
    3636#include <genarch/fb/font-8x16.h>
    3737#include <genarch/fb/logo-196x66.h>
    38 #include <genarch/fb/visuals.h>
    3938#include <genarch/fb/fb.h>
    4039#include <console/chardev.h>
     
    8281        SPINLOCK_DECLARE(lock);
    8382       
     83        parea_t parea;
     84       
    8485        uint8_t *addr;
    8586        uint16_t *backbuf;
     
    109110} fb_instance_t;
    110111
    111 static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent);
     112static void fb_putchar(outdev_t *dev, wchar_t ch);
    112113static void fb_redraw_internal(fb_instance_t *instance);
    113114static void fb_redraw(outdev_t *dev);
     
    215216 *
    216217 */
    217 static void logo_hide(fb_instance_t *instance, bool silent)
     218static void logo_hide(fb_instance_t *instance)
    218219{
    219220        instance->ylogo = 0;
     
    221222        instance->rowtrim = instance->rows;
    222223       
    223         if (!silent)
     224        if ((!instance->parea.mapped) || (console_override))
    224225                fb_redraw_internal(instance);
    225226}
     
    229230 */
    230231static void glyph_draw(fb_instance_t *instance, uint16_t glyph,
    231     unsigned int col, unsigned int row, bool silent, bool overlay)
     232    unsigned int col, unsigned int row, bool overlay)
    232233{
    233234        unsigned int x = COL2X(col);
     
    236237       
    237238        if (y >= instance->ytrim)
    238                 logo_hide(instance, silent);
     239                logo_hide(instance);
    239240       
    240241        if (!overlay)
    241242                instance->backbuf[BB_POS(instance, col, row)] = glyph;
    242243       
    243         if (!silent) {
     244        if ((!instance->parea.mapped) || (console_override)) {
    244245                for (yd = 0; yd < FONT_SCANLINES; yd++)
    245246                        memcpy(&instance->addr[FB_POS(instance, x, y + yd + instance->ylogo)],
     
    253254 *
    254255 */
    255 static void screen_scroll(fb_instance_t *instance, bool silent)
     256static void screen_scroll(fb_instance_t *instance)
    256257{
    257258        if (instance->ylogo > 0) {
    258                 logo_hide(instance, silent);
     259                logo_hide(instance);
    259260                return;
    260261        }
    261262       
    262         if (!silent) {
     263        if ((!instance->parea.mapped) || (console_override)) {
    263264                unsigned int row;
    264265               
     
    298299}
    299300
    300 static void cursor_put(fb_instance_t *instance, bool silent)
     301static void cursor_put(fb_instance_t *instance)
    301302{
    302303        unsigned int col = instance->position % instance->cols;
    303304        unsigned int row = instance->position / instance->cols;
    304305       
    305         glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, silent, true);
    306 }
    307 
    308 static void cursor_remove(fb_instance_t *instance, bool silent)
     306        glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, true);
     307}
     308
     309static void cursor_remove(fb_instance_t *instance)
    309310{
    310311        unsigned int col = instance->position % instance->cols;
     
    312313       
    313314        glyph_draw(instance, instance->backbuf[BB_POS(instance, col, row)],
    314             col, row, silent, true);
     315            col, row, true);
    315316}
    316317
     
    362363 *
    363364 */
    364 static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent)
     365static void fb_putchar(outdev_t *dev, wchar_t ch)
    365366{
    366367        fb_instance_t *instance = (fb_instance_t *) dev->data;
     
    369370        switch (ch) {
    370371        case '\n':
    371                 cursor_remove(instance, silent);
     372                cursor_remove(instance);
    372373                instance->position += instance->cols;
    373374                instance->position -= instance->position % instance->cols;
    374375                break;
    375376        case '\r':
    376                 cursor_remove(instance, silent);
     377                cursor_remove(instance);
    377378                instance->position -= instance->position % instance->cols;
    378379                break;
    379380        case '\b':
    380                 cursor_remove(instance, silent);
     381                cursor_remove(instance);
    381382                if (instance->position % instance->cols)
    382383                        instance->position--;
    383384                break;
    384385        case '\t':
    385                 cursor_remove(instance, silent);
     386                cursor_remove(instance);
    386387                do {
    387388                        glyph_draw(instance, fb_font_glyph(' '),
    388389                            instance->position % instance->cols,
    389                             instance->position / instance->cols, silent, false);
     390                            instance->position / instance->cols, false);
    390391                        instance->position++;
    391392                } while ((instance->position % 8)
     
    395396                glyph_draw(instance, fb_font_glyph(ch),
    396397                    instance->position % instance->cols,
    397                     instance->position / instance->cols, silent, false);
     398                    instance->position / instance->cols, false);
    398399                instance->position++;
    399400        }
     
    401402        if (instance->position >= instance->cols * instance->rows) {
    402403                instance->position -= instance->cols;
    403                 screen_scroll(instance, silent);
    404         }
    405        
    406         cursor_put(instance, silent);
     404                screen_scroll(instance);
     405        }
     406       
     407        cursor_put(instance);
    407408       
    408409        spinlock_unlock(&instance->lock);
     
    555556       
    556557        spinlock_initialize(&instance->lock, "*fb.instance.lock");
     558       
    557559        instance->rgb_conv = rgb_conv;
    558560        instance->pixelbytes = pixelbytes;
     
    623625        glyphs_render(instance);
    624626       
     627        link_initialize(&instance->parea.link);
     628        instance->parea.pbase = props->addr;
     629        instance->parea.frames = SIZE2FRAMES(fbsize);
     630        instance->parea.unpriv = false;
     631        instance->parea.mapped = false;
     632        ddi_parea_register(&instance->parea);
     633       
    625634        if (!fb_exported) {
    626635                /*
    627                  * This is the necessary evil until the userspace driver is entirely
    628                  * self-sufficient.
     636                 * We export the kernel framebuffer for uspace usage.
     637                 * This is used in the case the uspace framebuffer
     638                 * driver is not self-sufficient.
    629639                 */
    630640                sysinfo_set_item_val("fb", NULL, true);
Note: See TracChangeset for help on using the changeset viewer.