// returns true if video format is detected, false otherwise bool_t VMD_DetectVideoResolution(void) { bool_t format_detected = true; sync_info_type sync_info; uint8_t vid_idx; if (vmd_data.bReadyforVMD) { vid_idx = detect_video_resolution(&sync_info); vmd_data.video_index = vid_idx; #if defined(__KERNEL__) gDriverContext.input_video_mode = vid_idx; VMD_VideoStableNotify(vid_idx); #endif if(SI_VIDEO_MODE_NON_STD == vid_idx) { format_detected = false; } else if(SI_VIDEO_MODE_PC_OTHER == vid_idx) { DEBUG_PRINT(MSG_STAT, "RX: PC resolution\n"); } else if(vid_idx & SI_VIDEO_MODE_3D_RESOLUTION_MASK) { print_3D_resolution(); } else if(vid_idx >= NMB_OF_CEA861_VIDEO_MODES) { print_hdmi_vic_resolution(); } else { // CEA-861D resolutions print_861_resolution(); } if(format_detected) { vmd_data.pix_freq = sync_info.PixelFreq; save_sync_info(&sync_info); } else { VMD_ResetTimingData(); } } else { // Video is not stable, no need to dectect resolution return false; } return format_detected; }
void SiiRxInterruptHandler(void) { uint8_t interrupts[NMB_OF_RX_INTERRUPTS]; //DEBUG_PRINT(MSG_STAT, ("RX Interrupt detected!\n")); // get interrupt requests SiiRegReadBlock(RX_A__INTR1, &interrupts[INT1], 4); SiiRegReadBlock(RX_A__INTR5, &interrupts[INT5], 2); SiiRegReadBlock(RX_A__INTR7, &interrupts[INT7], 2); // do not touch interrupts which are masked out interrupts[INT1] &= rx_isr.shadow_interrupt_mask[INT1]; interrupts[INT2] &= rx_isr.shadow_interrupt_mask[INT2]; interrupts[INT3] &= rx_isr.shadow_interrupt_mask[INT3]; interrupts[INT4] &= rx_isr.shadow_interrupt_mask[INT4]; interrupts[INT5] &= rx_isr.shadow_interrupt_mask[INT5]; interrupts[INT6] &= rx_isr.shadow_interrupt_mask[INT6]; interrupts[INT7] &= rx_isr.shadow_interrupt_mask[INT7]; interrupts[INT8] &= rx_isr.shadow_interrupt_mask[INT8]; // Cable plug-in / plug-out interrupts are handled elsewhere //interrupts[INT6] &= ~RX_M__INTR6__CABLE_UNPLUG; //interrupts[INT8] &= ~RX_M__INTR8__CABLE_IN; // clear interrupt requests SiiRegWriteBlock(RX_A__INTR1, &interrupts[INT1], 4); SiiRegWriteBlock(RX_A__INTR5, &interrupts[INT5], 2); SiiRegWriteBlock(RX_A__INTR7, &interrupts[INT7], 2); if(interrupts[INT1] & RX_M__INTR1__AUTH_DONE) { DEBUG_PRINT(MSG_STAT, ("RX: Authentication done!\n")); switch_hdcp_failure_check_with_v_sync_rate(OFF); } if(interrupts[INT2] & RX_M__INTR2__VID_CLK_CHANGED) { rx_isr.bVidStableChgEvent = true; DEBUG_PRINT(MSG_STAT, ("RX: video clock change\n")); } if(interrupts[INT2] & RX_M__INTR2__SCDT) { switch_hdcp_failure_check_with_v_sync_rate(OFF); SiiDrvRxMuteVideo(ON); rx_isr.bVidStableChgEvent = true; if(SiiDrvRxIsSyncDetected()) { // SCDT detection for vdin utility. printk("sii9293 irq got SCDT!\n"); rx_isr.bScdtState = true; #if defined(__KERNEL__) SiiConnectionStateNotify(true); #endif } else { // SCDT detection for vdin utility. printk("sii9293 irq lost SCDT!\n"); sii_signal_notify(0); rx_isr.bScdtState = false; SiiDrvSoftwareReset(RX_M__SRST__SRST); VMD_ResetTimingData(); DEBUG_PRINT(MSG_STAT, ("RX: IDLE!\n")); } } if(interrupts[INT2] & RX_M__INTR2__HDMI_MODE) { DEBUG_PRINT(MSG_STAT, ("RX: HDMI mode change!\n")); RxIsr_HdmiDviTransition(); } if(interrupts[INT2] & RX_M__INTR2__VSYNC) { hdcp_error_handler(true); } if(interrupts[INT4] & RX_M__INTR4__HDCP) { hdcp_error_handler(false); } if((interrupts[INT5] & RX_M__INTR5__AUDIO_FS_CHANGED) || (interrupts[INT6] & RX_M__INTR6__CHST_READY)) { // Note: RX_M__INTR6__CHST_READY interrupt may be disabled //DEBUG_PRINT(MSG_STAT, ("RX: New Audio Fs\n")); RxAudio_OnChannelStatusChange(); } if(interrupts[INT4] & RX_M__INTR4__NO_AVI) { RxInfo_NoAviHandler(); rx_isr.bVidStableChgEvent = true; } if(interrupts[INT3] & RX_M__INTR3__NEW_AVI_PACKET) { RxInfo_InterruptHandler(INFO_AVI); rx_isr.bVidStableChgEvent = true; } if(interrupts[INT7] & RX_M__INTR7__NO_VSI_PACKET) { // Clear also vsif_received flag (indicating any VSIF packet detection). // If there is any other VSIF packet, the flag will be set again shortly. RxInfo_NoVsiHandler(); } if(interrupts[INT7] & RX_M__INTR7__NEW_VSI_PACKET) { RxInfo_InterruptHandler(INFO_VSI); } if(interrupts[INT3] & RX_M__INTR3__NEW_AUD_PACKET) { RxInfo_InterruptHandler(INFO_AUD); } if(interrupts[INT6] & RX_M__INTR6__NEW_ACP_PACKET) { RxInfo_InterruptHandler(INFO_AUD); } if (interrupts[INT6] & RX_M__INTR6__CABLE_UNPLUG) { if (SiiRegRead(RX_A__INTR6) & RX_M__INTR6__CABLE_UNPLUG) { rx_isr.bCableChgEvent = true; rx_isr.bCableState = false; rx_isr.shadow_interrupt_mask[INT6] &= ~RX_M__INTR6__CABLE_UNPLUG; // Disable 5v plug-out interrup rx_isr.shadow_interrupt_mask[INT8] |= RX_M__INTR8__CABLE_IN; // Enable 5v plug-in interrupt SiiRegWrite(RX_A__INTR6_MASK, rx_isr.shadow_interrupt_mask[INT6]); SiiRegWrite(RX_A__INTR8_MASK, rx_isr.shadow_interrupt_mask[INT8]); sii9293_cable_status_notify(0); } } if (interrupts[INT8] & RX_M__INTR8__CABLE_IN) { if (SiiRegRead(RX_A__INTR8) & RX_M__INTR8__CABLE_IN) { rx_isr.bCableChgEvent = true; rx_isr.bCableState = true; rx_isr.shadow_interrupt_mask[INT6] |= RX_M__INTR6__CABLE_UNPLUG; // Enable 5v plug-out interrup rx_isr.shadow_interrupt_mask[INT8] &= ~RX_M__INTR8__CABLE_IN; // Disable 5v plug-in interrupt SiiRegWrite(RX_A__INTR6_MASK, rx_isr.shadow_interrupt_mask[INT6]); SiiRegWrite(RX_A__INTR8_MASK, rx_isr.shadow_interrupt_mask[INT8]); sii9293_cable_status_notify(1); } } }