Changeset 4d2dba7 in mainline for kernel/genarch/src


Ignore:
Timestamp:
2013-10-15T17:05:26Z (12 years ago)
Author:
Jakub Klama <jakub.klama@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f988a13
Parents:
a73ebf0
Message:

Implementation of IRQMP interrupt controller and UART drivers, part 2.
Modified kernel config files to reflect presence of new drivers.

Location:
kernel/genarch/src/drivers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/drivers/grlib_irqmp/grlib_irqmp.c

    ra73ebf0 r4d2dba7  
    3838#include <arch/asm.h>
    3939
    40 void grlib_irqmp_init(grlib_irqmp_t *irqc, grlib_irqmp_regs_t *regs)
     40#include <mm/km.h>
     41
     42void grlib_irqmp_init(grlib_irqmp_t *irqc, bootinfo_t *bootinfo)
    4143{
    42         irqc->regs = regs;
     44        irqc->regs = (void *) km_map(bootinfo->intc_base, PAGE_SIZE,
     45            PAGE_NOT_CACHEABLE);
     46
     47        /* Mask all interrupts */
     48        pio_write_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET, 0);
    4349}
    4450
    45 unsigned grlib_irqmp_inum_get(grlib_irqmp_t *irqc)
     51int grlib_irqmp_inum_get(grlib_irqmp_t *irqc)
    4652{
    47         return 0;
     53        int i;
     54        uint32_t pending = pio_read_32(&irqc->regs->pending);
     55
     56        for (i = 1; i < 16; i++) {
     57                if (pending & (1 << i))
     58                        return i;
     59        }
     60
     61        return -1;
    4862}
    4963
    50 void grlib_irqmp_clear(grlib_irqmp_t *irqc, unsigned inum)
     64void grlib_irqmp_clear(grlib_irqmp_t *irqc, int inum)
    5165{
     66        pio_write_32(&irqc->regs->clear, (1 << inum));
    5267}
    5368
    54 void grlib_irqmp_src_enable(grlib_irqmp_t *irqc, unsigned src)
     69void grlib_irqmp_mask(grlib_irqmp_t *irqc, int src)
    5570{
     71        uint32_t mask = pio_read_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET);
     72
     73        mask &= ~(1 << src);
     74
     75        pio_write_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET, mask);
    5676}
    5777
    58 void grlib_irqmp_src_disable(grlib_irqmp_t *irqc, unsigned src)
     78void grlib_irqmp_unmask(grlib_irqmp_t *irqc, int src)
    5979{
     80        uint32_t mask = pio_read_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET);
     81
     82        mask |= (1 << src);
     83
     84        pio_write_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET, mask);
    6085}
    6186
  • kernel/genarch/src/drivers/grlib_uart/grlib_uart.c

    ra73ebf0 r4d2dba7  
    5050static void grlib_uart_sendb(outdev_t *dev, uint8_t byte)
    5151{
     52        uint32_t reg;
    5253        grlib_uart_status_t *status;
    5354        grlib_uart_t *uart =
     
    5657        /* Wait for space becoming available in Tx FIFO. */
    5758        do {
    58                 status = pio_read_32(&uart->io->status);
     59                reg = pio_read_32(&uart->io->status);
     60                status = (grlib_uart_status_t *)&reg;
    5961        } while (status->tf != 0);
    6062
     
    8587static void grlib_uart_irq_handler(irq_t *irq)
    8688{
     89        uint32_t reg;
    8790        grlib_uart_t *uart = irq->instance;
    88         grlib_status_t status;
     91        grlib_uart_status_t *status;
    8992
    90         status = (grlib_status_t)pio_read_32(&uart->io->status);
     93        reg = pio_read_32(&uart->io->status);
     94        status = (grlib_uart_status_t *)&reg;
    9195
    9296        while (status->dr != 0) {
    9397                uint32_t data = pio_read_32(&uart->io->data);
    94                 status = (grlib_status_t)pio_read_32(&uart->io->status);
     98                reg = pio_read_32(&uart->io->status);
     99                status = (grlib_uart_status_t *)&reg;
    95100                indev_push_character(uart->indev, data & 0xff);
    96101        }
     
    131136
    132137        /* Enable FIFO, Tx trigger level: empty, Rx trigger level: 1 byte. */
    133         grlib_control_t control =
     138        grlib_uart_control_t control =
    134139                { .fa = 1, .rf = 1, .tf = 1, .ri = 1,
    135140                  .te = 1, .re = 1};
    136141
    137         pio_write_32(&uart->io->control, control);
     142        uint32_t *reg = (uint32_t *)&control;
     143        pio_write_32(&uart->io->control, *reg);
    138144
    139145        link_initialize(&uart->parea.link);
Note: See TracChangeset for help on using the changeset viewer.