Changeset 6bbe470 in mainline


Ignore:
Timestamp:
2012-10-29T22:56:18Z (11 years ago)
Author:
Martin Sucha <sucha14@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
21b6307
Parents:
5030acad
Message:

Implement output in ns16550 driver.

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    r5030acad r6bbe470  
    464464
    465465% Use NS16550 controller as dummy serial output (kernel console)
    466 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_NS16550_KCON=y] CONFIG_NS16550_DSRLNOUT (y)
     466! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_NS16550_KCON=y] CONFIG_NS16550_OUT (y)
    467467
    468468% Support for ARM926 on-chip UART
     
    491491
    492492% Dummy serial line output
    493 ! [CONFIG_MIPS_PRN=y|CONFIG_ARM_PRN=y|CONFIG_NS16550_DSRLNOUT=y] CONFIG_DSRLNOUT (y)
     493! [CONFIG_MIPS_PRN=y|CONFIG_ARM_PRN=y] CONFIG_DSRLNOUT (y)
    494494
    495495% Serial line input module
  • kernel/arch/amd64/src/amd64.c

    r5030acad r6bbe470  
    5555#include <genarch/kbrd/kbrd.h>
    5656#include <genarch/srln/srln.h>
    57 #include <genarch/drivers/dsrln/dsrlnout.h>
    5857#include <genarch/multiboot/multiboot.h>
    5958#include <genarch/multiboot/multiboot2.h>
     
    219218#endif
    220219
    221 #ifdef CONFIG_NS16550
     220#if (defined(CONFIG_NS16550) || defined(CONFIG_NS16550_OUT))
    222221        /*
    223          * Initialize the ns16550 controller. Then initialize the serial
    224          * input module and connect it to ns16550.
     222         * Initialize the ns16550 controller.
    225223         */
    226224        ns16550_instance_t *ns16550_instance
    227225            = ns16550_init((ns16550_t *) NS16550_BASE, IRQ_NS16550, NULL, NULL);
    228226        if (ns16550_instance) {
     227#ifdef CONFIG_NS16550
    229228                srln_instance_t *srln_instance = srln_init();
    230229                if (srln_instance) {
     
    234233                        trap_virtual_enable_irqs(1 << IRQ_NS16550);
    235234                }
    236         }
    237 #endif
    238 
    239 #ifdef CONFIG_NS16550_DSRLNOUT
    240         /*
    241          * Initialize dummy serial output to the ns16550.
    242          */
    243         outdev_t *dsrlndev = dsrlnout_init(NS16550_BASE);
    244         if (dsrlndev) {
    245                 stdout_wire(dsrlndev);
     235#endif
     236#ifdef CONFIG_NS16550_OUT
     237                outdev_t *ns16550_out = ns16550_output(ns16550_instance);
     238                if (ns16550_out) {
     239                        stdout_wire(ns16550_out);
     240                }
     241#endif
    246242        }
    247243#endif
  • kernel/arch/ia32/src/ia32.c

    r5030acad r6bbe470  
    5656#include <genarch/kbrd/kbrd.h>
    5757#include <genarch/srln/srln.h>
    58 #include <genarch/drivers/dsrln/dsrlnout.h>
    5958#include <genarch/multiboot/multiboot.h>
    6059#include <genarch/multiboot/multiboot2.h>
     
    173172#endif
    174173
    175 #ifdef CONFIG_NS16550
     174#if (defined(CONFIG_NS16550) || defined(CONFIG_NS16550_OUT))
    176175        /*
    177          * Initialize the ns16550 controller. Then initialize the serial
    178          * input module and connect it to ns16550.
     176         * Initialize the ns16550 controller.
    179177         */
    180178        ns16550_instance_t *ns16550_instance
    181179            = ns16550_init((ns16550_t *) NS16550_BASE, IRQ_NS16550, NULL, NULL);
    182180        if (ns16550_instance) {
     181#ifdef CONFIG_NS16550
    183182                srln_instance_t *srln_instance = srln_init();
    184183                if (srln_instance) {
     
    188187                        trap_virtual_enable_irqs(1 << IRQ_NS16550);
    189188                }
    190         }
    191 #endif
    192        
    193 #ifdef CONFIG_NS16550_DSRLNOUT
    194         /*
    195          * Initialize dummy serial output to the ns16550.
    196          */
    197         outdev_t *dsrlndev = dsrlnout_init(NS16550_BASE);
    198         if (dsrlndev) {
    199                 stdout_wire(dsrlndev);
     189#endif
     190#ifdef CONFIG_NS16550_OUT
     191                outdev_t *ns16550_out = ns16550_output(ns16550_instance);
     192                if (ns16550_out) {
     193                        stdout_wire(ns16550_out);
     194                }
     195#endif
    200196        }
    201197#endif
  • kernel/genarch/include/drivers/ns16550/ns16550.h

    r5030acad r6bbe470  
    3838#define KERN_NS16550_H_
    3939
     40#include <ddi/ddi.h>
    4041#include <ddi/irq.h>
    4142#include <typedefs.h>
     
    5051/** NS16550 registers. */
    5152typedef struct {
    52         ioport8_t rbr;      /**< Receiver Buffer Register. */
     53        union {
     54                ioport8_t rbr;      /**< Receiver Buffer Register (read). */
     55                ioport8_t thr;      /**< Transmitter Holder Register (write). */
     56        } __attribute__ ((packed));
    5357        ioport8_t ier;      /**< Interrupt Enable Register. */
    5458        union {
     
    6569        irq_t irq;
    6670        ns16550_t *ns16550;
    67         indev_t *kbrdin;
     71        indev_t *input;
     72        outdev_t *output;
     73        parea_t parea;
    6874} ns16550_instance_t;
    6975
    7076extern ns16550_instance_t *ns16550_init(ns16550_t *, inr_t, cir_t, void *);
    7177extern void ns16550_wire(ns16550_instance_t *, indev_t *);
     78extern outdev_t *ns16550_output(ns16550_instance_t *);
    7279
    7380#endif
  • kernel/genarch/src/drivers/ns16550/ns16550.c

    r5030acad r6bbe470  
    4141#include <mm/slab.h>
    4242#include <ddi/device.h>
     43#include <str.h>
    4344
    4445#define LSR_DATA_READY  0x01
     46#define LSR_TH_READY    0x20
    4547
    4648static irq_ownership_t ns16550_claim(irq_t *irq)
     
    6264        if (pio_read_8(&dev->lsr) & LSR_DATA_READY) {
    6365                uint8_t data = pio_read_8(&dev->rbr);
    64                 indev_push_character(instance->kbrdin, data);
     66                indev_push_character(instance->input, data);
    6567        }
    6668}
     
    7274                (void) pio_read_8(&dev->rbr);
    7375}
     76
     77static void ns16550_sendb(ns16550_t *dev, uint8_t byte)
     78{
     79        while (!(pio_read_8(&dev->lsr) & LSR_TH_READY))
     80                ;
     81        pio_write_8(&dev->thr, byte);
     82}
     83
     84static void ns16550_putchar(outdev_t *dev, wchar_t ch)
     85{
     86        ns16550_instance_t *instance = (ns16550_instance_t *) dev->data;
     87       
     88        if ((!instance->parea.mapped) || (console_override)) {
     89                if (ascii_check(ch))
     90                        ns16550_sendb(instance->ns16550, (uint8_t) ch);
     91                else
     92                        ns16550_sendb(instance->ns16550, U_SPECIAL);
     93        }
     94}
     95
     96static outdev_operations_t ns16550_ops = {
     97        .write = ns16550_putchar,
     98        .redraw = NULL
     99};
    74100
    75101/** Initialize ns16550.
     
    90116        if (instance) {
    91117                instance->ns16550 = dev;
    92                 instance->kbrdin = NULL;
     118                instance->input = NULL;
     119                instance->output = NULL;
    93120               
    94121                irq_initialize(&instance->irq);
     
    100127                instance->irq.cir = cir;
    101128                instance->irq.cir_arg = cir_arg;
     129               
     130                instance->parea.pbase = (uintptr_t) dev;
     131                instance->parea.frames = 1;
     132                instance->parea.unpriv = false;
     133                instance->parea.mapped = false;
     134                ddi_parea_register(&instance->parea);
    102135        }
    103136       
     
    105138}
    106139
    107 void ns16550_wire(ns16550_instance_t *instance, indev_t *kbrdin)
     140void ns16550_wire(ns16550_instance_t *instance, indev_t *input)
    108141{
    109142        ASSERT(instance);
    110         ASSERT(kbrdin);
     143        ASSERT(input);
    111144       
    112         instance->kbrdin = kbrdin;
     145        instance->input = input;
    113146        irq_register(&instance->irq);
    114147       
     
    120153}
    121154
     155outdev_t *ns16550_output(ns16550_instance_t *instance)
     156{
     157        ASSERT(instance);
     158       
     159        if (instance->output == NULL) {
     160                instance->output = malloc(sizeof(outdev_t),
     161                    FRAME_ATOMIC);
     162                if (instance->output) {
     163                        outdev_initialize("ns16550", instance->output,
     164                            &ns16550_ops);
     165                        instance->output->data = instance;
     166                }
     167        }
     168       
     169        return instance->output;
     170}
     171
    122172/** @}
    123173 */
Note: See TracChangeset for help on using the changeset viewer.