1/* 2 * Copyright 2011-2012 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * François Revol, revol@free.fr 7 */ 8 9 10#include <arch/arm/reg.h> 11#include <arch/generic/debug_uart_8250.h> 12#include <board_config.h> 13#include <debug.h> 14#include <new> 15 16 17class ArchUART8250 : public DebugUART8250 { 18public: 19 ArchUART8250(addr_t base, int64 clock); 20 ~ArchUART8250(); 21 void InitEarly(); 22 23 // ARM MMIO: on ARM the UART regs are aligned on 32bit 24 virtual void Out8(int reg, uint8 value); 25 virtual uint8 In8(int reg); 26}; 27 28 29ArchUART8250::ArchUART8250(addr_t base, int64 clock) 30 : DebugUART8250(base, clock) 31{ 32} 33 34 35ArchUART8250::~ArchUART8250() 36{ 37} 38 39 40void 41ArchUART8250::InitEarly() 42{ 43 // Perform special hardware UART configuration 44 45#if BOARD_CPU_OMAP3 46 /* UART1 */ 47 RMWREG32(CM_FCLKEN1_CORE, 13, 1, 1); 48 RMWREG32(CM_ICLKEN1_CORE, 13, 1, 1); 49 50 /* UART2 */ 51 RMWREG32(CM_FCLKEN1_CORE, 14, 1, 1); 52 RMWREG32(CM_ICLKEN1_CORE, 14, 1, 1); 53 54 /* UART3 */ 55 RMWREG32(CM_FCLKEN_PER, 11, 1, 1); 56 RMWREG32(CM_ICLKEN_PER, 11, 1, 1); 57#else 58#warning INTITIALIZE UART!!!!! 59#endif 60} 61 62 63void 64ArchUART8250::Out8(int reg, uint8 value) 65{ 66 *((uint8 *)Base() + reg * sizeof(uint32)) = value; 67} 68 69 70uint8 71ArchUART8250::In8(int reg) 72{ 73 return *((uint8 *)Base() + reg * sizeof(uint32)); 74} 75 76 77DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock) 78{ 79 static char buffer[sizeof(ArchUART8250)]; 80 ArchUART8250 *uart = new(buffer) ArchUART8250(base, clock); 81 return uart; 82} 83