From a42249db2df7f24502c01c6e87200afc8d6ef52c Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Mon, 20 Nov 2017 09:16:52 -0600 Subject: [PATCH] arm: Add 8250 omap variant uart driver * Untested, someone with an omap3,4,5 could though. --- .../kernel/arch/generic/debug_uart_8250.h | 1 + src/system/boot/arch/arm/Jamfile | 9 ++- src/system/kernel/arch/arm/Jamfile | 3 + .../kernel/arch/arm/arch_uart_8250_omap.cpp | 78 +++++++++++++++++++ .../kernel/platform/u-boot/fdt_serial.cpp | 5 ++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/system/kernel/arch/arm/arch_uart_8250_omap.cpp diff --git a/headers/private/kernel/arch/generic/debug_uart_8250.h b/headers/private/kernel/arch/generic/debug_uart_8250.h index e7f211f2a5..34694a4232 100644 --- a/headers/private/kernel/arch/generic/debug_uart_8250.h +++ b/headers/private/kernel/arch/generic/debug_uart_8250.h @@ -34,6 +34,7 @@ public: extern DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock); +extern DebugUART8250 *arch_get_uart_8250_omap(addr_t base, int64 clock); #endif /* _KERNEL_ARCH_DEBUG_UART_8250_H */ diff --git a/src/system/boot/arch/arm/Jamfile b/src/system/boot/arch/arm/Jamfile index d65f88ecab..fdb3e65e62 100644 --- a/src/system/boot/arch/arm/Jamfile +++ b/src/system/boot/arch/arm/Jamfile @@ -30,15 +30,22 @@ local kernelDebugSources = ; BootMergeObject boot_arch_$(TARGET_KERNEL_ARCH).o : + # Serial UART Drivers debug_uart_8250.cpp arch_uart_8250.cpp + arch_uart_8250_omap.cpp arch_uart_pl011.cpp - arch_elf.cpp + + # Framebuffer Drivers arch_framebuffer_920.cpp arch_framebuffer_bcm2835.cpp arch_framebuffer_pxa.cpp arch_framebuffer_omap3.cpp + + # Mailbox drivers arch_mailbox_bcm2835.cpp + + arch_elf.cpp arch_cpu.cpp arch_mmu.cpp arch_start_kernel.S diff --git a/src/system/kernel/arch/arm/Jamfile b/src/system/kernel/arch/arm/Jamfile index bed3e6afee..6e9163580e 100644 --- a/src/system/kernel/arch/arm/Jamfile +++ b/src/system/kernel/arch/arm/Jamfile @@ -25,8 +25,11 @@ KernelMergeObject kernel_arch_arm.o : arch_vm.cpp arch_vm_translation_map.cpp arch_asm.S + + # Serial UART and drivers debug_uart_8250.cpp arch_uart_8250.cpp + arch_uart_8250_omap.cpp arch_uart_pl011.cpp arch_atomic64.cpp diff --git a/src/system/kernel/arch/arm/arch_uart_8250_omap.cpp b/src/system/kernel/arch/arm/arch_uart_8250_omap.cpp new file mode 100644 index 0000000000..4f267eccc4 --- /dev/null +++ b/src/system/kernel/arch/arm/arch_uart_8250_omap.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2011-2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * François Revol, revol@free.fr + */ + + +#include +#include +#include +#include +#include + + +class ArchUART8250Omap : public DebugUART8250 { +public: + ArchUART8250Omap(addr_t base, int64 clock); + ~ArchUART8250Omap(); + void InitEarly(); + + // ARM MMIO: on ARM the UART regs are aligned on 32bit + virtual void Out8(int reg, uint8 value); + virtual uint8 In8(int reg); +}; + + +ArchUART8250Omap::ArchUART8250Omap(addr_t base, int64 clock) + : + DebugUART8250(base, clock) +{ +} + + +ArchUART8250Omap::~ArchUART8250Omap() +{ +} + + +void +ArchUART8250Omap::InitEarly() +{ + // Perform special hardware UART configuration + /* UART1 */ + RMWREG32(CM_FCLKEN1_CORE, 13, 1, 1); + RMWREG32(CM_ICLKEN1_CORE, 13, 1, 1); + + /* UART2 */ + RMWREG32(CM_FCLKEN1_CORE, 14, 1, 1); + RMWREG32(CM_ICLKEN1_CORE, 14, 1, 1); + + /* UART3 */ + RMWREG32(CM_FCLKEN_PER, 11, 1, 1); + RMWREG32(CM_ICLKEN_PER, 11, 1, 1); +} + + +void +ArchUART8250Omap::Out8(int reg, uint8 value) +{ + *((uint8 *)Base() + reg * sizeof(uint32)) = value; +} + + +uint8 +ArchUART8250Omap::In8(int reg) +{ + return *((uint8 *)Base() + reg * sizeof(uint32)); +} + + +DebugUART8250 *arch_get_uart_8250_omap(addr_t base, int64 clock) +{ + static char buffer[sizeof(ArchUART8250Omap)]; + ArchUART8250Omap *uart = new(buffer) ArchUART8250Omap(base, clock); + return uart; +} diff --git a/src/system/kernel/platform/u-boot/fdt_serial.cpp b/src/system/kernel/platform/u-boot/fdt_serial.cpp index 6842437633..3d988c0472 100644 --- a/src/system/kernel/platform/u-boot/fdt_serial.cpp +++ b/src/system/kernel/platform/u-boot/fdt_serial.cpp @@ -102,6 +102,11 @@ debug_uart_from_fdt(const void *fdt) TRACE(("serial: Found 8250 serial UART!\n")); uart = arch_get_uart_8250(regs, clock); #ifdef __ARM__ + } else if (fdt_node_check_compatible(fdt, node, "ti,omap3-uart") == 0 + || fdt_node_check_compatible(fdt, node, "ti,omap4-uart") == 0 + || fdt_node_check_compatible(fdt, node, "ti,omap5-uart") == 0) { + TRACE(("serial: Found omap 8250 serial UART!\n")); + uart = arch_get_uart_8250_omap(regs, clock); } else if (fdt_node_check_compatible(fdt, node, "arm,pl011") == 0 || fdt_node_check_compatible(fdt, node, "arm,primecell") == 0) { TRACE(("serial: Found pl011 serial UART!\n"));