⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c2410x_lcd.cpp

📁 windows wm5 下的Lcd 驱动接口
💻 CPP
📖 第 1 页 / 共 3 页
字号:

SCODE   S3C2410DISP::Line(GPELineParms *lineParameters, EGPEPhase phase)
{
    RETAILMSG(0, (TEXT("S3C2410DISP::Line\r\n")));

    if (phase == gpeSingle || phase == gpePrepare)
    {

        if ((lineParameters->pDst != m_pPrimarySurface))
        {
            lineParameters->pLine = EmulatedLine;
        }
        else
        {
            lineParameters->pLine = (SCODE (GPE::*)(struct GPELineParms *)) WrappedEmulatedLine;
        }
    }
    return S_OK;
}

SCODE   S3C2410DISP::BltPrepare(GPEBltParms *blitParameters)
{
    RECTL   rectl;

    RETAILMSG(0, (TEXT("S3C2410DISP::BltPrepare\r\n")));

    // default to base EmulatedBlt routine
    blitParameters->pBlt = EmulatedBlt;

    // see if we need to deal with cursor
    if (m_CursorVisible && !m_CursorDisabled)
    {
        // check for destination overlap with cursor and turn off cursor if overlaps
        if (blitParameters->pDst == m_pPrimarySurface)  // only care if dest is main display surface
        {
            if (blitParameters->prclDst != NULL)        // make sure there is a valid prclDst
            {
                rectl = *blitParameters->prclDst;       // if so, use it
            }
            else
            {
                rectl = m_CursorRect;                   // if not, use the Cursor rect - this forces the cursor to be turned off in this case
            }

            if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
                m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
            {
                CursorOff();
                m_CursorForcedOff = TRUE;
            }
        }

        // check for source overlap with cursor and turn off cursor if overlaps
        if (blitParameters->pSrc == m_pPrimarySurface)  // only care if source is main display surface
        {
            if (blitParameters->prclSrc != NULL)        // make sure there is a valid prclSrc
            {
                rectl = *blitParameters->prclSrc;       // if so, use it
            }
            else
            {
                rectl = m_CursorRect;                   // if not, use the CUrsor rect - this forces the cursor to be turned off in this case
            }
            if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
                m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
            {
                CursorOff();
                m_CursorForcedOff = TRUE;
            }
        }
    }

    return S_OK;
}

SCODE   S3C2410DISP::BltComplete(GPEBltParms *blitParameters)
{
    RETAILMSG(0, (TEXT("S3C2410DISP::BltComplete\r\n")));

    // see if cursor was forced off because of overlap with source or destination and turn back on
    if (m_CursorForcedOff)
    {
        m_CursorForcedOff = FALSE;
        CursorOn();
    }

    return S_OK;
}

INT     S3C2410DISP::InVBlank(void)
{
    RETAILMSG(0, (TEXT("S3C2410DISP::InVBlank\r\n")));
    return 0;
}

SCODE   S3C2410DISP::SetPalette(const PALETTEENTRY *source, USHORT firstEntry, USHORT numEntries)
{
    RETAILMSG(0, (TEXT("S3C2410DISP::SetPalette\r\n")));

    if (firstEntry < 0 || firstEntry + numEntries > 256 || source == NULL)
    {
        return  E_INVALIDARG;
    }

    return  S_OK;
}

ULONG   S3C2410DISP::GetGraphicsCaps()
{
    
#ifdef  CLEARTYPE
    return  GCAPS_GRAY16 | GCAPS_CLEARTYPE;
#else
    return  GCAPS_GRAY16;
#endif 
}

#if defined(CLEARTYPE) || defined(ROTATE)

ULONG  S3C2410DISP::DrvEscape(
                        SURFOBJ *pso,
                        ULONG    iEsc,
                        ULONG    cjIn,
                        PVOID    pvIn,
                        ULONG    cjOut,
                        PVOID    pvOut)
{
    if (iEsc == QUERYESCSUPPORT )
    {
        if (cjIn == sizeof(DWORD))
        {
            DWORD SupportChk = *(DWORD *)pvIn;
            if ((SupportChk == GETRAWFRAMEBUFFER) ||
                (SupportChk == GETGXINFO) )
                return 1;
            else
                return 0;
        }
        else
        {
            SetLastError (ERROR_INVALID_PARAMETER);
            return -1;
        }
    }
    else if (iEsc == GETRAWFRAMEBUFFER )
    {
        if ((cjOut >= sizeof(RawFrameBufferInfo)) && (pvOut != NULL))
        {
            RawFrameBufferInfo *pRFBI = (RawFrameBufferInfo *)pvOut;
            pRFBI->wBPP = m_pMode->Bpp;
            pRFBI->wFormat= FORMAT_565;
            pRFBI->cxStride = sizeof(WORD);
            pRFBI->cyStride = m_pPrimarySurface->Stride();
            pRFBI->cxPixels = m_pPrimarySurface->Width();
            pRFBI->cyPixels = m_pPrimarySurface->Height();
            pRFBI->pFramePointer = (PVOID)m_pPrimarySurface->Buffer();
            return 1;
        }
        else
        {
            SetLastError (ERROR_INVALID_PARAMETER);
            return -1;
        }
    }
    else if (iEsc == GETGXINFO)
    {
        if((cjOut >= sizeof(GXDeviceInfo)) && (pvOut != NULL) &&
           (m_pMode->Bpp == 8 || m_pMode->Bpp == 16 || m_pMode->Bpp == 24 || m_pMode->Bpp == 32))
        {
            if(((GXDeviceInfo*)pvOut)->idVersion == kidVersion100)
            {
                GXDeviceInfo* pgxoi = (GXDeviceInfo*)pvOut;
                pgxoi->idVersion = kidVersion100;

                if( m_DPI == HIGH_DPI_VALUE || m_DPI == HIGH_DPI_VALUE_TPC )
                {
                    pgxoi->pvFrameBuffer = (void *)m_pvDRAMBuffer;
                    if( m_DPI == HIGH_DPI_VALUE )
                    {
                        pgxoi->cbStride      = DISP_CY_STRIDE;
                        pgxoi->cxWidth       = DISP_CX_SCREEN;
                        pgxoi->cyHeight      = DISP_CY_SCREEN;
                    }
                    else
                    {
                        pgxoi->cbStride      = DISP_CY_STRIDE_TPC;
                        pgxoi->cxWidth       = DISP_CX_SCREEN_TPC;
                        pgxoi->cyHeight      = DISP_CY_SCREEN_TPC;
                    }
                    pgxoi->cBPP = 16;
                    pgxoi->ffFormat = kfDirect | kfDirect565;
                    RETAILMSG(TRUE, (TEXT("m_pvDRAMBuffer is %x \r\n"), m_pvDRAMBuffer ));
                }
                else
                {
                    pgxoi->pvFrameBuffer = (void *)m_pPrimarySurface->Buffer();
                    pgxoi->cbStride      = m_pPrimarySurface->Stride();
                    pgxoi->cxWidth       = m_pPrimarySurface->Width();
                    pgxoi->cyHeight      = m_pPrimarySurface->Height();

                    switch(m_pMode->Bpp)
                    {
                    case 8:
                        pgxoi->cBPP = 8;
                        pgxoi->ffFormat = kfPalette;
                    break;

                    case 16:
                        pgxoi->cBPP = 16;
                        pgxoi->ffFormat = kfDirect | kfDirect565;
                    break;

                    case 24:
                        pgxoi->cBPP = 24;
                        pgxoi->ffFormat = kfDirect | kfDirect888;
                    break;
                
                    case 32:
                        pgxoi->cBPP = 32;
                        pgxoi->ffFormat = kfDirect | kfDirect888;
                    break;
                    }
                }

#ifdef ROTATE  
                if (m_iRotate == DMDO_90 || m_iRotate == DMDO_270 )
                    pgxoi->ffFormat |= kfLandscape;  // Rotated
#endif //ROTATE & ROTATE

                pgxoi->vkButtonUpPortrait = VK_UP;
                pgxoi->vkButtonUpLandscape = VK_LEFT;
                pgxoi->ptButtonUp.x = 88;
                pgxoi->ptButtonUp.y = 250;
                pgxoi->vkButtonDownPortrait = VK_DOWN;
                pgxoi->vkButtonDownLandscape = VK_RIGHT;
                pgxoi->ptButtonDown.x = 88;
                pgxoi->ptButtonDown.y = 270;
                pgxoi->vkButtonLeftPortrait = VK_LEFT;
                pgxoi->vkButtonLeftLandscape = VK_DOWN;
                pgxoi->ptButtonLeft.x = 78;
                pgxoi->ptButtonLeft.y = 260;
                pgxoi->vkButtonRightPortrait = VK_RIGHT;
                pgxoi->vkButtonRightLandscape = VK_UP;
                pgxoi->ptButtonRight.x = 98;
                pgxoi->ptButtonRight.y = 260;
                pgxoi->vkButtonAPortrait = VK_F1;   // Softkey 1
                pgxoi->vkButtonALandscape = VK_F1;
                pgxoi->ptButtonA.x = 10;
                pgxoi->ptButtonA.y = 240;
                pgxoi->vkButtonBPortrait = VK_F2;   // Softkey 2
                pgxoi->vkButtonBLandscape = VK_F2;
                pgxoi->ptButtonB.x = 166;
                pgxoi->ptButtonB.y = 240;
                pgxoi->vkButtonCPortrait = VK_F8;       // Asterisk on keypad
                pgxoi->vkButtonCLandscape = VK_F8;
                pgxoi->ptButtonC.x = 10;
                pgxoi->ptButtonC.y = 320;
                pgxoi->vkButtonStartPortrait = '\r';
                pgxoi->vkButtonStartLandscape = '\r';
                pgxoi->ptButtonStart.x = 88;
                pgxoi->ptButtonStart.y = 260;
                pgxoi->pvReserved1 = (void *) 0;
                pgxoi->pvReserved2 = (void *) 0;

                return 1;
            }
        }
        return -1;
    }

#ifdef ROTATE
    if (iEsc == DRVESC_GETSCREENROTATION)
    {
        *(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
        return DISP_CHANGE_SUCCESSFUL; 
    }
    else if (iEsc == DRVESC_SETSCREENROTATION)
    {
        if ((cjIn == DMDO_0) ||
           (cjIn == DMDO_90) ||
           (cjIn == DMDO_180) ||
           (cjIn == DMDO_270) )
           {
               return DynRotate(cjIn);
           }
        return DISP_CHANGE_BADMODE;
    }
#endif //ROTATE & ROTATE
    
    return 0;
}
#endif //CLEARTYPE

ULONG *APIENTRY DrvGetMasks(DHPDEV dhpdev)
{
    return gBitMasks;
}

#ifdef ROTATE
void S3C2410DISP::SetRotateParms()
{
    int iswap;
    switch(m_iRotate)
    {
    case DMDO_0:
        m_nScreenHeightSave = m_nScreenHeight;
        m_nScreenWidthSave = m_nScreenWidth;
        break;
    case DMDO_180:
        m_nScreenHeightSave = m_nScreenHeight;
        m_nScreenWidthSave = m_nScreenWidth;
        break;
    case DMDO_90:
    case DMDO_270:
        iswap = m_nScreenHeight;
        m_nScreenHeight = m_nScreenWidth;
        m_nScreenWidth = iswap;
        m_nScreenHeightSave = m_nScreenWidth;
        m_nScreenWidthSave = m_nScreenHeight;
        break;
    default:
        m_nScreenHeightSave = m_nScreenHeight;
        m_nScreenWidthSave = m_nScreenWidth;
        break;
    }
    return;
}

LONG S3C2410DISP::DynRotate(int angle)
{
    unsigned __int32 EmulatorAngle;
    volatile S3C2410X_LCD_REG *s2410LCD;

    GPESurfRotate *pSurf = (GPESurfRotate *)m_pPrimarySurface;
    if (angle == m_iRotate)
        return DISP_CHANGE_SUCCESSFUL;

    m_iRotate = angle;

    switch(m_iRotate)
    {
    case DMDO_0:
        m_nScreenHeight = m_nScreenHeightSave;
        m_nScreenWidth = m_nScreenWidthSave;
        EmulatorAngle = 0;
        break;
    case DMDO_90:
        m_nScreenHeight = m_nScreenWidthSave;
        m_nScreenWidth = m_nScreenHeightSave;
        EmulatorAngle = 1;
    break;
    case DMDO_180:
        m_nScreenHeight = m_nScreenHeightSave;
        m_nScreenWidth = m_nScreenWidthSave;
        EmulatorAngle = 2;
        break;
    case DMDO_270:
        m_nScreenHeight = m_nScreenWidthSave;
        m_nScreenWidth = m_nScreenHeightSave;
        EmulatorAngle = 3;
    break;
    }

    // Inform the DeviceEmulator of the change in rotation

    s2410LCD = (S3C2410X_LCD_REG *)VirtualAlloc(NULL, sizeof(*s2410LCD), MEM_RESERVE, PAGE_NOACCESS);
    if (s2410LCD) {
        if (VirtualCopy((PVOID)s2410LCD, (LPVOID)(S3C2410X_BASE_REG_PA_LCD>>8), sizeof(*s2410LCD), PAGE_READWRITE|PAGE_PHYSICAL|PAGE_NOCACHE)) {
            s2410LCD->PAD[0] = EmulatorAngle;
        }
    VirtualFree((LPVOID)s2410LCD, 0, MEM_RELEASE);
    }

    m_pMode->width = m_nScreenWidth;
    m_pMode->height = m_nScreenHeight;
    pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, angle);

    return DISP_CHANGE_SUCCESSFUL;
}

int
S3C2410DISP::GetRotateModeFromReg()
{
    HKEY hKey;

    if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\GDI\\ROTATION"), 0, 0, &hKey))
    {
        DWORD dwSize, dwAngle, dwType = REG_DWORD;
        dwSize = sizeof(DWORD);
        if (ERROR_SUCCESS == RegQueryValueEx(hKey,
                                             TEXT("ANGLE"),
                                             NULL,
                                             &dwType,
                                             (LPBYTE)&dwAngle,
                                             &dwSize))
        {
            switch (dwAngle)
            {
            case 0:
                return DMDO_0;

            case 90:
                return DMDO_90;

            case 180:
                return DMDO_180;

            case 270:
                return DMDO_270;

            default:
                return DMDO_0;
            }
        }

        RegCloseKey(hKey);
    }

    return DMDO_0;
}

#endif //ROTATE

⌨️ 快捷键说明

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