/* 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.
 *
 *****************************************************************************/

/*-----------------------------------------------------------------------------
 *
 * $Author: brianpc.huang $
 * $Date: 2015/05/29 $
 * $RCSfile: ir_ph.h,v $
 * $Revision: #1 $
 *
 *---------------------------------------------------------------------------*/

#ifndef IR_PH_H
#define IR_PH_H

#include "x_lint.h"
#include "x_typedef.h"

/* standard ansi c __attribute__((packed))  */
LINT_SUPPRESS_BRACE(950)
typedef union
{
	UINT32 u4MtCode;
	struct
	{
		UINT32 tail			:  4;
		UINT32 command		: 12;
		UINT32 address		: 10;
		UINT32 toggle		:  2;
		UINT32 start		:  4;
	} u;
} __attribute__ ((packed)) RC5_RAW_T;

/* standard ansi c __attribute__((packed))  */
LINT_SUPPRESS_BRACE(950)
typedef union
{
	UINT32 u4Rc5Code;
	struct
	{
		UINT32 reserved		: 2;
		UINT32 command		: 6;
		UINT32 address		: 5;
		UINT32 toggle		: 1;
		UINT32 start		: 2;
	} u;
} __attribute__ ((packed)) RC5_SPLITTER_T;

/* standard ansi c __attribute__((packed))  */
LINT_SUPPRESS_BRACE(950)
typedef union
{
	UINT32 u4Rc6Mode0Code;
	struct
	{
		UINT32 tail			: 9;
		UINT32 command		: 8;
		UINT32 address		: 8;
		UINT32 toggle		: 2;
		UINT32 mb			: 3;
		UINT32 start		: 2;
	} u;
} __attribute__ ((packed)) RC6_SPLITTER_T;

/* macros */
#define SCREEN_LO	(0x55555555)
#define BITMASK_LO(bits) ( (bits >= 32) ? 0xffffffff : ((1 << (bits)) - 1) )

EXTERN UINT8 IR_PH_ReverseBit8(UINT8 u1Input);
EXTERN UINT16 IR_PH_ReverseBit16(UINT16 u2Input);
EXTERN UINT32 IR_PH_ReverseBit32(UINT32 u4Input);
EXTERN UINT32 IR_PH_BiPhase(UINT32 u4Input, UINT32 u4Bits);

/* rc5 decoder */
EXTERN BOOL IR_PH_BiPhaseTest(UINT8 u1Bits, UINT32 u4Val);
EXTERN UINT32 IR_PH_Rc5BiPhaseDecode(UINT8 u1Bits, UINT32 u4BiPhase);
EXTERN UINT32 IR_PH_Mt2Rc5Shift(UINT8 u1Bits, UINT32 u4MtCode);
EXTERN UINT32 IR_PH_Mt2Rc5Decode(UINT32 u4MtCode);
EXTERN void IR_PH_Rc5Split(UINT32 u4Rc5Code, UINT32 *pu4Start, UINT32 *pu4Toggle,
	UINT32 *pu4Address, UINT32 *pu4Command);
EXTERN BOOL IR_PH_Rc5Validate(UINT8 u1Bits, UINT32 u4MtCode, UINT32 u4Rc5Code);

/* rc6 decoder */
EXTERN UINT32 IR_PH_Mt2Rc6Decode(UINT32 u4MtCode);
EXTERN void IR_PH_Rc6Split(UINT32 u4Rc6Code, UINT32 *pu4Start, UINT32 *pu4Mb, UINT32 *pu4Toggle,
	UINT32 *pu4Address, UINT32 *pu4Command);
EXTERN BOOL IR_PH_Rc6Validate(UINT8 u1Bits, UINT32 u4MtCode, UINT32 u4Rc6Code);



#endif /* IR_PH_H */
