display_main.cpp

来自「6410BSP3」· C++ 代码 · 共 1,962 行 · 第 1/5 页

CPP
1,962
字号
    || (SMDK6410_LCD_MODULE == LCD_MODULE_LTP700) \
    || (SMDK6410_LCD_MODULE == LCD_MODULE_LTM030DK) \
    )
    // Initialize LCD Module
    LDI_initialize_LCD_module();
#endif

    // Power On Video Driver
    // All of HW State is restored by Video Driver
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_PM_SET_POWER_ON, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevPowerOn() : IOCTL_SVE_PM_SET_POWER_ON Failed\n\r")));
    }

    if (m_eOutputInterface == OUTPUT_IF_RGB)
    {
#if ((SMDK6410_LCD_MODULE != LCD_MODULE_LTE480) \
    || (SMDK6410_LCD_MODULE != LCD_MODULE_LTV350) \
    || (SMDK6410_LCD_MODULE != LCD_MODULE_LTP700))    // In case of LTE480 Module
        // Initialize LCD Module
        LDI_initialize_LCD_module();
#endif
        // Backlight On
        DevicePowerNotify(_T("BKL1:"),(_CEDEVICE_POWER_STATE)D0, POWER_NAME);
    }

    LeaveCriticalSection(&m_csDevice);

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --%s()\n\r"), _T(__FUNCTION__)));

    return TRUE;
}


BOOL
S3C6410Disp::DevPowerOff(void)
{
    DWORD dwBytes;

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++%s()\n\r"), _T(__FUNCTION__)));

    EnterCriticalSection(&m_csDevice);

    if (m_eOutputInterface == OUTPUT_IF_RGB)
    {
        // Backlight Off
        DevicePowerNotify(_T("BKL1:"),(_CEDEVICE_POWER_STATE)D4, POWER_NAME);    
    }

#if    ((SMDK6410_LCD_MODULE == LCD_MODULE_LTS222) || (SMDK6410_LCD_MODULE == LCD_MODULE_LTV350)    \
    || (SMDK6410_LCD_MODULE == LCD_MODULE_LTP700))
    // Power Off Video Driver
    // All of HW State will be restored by Video Driver
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_PM_SET_POWER_OFF, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevPowerOff() : IOCTL_SVE_PM_SET_POWER_OFF Failed : m_hVideoDrv:0x%x\n\r"),m_hVideoDrv));
    }

    // Deinitialize LCD Module
    LDI_deinitialize_LCD_module();
#else    // In case of LTE480 Module
    // Deinitialize LCD Module
    LDI_deinitialize_LCD_module();

    // Power Off Video Driver
    // All of HW State will be restored by Video Driver
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_PM_SET_POWER_OFF, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevPowerOff() : IOCTL_SVE_PM_SET_POWER_OFF Failed : m_hVideoDrv:0x%x\n\r"),m_hVideoDrv));
    }
#endif
    LeaveCriticalSection(&m_csDevice);

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --%s()\n\r"), _T(__FUNCTION__)));

    return TRUE;
}


BOOL
S3C6410Disp::DevChangeOutputInterface(OUTPUT_INTERFACE eNewOutputIF)
{
    BOOL bRet = TRUE;

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++%s(%d)\n\r"), _T(__FUNCTION__), eNewOutputIF));

    EnterCriticalSection(&m_csDevice);

    if (m_eOutputInterface == eNewOutputIF)
    {
        RETAILMSG(DISP_ZONE_TEMP, (_T("[DISPDRV:INF] DevChangeOutputInterface(%d) : Same Inteface... Not Changed\n\r"), eNewOutputIF));
        bRet = FALSE;
        goto CleanUp;
    }

    if (eNewOutputIF == OUTPUT_IF_TV)
    {
        // Check TV Scaler Limitation
        if (m_dwDeviceScreenWidth > 800)
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevChangeOutputInterface() : For TVout, Screen width[%d] should be lower than 800 pixel\n\r"), m_dwDeviceScreenWidth));
            bRet = FALSE;
            goto CleanUp;
        }

        // Request Video Driver HW Resource
        if (!TVOutAllocResource())
        {
            RETAILMSG(DISP_ZONE_TEMP, (_T("[DISPDRV:INF] DevChangeOutputInterface(%d) : TVOutAllocResource() Failed\n\r"), eNewOutputIF));
            bRet = FALSE;
            goto CleanUp;
        }
    }

    //---------------------------
    // Disable Old Output Interface
    //---------------------------
    if (m_eOutputInterface == OUTPUT_IF_RGB)    // Previous interface is RGB I/F
    {
        if (m_eTVDMAMode !=     TV_DMA_DISABLE)
        {
            DevOutputDisableTVDMA();
            m_eTVDMAMode = TV_DMA_DISABLE;
            RETAILMSG(DISP_ZONE_TEMP, (_T("[DISPDRV:INF] DevChangeOutputInterface() : TV DMA is disabled for TV Out\n\r")));
        }

        DevOutputDisableRGBIF();
    }
    else        // Previous interface is TV Out
    {
        DevOutputDisableTV();
    }

    //---------------------------
    // Update Output Interface State
    //---------------------------
    m_eOutputInterface = eNewOutputIF;

    if (m_eOutputInterface == OUTPUT_IF_RGB)
    {
        // Release Video Driver HW Resource
        TVOutReleaseResource();
    }

    //---------------------------
    // Enable New Output Interface
    //---------------------------
    RETAILMSG(DISP_ZONE_TEMP, (_T("[DISPDRV:INF] Enable New Output Interface(%d)\n\r"), m_eOutputInterface));

    if (m_eOutputInterface == OUTPUT_IF_RGB)
    {
        DevOutputEnableRGBIF();
    }
    else if (m_eOutputInterface == OUTPUT_IF_TV)
    {
        DevOutputEnableTV();
    }

CleanUp:

    LeaveCriticalSection(&m_csDevice);

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --%s()\n\r"), _T(__FUNCTION__)));

    return bRet;
}


void
S3C6410Disp::DevOutputEnableRGBIF(void)
{
    DWORD dwBytes;

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++%s()\n\r"), _T(__FUNCTION__)));

    // Display initialize to RGB I/F
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_RGBIF, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableRGBIF() : IOCTL_SVE_FIMD_SET_OUTPUT_RGBIF Failed\n\r")));
    }

    switch(m_pModeEx->ePixelFormat)
    {
    case ddgpePixelFormat_565:
        {
            SVEARG_FIMD_WIN_MODE tParam;

            tParam.dwWinMode = PRIMARY_WINDOW_MODE;
            tParam.dwBPP = DISP_16BPP_565;
            tParam.dwWidth = m_dwDeviceScreenWidth;
            tParam.dwHeight = m_dwDeviceScreenHeight;
            tParam.dwOffsetX = 0;
            tParam.dwOffsetY = 0;

            // Primary Window Initialize
            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_MODE, &tParam, sizeof(SVEARG_FIMD_WIN_MODE), NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableRGBIF() : IOCTL_SVE_FIMD_SET_WINDOW_MODE Failed\n\r")));
            }

            break;
        }
    //case ddgpePixelFormat_8880:    // FIMD can not support Packed RGB888
    case ddgpePixelFormat_8888:
        {
            SVEARG_FIMD_WIN_MODE tParam;

            tParam.dwWinMode = PRIMARY_WINDOW_MODE;
            tParam.dwBPP = DISP_24BPP_888;
            tParam.dwWidth = m_dwDeviceScreenWidth;
            tParam.dwHeight = m_dwDeviceScreenHeight;
            tParam.dwOffsetX = 0;
            tParam.dwOffsetY = 0;

            // Primary Window Initialize
            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_MODE, &tParam, sizeof(SVEARG_FIMD_WIN_MODE), NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableRGBIF() : IOCTL_SVE_FIMD_SET_WINDOW_MODE Failed\n\r")));
            }

            break;
        }
    default:
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableRGBIF() : Unknown PixelFormat %d \n\r"), m_pModeEx->ePixelFormat));
        break;
    }

    // Set Primary Window Framebuffer
    SVEARG_FIMD_WIN_FRAMEBUFFER tParamFB;
    tParamFB.dwWinNum = PRIMARY_WINDOW;
    tParamFB.dwFrameBuffer = m_VideoMemoryPhysicalBase;
    tParamFB.bWaitForVSync = FALSE;
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER, &tParamFB, sizeof(SVEARG_FIMD_WIN_FRAMEBUFFER), NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableRGBIF() : IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER Failed\n\r")));
    }

    // Primary Window Enable
    DWORD dwParam;
    dwParam = PRIMARY_WINDOW;
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_ENABLE, &dwParam, sizeof(DWORD), NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableRGBIF() : IOCTL_SVE_FIMD_SET_WINDOW_ENABLE Failed\n\r")));
    }

    // Initialize LCD Module
#if (SMDK6410_LCD_MODULE == LCD_MODULE_LTM030DK)
    LDI_LTM030DK_port_initialize();
    LDI_LTM030DK_SetALC();
    LDI_LTM030DK_RGB_initialize();
#else
    LDI_initialize_LCD_module();
#endif

    // Video Output Enable
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_ENABLE, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableRGBIF() : IOCTL_SVE_LCD_SET_MODULE_ENABLE Failed\n\r")));
    }

    // Enable Overlay Window and Blending
    DevRecoverOverlay();

    // Backlight On
    DevicePowerNotify(_T("BKL1:"),(_CEDEVICE_POWER_STATE)D0, POWER_NAME);

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --%s()\n\r"), _T(__FUNCTION__)));
}


void
S3C6410Disp::DevOutputDisableRGBIF(void)
{
    DWORD dwBytes;

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++%s()\n\r"), _T(__FUNCTION__)));

    // Backlight Off
    DevicePowerNotify(_T("BKL1:"),(_CEDEVICE_POWER_STATE)D4, POWER_NAME);    

    // Disable Overlay Window
    DevOverlayDisable();

#if    ((SMDK6410_LCD_MODULE == LCD_MODULE_LTS222) || (SMDK6410_LCD_MODULE == LCD_MODULE_LTV350)    \
    || (SMDK6410_LCD_MODULE == LCD_MODULE_LTP700))
    // Video Output Disable
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputDisableRGBIF() : IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE Failed\n\r")));
    }
    // Deinitialize LCD Module
    LDI_deinitialize_LCD_module();
#else    // In case of LTE480 Module
    // Deinitialize LCD Module
    LDI_deinitialize_LCD_module();

    // Video Output Disable
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputDisableRGBIF() : IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE Failed\n\r")));
    }
#endif

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --%s()\n\r"), _T(__FUNCTION__)));
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --S3C6410Disp::DevOutputDisableRGBIF()\n\r")));
}

BOOL
S3C6410Disp::DevWaitForVerticalBlank(void)
{
    BOOL bRet = TRUE;
    DWORD dwBytes;

    // Wait for Frame Interrupt
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_WAIT_FRAME_INTERRUPT, NULL, 0, NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevGetVerticalStatus() : IOCTL_SVE_FIMD_WAIT_FRAME_INTERRUPT Failed\n\r")));
        bRet = FALSE;
    }

    return bRet;
}


int
S3C6410Disp::DevGetVerticalStatus(void)
{
    SVEARG_FIMD_OUTPUT_STAT tParam;
    DWORD dwBytes;

    // Get Output Status
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_GET_OUTPUT_STATUS, NULL, 0, &tParam, sizeof(SVEARG_FIMD_OUTPUT_STAT), &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevGetVerticalStatus() : IOCTL_SVE_FIMD_GET_OUTPUT_STATUS Failed\n\r")));
    }

    return (int)tParam.dwVerticalStatus;
}


DWORD
S3C6410Disp::DevGetScanLine(void)
{
    SVEARG_FIMD_OUTPUT_STAT tParam;
    DWORD dwBytes;

    // Get Output Status
    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_GET_OUTPUT_STATUS, NULL, 0, &tParam, sizeof(SVEARG_FIMD_OUTPUT_STAT), &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevGetScanLine() : IOCTL_SVE_FIMD_GET_OUTPUT_STATUS Failed\n\r")));
    }

    return tParam.dwLineCnt;
}

// this routine converts a string into a GUID and returns TRUE if the
// conversion was successful.
BOOL
ConvertStringToGuid (LPCTSTR pszGuid, GUID *pGuid)
{
    UINT Data4[8];
    int  Count;
    BOOL fOk = FALSE;
    TCHAR *pszGuidFormat = _T("{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}");

    DEBUGCHK(pGuid != NULL && pszGuid != NULL);
    __try
    {
        if (_stscanf(pszGuid, pszGuidFormat, &pGuid->Data1,
            &pGuid->Data2, &pGuid->Data3, &Data4[0], &Data4[1], &Data4[2], &Data4[3],
            &Data4[4], &Data4[5], &Data4[6], &Data4[7]) == 11)
        {
            for(Count = 0; Count < (sizeof(Data4) / sizeof(Data4[0])); Count++)
            {
                pGuid->Data4[Count] = (UCHAR) Data4[Count];
            }
        }
        fOk = TRUE;
    }
    __except(GetExceptionCode()==STATUS_ACCESS_VIOLATION ?
               EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        DEBUGMSG(DISP_ZONE_ERROR, (TEXT("%s: Exception occured\n")));
        fOk=FALSE;
    }

    return fOk;
}

// This routine notifies the OS that we support the 

⌨️ 快捷键说明

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