⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msir.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 2 页
字号:
            *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 + -