Ignore:
File:
1 edited

Legend:

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

    rba7371f9 rb366a6f4  
    8282        SPINLOCK_DECLARE(lock);
    8383       
     84        parea_t parea;
     85       
    8486        uint8_t *addr;
    8587        uint16_t *backbuf;
     
    109111} fb_instance_t;
    110112
    111 static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent);
     113static void fb_putchar(outdev_t *dev, wchar_t ch);
    112114static void fb_redraw_internal(fb_instance_t *instance);
    113115static void fb_redraw(outdev_t *dev);
     
    215217 *
    216218 */
    217 static void logo_hide(fb_instance_t *instance, bool silent)
     219static void logo_hide(fb_instance_t *instance)
    218220{
    219221        instance->ylogo = 0;
     
    221223        instance->rowtrim = instance->rows;
    222224       
    223         if (!silent)
     225        if ((!instance->parea.mapped) || (console_override))
    224226                fb_redraw_internal(instance);
    225227}
     
    229231 */
    230232static void glyph_draw(fb_instance_t *instance, uint16_t glyph,
    231     unsigned int col, unsigned int row, bool silent, bool overlay)
     233    unsigned int col, unsigned int row, bool overlay)
    232234{
    233235        unsigned int x = COL2X(col);
     
    236238       
    237239        if (y >= instance->ytrim)
    238                 logo_hide(instance, silent);
     240                logo_hide(instance);
    239241       
    240242        if (!overlay)
    241243                instance->backbuf[BB_POS(instance, col, row)] = glyph;
    242244       
    243         if (!silent) {
     245        if ((!instance->parea.mapped) || (console_override)) {
    244246                for (yd = 0; yd < FONT_SCANLINES; yd++)
    245247                        memcpy(&instance->addr[FB_POS(instance, x, y + yd + instance->ylogo)],
     
    253255 *
    254256 */
    255 static void screen_scroll(fb_instance_t *instance, bool silent)
     257static void screen_scroll(fb_instance_t *instance)
    256258{
    257259        if (instance->ylogo > 0) {
    258                 logo_hide(instance, silent);
     260                logo_hide(instance);
    259261                return;
    260262        }
    261263       
    262         if (!silent) {
     264        if ((!instance->parea.mapped) || (console_override)) {
    263265                unsigned int row;
    264266               
     
    298300}
    299301
    300 static void cursor_put(fb_instance_t *instance, bool silent)
     302static void cursor_put(fb_instance_t *instance)
    301303{
    302304        unsigned int col = instance->position % instance->cols;
    303305        unsigned int row = instance->position / instance->cols;
    304306       
    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)
     307        glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, true);
     308}
     309
     310static void cursor_remove(fb_instance_t *instance)
    309311{
    310312        unsigned int col = instance->position % instance->cols;
     
    312314       
    313315        glyph_draw(instance, instance->backbuf[BB_POS(instance, col, row)],
    314             col, row, silent, true);
     316            col, row, true);
    315317}
    316318
     
    362364 *
    363365 */
    364 static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent)
     366static void fb_putchar(outdev_t *dev, wchar_t ch)
    365367{
    366368        fb_instance_t *instance = (fb_instance_t *) dev->data;
     
    369371        switch (ch) {
    370372        case '\n':
    371                 cursor_remove(instance, silent);
     373                cursor_remove(instance);
    372374                instance->position += instance->cols;
    373375                instance->position -= instance->position % instance->cols;
    374376                break;
    375377        case '\r':
    376                 cursor_remove(instance, silent);
     378                cursor_remove(instance);
    377379                instance->position -= instance->position % instance->cols;
    378380                break;
    379381        case '\b':
    380                 cursor_remove(instance, silent);
     382                cursor_remove(instance);
    381383                if (instance->position % instance->cols)
    382384                        instance->position--;
    383385                break;
    384386        case '\t':
    385                 cursor_remove(instance, silent);
     387                cursor_remove(instance);
    386388                do {
    387389                        glyph_draw(instance, fb_font_glyph(' '),
    388390                            instance->position % instance->cols,
    389                             instance->position / instance->cols, silent, false);
     391                            instance->position / instance->cols, false);
    390392                        instance->position++;
    391393                } while ((instance->position % 8)
     
    395397                glyph_draw(instance, fb_font_glyph(ch),
    396398                    instance->position % instance->cols,
    397                     instance->position / instance->cols, silent, false);
     399                    instance->position / instance->cols, false);
    398400                instance->position++;
    399401        }
     
    401403        if (instance->position >= instance->cols * instance->rows) {
    402404                instance->position -= instance->cols;
    403                 screen_scroll(instance, silent);
    404         }
    405        
    406         cursor_put(instance, silent);
     405                screen_scroll(instance);
     406        }
     407       
     408        cursor_put(instance);
    407409       
    408410        spinlock_unlock(&instance->lock);
     
    555557       
    556558        spinlock_initialize(&instance->lock, "*fb.instance.lock");
     559       
    557560        instance->rgb_conv = rgb_conv;
    558561        instance->pixelbytes = pixelbytes;
     
    623626        glyphs_render(instance);
    624627       
     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       
    625635        if (!fb_exported) {
    626636                /*
    627                  * This is the necessary evil until the userspace driver is entirely
    628                  * self-sufficient.
     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.
    629640                 */
    630641                sysinfo_set_item_val("fb", NULL, true);
Note: See TracChangeset for help on using the changeset viewer.