📄 msir.c
字号:
*pkey = msIR_ReadByte(IR_KEY); //msIR_GetIrKeyData();
XBYTE[IR_FIFO_READ_PULSE] = 0x01;
for(i=0;i<35;i++)
;
*pu8flag = msIR_ReadByte(IR_RPT_FIFOEMPTY) & 0x1;
if (*pu8flag == 0)
{
u8RepeatCount = 0;
return MSRET_OK;
}
else
{
u8RepeatCount++;
if (u8RepeatCount >= IR_FILTER_REPEAT_NUM)
{
return MSRET_OK;
}
}
}
}
return MSRET_ERROR;
#elif (IR_MODE_SEL == IR_TYPE_RAWDATA_MODE)
if(!(msIR_ReadByte(IR_RPT_FIFOEMPTY) & _BIT1)) // check FIFO not empty
{
u8IRRawModeBuf[u8IRRawModeCount] = msIR_ReadByte(IR_KEY);
XBYTE[IR_FIFO_READ_PULSE] = 0x01;
IR_DEBUG(printf("IR D%bu = 0x%02bx\n", u8IRRawModeCount, u8IRRawModeBuf[u8IRRawModeCount]));
u8IRRawModeCount++;
if(u8IRRawModeCount == IR_RAW_DATA_NUM)
{
u8IRRawModeCount = 0;
u8IRRawModeDone = 1;
}
}
if(u8IRRawModeDone)
{
u8IRRawModeDone = 0;
if(u8IRRawModeBuf[0] == IR_HEADER_CODE0)
{
if(u8IRRawModeBuf[1] == IR_HEADER_CODE1)
{
if(u8IRRawModeBuf[2] == ~u8IRRawModeBuf[3])
{
*pkey = u8IRRawModeBuf[2];
*pu8flag = 0;
return MSRET_OK;
}
}
}
}
return MSRET_ERROR;
#elif (IR_MODE_SEL == IR_TYPE_SWDECODE_MODE)
#if 1
if(g_bIrDetect)//hjkoh 070403
{
//g_bIrDetect = FALSE;
// g_bIrHold = TRUE;
IRPRINT(printf("RP:%bx\n", g_bIrRepeat));
IRPRINT(printf("C0:%bx\n", g_ucIrCode[0]));
IRPRINT(printf("C1:%bx\n", g_ucIrCode[1]));
IRPRINT(printf("C2:%bx\n", g_ucIrCode[2]));
IRPRINT(printf("C3:%bx\n", g_ucIrCode[3]));
if(g_bIrRepeat)
{
if(g_ucIrRepeatSkipCnt > 0)
{
g_ucIrRepeatSkipCnt--;
g_bIrRepeat = FALSE;
g_bIrStartReceived = FALSE;
g_ucIrRepeatTimer = IR_SW_REPEAT_TIMEOUT;
IRPRINT(printf("g_ucIrRepeatSkipCnt:%bu\n", g_ucIrRepeatSkipCnt));
return MSRET_ERROR;
}
else
{
printf("RP!\r\n");
*pkey = IR_CODE;
*pu8flag = g_bIrRepeat;
//g_ucIrRepeatSkipCnt = IR_REPEAT_SKIP_COUNT;
}
}
else
{
*pkey = IR_CODE;
*pu8flag = g_bIrRepeat;
g_ucIrRepeatSkipCnt = IR_REPEAT_SKIP_COUNT;
}
g_bIrRepeat = FALSE;
g_bIrStartReceived = FALSE;
g_ucIrRepeatTimer = IR_SW_REPEAT_TIMEOUT;
//g_bIrHold = FALSE;
g_bIrDetect = FALSE;
return MSRET_OK;
}
#else
if (gIRCount > 0x00)
{
if(LOWBYTE(gIRKey) == IR_HEADER_CODE0)
{
if(HIGHBYTE(gIRKey) == IR_HEADER_CODE1)
{
if(LOWBYTE(gIRKey >> 16) == ~(HIGHBYTE(gIRKey >> 16)))
{
*pkey = LOWBYTE(gIRKey >> 16);
*pu8flag = 0;
gIRCount = 0;
gIRKey = 0;
return MSRET_OK;
}
}
}
}
#endif
return MSRET_ERROR;
#endif
}
#if (IR_MODE_SEL == IR_TYPE_SWDECODE_MODE || IR_MODE_SEL == IR_TYPE_RC5_MODE)
#pragma SAVE
#pragma NOAREGS
U32 MDrv_IR_SW_Isr()
{
//add by Jason071031 for RC5
#if (IR_MODE_SEL == IR_TYPE_RC5_MODE)
U32 ret;
BYTE ucLevel;
if(!g_ReadyForRepeat)
return ret;
if(g_ucIRCountSkip && g_ucLongFlag==0)
g_ucIRCountSkip -= 1;
else
{
g_wIRCounter = 0;
g_wIRCounter |= ( U32 ) (( XBYTE[IR_SHOT_CNT_2] & 0x07 ) << 16);
g_wIRCounter |= ( U32 ) ((XBYTE[IR_SHOT_CNT_1]) << 8);
g_wIRCounter |= ( U32 ) (XBYTE[IR_SHOT_CNT_0]);
if ( (msIR_ReadByte(IR_SHOT_CNT_2) & _BIT4) ==_BIT4 )
ucLevel = 0;
else
ucLevel = 1;
if (g_wIRCounter > ONE_BIT_LB && g_wIRCounter < ONE_BIT_UB)
{
if(g_ucLongFlag == 0)
{
if(ucLevel)
{
if(g_ucIRBitsCnt != _BIT0)
g_RC5Data |= g_ucIRBitsCnt;
else
g_RC5Data &= ~g_ucIRBitsCnt;
}
else
{
if(g_ucIRBitsCnt != _BIT0)
g_RC5Data &= ~g_ucIRBitsCnt;
else
g_RC5Data |= g_ucIRBitsCnt;
}
g_ucIRBitsCnt >>= 1; // 1 2 short
}
if(g_ucIRBitsCnt != _BIT0)
g_ucIRCountSkip = 1;
g_ucLongFlag = 0;
}
else if (g_wIRCounter > TWO_BIT_LB && g_wIRCounter < TWO_BIT_UB)
{
//-------------------------------------------------------------------
if(ucLevel)
{
if(g_ucLongFlag)
g_RC5Data &= ~g_ucIRBitsCnt;
else
{
g_RC5Data |= g_ucIRBitsCnt;
g_ucIRBitsCnt >>= 1;
g_RC5Data &= ~g_ucIRBitsCnt;
}
}
else
{
if(g_ucLongFlag)
g_RC5Data|= g_ucIRBitsCnt;
else
{
g_RC5Data&= ~g_ucIRBitsCnt;
g_ucIRBitsCnt >>= 1;
g_RC5Data|= g_ucIRBitsCnt;
}
}
g_ucLongFlag = 1;
g_ucIRBitsCnt>>= 1;
}
RC5CheckStart();
}
if(g_ucIRBitsCnt == 0)
{
g_bIRSWDone = 1;
g_ucIRBitsCnt = _BIT13;
g_ReadyForRepeat = 0;
}
return ret;
#else
#if 1
//if(TRUE == g_bIrHold)
if(TRUE == g_bIrDetect)
{
return;
}
//g_wIrPulseCounter = (U32)((((U32)msIR_ReadByte(IR_SHOT_CNT_2) << 16)&0x70000L)
// + (((U32)msIR_ReadByte(IR_SHOT_CNT_1) << 8)&0xFF00L)
// + ((U32)msIR_ReadByte(IR_SHOT_CNT_0)&0xFF));
//g_wIrPulseCounter = (U32)((((U32)msIR_ReadByte(IR_SHOT_CNT_1) << 8)&0xFF00)
// + ((U32)msIR_ReadByte(IR_SHOT_CNT_0)&0xFF));
g_wIrPulseCounter = 0;
g_wIrPulseCounter |= ( U32 ) (( XBYTE[IR_SHOT_CNT_2] & 0x07 ) << 16);
g_wIrPulseCounter |= ( U32 ) ((XBYTE[IR_SHOT_CNT_1]) << 8);
g_wIrPulseCounter |= ( U32 ) (XBYTE[IR_SHOT_CNT_0]);
if(g_bIrStartReceived == FALSE)
{
if(g_ucIrPulseCntIndex == 0 && g_ucIrByteIndex == 0)
{
if(g_ucIrRepeatTimer > 0)
{
if(g_wIrPulseCounter > 1800L && g_wIrPulseCounter < 2600L)//Repeat Negative Period 2.25ms After Leader signal.
{
IRCHAR('R');
//g_bIrDetect = TRUE;
g_bIrRepeat = TRUE;
g_ucIrPulseCntIndex = 0;
g_ucIrRepeatTimer = IR_SW_REPEAT_TIMEOUT;
g_bIrStartReceived = FALSE;
return;
}
}
//if(g_wIrPulseCounter < HEADER_UPPER_BOND && g_wIrPulseCounter > HEADER_LOWER_BOND)
if(g_wIrPulseCounter > 4000L && g_wIrPulseCounter < 5000L)//Leader code - Low 4500us(4.5ms)
{
IRCHAR('L');
g_bIrStartReceived = TRUE;
g_ucIrRepeatTimer = IR_SW_REPEAT_TIMEOUT;
g_ucIrPulseCntIndex = 0;
g_ucIrByteIndex = 0;
g_ucIrCode[g_ucIrByteIndex] = 0;
return;
}
else
{
IRCHAR('3');
g_ucIrByteIndex = 0;
g_ucIrPulseCntIndex = 0;
g_bIrStartReceived = FALSE;
g_bIrDetect = FALSE;
g_bIrRepeat = FALSE;
return;
}
}
}
else
{
//Decode Bit
if(g_bIrTVLinkLoader == TRUE)
{
//Not Used Yet.
g_ucIrCode[g_ucIrByteIndex] <<= 1;
if(g_wIrPulseCounter > 400L && g_wIrPulseCounter < 1400)
{
g_ucIrCode[g_ucIrByteIndex] &= ~(_BIT0);//Set 0
}
else if(g_wIrPulseCounter > 1399L && g_wIrPulseCounter <= 2750L)
{
g_ucIrCode[g_ucIrByteIndex] |= _BIT0;//set 1
}
else
{
IRCHAR('\r\n');IRCHAR('O');IRCHAR('V');IRCHAR('\r\n');
}
}
else
{
//Because Pulse Counter is Unstable, BIT Decoding Error is occurred.
g_ucIrCode[g_ucIrByteIndex] >>= 1;
if(g_wIrPulseCounter > 400L && g_wIrPulseCounter < 1400)//Negative period 560us(5.6ms)
{
g_ucIrCode[g_ucIrByteIndex] &= ~(_BIT7);//Set 0
}
else if(g_wIrPulseCounter > 1399L && g_wIrPulseCounter <= 2750L)//Negative period 2250us(2.25ms)
{
g_ucIrCode[g_ucIrByteIndex] |= _BIT7;//Set 1
}
else
{
IRCHAR('\r\n');IRCHAR('E');IRCHAR('R');IRCHAR('\r\n');//Pulse Count Error!.
}
}
g_ucIrPulseCntIndex ++;
if(g_ucIrPulseCntIndex >= 8)
{
IRCHAR('4');
g_ucIrPulseCntIndex = 0;
if(g_ucIrByteIndex < 10)
{
g_ucIrByteIndex ++;
g_ucIrCode[g_ucIrByteIndex] = 0;
}
//Normal Code or TV Link Loader Code
if(g_bIrTVLinkLoader == FALSE)
{
IRCHAR('7');
if(g_ucIrByteIndex == 4)
{
IRCHAR('8');
//Check TV Link Loader Header
if(IS_TV_LNK_LOADER_START())
{
g_bIrDetect = TRUE;
g_bIrStartReceived = FALSE;
g_bIrTVLinkLoader = TRUE;
//g_bIrHold = TRUE;
}
else //Custom code Error
{
IRCHAR('H');
g_bIrDetect = FALSE;
g_ucIrPulseCntIndex = 0;
g_bIrStartReceived = FALSE;
g_bIrTVLinkLoader = FALSE;
//g_bIrHold = FALSE;
}
g_ucIrByteIndex = 0;
}
}
else
{
IRCHAR('T');
if(g_ucIrByteIndex == 10)
{
g_bIrDetect = TRUE;
g_ucIrByteIndex = 0;
g_ucIrPulseCntIndex = 0;
g_bIrStartReceived = FALSE;
g_bIrTVLinkLoader = TRUE;
//g_bIrHold = FALSE;
}
}
}
}
#else
gIRCount ++;
if(XBYTE[IR_SHOT_CNT_1] & 0x08)
gIRKey = gIRKey >> 1 | 0x80000000;
else
gIRKey = gIRKey >> 1;
#endif
#endif //add by Jason071031 end of (IR_MODE_SEL == IR_TYPE_RC5_MODE)
}
#pragma RESTORE
#endif
#if (IR_MODE_SEL == IR_TYPE_SWDECODE_MODE)
BOOLEAN MDrv_Power_CheckPowerOnSWIRKey(void)
{
if(g_bIrDetect)
{
if(IR_CODE == IRKEY_POWER)
return MSRET_OK;
#if 0
if(g_ucIrCode[0] == IR_HEADER_CODE0)
{
if(g_ucIrCode[1] == IR_HEADER_CODE1)
{
if(g_ucIrCode[2] == IRKEY_POWER) {
//gIRCount = 0;
g_ucIrCode[2] = 0;
return MSRET_OK;
}
}
}
#endif
g_bIrDetect = FALSE;
}
return MSRET_ERROR;
}
#endif
//add by Jason071031 for RC5
#if (IR_MODE_SEL == IR_TYPE_RC5_MODE)
void RC5Reset(void)
{
g_RC5Data = _BIT0;
g_ucIRBitsCnt = _BIT13;
g_ucLongFlag = 0;
g_ucIRCountSkip = 0;
g_bIRSWDone = 0;
}
void RC5CheckStart(void)
{
if(g_ucIRBitsCnt == _BIT11)
{
if(
((g_RC5Data & (_BIT13|_BIT12))!= 0x2000) &&
((g_RC5Data & (_BIT13|_BIT12))!= 0x3000)
)
{
RC5Reset();
return;
}
}
}
#endif
//end by Jason071031
#undef MS_IR_C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -