void TimerImpl::OnTimer() { linear::unique_lock<linear::mutex> lock(mutex_); if (state_ == STOP) { return; } state_ = STOP; tv_timer_stop(tv_timer_); tv_close(reinterpret_cast<tv_handle_t*>(tv_timer_), EventLoop::OnClose); tv_timer_ = NULL; lock.unlock(); if (callback_ != NULL) { (*callback_)(args_); } }
void TimerImpl::Stop() { linear::lock_guard<linear::mutex> lock(mutex_); if (state_ == STOP) { return; } EventLoop::TimerEventData* data = static_cast<EventLoop::TimerEventData*>(tv_timer_->data); data->Lock(); data->Unregister(); data->Unlock(); state_ = STOP; tv_timer_stop(tv_timer_); tv_close(reinterpret_cast<tv_handle_t*>(tv_timer_), EventLoop::OnClose); tv_timer_ = NULL; }
/* Display Device API of open TV Encoder Display Device API of open TV Encoder @param[in] pDevIF Please refer to dispdevctrl.h for details. @return - @b E_PAR: Error pDevIF content. - @b E_OK: TV Encoder Open done and success. */ static ER dispdev_openTV(void) { UINT32 uiBurstLevel=0; UINT32 uiBlandLevel=0; UINT32 uiYScale=0,uiCbScale=0,uiCrScale=0; //UINT32 uiClockDiv; //UINT32 uiSrcClkFreq; DISPDEV_IOCTRL_PARAM DevIOCtrl; DISPDEV_IOCTRL pDispDevControl = pTvIoControl; if(pDispDevControl == NULL) return E_PAR; disptv_debug(("DEVTV: open\r\n")); if (bTvDispDevFreqChange == FALSE) { if (dispdev_chgTvClkFreq() == TRUE) bTvDispDevFreqChange = TRUE; } if(tv_isOpened()) tv_close(); tv_open(); pDispDevControl(DISPDEV_IOCTRL_GET_ENABLE, &DevIOCtrl); if(DevIOCtrl.SEL.GET_ENABLE.bEn == TRUE) { DevIOCtrl.SEL.SET_ENABLE.bEn = FALSE; pDispDevControl(DISPDEV_IOCTRL_SET_ENABLE, &DevIOCtrl); pDispDevControl(DISPDEV_IOCTRL_WAIT_FRAMEEND, NULL); } #if 0 pDispDevControl(DISPDEV_IOCTRL_GET_SRCCLK, &DevIOCtrl); if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_PLL1) { pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_480); // pll_setConfig(PLL_CONFIG_ID_IDE_CLK_SRC, 480); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_1)/1000000; //uiSrcClkFreq = pll_getPLL1Freq()/1000000; //pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_PLL1); if (pll_getPLLEn(PLL_ID_1)!= TRUE) { pll_setPLLEn(PLL_ID_1, TRUE); } } else if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_PLL2) { pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_PLL2); // pll_setConfig(PLL_CONFIG_ID_IDE_CLK_SRC, PLL_SRC_ID_PLL2); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_2)/1000000; //uiSrcClkFreq = pll_getPLL2Freq()/1000000; //pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_PLL2); if (pll_getPLLEn(PLL_ID_2)!= TRUE) { pll_setPLLEn(PLL_ID_2, TRUE); } } else if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_PLL4) { pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_PLL4); // pll_setConfig(PLL_CONFIG_ID_IDE_CLK_SRC, PLL_SRC_ID_PLL4); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_4)/1000000; if (pll_getPLLEn(PLL_ID_4)!= TRUE) { pll_setPLLEn(PLL_ID_4, TRUE); } } else if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_PLL7) { pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_PLL7); // pll_setConfig(PLL_CONFIG_ID_IDE_CLK_SRC, PLL_SRC_ID_PLL7); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_7)/1000000; if (pll_getPLLEn(PLL_ID_7)!= TRUE) { pll_setPLLEn(PLL_ID_7, TRUE); } } else if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_IDE2_PLL1) { pll_setClockRate(PLL_CLKSEL_IDE2_CLKSRC, PLL_CLKSEL_IDE2_CLKSRC_480); // pll_setConfig(PLL_CONFIG_ID_IDE2_CLK_SRC, 480); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_1)/1000000; //uiSrcClkFreq = pll_getPLL1Freq()/1000000; //pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_PLL1); if (pll_getPLLEn(PLL_ID_1)!= TRUE) { pll_setPLLEn(PLL_ID_1, TRUE); } } else if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_IDE2_PLL2) { pll_setClockRate(PLL_CLKSEL_IDE2_CLKSRC, PLL_CLKSEL_IDE2_CLKSRC_PLL2); // pll_setConfig(PLL_CONFIG_ID_IDE2_CLK_SRC, PLL_SRC_ID_PLL2); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_2)/1000000; //uiSrcClkFreq = pll_getPLL2Freq()/1000000; //pll_setClockRate(PLL_CLKSEL_IDE_CLKSRC, PLL_CLKSEL_IDE_CLKSRC_PLL2); if (pll_getPLLEn(PLL_ID_2)!= TRUE) { pll_setPLLEn(PLL_ID_2, TRUE); } } else if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_IDE2_PLL4) { pll_setClockRate(PLL_CLKSEL_IDE2_CLKSRC, PLL_CLKSEL_IDE2_CLKSRC_PLL4); // pll_setConfig(PLL_CONFIG_ID_IDE2_CLK_SRC, PLL_SRC_ID_PLL4); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_4)/1000000; if (pll_getPLLEn(PLL_ID_4)!= TRUE) { pll_setPLLEn(PLL_ID_4, TRUE); } } else if (DevIOCtrl.SEL.GET_SRCCLK.SrcClk == DISPCTRL_SRCCLK_IDE2_PLL7) { pll_setClockRate(PLL_CLKSEL_IDE2_CLKSRC, PLL_CLKSEL_IDE2_CLKSRC_PLL7); // pll_setConfig(PLL_CONFIG_ID_IDE2_CLK_SRC, PLL_SRC_ID_PLL7); uiSrcClkFreq = pll_getPLLFreq(PLL_ID_7)/1000000; if (pll_getPLLEn(PLL_ID_7)!= TRUE) { pll_setPLLEn(PLL_ID_7, TRUE); } } else { return E_SYS; } //set to 27MHz uiClockDiv = (float)uiSrcClkFreq/(float)27/(float)2; if (uiClockDiv > 0) { uiClockDiv--; } switch (DevIOCtrl.SEL.GET_SRCCLK.SrcClk) { case DISPCTRL_SRCCLK_PLL1: case DISPCTRL_SRCCLK_PLL2: case DISPCTRL_SRCCLK_PLL4: case DISPCTRL_SRCCLK_PLL7: pll_setClockRate(PLL_CLKSEL_IDE_CLKDIV, PLL_IDE_CLKDIV(uiClockDiv)); pll_enableClock(IDE1_CLK); break; case DISPCTRL_SRCCLK_IDE2_PLL1: case DISPCTRL_SRCCLK_IDE2_PLL2: case DISPCTRL_SRCCLK_IDE2_PLL4: case DISPCTRL_SRCCLK_IDE2_PLL7: pll_setClockRate(PLL_CLKSEL_IDE2_CLKDIV, PLL_IDE2_CLKDIV(uiClockDiv)); pll_enableClock(IDE2_CLK); break; default: break; } #else // set clock rate DevIOCtrl.SEL.SET_CLK_FREQ.uiFreq = 27 * 1000000; DevIOCtrl.SEL.SET_CLK_FREQ.bYCC8bit= FALSE; pDispDevControl(DISPDEV_IOCTRL_SET_CLK_FREQ, &DevIOCtrl); // enable clock DevIOCtrl.SEL.SET_CLK_EN.bClkEn = TRUE; pDispDevControl(DISPDEV_IOCTRL_SET_CLK_EN, &DevIOCtrl); #endif pDispDevControl(DISPDEV_IOCTRL_GET_SRCCLK, &DevIOCtrl); if ((DevIOCtrl.SEL.GET_SRCCLK.SrcClk < DISPCTRL_SRCCLK_IDE2_PLL1)) { if ((pinmux_getDispMode(PINMUX_FUNC_ID_TV)&PINMUX_TV_HDMI_CFG_MASK) == PINMUX_TV_HDMI_CFG_GPIO) pinmux_setPinmux(PINMUX_FUNC_ID_LCD, PINMUX_LCD_SEL_GPIO); } else { if ((pinmux_getDispMode(PINMUX_FUNC_ID_TV)&PINMUX_TV_HDMI_CFG_MASK) == PINMUX_TV_HDMI_CFG_GPIO) pinmux_setPinmux(PINMUX_FUNC_ID_LCD2, PINMUX_LCD_SEL_GPIO); } DevIOCtrl.SEL.SET_ICST_EN.bEn = FALSE; DevIOCtrl.SEL.SET_ICST_EN.Select = CST_RGB2YCBCR; pDispDevControl(DISPDEV_IOCTRL_SET_ICST_EN, &DevIOCtrl); DevIOCtrl.SEL.SET_DITHER_EN.bEn = FALSE; pDispDevControl(DISPDEV_IOCTRL_SET_DITHER_EN, &DevIOCtrl); DevIOCtrl.SEL.SET_DEVICE.DispDevType = DISPDEV_TYPE_EMBD_TV; pDispDevControl(DISPDEV_IOCTRL_SET_DEVICE, &DevIOCtrl); #if 0 // These parameters would not influence TV out ide_setPdir(IDE_PDIR_RGB); ide_setOdd(IDE_LCD_R); ide_setEven(IDE_LCD_G); ide_setHsInv(FALSE); ide_setVsInv(FALSE); ide_setHvldInv(FALSE); ide_setVvldInv(FALSE); ide_setClkInv(FALSE); ide_setFldInv(FALSE); #endif pDispDevControl(DISPDEV_IOCTRL_GET_ACT_DEVICE, &DevIOCtrl); if (DevIOCtrl.SEL.GET_ACT_DEVICE.DevID == DISPDEV_ID_TVNTSC) { //NTSC ide_setTvMode(IDE_TV_NTSC_M); ide_setTvNtscSetupLevel(0x27); //ide_setHorTiming(0x7F, 0x6B3, 0x144, 0x69D); DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHsync = 0x7F; DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHtotal = 0x6B3; DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHvldStart = 0x144; DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHvldEnd = 0x69D; pDispDevControl(DISPDEV_IOCTRL_SET_WINDOW_H_TIMING, &DevIOCtrl); //ide_set_ver_timing(0x05, 0x20C, 0x32, 0x205, 0x33, 0x206); DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVsync = 0x05; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVtotal = 0x20C; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldOddStart = 0x32; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldOddEnd = 0x205; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldEvenStart= 0x33; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldEvenEnd = 0x206; pDispDevControl(DISPDEV_IOCTRL_SET_WINDOW_V_TIMING, &DevIOCtrl); pDispDevControl(DISPDEV_IOCTRL_GET_TVADJUST, &DevIOCtrl); if( DevIOCtrl.SEL.GET_TVADJUST.TvAdjust == DISPDEV_TVADJUST_3_6_K) { uiBurstLevel = TV_NTSC_BURST_LEVEL_3_6; uiBlandLevel = TV_NTSC_BLAND_LEVEL_3_6; uiYScale = TV_NTSC_Y_SCALE_3_6; uiCbScale = TV_NTSC_CB_SCALE_3_6; uiCrScale = TV_NTSC_CR_SCALE_3_6; } else if ( DevIOCtrl.SEL.GET_TVADJUST.TvAdjust == DISPDEV_TVADJUST_3_0_K) { uiBurstLevel = TV_NTSC_BURST_LEVEL_3_0; uiBlandLevel = TV_NTSC_BLAND_LEVEL_3_0; uiYScale = TV_NTSC_Y_SCALE_3_0; uiCbScale = TV_NTSC_CB_SCALE_3_0; uiCrScale = TV_NTSC_CR_SCALE_3_0; } else { uiBurstLevel = TV_NTSC_BURST_LEVEL_3_3; uiBlandLevel = TV_NTSC_BLAND_LEVEL_3_3; uiYScale = TV_NTSC_Y_SCALE_3_3; uiCbScale = TV_NTSC_CB_SCALE_3_3; uiCrScale = TV_NTSC_CR_SCALE_3_3; } pDispDevControl(DISPDEV_IOCTRL_GET_TVPAR, &DevIOCtrl); if ( DevIOCtrl.SEL.GET_TVPAR.bEnUser == TRUE) { uiBurstLevel = DevIOCtrl.SEL.GET_TVPAR.uiNTSC_BRL; uiBlandLevel = DevIOCtrl.SEL.GET_TVPAR.uiNTSC_BLL; uiYScale = DevIOCtrl.SEL.GET_TVPAR.uiNTSC_YScaling; uiCbScale = DevIOCtrl.SEL.GET_TVPAR.uiNTSC_CbScaling; uiCrScale = DevIOCtrl.SEL.GET_TVPAR.uiNTSC_CrScaling; ide_setTvNtscSetupLevel(DevIOCtrl.SEL.GET_TVPAR.uiNTSC_Setup); } } else { //PAL ide_setTvMode(IDE_TV_PAL_BDGHI); ide_setTvNtscSetupLevel(0x00); DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHsync = 0x01; DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHtotal = 0x6BF; DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHvldStart = 0x15C; DevIOCtrl.SEL.SET_WINDOW_H_TIMING.uiHvldEnd = 0x69B; pDispDevControl(DISPDEV_IOCTRL_SET_WINDOW_H_TIMING, &DevIOCtrl); DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVsync = 0x04; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVtotal = 0x270; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldOddStart = 0x040; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldOddEnd = 0x267; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldEvenStart= 0x041; DevIOCtrl.SEL.SET_WINDOW_V_TIMING.uiVvldEvenEnd = 0x268; pDispDevControl(DISPDEV_IOCTRL_SET_WINDOW_V_TIMING, &DevIOCtrl); pDispDevControl(DISPDEV_IOCTRL_GET_TVADJUST, &DevIOCtrl); if( DevIOCtrl.SEL.GET_TVADJUST.TvAdjust == DISPDEV_TVADJUST_3_6_K) { uiBurstLevel = TV_PAL_BURST_LEVEL_3_6; uiBlandLevel = TV_PAL_BLAND_LEVEL_3_6; uiYScale = TV_PAL_Y_SCALE_3_6; uiCbScale = TV_PAL_CB_SCALE_3_6; uiCrScale = TV_PAL_CR_SCALE_3_6; } else if ( DevIOCtrl.SEL.GET_TVADJUST.TvAdjust == DISPDEV_TVADJUST_3_0_K) { uiBurstLevel = TV_PAL_BURST_LEVEL_3_0; uiBlandLevel = TV_PAL_BLAND_LEVEL_3_0; uiYScale = TV_PAL_Y_SCALE_3_0; uiCbScale = TV_PAL_CB_SCALE_3_0; uiCrScale = TV_PAL_CR_SCALE_3_0; } else { uiBurstLevel = TV_PAL_BURST_LEVEL_3_3; uiBlandLevel = TV_PAL_BLAND_LEVEL_3_3; uiYScale = TV_PAL_Y_SCALE_3_3; uiCbScale = TV_PAL_CB_SCALE_3_3; uiCrScale = TV_PAL_CR_SCALE_3_3; } pDispDevControl(DISPDEV_IOCTRL_GET_TVPAR, &DevIOCtrl); if ( DevIOCtrl.SEL.GET_TVPAR.bEnUser == TRUE) { uiBurstLevel = DevIOCtrl.SEL.GET_TVPAR.uiPAL_BRL; uiBlandLevel = DevIOCtrl.SEL.GET_TVPAR.uiPAL_BLL; uiYScale = DevIOCtrl.SEL.GET_TVPAR.uiPAL_YScaling; uiCbScale = DevIOCtrl.SEL.GET_TVPAR.uiPAL_CbScaling; uiCrScale = DevIOCtrl.SEL.GET_TVPAR.uiPAL_CrScaling; } } DevIOCtrl.SEL.SET_WINDOW_OUT_TYPE.bInterlaced = TRUE; DevIOCtrl.SEL.SET_WINDOW_OUT_TYPE.bFieldOddSt = TRUE; pDispDevControl(DISPDEV_IOCTRL_SET_WINDOW_OUT_TYPE, &DevIOCtrl); DevIOCtrl.SEL.SET_CSB_EN.bEn = FALSE; pDispDevControl(DISPDEV_IOCTRL_SET_CSB_EN,&DevIOCtrl); DevIOCtrl.SEL.SET_YC_EXCHG.bCbCrExchg = FALSE; DevIOCtrl.SEL.SET_YC_EXCHG.bYCExchg = FALSE; pDispDevControl(DISPDEV_IOCTRL_SET_YC_EXCHG,&DevIOCtrl); DevIOCtrl.SEL.SET_SUBPIXEL.bOddR = FALSE; DevIOCtrl.SEL.SET_SUBPIXEL.bOddG = FALSE; DevIOCtrl.SEL.SET_SUBPIXEL.bOddB = FALSE; DevIOCtrl.SEL.SET_SUBPIXEL.bEvenR = FALSE; DevIOCtrl.SEL.SET_SUBPIXEL.bEvenG = FALSE; DevIOCtrl.SEL.SET_SUBPIXEL.bEvenB = FALSE; pDispDevControl(DISPDEV_IOCTRL_SET_SUBPIXEL,&DevIOCtrl); DevIOCtrl.SEL.SET_CLK1_2.bClk1_2 = FALSE; pDispDevControl(DISPDEV_IOCTRL_SET_CLK1_2,&DevIOCtrl); // // TV Related APIs // ide_setTvBurst(0x00); //ide_setTvSlaveMode(TRUE); ide_setTvChromaFilter(TRUE, guiTvFilterTap); ide_setTvSearchEn(TRUE); ide_setTvCkpnPol(FALSE);//NEW DAC use positive edge ide_setTvBrl((UINT8)uiBurstLevel); ide_setTvBll((UINT8)uiBlandLevel); ide_setTvScale((UINT8)uiYScale, (UINT8)uiCbScale, (UINT8)uiCrScale); ide_setTvSela(0x3); ide_setTvPowerDown(FALSE); pDispDevControl(DISPDEV_IOCTRL_GET_ACT_DEVICE, &DevIOCtrl); if (DevIOCtrl.SEL.GET_ACT_DEVICE.DevID == DISPDEV_ID_TVNTSC) { DevIOCtrl.SEL.SET_DISPSIZE.uiBufWidth = TV_NTSC_Buf_width; DevIOCtrl.SEL.SET_DISPSIZE.uiBufHeight = TV_NTSC_Buf_height; DevIOCtrl.SEL.SET_DISPSIZE.uiWinWidth = TV_NTSC_Win_width; DevIOCtrl.SEL.SET_DISPSIZE.uiWinHeight = TV_NTSC_Win_height; } else { DevIOCtrl.SEL.SET_DISPSIZE.uiBufWidth = TV_PAL_Buf_width; DevIOCtrl.SEL.SET_DISPSIZE.uiBufHeight = TV_PAL_Buf_height; DevIOCtrl.SEL.SET_DISPSIZE.uiWinWidth = TV_PAL_Win_width; DevIOCtrl.SEL.SET_DISPSIZE.uiWinHeight = TV_PAL_Win_height; } pDispDevControl(DISPDEV_IOCTRL_SET_DISPSIZE, &DevIOCtrl); disptv_debug(("DEVTV: init done\r\n")); return E_OK; }