Ignore:
File:
1 edited

Legend:

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

    rc5429fe r2a103b5  
    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>
    4048
    4149static void malta_init(void);
     
    5765};
    5866
     67#ifdef CONFIG_NS16550
     68static ns16550_instance_t *tty_instance;
     69#endif
     70#ifdef CONFIG_NS16550_OUT
     71static outdev_t *tty_out;
     72#endif
     73
     74static 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
    5998void malta_init(void)
    6099{
     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
    61117}
    62118
     
    73129}
    74130
    75 #define YAMON_SUBR_BASE         PA2KA(0x1fc00500)
    76 #define YAMON_SUBR_PRINT_COUNT  (YAMON_SUBR_BASE + 0x4)
    77 
    78 typedef void (**yamon_print_count_ptr_t)(uint32_t, const char *, uint32_t);
    79 
    80 yamon_print_count_ptr_t yamon_print_count =
    81     (yamon_print_count_ptr_t) YAMON_SUBR_PRINT_COUNT;
    82 
    83 static 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 
    91 static outdev_t yamon_outdev;
    92 static outdev_operations_t yamon_outdev_ops = {
    93         .write = yamon_putwchar,
    94         .redraw = NULL,
    95         .scroll_up = NULL,
    96         .scroll_down = NULL
    97 };
    98 
    99131void malta_output_init(void)
    100132{
    101         outdev_initialize("yamon", &yamon_outdev, &yamon_outdev_ops);
    102         stdout_wire(&yamon_outdev);
     133#ifdef CONFIG_NS16550_OUT
     134        if (tty_out)
     135                stdout_wire(tty_out);
     136#endif
    103137}
    104138
    105139void malta_input_init(void)
    106140{
    107         (void) stdin_wire();
     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
    108152}
    109153
Note: See TracChangeset for help on using the changeset viewer.