Ejemplo n.º 1
0
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_);
  }
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
/*
    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;
}