Example #1
0
//------------------------------------------------------------------------------
// Function Name: SiI_CEC_GetCommand
// Function Description: This function gets data from CEC Reception
//
// Accepts: pSiI_CEC
// Returns: none
// Globals: none
//------------------------------------------------------------------------------
uint8_t SiI_CEC_GetCommand( SiI_CEC_t * pSiI_CEC )
{
    uint8_t error = FALSE;
    uint8_t bCount;

    bCount = pSiI_CEC->bCount  & 0x0f; // extract uint8_t counter, ignore frame counter

    if ( !(pSiI_CEC->bCount & BIT_MSG_ERROR) )
        RegisterReadBlock(REG__CEC_RX_CMD_HEADER, &pSiI_CEC->bDestOrRXHeader , bCount + 2);
    else
        error = 1;

    // Clear CLR_RX_FIFO_CUR;
    // Clear current frame from Rx FIFO
    RegisterModify(REG__CEC_RX_CONTROL, BIT_CLR_RX_FIFO_CUR, BIT_CLR_RX_FIFO_CUR );

    // Check if more frame in Rx FIFO, if yes get uint8_t count of next frame.
    pSiI_CEC->bRXNextCount = 0;

    if( pSiI_CEC->bCount & 0xF0 )
    {
        pSiI_CEC->bRXNextCount = RegisterRead(REG__CEC_RX_COUNT);
    }

    return error;
}
Example #2
0
static void print_mpegbuffer( void ){
uint8_t abData[16];

    RegisterReadBlock( REG__MPEG_TYPE, abData, 16 );
    print_tabl ( "Mpeg_buf", abData, 16, 8 );

}
static void InterruptHandler(void)
{
    uint8_t abIntrStatus[8];
    uint8_t bNewInfoFrm	= 0;
    uint8_t bNoInfoFrm		= 0;

    //read all interrupt registers
    RegisterReadBlock(REG__INTR1, &abIntrStatus[0], 4);
    RegisterReadBlock(REG__INTR5, &abIntrStatus[4], 2);

    RegisterReadBlock(REG__INTR7, &abIntrStatus[6], 2);

#if 0
    DEBUG_PRINT(("i: %02X %02X %02X %02X %02X %02X %02X %02X\n",
                (int)abIntrStatus[0],(int)abIntrStatus[1],(int)abIntrStatus[2],(int)abIntrStatus[3],
                (int)abIntrStatus[4],(int)abIntrStatus[5],(int)abIntrStatus[6],(int)abIntrStatus[7]));
#endif
    //clear all pending interrupts
    RegisterWriteBlock(REG__INTR1, &abIntrStatus[0], 4);
    RegisterWriteBlock(REG__INTR5, &abIntrStatus[4], 2);
    RegisterWriteBlock(REG__INTR7, &abIntrStatus[6], 2);

#if (CONF__ODCK_LIMITED==ENABLE)
    if (abIntrStatus[6] & BIT__PCLK_STOP)   //ODCK stopped
    {
        DEBUG_PRINT(("ODCK stopped\n"));
        ProcessOdckStop();
    }
#endif //#if (CONF__ODCK_LIMITED==ENABLED)

    // process pending interrupts
    if (abIntrStatus[1] & BIT__SCDT_CHG)    //if SCDT change
        ProcessScdtModeChange();

    if (abIntrStatus[4] & BIT__AACDONE)    //if soft mute done
    {
        TurnAudioMute(ON);
        CurrentStatus.AudioState = STATE_AUDIO__REQUEST_AUDIO;
    }
#if (CONF__VSYNC_OVERFLOW == ENABLE)
    if (abIntrStatus[4] & BIT__HRCHG )       //if H res change
#else
    if (abIntrStatus[4] & (BIT__HRCHG|BIT__VRCHG))       //if H/V res change
#endif
    {
#if (PEBBLES_ES1_FF_WORKAROUND == ENABLE)
        if (!ProcessVhResolutionChange())
#endif
        ConfigureDeepColor();
    }

    if (abIntrStatus[5] & BIT__NEW_ACP_PKT)
       AcpPacketHandler(ON);

    if (abIntrStatus[6] & BIT__VIDEO_READY) //video ready for unmute
    {
        DEBUG_PRINT(("Video rdy\n"));
        TurnVideoMute(OFF);
    }

    if (abIntrStatus[7] & BIT__NO_ACP_INF)  // no ACP pkt
       AcpPacketHandler(OFF);

#if (CONF__SUPPORT_3D == ENABLE)
    /*****  Processing info frame interrupts    ***********************/
    bNewInfoFrm = abIntrStatus[INTR3_NEW_INFOFR] & INTR3_NEW_INFOFR_SEL;
    bNoInfoFrm = abIntrStatus[INTR8_NEW_GMT_NO_INFOFR] & INTR8_NO_INFOFR_SEL;
    if( abIntrStatus[INTR4_NO_AVI] & INTR4_NO_AVI_SEL ){
        bNoInfoFrm |= BIT__VIRT_NO_AVI_INF;
    }
    if ( abIntrStatus[INTR8_NEW_GMT_NO_INFOFR] & BIT__NEW_GDB_INF ){
        bNewInfoFrm |= BIT__VIRT_NEW_GDB_INF;
    }
    if ( abIntrStatus[INTR5_NEW_ACP] & BIT__NEW_ACP_PKT ){
        bNewInfoFrm |= BIT__VIRT_NEW_ACP_INF;
    }
    /*  Check if any of info frame interrupts has occured   */
    if( bNewInfoFrm || bNoInfoFrm ){
        InterInfoFrmProc ( bNewInfoFrm, bNoInfoFrm );
    }
#endif //#if (CONF__SUPPORT_3D == ENABLE)

    /*****  End Processing info frame interrupts    ***********************/
}
Example #4
0
//------------------------------------------------------------------------------
// Function Name: SiI_CEC_IntProcessing
// Function Description: This function is called on interrupt events
//                       it makes interrut service
// Accepts: SiI_CEC_Int_t * pInt
// Returns: none
// Globals: none
//------------------------------------------------------------------------------
uint8_t CEC_IntProcessing ( SiI_CEC_Int_t * pInt )
{
    uint8_t error = FALSE;
    uint8_t cec_int_status_reg[2];

    // Get Interrupts
    pInt->bTXState   = 0;
    pInt->bCECErrors = 0;
    pInt->bRXState   = 0;

    RegisterReadBlock(REG__CEC_INT_STATUS_0,cec_int_status_reg,2);


    {
        // Poll Interrupt
        if( (cec_int_status_reg[0] & 0x7F) || cec_int_status_reg[1] )
        {
           DEBUG_PRINT(("\nA6A7Reg: %02X %02X", (int) cec_int_status_reg[0], (int) cec_int_status_reg[1]));
            // Clear interrupts
            if ( cec_int_status_reg[1] & BIT_FRAME_RETRANSM_OV )
            {
               DEBUG_PRINT(("\n!CEC_A7_TX_RETRY_EXCEEDED![%02X][%02X]",(int) cec_int_status_reg[0], (int) cec_int_status_reg[1]));
                // flash TX otherwise after writing clear interrupt
                // BIT_FRAME_RETRANSM_OV the TX command will be re-send
               RegisterModify(REG__CEC_DEBUG_3,BIT_FLUSH_TX_FIFO, BIT_FLUSH_TX_FIFO);
            }
            //
            // Clear set bits that are set
            //
            RegisterWriteBlock(REG__CEC_INT_STATUS_0,cec_int_status_reg,2);

            DEBUG_PRINT(("\nA6A7Reg: %02X %02X", (int) cec_int_status_reg[0], (int) cec_int_status_reg[1]));

            // RX Processing
            if ( cec_int_status_reg[0] & BIT_RX_MSG_RECEIVED )
            {
                // Save number of frames in Rx Buffer
                pInt->bRXState = RegisterRead(REG__CEC_RX_COUNT);
            }

            // RX Errors processing
            if ( cec_int_status_reg[1] & BIT_SHORT_PULSE_DET )
            {
                pInt->bCECErrors |= eSiI_CEC_ShortPulse;
            }

            if ( cec_int_status_reg[1] & BIT_START_IRREGULAR )
            {
                pInt->bCECErrors |= eSiI_CEC_StartIrregular;
            }

            if ( cec_int_status_reg[1] & BIT_RX_FIFO_OVERRUN ) // fixed per Uematsu san
            {
                pInt->bCECErrors |= eSiI_CEC_RXOverFlow;
            }

            // TX Processing
            if ( cec_int_status_reg[0] & BIT_TX_FIFO_EMPTY )     //0x04
            {
                pInt->bTXState = eSiI_TXWaitCmd;
            }
            if ( cec_int_status_reg[0] & BIT_TX_MESSAGE_SENT )   //0x20
            {
                pInt->bTXState = eSiI_TXSendAcked;
            }
            if ( cec_int_status_reg[1] & BIT_FRAME_RETRANSM_OV )   //0x02
            {

                pInt->bTXState = eSiI_TXFailedToSend;
            }
        }
    }
    return error;
}