/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/


#ifndef CC_MTK_LOADER

#include "x_lint.h"

LINT_EXT_HEADER_BEGIN

#include "x_typedef.h"
#include "x_dbg_drv.h"

#include "x_serial.h"
#include "x_assert.h"

LINT_EXT_HEADER_END

VOID x_dbg_out_flag (BOOL fgOutEnable);

#ifdef EXT_DBG_DEV

#include "uart_if.h"

static x_dbg_data_rec_fct _pfDbgDataRec;
static BOOL _fgOutputEnable = TRUE;

static void _DbgInput(INT32 i4DbgInp)
{
	if (_pfDbgDataRec)
	{
		_pfDbgDataRec((UINT8)i4DbgInp);
	}
}


INT32 x_dbg_open_output (const CHAR*		ps_output_name,
						DBG_OUTPUT_TYPE_T	e_output_type,
						const VOID*			pv_output_info)
{
    static BOOL fgInit = FALSE;
	UNUSED(ps_output_name);
	UNUSED(pv_output_info);
/*
	if (e_output_type == DBG_OUTPUT_TYPE_IGNORE)
	{
		DBG_SetCallback(FALSE, (PF_DBG_INPUT_T) NULL);
		_pfDbgDataRec = NULL;
	}
	else
	{
		DBG_SetCallback(TRUE, (PF_DBG_INPUT_T) _DbgInput);
	}
*/
    if (!fgInit)
    {
        /* Init UART driver */
        UART_Init();
        fgInit = TRUE;
    }

	DBG_SetCallback(TRUE, (PF_DBG_INPUT_T) _DbgInput);

	return DBGR_OK;
}

VOID x_dbg_put_stmt (const CHAR* ps_stmt)
{
	CHAR* pCh;
	INT32 i4Cnt = 1024;

	pCh = (CHAR*)ps_stmt;

	if (_fgOutputEnable)
	{
	    while (i4Cnt-- && *pCh)
	    {
			outbyte(*pCh++);
	    }
	}
}

VOID x_dbg_reg_data_rec (x_dbg_data_rec_fct  pf_data_rec)
{
	_pfDbgDataRec = pf_data_rec;
}

VOID x_dbg_out_flag (BOOL fgOutEnalbe)
{
	_fgOutputEnable = fgOutEnalbe;
}

#else

INT32 x_dbg_open_output (const CHAR*		ps_output_name,
						DBG_OUTPUT_TYPE_T	e_output_type,
						const VOID*			pv_output_info)
{
	UNUSED(ps_output_name);
	UNUSED(pv_output_info);
    UNUSED(e_output_type);
    return TRUE;
}

VOID x_dbg_put_stmt (const CHAR* ps_stmt)
{
    UNUSED(ps_stmt);
}

VOID x_dbg_reg_data_rec (x_dbg_data_rec_fct  pf_data_rec)
{
    UNUSED(pf_data_rec);
}

VOID x_dbg_out_flag (BOOL fgOutEnable)
{
    UNUSED(fgOutEnable);
}

#endif  // EXT_DBG_DEV

#endif /* CC_MTK_LOADER */

