s3c6410_display_con.c

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

C
1,790
字号
        {
            g_pDispConReg->W1KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_ENABLE | uiKeyDir | COMPKEY(uiComparekey);
            g_pDispConReg->W1KEYCON1 = COLVAL(uiColorKey);
        }
        else
        {
            g_pDispConReg->W1KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_DISABLE;
        }
        break;
    case DISP_WIN2:
        if (bOnOff)
        {
            g_pDispConReg->W2KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_ENABLE | uiKeyDir | COMPKEY(uiComparekey);
            g_pDispConReg->W2KEYCON1 = COLVAL(uiColorKey);
        }
        else
        {
            g_pDispConReg->W2KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_DISABLE;
        }
        break;
    case DISP_WIN3:
        if (bOnOff)
        {
            g_pDispConReg->W3KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_ENABLE | uiKeyDir | COMPKEY(uiComparekey);
            g_pDispConReg->W3KEYCON1 = COLVAL(uiColorKey);
        }
        else
        {
            g_pDispConReg->W3KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_DISABLE;
        }
        break;
    case DISP_WIN4:
        if (bOnOff)
        {
            g_pDispConReg->W4KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_ENABLE | uiKeyDir | COMPKEY(uiComparekey);
            g_pDispConReg->W4KEYCON1 = COLVAL(uiColorKey);
        }
        else
        {
            g_pDispConReg->W4KEYCON0 = KEYBLEN_DISABLE | KEYEN_F_DISABLE;
        }
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_set_color_key() : Unknown Window Number [%d]\n\r"), Win));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

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

    return error;
}

DISP_ERROR Disp_set_alpha_blending(DISP_WINDOW Win, DISP_ALPHA_BLEND_METHOD Method, unsigned int uiAlphaSet0, unsigned int uiAlphaSet1)
{
    DISP_ERROR error = DISP_SUCCESS;
    unsigned int uiMethod;

    DISP_MSG((_T("[DISP]++Disp_set_alpha_blending(%d, %d, 0x%08x, 0x%08x)\n\r"), Win, Method, uiAlphaSet0, uiAlphaSet1));

    if (Method == DISP_ALPHA_PER_PLANE)
    {
        uiMethod = BLEND_PER_PLANE;
    }
    else
    {
        uiMethod = BLEND_PER_PIXEL;
    }

    switch(Win)
    {
    case DISP_WIN1:
        g_pDispConReg->WINCON1 =  (g_pDispConReg->WINCON1 & ~(BLEND_PER_PIXEL|ALPHASEL_ALPHA1)) | uiMethod;
        g_pDispConReg->VIDOSD1C = ALPHA0_R(uiAlphaSet0) | ALPHA0_G(uiAlphaSet0) | ALPHA0_B(uiAlphaSet0)
                                    | ALPHA1_R(uiAlphaSet1) | ALPHA1_G(uiAlphaSet1) | ALPHA1_B(uiAlphaSet1);
        break;
    case DISP_WIN2:
        g_pDispConReg->WINCON2 =  (g_pDispConReg->WINCON2 & ~(BLEND_PER_PIXEL|ALPHASEL_ALPHA1)) | uiMethod;
        g_pDispConReg->VIDOSD2C = ALPHA0_R(uiAlphaSet0) | ALPHA0_G(uiAlphaSet0) | ALPHA0_B(uiAlphaSet0)
                                    | ALPHA1_R(uiAlphaSet1) | ALPHA1_G(uiAlphaSet1) | ALPHA1_B(uiAlphaSet1);
        break;
    case DISP_WIN3:
        g_pDispConReg->WINCON3 =  (g_pDispConReg->WINCON3 & ~(BLEND_PER_PIXEL|ALPHASEL_ALPHA1)) | uiMethod;
        g_pDispConReg->VIDOSD3C = ALPHA0_R(uiAlphaSet0) | ALPHA0_G(uiAlphaSet0) | ALPHA0_B(uiAlphaSet0)
                                    | ALPHA1_R(uiAlphaSet1) | ALPHA1_G(uiAlphaSet1) | ALPHA1_B(uiAlphaSet1);
        break;
    case DISP_WIN4:
        g_pDispConReg->WINCON4 =  (g_pDispConReg->WINCON4 & ~(BLEND_PER_PIXEL|ALPHASEL_ALPHA1)) | uiMethod;
        g_pDispConReg->VIDOSD4C = ALPHA0_R(uiAlphaSet0) | ALPHA0_G(uiAlphaSet0) | ALPHA0_B(uiAlphaSet0)
                                    | ALPHA1_R(uiAlphaSet1) | ALPHA1_G(uiAlphaSet1) | ALPHA1_B(uiAlphaSet1);
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_set_alpha_blending() : Unknown Window Number [%d]\n\r"), Win));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

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

    return error;
}

DISP_ERROR Disp_set_frame_interrupt(DISP_FRAME_INTERRUPT FrameInt)
{
    DISP_ERROR error = DISP_SUCCESS;

    DISP_MSG((_T("[DISP]++Disp_set_frame_interrupt(%d)\n\r"), FrameInt));

    g_pDispConReg->VIDINTCON0 &= ~FRAMEINT_MASK;    // Clear Al Frame Interrupt Bit

    switch(FrameInt)
    {
    case DISP_FRMINT_BACKPORCH:
        g_pDispConReg->VIDINTCON0 |= FRAMESEL0_BACK;
        break;
    case DISP_FRMINT_VSYNC:
        g_pDispConReg->VIDINTCON0 |= FRAMESEL0_VSYNC;
        break;
    case DISP_FRMINT_ACTIVE:
        g_pDispConReg->VIDINTCON0 |= FRAMESEL0_ACTIVE;
        break;
    case DISP_FRMINT_FRONTPORCH:
        g_pDispConReg->VIDINTCON0 |= FRAMESEL0_FRONT;
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_set_frame_interrupt() : Unknown Frame Interrupt [%d]\n\r"), FrameInt));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

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

    return error;
}

DISP_ERROR Disp_enable_frame_interrupt(void)
{
    DISP_ERROR error = DISP_SUCCESS;

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

    g_pDispConReg->VIDINTCON0 |= (INTFRMEN_ENABLE | INTEN_ENABLE);

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

    return error;
}

DISP_ERROR Disp_disable_frame_interrupt(void)
{
    DISP_ERROR error = DISP_SUCCESS;

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

    if (g_pDispConReg->VIDINTCON0 & INTFIFOEN_ENABLE)
    {
        // If FIFO Interrupt is enabled, Clear only Frame Interrupt Enable Bit
        g_pDispConReg->VIDINTCON0 &= ~INTFRMEN_ENABLE;
    }
    else
    {
        g_pDispConReg->VIDINTCON0 &= ~(INTFRMEN_ENABLE | INTEN_ENABLE);
    }

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

    return error;
}

DISP_ERROR Disp_set_fifo_interrupt(DISP_WINDOW Win, DISP_FIFO_INTERRUPT_LEVEL Level)
{
    DISP_ERROR error = DISP_SUCCESS;

    DISP_MSG((_T("[DISP]++Disp_set_fifo_interrupt(%d, %d)\n\r"), Win, Level));

    g_pDispConReg->VIDINTCON0 &= ~FIFOINT_MASK;    // Clear Al FIFO Interrupt Bit

    switch(Win)
    {
    case DISP_WIN0:
        g_pDispConReg->VIDINTCON0 |= FIFOSEL_WIN0;
        break;
    case DISP_WIN1:
        g_pDispConReg->VIDINTCON0 |= FIFOSEL_WIN1;
        break;
    case DISP_WIN2:
        g_pDispConReg->VIDINTCON0 |= FIFOSEL_WIN2;
        break;
    case DISP_WIN3:
        g_pDispConReg->VIDINTCON0 |= FIFOSEL_WIN3;
        break;
    case DISP_WIN4:
        g_pDispConReg->VIDINTCON0 |= FIFOSEL_WIN4;
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_set_fifo_interrupt() : Unknown Window Number [%d]\n\r"), Win));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

    switch(Level)
    {
    case DISP_FIFO_0_25:
        g_pDispConReg->VIDINTCON0 |= FIFOLEVEL_25;
        break;
    case DISP_FIFO_0_50:
        g_pDispConReg->VIDINTCON0 |= FIFOLEVEL_50;
        break;
    case DISP_FIFO_0_75:
        g_pDispConReg->VIDINTCON0 |= FIFOLEVEL_75;
        break;
    case DISP_FIFO_EMPTY:
        g_pDispConReg->VIDINTCON0 |= FIFOLEVEL_EMPTY;
        break;
    case DISP_FIFO_FULL:
        g_pDispConReg->VIDINTCON0 |= FIFOLEVEL_FULL;
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_set_fifo_interrupt() : Unknown FIFO Level [%d]\n\r"), Level));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }

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

    return error;
}

DISP_ERROR Disp_enable_fifo_interrupt(void)
{
    DISP_ERROR error = DISP_SUCCESS;

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

    g_pDispConReg->VIDINTCON0 |= (INTFIFOEN_ENABLE | INTEN_ENABLE);

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

    return error;
}

DISP_ERROR Disp_disable_fifo_interrupt(void)
{
    DISP_ERROR error = DISP_SUCCESS;

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

    if (g_pDispConReg->VIDINTCON0 & INTFRMEN_ENABLE)
    {
        // If Frame Interrupt is enabled, Clear only FIFO Interrupt Enable Bit
        g_pDispConReg->VIDINTCON0 &= ~INTFIFOEN_ENABLE;
    }
    else
    {
        g_pDispConReg->VIDINTCON0 &= ~(INTFIFOEN_ENABLE | INTEN_ENABLE);
    }

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

    return error;
}

DISP_INTERRUPT Disp_clear_interrupt_pending(void)
{
    DISP_INTERRUPT Interrupt = DISP_INT_NONE;

    // Check Interrupt Source and Clear Pending
    if (g_pDispConReg->VIDINTCON1 & INTFIFO_PEND)
    {
        g_pDispConReg->VIDINTCON1 = INTFIFO_PEND;
        Interrupt = DISP_INT_FIFO;
    }
    else if (g_pDispConReg->VIDINTCON1 & INTFRM_PEND)
    {
        g_pDispConReg->VIDINTCON1 = INTFRM_PEND;
        Interrupt = DISP_INT_FRAME;
    }
    else if (g_pDispConReg->VIDINTCON1 & INTSYSIF_PEND)
    {
        g_pDispConReg->VIDINTCON1 = INTSYSIF_PEND;
        Interrupt = DISP_INT_I80;
    }

    return Interrupt;
}

unsigned int Disp_get_line_count(void)
{
    unsigned int uiLineCnt;

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

    uiLineCnt = ((g_pDispConReg->VIDCON1)>>16)&0x7ff;

    DISP_MSG((_T("[DISP]--Disp_get_line_count() : Line Count = %d\n\r"), uiLineCnt));

    return uiLineCnt;
}

DISP_VERTICAL_STATUS Disp_get_vertical_status(void)
{
    unsigned int status;

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

    status = ((g_pDispConReg->VIDCON1)>>13)&0x3;

    DISP_MSG((_T("[DISP]--Disp_get_vertical_status() : Status = %d\n\r"), status));

    return (DISP_VERTICAL_STATUS)status;
}

DISP_WINDOW Disp_get_win_num_from_win_mode(DISP_WINDOW_MODE Mode)
{
    DISP_WINDOW win;

    switch(Mode)
    {
    case DISP_WIN0_DMA:
    case DISP_WIN0_POST_RGB:
    case DISP_WIN0_POST_YUV:
        win = DISP_WIN0;
        break;
    case DISP_WIN1_DMA:
    case DISP_WIN1_TVSCALER_RGB:
    case DISP_WIN1_TVSCALER_YUV:
    case DISP_WIN1_CIPREVIEW_RGB:
    case DISP_WIN1_CIPREVIEW_YUV:
        win = DISP_WIN1;
        break;
    case DISP_WIN2_DMA:
    case DISP_WIN2_TVSCALER_RGB:
    case DISP_WIN2_TVSCALER_YUV:
    case DISP_WIN2_CICODEC_RGB:
    case DISP_WIN2_CICODEC_YUV:
        win = DISP_WIN2;
        break;
    case DISP_WIN3_DMA:
        win = DISP_WIN3;
        break;
    case DISP_WIN4_DMA:
        win = DISP_WIN4;
        break;
    default:
        win = -1;
        break;
    }

    return win;
}

static DISP_ERROR Disp_initialize_port_RGBIF(DISP_RGBIFOUT_MODE RGBOutMode)
{
    DISP_ERROR error = DISP_SUCCESS;

    DISP_MSG((_T("[DISP]++Disp_initialize_port_RGBIF(%d)\n\r"), RGBOutMode));

    // This code enable or disable VideoSignalLine mapped with GPIO

⌨️ 快捷键说明

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