Changeset 516ff92 in mainline for kernel/genarch/src
- Timestamp:
- 2009-01-31T21:27:18Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4863e50b
- Parents:
- 96a2e45
- Location:
- kernel/genarch/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/ega/ega.c
r96a2e45 r516ff92 63 63 static ioport_t ega_base; 64 64 65 static void ega_putchar(chardev_t *d, const char ch);66 67 65 chardev_t ega_console; 68 static chardev_operations_t ega_ops = {69 .write = ega_putchar70 };71 72 static void ega_move_cursor(void);73 74 void ega_init(ioport_t base, uintptr_t videoram_phys)75 {76 /* Initialize the software structure. */77 ega_base = base;78 79 backbuf = (uint8_t *) malloc(SCREEN * 2, 0);80 if (!backbuf)81 panic("Unable to allocate backbuffer.");82 83 videoram = (uint8_t *) hw_map(videoram_phys, SCREEN * 2);84 85 /* Clear the screen and set the cursor position. */86 memsetw(videoram, SCREEN, 0x0720);87 memsetw(backbuf, SCREEN, 0x0720);88 ega_move_cursor();89 90 chardev_initialize("ega_out", &ega_console, &ega_ops);91 stdout = &ega_console;92 93 ega_parea.pbase = videoram_phys;94 ega_parea.vbase = (uintptr_t) videoram;95 ega_parea.frames = 1;96 ega_parea.cacheable = false;97 ddi_parea_register(&ega_parea);98 99 sysinfo_set_item_val("fb", NULL, true);100 sysinfo_set_item_val("fb.kind", NULL, 2);101 sysinfo_set_item_val("fb.width", NULL, ROW);102 sysinfo_set_item_val("fb.height", NULL, ROWS);103 sysinfo_set_item_val("fb.blinking", NULL, true);104 sysinfo_set_item_val("fb.address.physical", NULL, videoram_phys);105 }106 107 static void ega_display_char(char ch)108 {109 videoram[ega_cursor * 2] = ch;110 backbuf[ega_cursor * 2] = ch;111 }112 66 113 67 /* … … 128 82 } 129 83 130 void ega_putchar(chardev_t *d __attribute__((unused)), const char ch) 84 static void ega_move_cursor(void) 85 { 86 outb(ega_base + EGA_INDEX_REG, 0xe); 87 outb(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff)); 88 outb(ega_base + EGA_INDEX_REG, 0xf); 89 outb(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff)); 90 } 91 92 static void ega_display_char(char ch, bool silent) 93 { 94 backbuf[ega_cursor * 2] = ch; 95 96 if (!silent) 97 videoram[ega_cursor * 2] = ch; 98 } 99 100 static void ega_putchar(chardev_t *d __attribute__((unused)), const char ch, bool silent) 131 101 { 132 102 ipl_t ipl; 133 103 134 104 ipl = interrupts_disable(); 135 105 spinlock_lock(&egalock); 136 106 137 107 switch (ch) { 138 108 case '\n': … … 147 117 break; 148 118 default: 149 ega_display_char(ch );119 ega_display_char(ch, silent); 150 120 ega_cursor++; 151 121 break; 152 122 } 153 123 ega_check_cursor(); 154 ega_move_cursor(); 155 124 125 if (!silent) 126 ega_move_cursor(); 127 156 128 spinlock_unlock(&egalock); 157 129 interrupts_restore(ipl); 158 130 } 159 131 160 void ega_move_cursor(void) 132 static chardev_operations_t ega_ops = { 133 .write = ega_putchar 134 }; 135 136 void ega_init(ioport_t base, uintptr_t videoram_phys) 161 137 { 162 outb(ega_base + EGA_INDEX_REG, 0xe); 163 outb(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff)); 164 outb(ega_base + EGA_INDEX_REG, 0xf); 165 outb(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff)); 138 /* Initialize the software structure. */ 139 ega_base = base; 140 141 backbuf = (uint8_t *) malloc(SCREEN * 2, 0); 142 if (!backbuf) 143 panic("Unable to allocate backbuffer."); 144 145 videoram = (uint8_t *) hw_map(videoram_phys, SCREEN * 2); 146 147 /* Clear the screen and set the cursor position. */ 148 memsetw(videoram, SCREEN, 0x0720); 149 memsetw(backbuf, SCREEN, 0x0720); 150 ega_move_cursor(); 151 152 chardev_initialize("ega_out", &ega_console, &ega_ops); 153 stdout = &ega_console; 154 155 ega_parea.pbase = videoram_phys; 156 ega_parea.vbase = (uintptr_t) videoram; 157 ega_parea.frames = 1; 158 ega_parea.cacheable = false; 159 ddi_parea_register(&ega_parea); 160 161 sysinfo_set_item_val("fb", NULL, true); 162 sysinfo_set_item_val("fb.kind", NULL, 2); 163 sysinfo_set_item_val("fb.width", NULL, ROW); 164 sysinfo_set_item_val("fb.height", NULL, ROWS); 165 sysinfo_set_item_val("fb.blinking", NULL, true); 166 sysinfo_set_item_val("fb.address.physical", NULL, videoram_phys); 166 167 } 167 168 -
kernel/genarch/src/fb/fb.c
r96a2e45 r516ff92 185 185 * 186 186 */ 187 static void logo_hide( void)187 static void logo_hide(bool silent) 188 188 { 189 189 ylogo = 0; 190 190 ytrim = yres; 191 191 rowtrim = rows; 192 fb_redraw(); 192 if (!silent) 193 fb_redraw(); 193 194 } 194 195 … … 197 198 * 198 199 */ 199 static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row )200 static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row, bool silent) 200 201 { 201 202 unsigned int x = COL2X(col); … … 204 205 205 206 if (y >= ytrim) 206 logo_hide( );207 logo_hide(silent); 207 208 208 209 backbuf[BB_POS(col, row)] = glyph; 209 210 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 } 213 216 } 214 217 … … 218 221 * 219 222 */ 220 static void screen_scroll( void)223 static void screen_scroll(bool silent) 221 224 { 222 225 if (ylogo > 0) { 223 logo_hide( );226 logo_hide(silent); 224 227 return; 225 228 } 226 229 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; 232 232 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; 236 236 237 for ( col = 0, x = 0; col < cols; col++,238 x += FONT_WIDTH) {239 u int8_t glyph;237 for (yd = 0; yd < FONT_SCANLINES; yd++) { 238 unsigned int x; 239 unsigned int col; 240 240 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; 245 244 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 } 253 258 } 254 259 } … … 260 265 261 266 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 );267 static void cursor_put(bool silent) 268 { 269 glyph_draw(CURSOR, position % cols, position / cols, silent); 270 } 271 272 273 static void cursor_remove(bool silent) 274 { 275 glyph_draw(0, position % cols, position / cols, silent); 271 276 } 272 277 … … 277 282 * 278 283 */ 279 static void fb_putchar(chardev_t *dev, char ch )284 static void fb_putchar(chardev_t *dev, char ch, bool silent) 280 285 { 281 286 spinlock_lock(&fb_lock); … … 283 288 switch (ch) { 284 289 case '\n': 285 cursor_remove( );290 cursor_remove(silent); 286 291 position += cols; 287 292 position -= position % cols; 288 293 break; 289 294 case '\r': 290 cursor_remove( );295 cursor_remove(silent); 291 296 position -= position % cols; 292 297 break; 293 298 case '\b': 294 cursor_remove( );299 cursor_remove(silent); 295 300 if (position % cols) 296 301 position--; 297 302 break; 298 303 case '\t': 299 cursor_remove( );304 cursor_remove(silent); 300 305 do { 301 306 glyph_draw((uint8_t) ' ', position % cols, 302 position / cols );307 position / cols, silent); 303 308 position++; 304 309 } while ((position % 8) && (position < cols * rows)); 305 310 break; 306 311 default: 307 glyph_draw((uint8_t) ch, position % cols, position / cols); 312 glyph_draw((uint8_t) ch, position % cols, 313 position / cols, silent); 308 314 position++; 309 315 } … … 311 317 if (position >= cols * rows) { 312 318 position -= cols; 313 screen_scroll( );314 } 315 316 cursor_put( );319 screen_scroll(silent); 320 } 321 322 cursor_put(silent); 317 323 318 324 spinlock_unlock(&fb_lock);
Note:
See TracChangeset
for help on using the changeset viewer.