Changeset 516ff92 in mainline for kernel/genarch/src/fb/fb.c


Ignore:
Timestamp:
2009-01-31T21:27:18Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4863e50b
Parents:
96a2e45
Message:

silent kernel console output when user space console is active

File:
1 edited

Legend:

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

    r96a2e45 r516ff92  
    185185 *
    186186 */
    187 static void logo_hide(void)
     187static void logo_hide(bool silent)
    188188{
    189189        ylogo = 0;
    190190        ytrim = yres;
    191191        rowtrim = rows;
    192         fb_redraw();
     192        if (!silent)
     193                fb_redraw();
    193194}
    194195
     
    197198 *
    198199 */
    199 static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row)
     200static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row, bool silent)
    200201{
    201202        unsigned int x = COL2X(col);
     
    204205       
    205206        if (y >= ytrim)
    206                 logo_hide();
     207                logo_hide(silent);
    207208       
    208209        backbuf[BB_POS(col, row)] = glyph;
    209210       
    210         for (yd = 0; yd < FONT_SCANLINES; yd++)
    211                 memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
    212                     &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
     211        if (!silent) {
     212                for (yd = 0; yd < FONT_SCANLINES; yd++)
     213                        memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
     214                            &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
     215        }
    213216}
    214217
     
    218221 *
    219222 */
    220 static void screen_scroll(void)
     223static void screen_scroll(bool silent)
    221224{
    222225        if (ylogo > 0) {
    223                 logo_hide();
     226                logo_hide(silent);
    224227                return;
    225228        }
    226229       
    227         unsigned int row;
    228        
    229         for (row = 0; row < rows; row++) {
    230                 unsigned int y = ROW2Y(row);
    231                 unsigned int yd;
     230        if (!silent) {
     231                unsigned int row;
    232232               
    233                 for (yd = 0; yd < FONT_SCANLINES; yd++) {
    234                         unsigned int x;
    235                         unsigned int col;
     233                for (row = 0; row < rows; row++) {
     234                        unsigned int y = ROW2Y(row);
     235                        unsigned int yd;
    236236                       
    237                         for (col = 0, x = 0; col < cols; col++,
    238                             x += FONT_WIDTH) {
    239                                 uint8_t glyph;
     237                        for (yd = 0; yd < FONT_SCANLINES; yd++) {
     238                                unsigned int x;
     239                                unsigned int col;
    240240                               
    241                                 if (row < rows - 1) {
    242                                         if (backbuf[BB_POS(col, row)] ==
    243                                             backbuf[BB_POS(col, row + 1)])
    244                                                 continue;
     241                                for (col = 0, x = 0; col < cols; col++,
     242                                    x += FONT_WIDTH) {
     243                                        uint8_t glyph;
    245244                                       
    246                                         glyph = backbuf[BB_POS(col, row + 1)];
    247                                 } else
    248                                         glyph = 0;
    249                                
    250                                 memcpy(&fb_addr[FB_POS(x, y + yd)],
    251                                     &glyphs[GLYPH_POS(glyph, yd)],
    252                                     glyphscanline);
     245                                        if (row < rows - 1) {
     246                                                if (backbuf[BB_POS(col, row)] ==
     247                                                    backbuf[BB_POS(col, row + 1)])
     248                                                        continue;
     249                                               
     250                                                glyph = backbuf[BB_POS(col, row + 1)];
     251                                        } else
     252                                                glyph = 0;
     253                                       
     254                                        memcpy(&fb_addr[FB_POS(x, y + yd)],
     255                                            &glyphs[GLYPH_POS(glyph, yd)],
     256                                            glyphscanline);
     257                                }
    253258                        }
    254259                }
     
    260265
    261266
    262 static void cursor_put(void)
    263 {
    264         glyph_draw(CURSOR, position % cols, position / cols);
    265 }
    266 
    267 
    268 static void cursor_remove(void)
    269 {
    270         glyph_draw(0, position % cols, position / cols);
     267static void cursor_put(bool silent)
     268{
     269        glyph_draw(CURSOR, position % cols, position / cols, silent);
     270}
     271
     272
     273static void cursor_remove(bool silent)
     274{
     275        glyph_draw(0, position % cols, position / cols, silent);
    271276}
    272277
     
    277282 *
    278283 */
    279 static void fb_putchar(chardev_t *dev, char ch)
     284static void fb_putchar(chardev_t *dev, char ch, bool silent)
    280285{
    281286        spinlock_lock(&fb_lock);
     
    283288        switch (ch) {
    284289        case '\n':
    285                 cursor_remove();
     290                cursor_remove(silent);
    286291                position += cols;
    287292                position -= position % cols;
    288293                break;
    289294        case '\r':
    290                 cursor_remove();
     295                cursor_remove(silent);
    291296                position -= position % cols;
    292297                break;
    293298        case '\b':
    294                 cursor_remove();
     299                cursor_remove(silent);
    295300                if (position % cols)
    296301                        position--;
    297302                break;
    298303        case '\t':
    299                 cursor_remove();
     304                cursor_remove(silent);
    300305                do {
    301306                        glyph_draw((uint8_t) ' ', position % cols,
    302                             position / cols);
     307                            position / cols, silent);
    303308                        position++;
    304309                } while ((position % 8) && (position < cols * rows));
    305310                break;
    306311        default:
    307                 glyph_draw((uint8_t) ch, position % cols, position / cols);
     312                glyph_draw((uint8_t) ch, position % cols,
     313                    position / cols, silent);
    308314                position++;
    309315        }
     
    311317        if (position >= cols * rows) {
    312318                position -= cols;
    313                 screen_scroll();
    314         }
    315        
    316         cursor_put();
     319                screen_scroll(silent);
     320        }
     321       
     322        cursor_put(silent);
    317323       
    318324        spinlock_unlock(&fb_lock);
Note: See TracChangeset for help on using the changeset viewer.