Ignore:
File:
1 edited

Legend:

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

    rb366a6f4 rba7371f9  
    8282        SPINLOCK_DECLARE(lock);
    8383       
    84         parea_t parea;
    85        
    8684        uint8_t *addr;
    8785        uint16_t *backbuf;
     
    111109} fb_instance_t;
    112110
    113 static void fb_putchar(outdev_t *dev, wchar_t ch);
     111static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent);
    114112static void fb_redraw_internal(fb_instance_t *instance);
    115113static void fb_redraw(outdev_t *dev);
     
    217215 *
    218216 */
    219 static void logo_hide(fb_instance_t *instance)
     217static void logo_hide(fb_instance_t *instance, bool silent)
    220218{
    221219        instance->ylogo = 0;
     
    223221        instance->rowtrim = instance->rows;
    224222       
    225         if ((!instance->parea.mapped) || (console_override))
     223        if (!silent)
    226224                fb_redraw_internal(instance);
    227225}
     
    231229 */
    232230static void glyph_draw(fb_instance_t *instance, uint16_t glyph,
    233     unsigned int col, unsigned int row, bool overlay)
     231    unsigned int col, unsigned int row, bool silent, bool overlay)
    234232{
    235233        unsigned int x = COL2X(col);
     
    238236       
    239237        if (y >= instance->ytrim)
    240                 logo_hide(instance);
     238                logo_hide(instance, silent);
    241239       
    242240        if (!overlay)
    243241                instance->backbuf[BB_POS(instance, col, row)] = glyph;
    244242       
    245         if ((!instance->parea.mapped) || (console_override)) {
     243        if (!silent) {
    246244                for (yd = 0; yd < FONT_SCANLINES; yd++)
    247245                        memcpy(&instance->addr[FB_POS(instance, x, y + yd + instance->ylogo)],
     
    255253 *
    256254 */
    257 static void screen_scroll(fb_instance_t *instance)
     255static void screen_scroll(fb_instance_t *instance, bool silent)
    258256{
    259257        if (instance->ylogo > 0) {
    260                 logo_hide(instance);
     258                logo_hide(instance, silent);
    261259                return;
    262260        }
    263261       
    264         if ((!instance->parea.mapped) || (console_override)) {
     262        if (!silent) {
    265263                unsigned int row;
    266264               
     
    300298}
    301299
    302 static void cursor_put(fb_instance_t *instance)
     300static void cursor_put(fb_instance_t *instance, bool silent)
    303301{
    304302        unsigned int col = instance->position % instance->cols;
    305303        unsigned int row = instance->position / instance->cols;
    306304       
    307         glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, true);
    308 }
    309 
    310 static void cursor_remove(fb_instance_t *instance)
     305        glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, silent, true);
     306}
     307
     308static void cursor_remove(fb_instance_t *instance, bool silent)
    311309{
    312310        unsigned int col = instance->position % instance->cols;
     
    314312       
    315313        glyph_draw(instance, instance->backbuf[BB_POS(instance, col, row)],
    316             col, row, true);
     314            col, row, silent, true);
    317315}
    318316
     
    364362 *
    365363 */
    366 static void fb_putchar(outdev_t *dev, wchar_t ch)
     364static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent)
    367365{
    368366        fb_instance_t *instance = (fb_instance_t *) dev->data;
     
    371369        switch (ch) {
    372370        case '\n':
    373                 cursor_remove(instance);
     371                cursor_remove(instance, silent);
    374372                instance->position += instance->cols;
    375373                instance->position -= instance->position % instance->cols;
    376374                break;
    377375        case '\r':
    378                 cursor_remove(instance);
     376                cursor_remove(instance, silent);
    379377                instance->position -= instance->position % instance->cols;
    380378                break;
    381379        case '\b':
    382                 cursor_remove(instance);
     380                cursor_remove(instance, silent);
    383381                if (instance->position % instance->cols)
    384382                        instance->position--;
    385383                break;
    386384        case '\t':
    387                 cursor_remove(instance);
     385                cursor_remove(instance, silent);
    388386                do {
    389387                        glyph_draw(instance, fb_font_glyph(' '),
    390388                            instance->position % instance->cols,
    391                             instance->position / instance->cols, false);
     389                            instance->position / instance->cols, silent, false);
    392390                        instance->position++;
    393391                } while ((instance->position % 8)
     
    397395                glyph_draw(instance, fb_font_glyph(ch),
    398396                    instance->position % instance->cols,
    399                     instance->position / instance->cols, false);
     397                    instance->position / instance->cols, silent, false);
    400398                instance->position++;
    401399        }
     
    403401        if (instance->position >= instance->cols * instance->rows) {
    404402                instance->position -= instance->cols;
    405                 screen_scroll(instance);
    406         }
    407        
    408         cursor_put(instance);
     403                screen_scroll(instance, silent);
     404        }
     405       
     406        cursor_put(instance, silent);
    409407       
    410408        spinlock_unlock(&instance->lock);
     
    557555       
    558556        spinlock_initialize(&instance->lock, "*fb.instance.lock");
    559        
    560557        instance->rgb_conv = rgb_conv;
    561558        instance->pixelbytes = pixelbytes;
     
    626623        glyphs_render(instance);
    627624       
    628         link_initialize(&instance->parea.link);
    629         instance->parea.pbase = props->addr;
    630         instance->parea.frames = SIZE2FRAMES(fbsize);
    631         instance->parea.unpriv = false;
    632         instance->parea.mapped = false;
    633         ddi_parea_register(&instance->parea);
    634        
    635625        if (!fb_exported) {
    636626                /*
    637                  * We export the kernel framebuffer for uspace usage.
    638                  * This is used in the case the uspace framebuffer
    639                  * driver is not self-sufficient.
     627                 * This is the necessary evil until the userspace driver is entirely
     628                 * self-sufficient.
    640629                 */
    641630                sysinfo_set_item_val("fb", NULL, true);
Note: See TracChangeset for help on using the changeset viewer.