Ignore:
Timestamp:
2014-01-17T17:02:59Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
476f62c, facc34d
Parents:
2e80321 (diff), 61b5b73d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Mainline changes

File:
1 moved

Legend:

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

    r2e80321 r66be0288  
    3232/**
    3333 * @file
    34  * @brief ARM926 on-chip UART (PrimeCell UART, PL011) driver.
     34 * @brief ARM PrimeCell PL011 UART driver.
    3535 */
    3636
    37 #include <genarch/drivers/arm926_uart/arm926_uart.h>
     37#include <genarch/drivers/pl011/pl011.h>
    3838#include <console/chardev.h>
    3939#include <console/console.h>
     
    4646#include <str.h>
    4747
    48 static void arm926_uart_sendb(arm926_uart_t *uart, uint8_t byte)
     48static void pl011_uart_sendb(pl011_uart_t *uart, uint8_t byte)
    4949{
    5050        /* Wait for space becoming available in Tx FIFO. */
    5151        // TODO make pio_read accept consts pointers and remove the cast
    52         while ((pio_read_32((ioport32_t*)&uart->regs->flag) & ARM926_UART_FLAG_TXFF_FLAG) != 0)
     52        while ((pio_read_32((ioport32_t*)&uart->regs->flag) & PL011_UART_FLAG_TXFF_FLAG) != 0)
    5353                ;
    5454
     
    5656}
    5757
    58 static void arm926_uart_putchar(outdev_t *dev, wchar_t ch)
     58static void pl011_uart_putchar(outdev_t *dev, wchar_t ch)
    5959{
    60         arm926_uart_t *uart = dev->data;
     60        pl011_uart_t *uart = dev->data;
    6161
    6262        if (!ascii_check(ch)) {
    63                 arm926_uart_sendb(uart, U_SPECIAL);
     63                pl011_uart_sendb(uart, U_SPECIAL);
    6464        } else {
    6565                if (ch == '\n')
    66                         arm926_uart_sendb(uart, (uint8_t) '\r');
    67                 arm926_uart_sendb(uart, (uint8_t) ch);
     66                        pl011_uart_sendb(uart, (uint8_t) '\r');
     67                pl011_uart_sendb(uart, (uint8_t) ch);
    6868        }
    6969}
    7070
    71 static outdev_operations_t arm926_uart_ops = {
    72         .write = arm926_uart_putchar,
     71static outdev_operations_t pl011_uart_ops = {
     72        .write = pl011_uart_putchar,
    7373        .redraw = NULL,
    7474};
    7575
    76 static irq_ownership_t arm926_uart_claim(irq_t *irq)
     76static irq_ownership_t pl011_uart_claim(irq_t *irq)
    7777{
    7878        return IRQ_ACCEPT;
    7979}
    8080
    81 static void arm926_uart_irq_handler(irq_t *irq)
     81static void pl011_uart_irq_handler(irq_t *irq)
    8282{
    83         arm926_uart_t *uart = irq->instance;
     83        pl011_uart_t *uart = irq->instance;
    8484
    8585        // TODO make pio_read accept const pointers and remove the cast
    86         while ((pio_read_32((ioport32_t*)&uart->regs->flag) & ARM926_UART_FLAG_RXFE_FLAG) == 0) {
     86        while ((pio_read_32((ioport32_t*)&uart->regs->flag) & PL011_UART_FLAG_RXFE_FLAG) == 0) {
    8787                /* We ignore all error flags here */
    8888                const uint8_t data = pio_read_32(&uart->regs->data);
     
    9191        }
    9292        /* Ack interrupts */
    93         pio_write_32(&uart->regs->interrupt_clear, ARM926_UART_INTERRUPT_ALL);
     93        pio_write_32(&uart->regs->interrupt_clear, PL011_UART_INTERRUPT_ALL);
    9494}
    9595
    96 bool arm926_uart_init(
    97     arm926_uart_t *uart, inr_t interrupt, uintptr_t addr, size_t size)
     96bool pl011_uart_init(pl011_uart_t *uart, inr_t interrupt, uintptr_t addr)
    9897{
    9998        ASSERT(uart);
    100         uart->regs = (void*)km_map(addr, size, PAGE_NOT_CACHEABLE);
    101 
     99        uart->regs = (void*)km_map(addr, sizeof(pl011_uart_regs_t),
     100                                   PAGE_NOT_CACHEABLE);
    102101        ASSERT(uart->regs);
    103102
     103        /* Disable UART */
     104        uart->regs->control &= ~ PL011_UART_CONTROL_UARTEN_FLAG;
     105
    104106        /* Enable hw flow control */
    105         uart->regs->control = 0 |
    106             ARM926_UART_CONTROL_UARTEN_FLAG |
    107             ARM926_UART_CONTROL_RTSE_FLAG |
    108             ARM926_UART_CONTROL_CTSE_FLAG;
     107        uart->regs->control |=
     108                PL011_UART_CONTROL_RTSE_FLAG |
     109                PL011_UART_CONTROL_CTSE_FLAG;
    109110
    110111        /* Mask all interrupts */
    111112        uart->regs->interrupt_mask = 0;
     113        /* Clear interrupts */
     114        uart->regs->interrupt_clear = PL011_UART_INTERRUPT_ALL;
     115        /* Enable UART, TX and RX */
     116        uart->regs->control |=
     117                PL011_UART_CONTROL_UARTEN_FLAG |
     118                PL011_UART_CONTROL_TXE_FLAG |
     119                PL011_UART_CONTROL_RXE_FLAG;
    112120
    113         outdev_initialize("arm926_uart_dev", &uart->outdev, &arm926_uart_ops);
     121        outdev_initialize("pl011_uart_dev", &uart->outdev, &pl011_uart_ops);
    114122        uart->outdev.data = uart;
    115123
    116124        /* Initialize IRQ */
    117125        irq_initialize(&uart->irq);
    118         uart->irq.devno = device_assign_devno();
    119         uart->irq.inr = interrupt;
    120         uart->irq.claim = arm926_uart_claim;
    121         uart->irq.handler = arm926_uart_irq_handler;
    122         uart->irq.instance = uart;
     126        uart->irq.devno = device_assign_devno();
     127        uart->irq.inr = interrupt;
     128        uart->irq.claim = pl011_uart_claim;
     129        uart->irq.handler = pl011_uart_irq_handler;
     130        uart->irq.instance = uart;
    123131
    124132        return true;
    125133}
    126134
    127 void arm926_uart_input_wire(arm926_uart_t *uart, indev_t *indev)
     135void pl011_uart_input_wire(pl011_uart_t *uart, indev_t *indev)
    128136{
    129137        ASSERT(uart);
     
    132140        uart->indev = indev;
    133141        irq_register(&uart->irq);
    134         /* Enable receive interrupt */
    135         uart->regs->interrupt_mask |= ARM926_UART_INTERRUPT_RX_FLAG;
     142        /* Enable receive interrupts */
     143        uart->regs->interrupt_mask |=
     144                PL011_UART_INTERRUPT_RX_FLAG |
     145                PL011_UART_INTERRUPT_RT_FLAG;
    136146}
    137147
Note: See TracChangeset for help on using the changeset viewer.