Ignore:
File:
1 edited

Legend:

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

    rc0699467 rc263c77  
    3636#include <genarch/fb/font-8x16.h>
    3737#include <genarch/fb/logo-196x66.h>
     38#include <genarch/fb/visuals.h>
    3839#include <genarch/fb/fb.h>
    3940#include <console/chardev.h>
     
    8182        SPINLOCK_DECLARE(lock);
    8283       
    83         parea_t parea;
    84        
    8584        uint8_t *addr;
    8685        uint16_t *backbuf;
     
    110109} fb_instance_t;
    111110
    112 static void fb_putchar(outdev_t *dev, wchar_t ch);
     111static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent);
    113112static void fb_redraw_internal(fb_instance_t *instance);
    114113static void fb_redraw(outdev_t *dev);
     
    216215 *
    217216 */
    218 static void logo_hide(fb_instance_t *instance)
     217static void logo_hide(fb_instance_t *instance, bool silent)
    219218{
    220219        instance->ylogo = 0;
     
    222221        instance->rowtrim = instance->rows;
    223222       
    224         if ((!instance->parea.mapped) || (console_override))
     223        if (!silent)
    225224                fb_redraw_internal(instance);
    226225}
     
    230229 */
    231230static void glyph_draw(fb_instance_t *instance, uint16_t glyph,
    232     unsigned int col, unsigned int row, bool overlay)
     231    unsigned int col, unsigned int row, bool silent, bool overlay)
    233232{
    234233        unsigned int x = COL2X(col);
     
    237236       
    238237        if (y >= instance->ytrim)
    239                 logo_hide(instance);
     238                logo_hide(instance, silent);
    240239       
    241240        if (!overlay)
    242241                instance->backbuf[BB_POS(instance, col, row)] = glyph;
    243242       
    244         if ((!instance->parea.mapped) || (console_override)) {
     243        if (!silent) {
    245244                for (yd = 0; yd < FONT_SCANLINES; yd++)
    246245                        memcpy(&instance->addr[FB_POS(instance, x, y + yd + instance->ylogo)],
     
    254253 *
    255254 */
    256 static void screen_scroll(fb_instance_t *instance)
     255static void screen_scroll(fb_instance_t *instance, bool silent)
    257256{
    258257        if (instance->ylogo > 0) {
    259                 logo_hide(instance);
     258                logo_hide(instance, silent);
    260259                return;
    261260        }
    262261       
    263         if ((!instance->parea.mapped) || (console_override)) {
     262        if (!silent) {
    264263                unsigned int row;
    265264               
     
    299298}
    300299
    301 static void cursor_put(fb_instance_t *instance)
     300static void cursor_put(fb_instance_t *instance, bool silent)
    302301{
    303302        unsigned int col = instance->position % instance->cols;
    304303        unsigned int row = instance->position / instance->cols;
    305304       
    306         glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, true);
    307 }
    308 
    309 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)
    310309{
    311310        unsigned int col = instance->position % instance->cols;
     
    313312       
    314313        glyph_draw(instance, instance->backbuf[BB_POS(instance, col, row)],
    315             col, row, true);
     314            col, row, silent, true);
    316315}
    317316
     
    363362 *
    364363 */
    365 static void fb_putchar(outdev_t *dev, wchar_t ch)
     364static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent)
    366365{
    367366        fb_instance_t *instance = (fb_instance_t *) dev->data;
     
    370369        switch (ch) {
    371370        case '\n':
    372                 cursor_remove(instance);
     371                cursor_remove(instance, silent);
    373372                instance->position += instance->cols;
    374373                instance->position -= instance->position % instance->cols;
    375374                break;
    376375        case '\r':
    377                 cursor_remove(instance);
     376                cursor_remove(instance, silent);
    378377                instance->position -= instance->position % instance->cols;
    379378                break;
    380379        case '\b':
    381                 cursor_remove(instance);
     380                cursor_remove(instance, silent);
    382381                if (instance->position % instance->cols)
    383382                        instance->position--;
    384383                break;
    385384        case '\t':
    386                 cursor_remove(instance);
     385                cursor_remove(instance, silent);
    387386                do {
    388387                        glyph_draw(instance, fb_font_glyph(' '),
    389388                            instance->position % instance->cols,
    390                             instance->position / instance->cols, false);
     389                            instance->position / instance->cols, silent, false);
    391390                        instance->position++;
    392391                } while ((instance->position % 8)
     
    396395                glyph_draw(instance, fb_font_glyph(ch),
    397396                    instance->position % instance->cols,
    398                     instance->position / instance->cols, false);
     397                    instance->position / instance->cols, silent, false);
    399398                instance->position++;
    400399        }
     
    402401        if (instance->position >= instance->cols * instance->rows) {
    403402                instance->position -= instance->cols;
    404                 screen_scroll(instance);
    405         }
    406        
    407         cursor_put(instance);
     403                screen_scroll(instance, silent);
     404        }
     405       
     406        cursor_put(instance, silent);
    408407       
    409408        spinlock_unlock(&instance->lock);
     
    556555       
    557556        spinlock_initialize(&instance->lock, "*fb.instance.lock");
    558        
    559557        instance->rgb_conv = rgb_conv;
    560558        instance->pixelbytes = pixelbytes;
     
    625623        glyphs_render(instance);
    626624       
    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        
    634625        if (!fb_exported) {
    635626                /*
    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.
     627                 * This is the necessary evil until the userspace driver is entirely
     628                 * self-sufficient.
    639629                 */
    640630                sysinfo_set_item_val("fb", NULL, true);
Note: See TracChangeset for help on using the changeset viewer.