Changeset 516ff92 in mainline for kernel/genarch/src/drivers/ega/ega.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/drivers/ega/ega.c

    r96a2e45 r516ff92  
    6363static ioport_t ega_base;
    6464
    65 static void ega_putchar(chardev_t *d, const char ch);
    66 
    6765chardev_t ega_console;
    68 static chardev_operations_t ega_ops = {
    69         .write = ega_putchar
    70 };
    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 }
    11266
    11367/*
     
    12882}
    12983
    130 void ega_putchar(chardev_t *d __attribute__((unused)), const char ch)
     84static 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
     92static 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
     100static void ega_putchar(chardev_t *d __attribute__((unused)), const char ch, bool silent)
    131101{
    132102        ipl_t ipl;
    133 
     103       
    134104        ipl = interrupts_disable();
    135105        spinlock_lock(&egalock);
    136 
     106       
    137107        switch (ch) {
    138108        case '\n':
     
    147117                break;
    148118        default:
    149                 ega_display_char(ch);
     119                ega_display_char(ch, silent);
    150120                ega_cursor++;
    151121                break;
    152122        }
    153123        ega_check_cursor();
    154         ega_move_cursor();
    155 
     124       
     125        if (!silent)
     126                ega_move_cursor();
     127       
    156128        spinlock_unlock(&egalock);
    157129        interrupts_restore(ipl);
    158130}
    159131
    160 void ega_move_cursor(void)
     132static chardev_operations_t ega_ops = {
     133        .write = ega_putchar
     134};
     135
     136void ega_init(ioport_t base, uintptr_t videoram_phys)
    161137{
    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);
    166167}
    167168
Note: See TracChangeset for help on using the changeset viewer.