arm: Add 8250 omap variant uart driver
* Untested, someone with an omap3,4,5 could though.
This commit is contained in:
@@ -34,6 +34,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
extern DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock);
|
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 */
|
#endif /* _KERNEL_ARCH_DEBUG_UART_8250_H */
|
||||||
|
|||||||
@@ -30,15 +30,22 @@ local kernelDebugSources =
|
|||||||
;
|
;
|
||||||
|
|
||||||
BootMergeObject boot_arch_$(TARGET_KERNEL_ARCH).o :
|
BootMergeObject boot_arch_$(TARGET_KERNEL_ARCH).o :
|
||||||
|
# Serial UART Drivers
|
||||||
debug_uart_8250.cpp
|
debug_uart_8250.cpp
|
||||||
arch_uart_8250.cpp
|
arch_uart_8250.cpp
|
||||||
|
arch_uart_8250_omap.cpp
|
||||||
arch_uart_pl011.cpp
|
arch_uart_pl011.cpp
|
||||||
arch_elf.cpp
|
|
||||||
|
# Framebuffer Drivers
|
||||||
arch_framebuffer_920.cpp
|
arch_framebuffer_920.cpp
|
||||||
arch_framebuffer_bcm2835.cpp
|
arch_framebuffer_bcm2835.cpp
|
||||||
arch_framebuffer_pxa.cpp
|
arch_framebuffer_pxa.cpp
|
||||||
arch_framebuffer_omap3.cpp
|
arch_framebuffer_omap3.cpp
|
||||||
|
|
||||||
|
# Mailbox drivers
|
||||||
arch_mailbox_bcm2835.cpp
|
arch_mailbox_bcm2835.cpp
|
||||||
|
|
||||||
|
arch_elf.cpp
|
||||||
arch_cpu.cpp
|
arch_cpu.cpp
|
||||||
arch_mmu.cpp
|
arch_mmu.cpp
|
||||||
arch_start_kernel.S
|
arch_start_kernel.S
|
||||||
|
|||||||
@@ -25,8 +25,11 @@ KernelMergeObject kernel_arch_arm.o :
|
|||||||
arch_vm.cpp
|
arch_vm.cpp
|
||||||
arch_vm_translation_map.cpp
|
arch_vm_translation_map.cpp
|
||||||
arch_asm.S
|
arch_asm.S
|
||||||
|
|
||||||
|
# Serial UART and drivers
|
||||||
debug_uart_8250.cpp
|
debug_uart_8250.cpp
|
||||||
arch_uart_8250.cpp
|
arch_uart_8250.cpp
|
||||||
|
arch_uart_8250_omap.cpp
|
||||||
arch_uart_pl011.cpp
|
arch_uart_pl011.cpp
|
||||||
|
|
||||||
arch_atomic64.cpp
|
arch_atomic64.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, [email protected]
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <arch/arm/reg.h>
|
||||||
|
#include <arch/generic/debug_uart_8250.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <omap3.h>
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -102,6 +102,11 @@ debug_uart_from_fdt(const void *fdt)
|
|||||||
TRACE(("serial: Found 8250 serial UART!\n"));
|
TRACE(("serial: Found 8250 serial UART!\n"));
|
||||||
uart = arch_get_uart_8250(regs, clock);
|
uart = arch_get_uart_8250(regs, clock);
|
||||||
#ifdef __ARM__
|
#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
|
} else if (fdt_node_check_compatible(fdt, node, "arm,pl011") == 0
|
||||||
|| fdt_node_check_compatible(fdt, node, "arm,primecell") == 0) {
|
|| fdt_node_check_compatible(fdt, node, "arm,primecell") == 0) {
|
||||||
TRACE(("serial: Found pl011 serial UART!\n"));
|
TRACE(("serial: Found pl011 serial UART!\n"));
|
||||||
|
|||||||
Reference in New Issue
Block a user