s3c6410_display_con.c

来自「6410BSP3」· C语言 代码 · 共 1,790 行 · 第 1/5 页

C
1,790
字号
    switch(RGBOutMode)
    {
    case DISP_16BIT_RGB565_P:    // GPJ[7:3]->R[4:0], GPI[15:10]->G[5:0], GPI[7:3] -> B[4:0]
        g_pGPIOReg->GPIPUD &= ~(0xfff0ffc0);                                        // Pull up/down disable
        g_pGPIOReg->GPICON = (g_pGPIOReg->GPICON & ~(0xfff0ffc0)) | (0xaaa0aa80);    // G[5:0], B[4:0]
        g_pGPIOReg->GPJPUD &= ~(0xffc0);                                            // Pull up/down disable
        g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xffc0)) | (0xaa80);            // R[4:0]
        break;
    case DISP_18BIT_RGB666_P:    // GPJ[7:2]->R[5:0], GPI[15:10]->G[5:0], GPI[7:2] -> B[5:0]
        g_pGPIOReg->GPIPUD &= ~(0xfff0fff0);                                        // Pull up/down disable
        g_pGPIOReg->GPICON = (g_pGPIOReg->GPICON & ~(0xfff0fff0)) | (0xaaa0aaa0);    // G[5:0], B[5:0]
        g_pGPIOReg->GPJPUD &= ~(0xfff0);                                            // Pull up/down disable
        g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xfff0)) | (0xaaa0);            // R[5:0]
        break;
    case DISP_24BIT_RGB888_P:    // GPI[15:0] -> Data[15:0], GPJ[7:0]->Data[23:16]
        g_pGPIOReg->GPIPUD = 0;                                            // Pull up/down disable
        g_pGPIOReg->GPICON = 0xaaaaaaaa;                                    // Data[15:0]
        g_pGPIOReg->GPJPUD &= ~0xffff;                                        // Pull up/down disable
        g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~0xffff) | 0xaaaa;        // Data[23:16]
        break;
    case DISP_16BIT_RGB565_S:    // GPJ[7:2] -> Data[5:0]
    case DISP_18BIT_RGB666_S:    // GPJ[7:2] -> Data[5:0]
        g_pGPIOReg->GPJPUD &= ~(0xfff0);                                    // Pull up/down disable
        g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xfff0)) | (0xaaa0);    // Data[5:0]
        break;
    case DISP_24BIT_RGB888_S:    // GPJ[7:0] -> Data[7:0]

        g_pGPIOReg->GPJPUD &= ~0xffff;                                        // Pull up/down disable
        g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xffff)) | 0xaaaa;    // Data[7:0]
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_initialize_port_RGBIF() : Unsupported RGB I/F Output Mode [%d]\n\r"), RGBOutMode));
        error = DISP_ERROR_NOT_INITIALIZED;
        break;
    }

    // Control Signal (HSync, VSync, VDEN, VClk)
    g_pGPIOReg->GPJPUD &= ~(0xf<<16);    // Pull up/down disable
    g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xff<<16)) | (0xaa<<16);    // HSync, VSync, VDEN, VCLK

    // MSM I/F Bypass Mode Disable
    g_pMSMIFReg->MIFPCON &= ~(0x1<<3);    // SEL_BYPASS -> Normal Mode

    // LCD Interface Type
    g_pGPIOReg->SPCON = (g_pGPIOReg->SPCON & ~(0x3)) | (0x1);
    DISP_MSG((_T("[DISP]--Disp_initialize_port_RGBIF() : %d\n\r"), error));

    return error;
}

static DISP_ERROR Disp_initialize_RGBIF(void)
{
    DISP_ERROR error = DISP_SUCCESS;
    unsigned int VCLKDivider;

    DISP_MSG((_T("[DISP]++Disp_initialize_RGBIF()\n\r")));

    if (Disp_get_vclk_direction_divider(g_DevInfoRGB.VCLK_Source, &g_DevInfoRGB.VCLK_Direction, &VCLKDivider))
    {
        g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_RGBIF | g_DevInfoRGB.PNR_Mode | CLKVALUP_ALWAYS |
                                CLKVAL_F(VCLKDivider) | VCLK_NORMAL | g_DevInfoRGB.VCLK_Direction |
                                g_DevInfoRGB.VCLK_Source | ENVID_DISABLE | ENVID_F_DISABLE;

        g_pDispConReg->VIDCON1 = g_DevInfoRGB.VCLK_Polarity | g_DevInfoRGB.HSYNC_Polarity |
                                g_DevInfoRGB.VSYNC_Polarity | g_DevInfoRGB.VDEN_Polarity;

        g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444;    // Should be this value

        g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfoRGB.VBPD_Value) |
                                VFPD(g_DevInfoRGB.VFPD_Value) | VSPW(g_DevInfoRGB.VSPW_Value);

        g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfoRGB.HBPD_Value) |
                                HFPD(g_DevInfoRGB.HFPD_Value) | HSPW(g_DevInfoRGB.HSPW_Value);

        g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfoRGB.uiHeight) | HOZVAL(g_DevInfoRGB.uiWidth);
    }
    else
    {
        DISP_ERR((_T("[DISP:ERR] Disp_initialize_RGBIF() : Clock Source Decision Failed\n\r")));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
    }

    DISP_MSG((_T("[DISP]--Disp_initialize_RGBIF() : %d\n\r"), error));

    return error;
}

static DISP_ERROR Disp_initialize_RGBIF_withTVEnc(void)
{
    DISP_ERROR error = DISP_SUCCESS;
    unsigned int VCLKDivider;

    DISP_MSG((_T("[DISP]++Disp_initialize_RGBIF_withTVEnc()\n\r")));

    if (Disp_get_vclk_direction_divider_forTVEnc(g_DevInfoRGB.VCLK_Source, &g_DevInfoRGB.VCLK_Direction, &VCLKDivider))
    {
        g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TV_RGBIF | g_DevInfoRGB.PNR_Mode | CLKVALUP_ALWAYS |
                                CLKVAL_F(VCLKDivider) | VCLK_NORMAL | g_DevInfoRGB.VCLK_Direction |
                                g_DevInfoRGB.VCLK_Source | ENVID_DISABLE | ENVID_F_DISABLE;

        g_pDispConReg->VIDCON1 = g_DevInfoRGB.VCLK_Polarity | g_DevInfoRGB.HSYNC_Polarity |
                                g_DevInfoRGB.VSYNC_Polarity | g_DevInfoRGB.VDEN_Polarity;

        g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444;    // Should be this value

        g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfoRGB.VBPD_Value) |
                                VFPD(g_DevInfoRGB.VFPD_Value) | VSPW(g_DevInfoRGB.VSPW_Value);

        g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfoRGB.HBPD_Value) |
                                HFPD(g_DevInfoRGB.HFPD_Value) | HSPW(g_DevInfoRGB.HSPW_Value);

        g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfoRGB.uiHeight) | HOZVAL(g_DevInfoRGB.uiWidth);
    }
    else
    {
        DISP_ERR((_T("[DISP:ERR] Disp_initialize_RGBIF_withTVEnc() : Clock Source Decision Failed\n\r")));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
    }

    DISP_MSG((_T("[DISP]--Disp_initialize_RGBIF_withTVEnc() : %d\n\r"), error));

    return error;
}

static DISP_ERROR Disp_initialize_TVEnc(void)
{
    DISP_ERROR error = DISP_SUCCESS;

    DISP_MSG((_T("[DISP]++Disp_initialize_TVEnc()\n\r")));

#if 0  // TV Encoder FIFO underrun at WVGA(800x480) size Frame Buffer
    g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TVENC | g_DevInfoTV.PNR_Mode | CLKVALUP_ALWAYS |
                            CLKVAL_F(2) | VCLK_NORMAL | CLKDIR_DIRECT |
                            CLKSEL_F_EXT27M | ENVID_DISABLE | ENVID_F_DISABLE;
#else
    g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TVENC | g_DevInfoTV.PNR_Mode | CLKVALUP_ALWAYS |
                            CLKVAL_F(4) | VCLK_NORMAL | CLKDIR_DIVIDED |
                            CLKSEL_F_HCLK | ENVID_DISABLE | ENVID_F_DISABLE;
#endif

    g_pDispConReg->VIDCON1 = g_DevInfoTV.VCLK_Polarity | g_DevInfoTV.HSYNC_Polarity |
                            g_DevInfoTV.VSYNC_Polarity | g_DevInfoTV.VDEN_Polarity;

    g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444;    // Should be this value

    g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfoTV.VBPD_Value) |
                            VFPD(g_DevInfoTV.VFPD_Value) | VSPW(g_DevInfoTV.VSPW_Value);

    g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfoTV.HBPD_Value) |
                            HFPD(g_DevInfoTV.HFPD_Value) | HSPW(g_DevInfoTV.HSPW_Value);

    g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfoTV.uiHeight) | HOZVAL(g_DevInfoTV.uiWidth);

    DISP_MSG((_T("[DISP]--Disp_initialize_TVEnc() : %d\n\r"), error));

    return error;
}

static DISP_ERROR Disp_window0_initialize(DISP_WINDOW_MODE Mode, DISP_BPP_MODE BPPMode, unsigned int uiWidth, unsigned int uiHeight, unsigned int uiOffsetX, unsigned int uiOffsetY)
{
    DISP_ERROR error = DISP_SUCCESS;

    DISP_MSG((_T("[DISP]++Disp_window0_initialize(%d, %d, %d, %d, %d, %d)\n\r"), Mode, BPPMode, uiWidth, uiHeight, uiOffsetX, uiOffsetY));

    switch(Mode)
    {
    case DISP_WIN0_DMA:
        g_Win0Config.LocalPathEnable = LOCAL_PATH_DISABLE;
        //g_Win0Config.LocaPathSourceFormat;    // Don't care when Local Path is disabled
        break;
    case DISP_WIN0_POST_RGB:
        g_Win0Config.LocalPathEnable = LOCAL_PATH_ENABLE;
        g_Win0Config.LocaPathSourceFormat = LOCAL_IN_RGB888;
        break;
    case DISP_WIN0_POST_YUV:
        g_Win0Config.LocalPathEnable = LOCAL_PATH_ENABLE;
        g_Win0Config.LocaPathSourceFormat = LOCAL_IN_YUV444;
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_window0_initialize() : Unsupported Window Mode [%d]\n\r"), Mode));
        return DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

    g_Win0Config.BitSwapping = BITSWP_DISABLE;
    g_Win0Config.ByteSwapping = BYTSWP_DISABLE;
    g_Win0Config.HalfWordSwapping = HAWSWP_DISABLE;

    switch(BPPMode)
    {
    //case DISP_1BPP:
    //case DISP_2BPP:
    //case DISP_4BPP:
    //case DISP_8BPP_PAL:
    //case DISP_16BPP_I555:
    case DISP_16BPP_565:
        g_Win0Config.uiPageWidth = uiWidth*2;    // 2 byte per pixel
        g_Win0Config.HalfWordSwapping = HAWSWP_ENABLE;    // 16BPP need Halfword Swapping
        break;
    case DISP_18BPP_666:
    case DISP_24BPP_888:
        g_Win0Config.uiPageWidth = uiWidth*4;    // 4 byte per pixel
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_window0_initialize() : Unsupported BPP Mode [%d]\n\r"), BPPMode));
        return DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

    g_Win0Config.BPP_Mode = BPPMode;
    g_Win0Config.BufferSelect = BUFSEL_BUF0;
    g_Win0Config.BufferAutoControl = BUFAUTO_DISABLE;
    g_Win0Config.uiWidth = uiWidth;
    g_Win0Config.uiHeight = uiHeight;
    g_Win0Config.uiOffsetX = uiOffsetX;
    g_Win0Config.uiOffsetY = uiOffsetY;

    if (g_Win0Config.LocalPathEnable == LOCAL_PATH_ENABLE)
    {
        g_Win0Config.BurstLength = BURSTLEN_4WORD;    // 4 Words Burst
    }
    else if ((g_Win0Config.uiPageWidth%64) == 0)        // 16 words burst case
    {
        g_Win0Config.BurstLength = BURSTLEN_16WORD;
    }
    else if ((g_Win0Config.uiPageWidth%32) == 0)    // 8 words burst case
    {
        g_Win0Config.BurstLength = BURSTLEN_8WORD;
    }
    else if ((g_Win0Config.uiPageWidth%16) == 0)    // 4 words burst case
    {
        g_Win0Config.BurstLength = BURSTLEN_4WORD;
    }
    else
    {
        DISP_ERR((_T("[DISP:ERR] Disp_window0_initialize() : uiPageWidth[%d] is not Aligned with Minimum Burst Size (4 Words)\n\r"), g_Win0Config.uiPageWidth));
        return DISP_ERROR_ILLEGAL_PARAMETER;
    }

    g_pDispConReg->WINCON0 = CSC_WIDE_RANGE | //g_Win0Config.LocalPathEnable |
                            g_Win0Config.BufferSelect | g_Win0Config.BufferAutoControl | g_Win0Config.BitSwapping |
                            g_Win0Config.ByteSwapping | g_Win0Config.HalfWordSwapping | g_Win0Config.LocaPathSourceFormat |
                            g_Win0Config.BurstLength | BPPMODE_F(g_Win0Config.BPP_Mode);

    g_pDispConReg->VIDOSD0A = OSD_LEFTTOPX_F(g_Win0Config.uiOffsetX) | OSD_LEFTTOPY_F(g_Win0Config.uiOffsetY);

    g_pDispConReg->VIDOSD0B = OSD_RIGHTBOTX_F(g_Win0Config.uiWidth+g_Win0Config.uiOffsetX-1) |
                                OSD_RIGHTBOTY_F(g_Win0Config.uiHeight+g_Win0Config.uiOffsetY-1);

    g_pDispConReg->VIDOSD0C = OSD_SIZE(g_Win0Config.uiWidth*g_Win0Config.uiHeight);

    DISP_MSG((_T("[DISP]--Disp_window0_initialize() : %d\n\r"), error));

    return error;
}

static DISP_ERROR Disp_window1_initialize(DISP_WINDOW_MODE Mode, DISP_BPP_MODE BPPMode, unsigned int uiWidth, unsigned int uiHeight, unsigned int uiOffsetX, unsigned int uiOffsetY)
{
    DISP_ERROR error = DISP_SUCCESS;

    DISP_MSG((_T("[DISP]++Disp_window1_initialize(%d, %d, %d, %d, %d, %d)\n\r"), Mode, BPPMode, uiWidth, uiHeight, uiOffsetX, uiOffsetY));

    switch(Mode)
    {
    case DISP_WIN1_DMA:
        g_Win1Config.LocalPathEnable = LOCAL_PATH_DISABLE;
        //g_Win1Config.LocalPathSelect;            // Don't care when Local Path is disabled
        //g_Win1Config.LocaPathSourceFormat;    // Don't care when Local Path is disabled
        break;
    case DISP_WIN1_TVSCALER_RGB:
        g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
        g_Win1Config.LocalPathSelect = LOCALSEL_TVSCALER;
        g_Win1Config.LocaPathSourceFormat = LOCAL_IN_RGB888;
        break;
    case DISP_WIN1_TVSCALER_YUV:
        g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
        g_Win1Config.LocalPathSelect = LOCALSEL_TVSCALER;
        g_Win1Config.LocaPathSourceFormat = LOCAL_IN_YUV444;
        break;
    case DISP_WIN1_CIPREVIEW_RGB:
        g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
        g_Win1Config.LocalPathSelect = LOCALSEL_CIPREVIEW;
        g_Win1Config.LocaPathSourceFormat = LOCAL_IN_RGB888;
        break;
    case DISP_WIN1_CIPREVIEW_YUV:
        g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
        g_Win1Config.LocalPathSelect = LOCALSEL_CIPREVIEW;
        g_Win1Config.LocaPathSourceFormat = LOCAL_IN_YUV444;
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_window1_initialize() : Unsupported Window Mode [%d]\n\r"), Mode));
        return DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

    g_Win1Config.BitSwapping = BITSWP_DISABLE;
    g_Win1Config.ByteSwapping = BYTSWP_DISABLE;
    g_Win1Config.HalfWordSwapping = HAWSWP_DISABLE;

    switch(BPPMode)
    {
    //case DISP_1BPP:
    //case DISP_2BPP:
    //case DISP_4BPP:
    //case DISP_8BPP_PAL:
    //case DISP_8BPP_NOPAL:
    //case DISP_16BPP_A555:
    //case DISP_16BPP_I555:
    //case DISP_18BPP_A665:
    //case DISP_19BPP_A666:
    //case DISP_24BPP_A887:
    //case DISP_25BPP_A888:
    case DISP_16BPP_565:
        g_Win1Config.uiPageWidth = uiWidth*2;    // 2 byte per pixel
        g_Win1Config.HalfWordSwapping = HAWSWP_ENABLE;    // 16BPP need Halfword Swapping
        break;
    case DISP_18BPP_666:
    case DISP_24BPP_888:
        g_Win1Config.uiPageWidth = uiWidth*4;    // 4 byte per pixel
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_window1_initialize() : Unsupported BPP Mode [%d]\n\r"), BPPMode));
        return DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

    g_Win1Config.BPP_Mode = BPPMode;
    g_Win1Config.BufferSelect = BUFSEL_BUF0;
    g_Win1Config.BufferAutoControl = BUFAUTO_DISABLE;
    g_Win1Config.uiWidth = uiWidth;
    g_Win1Config.uiHeight = uiHeight;
    g_Win1Config.uiOffsetX = uiOffsetX;
    g_Win1Config.uiOffsetY = uiOffsetY;

    if (g_Win1Config.LocalPathEnable == LOCAL_PATH_ENABLE)
    {
        g_Win1Config.BurstLength = BURSTLEN_4WORD;    // 4 Words Burst
    }
    else if ((g_Win1Config.uiPageWidth%64) == 0)        // 16 words burst case
    {
        g_Win1Config.BurstLength = BURSTLEN_16WORD;
    }
    else if ((g_Win1Config.uiPageWidth%32) == 0)    // 8 words burst case
    {
        g_Win1Config.BurstLength = BURSTLEN_8WORD;
    }
    else if ((g_Win1Config.uiPageWidth%16) == 0)    // 4 words burst case
    {
        g_Win1Config.BurstLength = BURSTLEN_4WORD;
    }
    else
    {
        DISP_ERR((_T("[DISP:ERR] Disp_window1_initialize() : uiPageWidth is not Word Aligned [%d]\n\r"), g_Win0Config.uiPageWidth));
        return DISP_ERROR_ILLEGAL_PARAMETER;
    }

    g_pDispConReg->WINCON1 = CSC_WIDE_RANGE | g_Win1Config.LocalPathSelect | //g_Win1Config.LocalPathEnable |
                            g_Win1Config.BufferSelect | g_Win1Config.BufferAutoControl | g_Win1Config.BitSwapping |

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?