Changeset 516ff92 in mainline for kernel/genarch/src/drivers/ega/ega.c
- 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
- File:
-
- 1 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
Note:
See TracChangeset
for help on using the changeset viewer.