//------------------------------------------------------------------------------ // Function Name: SiI_918x_Start // Function Description: Intilize Stream Switch Device // CEC Software Connection #1 //------------------------------------------------------------------------------ //void SiI_918x_Start( void ) void CEC_Init( void ) { // uint8_t cec_phyAddr[2]; #if(CONF__CEC_ENABLE == ENABLE) DEBUG_PRINT(("\nStream switch start\n")); //CEC workaround for ES0 GPIO_ClearCecD(); RegisterModify(REG__CEC_CONFIG_CPI,BIT__CEC_PASS_THROUGH,CLEAR); if((RegisterRead(DEV_REV_RX)& 0x0F)==VAL__REV_1_2) //if rev1.2 CEC by default reset RegisterModify(REG__C0_SRST2, BIT__CEC_SRST, SET); //0 is reset, 1 is normal else RegisterBitToggle(REG__C0_SRST2,BIT__CEC_SRST); RegisterWrite(REG__SLAVE_ADDR_EDID,CONF__I2C_SLAVE_PAGE_9); RegisterWrite(REG__SLAVE_ADDR_CEC,CONF__I2C_SLAVE_PAGE_8); // Set CEC device type = TV and logical address to capture. InitiatorAddress = CEC_LOGADDR_UNREGORBC_MSG ; if( CEC_CAPTURE_ID_Set( InitiatorAddress ) ) { DEBUG_PRINT(("\n Cannot init CEC")); } // // 4. Initialize Event Descriptor // CEC_event_descriptor_clear(); // Enumirate as an TV bCECTask = SiI_CEC_Enumiration; bEnumType = SiI_EnumTV; #endif // #if(CONF__CEC_ENABLE == ENABLE) //==================== // 5. Program EDID and set port specific address space. // Program (a) EDID and (b) Physical address //==================== ProgramEDID(); }
static void ConfigureDeepColor(void) { uint8_t abDcCtlVal1x[] = { VAL__DC_CTL_8BPP_1X, VAL__DC_CTL_10BPP_1X, VAL__DC_CTL_12BPP_1X, 0 }; uint8_t abDcCtlVal2x[] = { VAL__DC_CTL_8BPP_2X, VAL__DC_CTL_10BPP_2X, VAL__DC_CTL_12BPP_2X, 0 }; uint8_t bColorDepth; uint8_t bDcCtlValue; uint8_t vStatus; bColorDepth = RegisterRead(REG__DC_STAT) & MSK__PIXEL_DEPTH; if (bColorDepth != CurrentStatus.ColorDepth) { if(CurrentStatus.VideoState == STATE_VIDEO__ON) vStatus = ON; CurrentStatus.ColorDepth = bColorDepth; if(vStatus == ON) TurnVideoMute(ON); //value is 2x if muxYC output is enabled if (RegisterRead(REG__VID_AOF) & BIT__MUXYC) { bDcCtlValue = abDcCtlVal2x[ bColorDepth ]; } else { bDcCtlValue = abDcCtlVal1x[ bColorDepth ]; } RegisterModify(REG__TMDS_CCTRL2, MSK__DC_CTL, bDcCtlValue); RegisterBitToggle(REG__SRST2, BIT__DCFIFO_RST); //reset the deep color FIFO DEBUG_PRINT(("DC stat=%02X ctl=%02X\n", (int)bColorDepth, (int)bDcCtlValue)); if(vStatus == ON) TurnVideoMute(OFF); } }
//------------------------------------------------------------------------------ // Function: AudioUnmuteHandler // Description: State machine for performing audio unmute in firmware. //------------------------------------------------------------------------------ void AudioUnmuteHandler(void) { uint8_t bIntrStatus2; uint8_t bIntrStatus4; RegisterModify(REG__ECC_CTRL, BIT__CAPCNT, SET); //clear the error cont switch (CurrentStatus.AudioState) { case STATE_AUDIO__REQUEST_AUDIO: { bIntrStatus2 = RegisterRead(REG__INTR2); bIntrStatus4 = RegisterRead(REG__INTR4); if ((bIntrStatus2 & BIT__GOTAUD) && (bIntrStatus2 & BIT__GOTCTS)) //audio stable { if(bIntrStatus4 & MSK__CTS_ERROR) // reset ACR RegisterBitToggle(REG__SRST, BIT__ACRRST); else { // init ACR RegisterWrite(REG__ACR_CTRL1, BIT__ACR_INIT); DEBUG_PRINT(("aud rdy\n")); SetUpAudioOutput(); CurrentStatus.AudioState = STATE_AUDIO__AUDIO_READY; } } // clear all the audio interrupts RegisterWrite(REG__INTR2, (BIT__GOTAUD | BIT__GOTCTS)); RegisterWrite(REG__INTR4, (MSK__CTS_ERROR | MSK__FIFO_ERROR)); TIMER_Set(TIMER__AUDIO, 20); // delay 20ms before request audio again } break; case STATE_AUDIO__AUDIO_READY: { bIntrStatus4 = RegisterRead(REG__INTR4); if(bIntrStatus4 & MSK__CTS_ERROR) CurrentStatus.AudioState = STATE_AUDIO__REQUEST_AUDIO; else if (!(bIntrStatus4 & MSK__FIFO_ERROR)) // no audio FIFO error { if ((CurrentStatus.VideoState == STATE_VIDEO__ON) ||(CurrentStatus.VideoState == STATE_VIDEO__CHECKED)) //||ResetVideoControl())//video unmute status ok { if(CurrentStatus.AudioMode==AUDIO_MODE__DSD) HAL_SetAudioDACMode(AUDIO_MODE__DSD); else HAL_SetAudioDACMode(AUDIO_MODE__PCM); RegisterWrite(REG__INTR5, MSK__AUDIO_INTR);// clear all audio interrupts CurrentStatus.AudioState = STATE_AUDIO__ON; TurnAudioMute(OFF); } } else { // reset audio FIFO RegisterBitToggle(REG__SRST, BIT__FIFORST); // clear audio FIFO interrupts RegisterWrite(REG__INTR4, MSK__FIFO_ERROR); TIMER_Set(TIMER__AUDIO, 20); // delay 20ms before ready audio again } } } }