Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/mips32/src/mach/malta/malta.c

    r2a103b5 rc5429fe  
    3838#include <console/chardev.h>
    3939#include <arch/mm/page.h>
    40 #include <genarch/drivers/i8259/i8259.h>
    41 #include <genarch/drivers/ns16550/ns16550.h>
    42 #include <genarch/srln/srln.h>
    43 #include <arch/interrupt.h>
    44 #include <stdbool.h>
    45 #include <byteorder.h>
    46 #include <sysinfo/sysinfo.h>
    47 #include <log.h>
    4840
    4941static void malta_init(void);
     
    6557};
    6658
    67 #ifdef CONFIG_NS16550
    68 static ns16550_instance_t *tty_instance;
    69 #endif
    70 #ifdef CONFIG_NS16550_OUT
    71 static outdev_t *tty_out;
    72 #endif
    73 
    74 static void malta_isa_irq_handler(unsigned int i)
    75 {
    76         uint8_t isa_irq = host2uint32_t_le(pio_read_32(GT64120_PCI0_INTACK));
    77         if (i8259_is_spurious(isa_irq)) {
    78                 i8259_handle_spurious(isa_irq);
    79 #ifdef CONFIG_DEBUG
    80                 log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u",
    81                     CPU->id, isa_irq);
    82                 return;
    83 #endif
    84         }
    85         irq_t *irq = irq_dispatch_and_lock(isa_irq);
    86         if (irq) {
    87                 irq->handler(irq);
    88                 irq_spinlock_unlock(&irq->lock, false);
    89         } else {
    90 #ifdef CONFIG_DEBUG
    91                 log(LF_ARCH, LVL_DEBUG, "cpu%u: unhandled IRQ (irq=%u)",
    92                     CPU->id, isa_irq);
    93 #endif
    94         }
    95         i8259_eoi(isa_irq);
    96 }
    97 
    9859void malta_init(void)
    9960{
    100         irq_init(ISA_IRQ_COUNT, ISA_IRQ_COUNT);
    101 
    102         i8259_init((i8259_t *) PIC0_BASE, (i8259_t *) PIC1_BASE, 0);
    103         sysinfo_set_item_val("i8259", NULL, true);
    104 
    105         int_handler[INT_HW0] = malta_isa_irq_handler;
    106         cp0_unmask_int(INT_HW0);
    107 
    108 #if (defined(CONFIG_NS16550) || defined(CONFIG_NS16550_OUT))
    109 #ifdef CONFIG_NS16550_OUT
    110         outdev_t **tty_out_ptr = &tty_out;
    111 #else
    112         outdev_t **tty_out_ptr = NULL;
    113 #endif
    114         tty_instance = ns16550_init((ioport8_t *) TTY_BASE, 0, TTY_ISA_IRQ,
    115             NULL, NULL, tty_out_ptr);
    116 #endif
    11761}
    11862
     
    12973}
    13074
     75#define YAMON_SUBR_BASE         PA2KA(0x1fc00500)
     76#define YAMON_SUBR_PRINT_COUNT  (YAMON_SUBR_BASE + 0x4)
     77
     78typedef void (**yamon_print_count_ptr_t)(uint32_t, const char *, uint32_t);
     79
     80yamon_print_count_ptr_t yamon_print_count =
     81    (yamon_print_count_ptr_t) YAMON_SUBR_PRINT_COUNT;
     82
     83static void yamon_putwchar(outdev_t *dev, const wchar_t wch)
     84{
     85
     86        const char ch = (char) wch;
     87
     88        (*yamon_print_count)(0, &ch, 1);
     89}
     90
     91static outdev_t yamon_outdev;
     92static outdev_operations_t yamon_outdev_ops = {
     93        .write = yamon_putwchar,
     94        .redraw = NULL,
     95        .scroll_up = NULL,
     96        .scroll_down = NULL
     97};
     98
    13199void malta_output_init(void)
    132100{
    133 #ifdef CONFIG_NS16550_OUT
    134         if (tty_out)
    135                 stdout_wire(tty_out);
    136 #endif
     101        outdev_initialize("yamon", &yamon_outdev, &yamon_outdev_ops);
     102        stdout_wire(&yamon_outdev);
    137103}
    138104
    139105void malta_input_init(void)
    140106{
    141 #ifdef CONFIG_NS16550
    142         if (tty_instance) {
    143                 srln_instance_t *srln_instance = srln_init();
    144                 if (srln_instance) {
    145                         indev_t *sink = stdin_wire();
    146                         indev_t *srln = srln_wire(srln_instance, sink);
    147                         ns16550_wire(tty_instance, srln);
    148                         i8259_enable_irqs(1 << TTY_ISA_IRQ);
    149                 }
    150         }
    151 #endif
     107        (void) stdin_wire();
    152108}
    153109
Note: See TracChangeset for help on using the changeset viewer.