/* * platform.c - Platform initialization and I/O. * * Copyright (C) 2015 ARM Limited. All rights reserved. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE.txt file. */ #include #include #include #define PL011_UARTDR 0x00 #define PL011_UARTFR 0x18 #define PL011_UARTIBRD 0x24 #define PL011_UARTFBRD 0x28 #define PL011_UART_LCR_H 0x2c #define PL011_UARTCR 0x30 #define PL011_UARTFR_BUSY (1 << 3) #define PL011_UARTFR_FIFO_FULL (1 << 5) #define PL011(reg) ((void *)UART_BASE + PL011_##reg) #ifdef SYSREGS_BASE #define V2M_SYS_CFGDATA 0xa0 #define V2M_SYS_CFGCTRL 0xa4 #define V2M_SYS(reg) ((void *)SYSREGS_BASE + V2M_SYS_##reg) #endif void print_char(char c) { uint32_t flags; do { flags = raw_readl(PL011(UARTFR)); } while (flags & PL011_UARTFR_FIFO_FULL); raw_writel(c, PL011(UARTDR)); do { flags = raw_readl(PL011(UARTFR)); } while (flags & PL011_UARTFR_BUSY); } void print_string(const char *str) { while (*str) print_char(*str++); } #define HEX_CHARS_PER_LONG (2 * sizeof(long)) #define HEX_CHARS "0123456789abcdef" void print_ulong_hex(unsigned long val) { int i; for (i = HEX_CHARS_PER_LONG - 1; i >= 0; i--) { int v = (val >> (4 * i)) & 0xf; print_char(HEX_CHARS[v]); } } void init_uart(void) { /* * UART initialisation (38400 8N1) */ raw_writel(0x10, PL011(UARTIBRD)); raw_writel(0x0, PL011(UARTFBRD)); /* Set parameters to 8N1 and enable the FIFOs */ raw_writel(0x70, PL011(UART_LCR_H)); /* Enable the UART, TXen and RXen */ raw_writel(0x301, PL011(UARTCR)); } void init_platform(void) { #ifdef SYSREGS_BASE /* * CLCD output site MB */ raw_writel(0x0, V2M_SYS(CFGDATA)); /* START | WRITE | MUXFPGA | SITE_MB */ raw_writel((1 << 31) | (1 << 30) | (7 << 20) | (0 << 16), V2M_SYS(CFGCTRL)); #endif }