blob: 2da336423d60cea1ad5e0ecd36093b50781641a7 [file] [log] [blame]
/*
* Copyright (C)2018 Amlogic, Inc. All rights reserved.
*
* All information contained herein is Amlogic confidential.
*
* This software is provided to you pursuant to Software License Agreement
* (SLA) with Amlogic Inc ("Amlogic"). This software may be used
* only in accordance with the terms of this agreement.
*
* Redistribution and use in source and binary forms, with or without
* modification is strictly prohibited without prior written permission from
* Amlogic.
*
* 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
* OWNER 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.
*/
#include "FreeRTOS.h"
#include <common.h>
#include "ir.h"
#include "ir_drv.h"
static struct xRegList xNECLegacyRegList[] = {
{REG_LDR_ACTIVE, (500 << 16) | (400 << 0)},
{REG_LDR_IDLE, 300 << 16 | 200 << 0},
{REG_LDR_REPEAT, 150 << 16 | 80 << 0},
{REG_BIT_0, 72 << 16 | 40 << 0 },
{REG_REG0, 7 << 28 | (0xFA0 << 12) | 0x13},
{REG_STATUS, (134 << 20) | (90 << 10)},
{REG_REG1, 0xbe00},
};
static struct xRegList xNECRegList[] = {
{REG_LDR_ACTIVE, (500 << 16) | (400 << 0)},
{REG_LDR_IDLE, 300 << 16 | 200 << 0},
{REG_LDR_REPEAT, 150 << 16 | 80 << 0},
{REG_BIT_0, 72 << 16 | 40 << 0},
{REG_REG0, 7 << 28 | (0xFA0 << 12) | 0x13},
{REG_STATUS, (134 << 20) | (90 << 10)},
{REG_REG1, 0x9f00},
{REG_REG2, 0x00},
{REG_DURATN2, 0x00},
{REG_DURATN3, 0x00}
};
#ifdef MODE_HARD_DUOKAN
static struct xRegList xDUOKANRegList[] = {
{ REG_LDR_ACTIVE, ((70 << 16) | (30 << 0))},
{ REG_LDR_IDLE, ((50 << 16) | (15 << 0))},
{ REG_LDR_REPEAT, ((30 << 16) | (26 << 0))},
{ REG_BIT_0, ((66 << 16) | (40 << 0))},
{ REG_REG0, ((3 << 28) | (0x4e2 << 12) | (0x13))},
{ REG_STATUS, ((80 << 20) | (66 << 10))},
{ REG_REG1, 0x9300},
{ REG_REG2, 0xb90b},
{ REG_DURATN2, ((97 << 16) | (80 << 0))},
{ REG_DURATN3, ((120 << 16) | (97 << 0))},
{ REG_REG3, 5000<<0}
};
static xRegProtocolMethod xDUOKANDecode = {
.ucProtocol = MODE_HARD_DUOKAN,
.RegList = xDUOKANRegList,
.ucRegNum = ARRAY_SIZE(xDUOKANRegList),
};
#endif
#ifdef MODE_HARD_XMP_1
static struct xRegList xXMP1RegList[] = {
{ REG_LDR_ACTIVE, 0},
{ REG_LDR_IDLE, 0},
{ REG_LDR_REPEAT, 0},
{ REG_BIT_0, (52 << 16) | (45<<0)},
{ REG_REG0, ((7 << 28) | (0x5DC << 12) | (0x13))},
{ REG_STATUS, (87 << 20) | (80 << 10)},
{ REG_REG1, 0x9f00},
{ REG_REG2, 0xa90e},
/*n=10,758+137*10=2128us,2128/20= 106*/
{ REG_DURATN2, (121<<16) | (114<<0)},
{ REG_DURATN3, (7<<16) | (7<<0)},
{ REG_REG3, 0}
};
static xRegProtocolMethod xXMP1Decode = {
.ucProtocol = MODE_HARD_XMP_1,
.RegList = xXMP1RegList,
.ucRegNum = ARRAY_SIZE(xXMP1RegList),
};
#endif
#ifdef MODE_HARD_RC5
static struct xRegList xRC5RegList[] = {
{ REG_LDR_ACTIVE, 0},
{ REG_LDR_IDLE, 0},
{ REG_LDR_REPEAT, 0},
{ REG_BIT_0, 0},
{ REG_REG0, ((3 << 28) | (0x1644 << 12) | 0x13)},
{ REG_STATUS, (1 << 30)},
{ REG_REG1, ((1 << 15) | (13 << 8))},
/*bit[0-3]: RC5; bit[8]: MSB first mode; bit[11]: compare frame method*/
{ REG_REG2, ((1 << 13) | (1 << 11) | (1 << 8) | 0x7)},
/*Half bit for RC5 format: 888.89us*/
{ REG_DURATN2, ((53 << 16) | (38 << 0))},
/*RC5 typically 1777.78us for whole bit*/
{ REG_DURATN3, ((99 << 16) | (81 << 0))},
{ REG_REG3, 0}
};
static xRegProtocolMethod xRC5Decode = {
.ucProtocol = MODE_HARD_RC5,
.RegList = xRC5RegList,
.ucRegNum = ARRAY_SIZE(xRC5RegList),
};
#endif
#ifdef MODE_HARD_RC6
static struct xRegList xRC6RegList[] = {
{REG_LDR_ACTIVE, (210 << 16) | (125 << 0)},
{REG_LDR_IDLE, 50 << 16 | 38 << 0}, /* leader idle 400*/
{REG_LDR_REPEAT, 145 << 16 | 125 << 0}, /* leader repeat*/
/* logic '0' or '00' 1500us*/
{REG_BIT_0, 51 << 16 | 38 << 0 },
{REG_REG0, (7 << 28)|(0xFA0 << 12)|0x13},
/* sys clock boby time.base time = 20 body frame*/
{REG_STATUS, (94 << 20) | (82 << 10)},
/*20bit:9440 32bit:9f40 36bit:a340 37bit:a440*/
{REG_REG1, 0xa440},
/*it may get the wrong customer value and key value from register if
*the value is set to 0x4,so the register value must set to 0x104
*/
{REG_REG2, 0x2909},
{REG_DURATN2, ((28 << 16) | (16 << 0))},
{REG_DURATN3, ((51 << 16) | (38 << 0))},
};
static xRegProtocolMethod xRC6Decode = {
.ucProtocol = MODE_HARD_RC6,
.RegList = xRC6RegList,
.ucRegNum = ARRAY_SIZE(xRC6RegList),
};
#endif
#ifdef MODE_HARD_TOSHIBA
static struct xRegList xTOSHIBARegList[] = {
{ REG_LDR_ACTIVE, (280 << 16) | (180 << 0)},
{ REG_LDR_IDLE, (280 << 16) | (180 << 0)},
{ REG_LDR_REPEAT, (150 << 16) | (60 << 0)},
{ REG_BIT_0, (72 << 16) | (40 << 0)},
{ REG_REG0, (7 << 28) | (0xFA0 << 12) | 0x13},
{ REG_STATUS, (134 << 20) | (90 << 10)},
{ REG_REG1, 0x9f00},
{ REG_REG2, (0x05) | (1 << 24) | (23 << 11)},
{ REG_DURATN2, 0x00},
{ REG_DURATN3, 0x00},
{ REG_REPEAT_DET, (1 << 31) | (0xFA0 << 16) | (10 << 0)},
{ REG_REG3, 0x2AF8},
};
static xRegProtocolMethod xTOSHIBADecode = {
.ucProtocol = MODE_HARD_TOSHIBA,
.RegList = xTOSHIBARegList,
.ucRegNum = ARRAY_SIZE(xTOSHIBARegList),
};
#endif
#ifdef MODE_HARD_RCA
static struct xRegList xRCARegList[] = {
{ REG_LDR_ACTIVE, (250 << 16) | (160 << 0)},
{ REG_LDR_IDLE, 250 << 16 | 160 << 0},
{ REG_LDR_REPEAT, 250 << 16 | 160 << 0},
{ REG_BIT_0, 100 << 16 | 48 << 0},
{ REG_REG0, 7 << 28 | (0xFA0 << 12) | 0x13},
{ REG_STATUS, (150 << 20) | (110 << 10)},
{ REG_REG1, 0x9700},
{ REG_REG2, 0x104 | (1 << 24) | (23 << 11)},
{ REG_DURATN2, 0x00},
{ REG_REPEAT_DET, (1 << 31) | (0xFA0 << 16) | (10 << 0)},
{ REG_REG3, 0x1A00},
{ REG_DURATN3, 0x00}
};
static xRegProtocolMethod xRCADecode = {
.ucProtocol = MODE_HARD_RCA,
.RegList = xRCARegList,
.ucRegNum = ARRAY_SIZE(xRCARegList),
};
#endif
#ifdef MODE_HARD_RCMM
static struct xRegList xRCMMRegList[] = {
{REG_LDR_ACTIVE, (35 << 16) | (17 << 0)},
{REG_LDR_IDLE, (17 << 16) | (8 << 0)},
{REG_LDR_REPEAT, (31 << 16) | (11 << 0)},
{REG_BIT_0, (25 << 16) | (21 << 0)},
{REG_REG0, (7 << 28) | (0x590 << 12) | 0x13},
{REG_STATUS, (36 << 20) | (29 << 10)},
{REG_REG1, 0x9f00},
{REG_REG2, 0x1150a},
{REG_DURATN2, ((43 << 16) | (37 << 0))},
{REG_DURATN3, ((50 << 16) | (44 << 0))},
{REG_REG3, 1200 << 0},
};
static xRegProtocolMethod xRCMMDecode = {
.ucProtocol = MODE_HARD_RCMM,
.RegList = xRCMMRegList,
.ucRegNum = ARRAY_SIZE(xRCMMRegList),
};
#endif
static xRegProtocolMethod xNECLegacyDecode = {
.ucProtocol = MODE_HARD_LEAGCY_NEC,
.RegList = xNECLegacyRegList,
.ucRegNum = ARRAY_SIZE(xNECLegacyRegList),
};
static xRegProtocolMethod xNECDecode = {
.ucProtocol = MODE_HARD_NEC,
.RegList = xNECRegList,
.ucRegNum = ARRAY_SIZE(xNECRegList),
};
static const xRegProtocolMethod *xSupportProtocol[] = {
&xNECDecode,
&xNECLegacyDecode,
#ifdef MODE_HARD_DUOKAN
&xDUOKANDecode,
#endif
#ifdef MODE_HARD_RCA
&xRCADecode,
#endif
#ifdef MODE_HARD_RC5
&xRC5Decode,
#endif
#ifdef MODE_HARD_RC6
&xRC6Decode,
#endif
#ifdef MODE_HARD_TOSHIBA
&xTOSHIBADecode,
#endif
#ifdef MODE_HARD_XMP_1
&xXMP1Decode,
#endif
#ifdef MODE_HARD_RCMM
&xRCMMDecode,
#endif
NULL,
};
static struct xIRDrvData xIRDrvPrvData;
struct xIRDrvData *pGetIRDrvData(void)
{
return &xIRDrvPrvData;
}
const xRegProtocolMethod **pGetSupportProtocol(void)
{
return xSupportProtocol;
}