logcom.cpp revision 0013b984212f7f0b741f4121be352249fc7e487b
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/* $Id$ */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/** @file
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * innotek Portable Runtime - Logging to Serial Port.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Copyright (C) 2006-2007 innotek GmbH
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * This file is part of VirtualBox Open Source Edition (OSE), as
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * available from http://www.virtualbox.org. This file is free software;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * you can redistribute it and/or modify it under the terms of the GNU
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * General Public License (GPL) as published by the Free Software
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Foundation, in version 2 as it comes in the "COPYING" file of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * The contents of this file may alternatively be used under the terms
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * of the Common Development and Distribution License Version 1.0
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * VirtualBox OSE distribution, in which case the provisions of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * CDDL are applicable instead of those of the GPL.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * You may elect to license modified versions of this file under the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * terms and conditions of either the GPL or the CDDL or both.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*******************************************************************************
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Defined Constants And Macros *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan*******************************************************************************/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/** Comport to log to (COM2).
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * This is also defined in VBox/nasm.mac. */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan//#define UART_BASE 0x2f8 /* COM2 */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define UART_BASE 0x3f8 /* COM1 */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*******************************************************************************
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Header Files *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan*******************************************************************************/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <iprt/log.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <iprt/asm.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <iprt/stdarg.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <iprt/string.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*******************************************************************************
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Internal Functions *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan*******************************************************************************/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic DECLCALLBACK(size_t) rtLogComOutput(void *pv, const char *pachChars, size_t cbChars);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/**
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Prints a formatted string to the serial port used for logging.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @returns Number of bytes written.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param pszFormat Format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param ... Optional arguments specified in the format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanRTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan va_list args;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan size_t cb;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan va_start(args, pszFormat);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cb = RTLogComPrintfV(pszFormat, args);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan va_end(args);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return cb;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/**
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Prints a formatted string to the serial port used for logging.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @returns Number of bytes written.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param pszFormat Format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param args Optional arguments specified in the format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanRTDECL(size_t) RTLogComPrintfV(const char *pszFormat, va_list args)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return RTLogFormatV(rtLogComOutput, NULL, pszFormat, args);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/**
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Callback for RTLogFormatV which writes to the com port.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * See PFNLOGOUTPUT() for details.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic DECLCALLBACK(size_t) rtLogComOutput(void *pv, const char *pachChars, size_t cbChars)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (cbChars)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan RTLogWriteCom(pachChars, cbChars);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return cbChars;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/**
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Write log buffer to COM port.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param pach Pointer to the buffer to write.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param cb Number of bytes to write.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanRTDECL(void) RTLogWriteCom(const char *pach, size_t cb)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan const uint8_t *pu8;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (pu8 = (const uint8_t *)pach; cb-- > 0; pu8++)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /* expand \n -> \r\n */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (*pu8 == '\n')
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan RTLogWriteCom("\r", 1);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /* Check if port is ready. */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan register unsigned cMaxWait = ~0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan register uint8_t u8;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan do
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan u8 = ASMInU8(UART_BASE + 5);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cMaxWait--;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } while (!(u8 & 0x20) && u8 != 0xff && cMaxWait);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /* write */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ASMOutU8(UART_BASE, *pu8);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan