DDDrvEsc.cpp
上传用户:fjqzjn
上传日期:2008-01-21
资源大小:2764k
文件大小:15k
源码类别:

Windows CE

开发平台:

Visual C++

  1. /******************************************************************************
  2. ** Copyright (c) 2004, Intel Corporation
  3. ** Copyright (c) 2003 by Imagination Technologies Limited.
  4. ** All rights reserved.
  5. **
  6. ** The source code contained or described herein and all documents related to the
  7. ** source code ("Material") are owned by Intel Corporation or its suppliers or 
  8. ** licensors. Title to the Material remains with Intel Corporation or its suppliers
  9. ** and licensors. The Material contains trade secrets and proprietary and 
  10. ** confidential information of Intel or its suppliers and licensors. The Material 
  11. ** is protected by worldwide copyright and trade secret laws and treaty provisions.
  12. ** No part of the Material may be used, copied, reproduced, modified, published, 
  13. ** uploaded, posted, transmitted, distributed, or disclosed in any way without 
  14. ** Intel抯 prior express written permission.
  15. ** 
  16. ** No license under any patent, copyright, trade secret or other intellectual 
  17. ** property right is granted to or conferred upon you by disclosure or delivery 
  18. ** of the Materials, either expressly, by implication, inducement, estoppel or 
  19. ** otherwise. Any license under such intellectual property rights must be express 
  20. ** and approved by Intel in writing.
  21. *
  22. * Description  : Dual display drvesc wrapper functions for DualDispDemo
  23. *                application.
  24. *
  25. * Platform     : Marathon/WinCE
  26. *
  27. ***********************************************************************************/
  28. #include "DDDrvEsc.h"
  29. #include <windows.h>
  30. #include <stdlib.h>
  31. #include <stdio.h>
  32. #include <assert.h>
  33. #include "dispconfig.h"
  34. extern FILE* gpStream;
  35. extern "C" BOOL VirtualCopy( 
  36. LPVOID lpvDest, 
  37. LPVOID lpvSrc, 
  38. DWORD cbSize, 
  39. DWORD fdwProtect 
  40. );
  41. #ifndef GETVFRAMEPHYSICAL
  42. #define GETVFRAMEPHYSICAL 6144
  43. #endif
  44. void MarRegWrite(ULONG regindex, DWORD regvalue);
  45. DWORD MarRegRead(ULONG regindex);
  46. void ConfigPrefetchEnable(ULONG ul32FBSize, ULONG ul32Base);
  47. /***********************************************************************************
  48.  Function Name      : DE_CreateSecondarySurfBitmap
  49.  Inputs             : hdcMarathon
  50.  Outputs            : hdcMem
  51.                       hBitmap
  52.                       hOldBitmap
  53.                       sDisplayConfig
  54.  Returns            : Error code
  55.  Description        : Request that a secondary surface (bit map) be created.
  56. ************************************************************************************/
  57. LONG DE_CreateSecondarySurfBitmap(HDC hdcMarathon, 
  58.                                        HDC& hdcMem, 
  59.                                        HBITMAP& hBitmap, 
  60.                                        HGDIOBJ& hOldBitmap, 
  61.                                        BOOL& bSecondarySurfaceCreated)
  62. {
  63.     LONG nDDRetVal = DUALDISPSUCCESS;
  64.     LONG nRetVal;
  65.     /* A new secondary surface should only be created when the old one has been destroyed. */
  66.     assert(bSecondarySurfaceCreated == FALSE);
  67.     DISPCFG_CREATE_SURFACE sSecondarySurface;
  68.     LONG nInputSize = sizeof (DISPCFG_CREATE_SURFACE);
  69.     sSecondarySurface.wWidth = SECONDARYSURFACEWIDTH;
  70.     sSecondarySurface.wHeight = SECONDARYSURFACEHEIGHT;
  71.     assert(hdcMarathon != NULL);
  72.     nRetVal = ExtEscape(hdcMarathon, DRVESC_CREATE_OFFSCREENSURFACE, 
  73.                        nInputSize, (LPSTR) &sSecondarySurface, 0, NULL);
  74.     if (nRetVal < 0)
  75.     {
  76.         TEXTOUT(TEXT("DUALDISPDEMO: DE_CreateSecondarySurfBitmap: DRVESC_CONFIG_DISPLAYSYSTEM error.n"));
  77.         nDDRetVal |= DUALDISPERROR;
  78.         assert(0);
  79.         return nDDRetVal;
  80.     }
  81. hdcMem = CreateCompatibleDC(hdcMarathon);
  82.     hBitmap = CreateCompatibleBitmap(hdcMarathon, SECONDARYSURFACEWIDTH, SECONDARYSURFACEHEIGHT);
  83. hOldBitmap=GetCurrentObject(hdcMem, OBJ_BITMAP);
  84.     SelectObject(hdcMem, hBitmap);
  85.     /* Secondary surface has now been created. */
  86.     bSecondarySurfaceCreated = TRUE;
  87.     return nDDRetVal;
  88. }
  89. /*****************************************************************************
  90.  FUNCTION :  DE_ReleaseDualDisplay
  91.     
  92.  DESCRIPTION:  Releases the Dual Screen lock
  93.  PARAMETERS : 
  94.  
  95.  RETURNS :  BOOL - The current state of the lock
  96. *****************************************************************************/
  97. BOOL DE_ReleaseDualDisplay(HDC hdcMarathon)
  98. {
  99. DISPCFG_ACQUIRE_LOCK sAcquireLock;
  100.     assert(hdcMarathon != NULL);
  101. sAcquireLock.bAcquire=FALSE;
  102. sAcquireLock.bRelease=TRUE;
  103. ExtEscape( 
  104. hdcMarathon,            // HDC hdc, 
  105.         DRVESC_ACQUIRE_DUALDISPLAY,             
  106.         sizeof(DISPCFG_ACQUIRE_LOCK) ,                   
  107.         (LPCSTR )&sAcquireLock,                    
  108.         sizeof(DISPCFG_ACQUIRE_LOCK) ,      
  109.         (LPSTR)&sAcquireLock                    
  110.       );
  111. return FALSE;
  112. }
  113. /*****************************************************************************
  114.  FUNCTION :  AqcuireDualDisplay
  115.     
  116.  DESCRIPTION:  Acquires the Dual Screen lock
  117.  PARAMETERS : 
  118.  
  119.  RETURNS :  BOOL - The current state of the lock
  120. *****************************************************************************/
  121. BOOL DE_AcquireDualDisplay(HDC hdcMarathon)
  122. {
  123. DISPCFG_ACQUIRE_LOCK sAcquireLock;
  124.     assert(hdcMarathon != NULL);
  125. sAcquireLock.bAcquire=TRUE;
  126. sAcquireLock.bRelease=FALSE;
  127. ExtEscape( 
  128. hdcMarathon,            // HDC hdc, 
  129.         DRVESC_ACQUIRE_DUALDISPLAY,             
  130.         sizeof(DISPCFG_ACQUIRE_LOCK) ,                   
  131.         (LPCSTR )&sAcquireLock,                    
  132.         sizeof(DISPCFG_ACQUIRE_LOCK) ,      
  133.         (LPSTR)&sAcquireLock                    
  134.       );
  135. return (BOOL)sAcquireLock.bSuccess;
  136. }
  137. /***********************************************************************************
  138.  Function Name      : DE_ConfigureDisplaySystem
  139.  Inputs             : sDisplayConfig
  140.                       hdcMarathon
  141.  Outputs            : 
  142.  Returns            : Error code
  143.  Description        : Pass a "display configuration" to a Marathon drvesc. sDisplayConfig 
  144.                       stores the required configuration of the LCD Switch, and
  145.                       also describes which surface is to connected to the PDP,
  146.                       (i.e. Desktop surface or secondary display surface).
  147.                       The drvesc will program up the Marathon as specified by 
  148.                       sDisplayConfig.
  149. ************************************************************************************/
  150. LONG DE_ConfigureDisplaySystem(DISPCFG_DISPLAY_SYSTEM& sDisplayConfig, HDC hdcMarathon)
  151. {
  152.     /* Connect Desktop or Off-Screen surface to PDP and program LCD Switch. */
  153.     LONG nDDRetVal = DUALDISPSUCCESS;
  154.     LONG nRetVal = 0;
  155.     LONG nInput = sizeof(DISPCFG_DISPLAY_SYSTEM);
  156.     assert(hdcMarathon != NULL);
  157.     nRetVal = ExtEscape(hdcMarathon, DRVESC_CONFIG_DISPLAYSYSTEM, nInput, (LPSTR) &sDisplayConfig, 0, NULL);
  158.     if (nRetVal < 0)
  159.     {
  160.         /* Note: this drvesc will fail when the requested mode cannot be found. */
  161.         TEXTOUT(TEXT("DUALDISPDEMO: DE_ConfigureDisplaySystem: Drvesc failure: DRVESC_CONFIG_DISPLAYSYSTEM.n"));
  162.         nDDRetVal |= DUALDISPERROR;
  163.         return nDDRetVal;
  164.     }
  165.     return nDDRetVal;
  166. }
  167. /***********************************************************************************
  168.  Function Name      : DE_GetMarathonSurfaceInfo
  169.  Inputs             : eDisplaySurface
  170.                       hdcMarathon
  171.  Outputs            : sMarathonSurfaceInfo
  172.  Returns            : Error code
  173.  Description        : Return surface information about the surface specified by
  174.                       eDisplaySurface (Desktop or Secondary surface). A drvesc
  175.                       is called to obtain the surface information.
  176. ************************************************************************************/
  177. LONG DE_GetMarathonSurfaceInfo(DISPCFG_GET_SURFACE_INFO& sMarathonSurfaceInfo, 
  178.                                DCFG_DISPLAY_SURFACE eDisplaySurface, HDC hdcMarathon)
  179. {
  180.     /* Get DISPCFG_GET_SURFACE_INFO */
  181.     LONG nDDRetVal = DUALDISPSUCCESS;
  182.     LONG nInput = sizeof(DISPCFG_GET_SURFACE_INFO);
  183.     LONG nOutput = sizeof(DISPCFG_GET_SURFACE_INFO);
  184.     USHORT* pMarathonFB;
  185.     ULONG ulAddr;
  186.     LONG nRetVal;
  187.     LONG nFBPixels;
  188.     assert(hdcMarathon != NULL);
  189.     sMarathonSurfaceInfo.eDisplaySurface = eDisplaySurface; 
  190.     nRetVal = ExtEscape(hdcMarathon, DRVESC_GET_SURFACEINFO, nInput, (LPSTR) &sMarathonSurfaceInfo, 
  191.                         nOutput, (LPSTR) &sMarathonSurfaceInfo);
  192.     if (nRetVal < 0)
  193.     {
  194.         TEXTOUT(TEXT("DUALDISPDEMO: DE_GetMarathonSurfaceInfo: DRVESC_GET_SURFACEINFO error.n"));
  195.         nDDRetVal |= DUALDISPERROR;
  196.         assert(0);
  197.         return nDDRetVal;
  198.     }
  199.     /* Get frame buffer address */
  200. ulAddr = sMarathonSurfaceInfo.sPhysSurfaceInfo.ulPhysAddress;
  201.     if (ulAddr == NULL)
  202.     {
  203.         TEXTOUT(TEXT("DUALDISPDEMO: DE_GetMarathonSurfaceInfo: DRVESC_GET_SURFACEINFO failed to return ul32PhysAddress.n"));
  204.         nDDRetVal |= DUALDISPERROR;
  205.         return nDDRetVal;
  206.     }
  207.     /* Marathon surface could be either Desktop or secondary surface. */
  208.     nFBPixels = sMarathonSurfaceInfo.sPhysSurfaceInfo.ulWidth * sMarathonSurfaceInfo.sPhysSurfaceInfo.ulHeight;
  209.     ULONG ul32EnableCache = MARATHON_CACHE_ENABLED;
  210.     /* Map it to a virtual address */
  211.     pMarathonFB = (USHORT*) getMemory(ulAddr, (nFBPixels * sizeof(USHORT)), ul32EnableCache);
  212.     if (pMarathonFB == NULL)
  213.     {
  214.         TEXTOUT(TEXT("DUALDISPDEMO: DE_GetMarathonSurfaceInfo: getMemory error.n"));
  215.         nDDRetVal |= DUALDISPERROR;
  216.         return nDDRetVal;
  217.     }
  218.     /* Write virtual memory address back to surface info */
  219.     sMarathonSurfaceInfo.sPhysSurfaceInfo.ulPhysAddress = (ULONG) pMarathonFB;
  220.     return nDDRetVal;
  221. }
  222. /***********************************************************************************
  223.  Function Name      : getMemory
  224.  Inputs             : dwPhysAddr
  225.                       size
  226.                       dwCacheEnabled
  227.  Outputs            : 
  228.  Returns            : pvoid (pointer to virtual address).
  229.  Description        : Maps physical memory to a virtual address.
  230. ************************************************************************************/
  231. void* getMemory(DWORD dwPhysAddr, DWORD dwSize, DWORD dwCacheEnabled)
  232. {
  233.   void* pVoid;
  234.   DWORD dwPageNoCache;
  235.   void* pvMemc = VirtualAlloc(0, dwSize, MEM_RESERVE, PAGE_NOACCESS);
  236.   
  237.   if (pvMemc == 0)
  238.     {
  239.       assert(0);
  240.       return 0;
  241.     }
  242.   
  243.   if (!dwCacheEnabled)
  244.     {
  245.       /* Disable cache */
  246.       dwPageNoCache = PAGE_NOCACHE;
  247.     }
  248.   else
  249.     {
  250.       /* Do not disable cache */
  251.       dwPageNoCache = 0;
  252.     }
  253.   /* Access SRAM */
  254.   if (!VirtualCopy(pvMemc, (void*) (dwPhysAddr / 256), 
  255.                    dwSize, PAGE_READWRITE | PAGE_PHYSICAL | dwPageNoCache)) 
  256.     {
  257.       /* Memory allocation has failed */
  258.       /* Release virtual memory, close logfile and exit */
  259.       VirtualFree(pvMemc, 0, MEM_RELEASE);
  260.       assert(0);
  261.       return NULL;
  262.     }
  263.   pVoid = (ULONG*) pvMemc;
  264.   return pVoid;
  265. }
  266. #define PAGE_SIZE 0x1000
  267. #define ALIGNMENT_MASK (PAGE_SIZE-1)
  268. /***********************************************************************************
  269.  Function Name      : DE_GetXScaleSurfaceInfo
  270.  Inputs             : hdcXScale
  271.  Outputs            : sXScaleSurfaceInfo
  272.  Returns            : Error code
  273.  Description        : Fills in XScale surface information struct.
  274. ************************************************************************************/
  275. LONG DE_GetXScaleSurfaceInfo(XSCALE_SURFACE_INFO& sXScaleSurfaceInfo, HDC hdcXScale)
  276. {
  277.     LONG nDDRetVal = DUALDISPSUCCESS;
  278.     LONG nRetVal;
  279.     ULONG ulXScaleFB;
  280.     LONG nOutput = sizeof(ULONG);
  281.     LONG nInput = 0;
  282.     assert(hdcXScale != NULL);
  283.     sXScaleSurfaceInfo.ulBpp = XSCALE_DISPLAY_BPP;
  284.     sXScaleSurfaceInfo.ulWidth = XSCALE_DISPLAY_WIDTH;
  285.     sXScaleSurfaceInfo.ulHeight = XSCALE_DISPLAY_HEIGHT;
  286.     sXScaleSurfaceInfo.ulStride = XSCALE_DISPLAY_STRIDE;
  287.     sXScaleSurfaceInfo.nPhysicalRotation = XSCALE_DISPLAY_PHYS_ROTATION;
  288.     sXScaleSurfaceInfo.bDouble = (BOOL) XSCALE_DISPLAY_DOUBLE;
  289.     /* Get XScale Frame Buffer */
  290.     nRetVal = ExtEscape(hdcXScale, GETVFRAMEPHYSICAL, nInput, NULL, nOutput,(LPSTR) &ulXScaleFB);
  291.     if (nRetVal <= 0)
  292.     {
  293.         TEXTOUT(TEXT("DUALDISPDEMO: DE_CreateSecondarySurfBitmap: DRVESC_CONFIG_DISPLAYSYSTEM error.n"));
  294.         nDDRetVal |= DUALDISPERROR;
  295.         assert(0);
  296.         return nDDRetVal;
  297.     }
  298.     /* Only page-aligned addresses can be mapped (page size is 4096 bytes). Hence, it may be 
  299.     necessary to map an address from the preceding page boundary. If so, the 'offset' 
  300.     must be added to the mapped address to obtain the frame buffer address. */
  301.     void* pvPtr;
  302. ULONG ul32SourcePtr;
  303.     ULONG ul32Offset;
  304. ULONG ul32ExtraFlags = 0;
  305.     ULONG ul32MappedSize;
  306.     BOOL bEnableCache = (BOOL) XSCALE_CACHE_ENABLED;
  307.     ul32MappedSize = sXScaleSurfaceInfo.ulWidth * sXScaleSurfaceInfo.ulHeight * sizeof(USHORT);
  308.     /* Mapping a virtual address */
  309.     BOOL bPhysicalAddress = FALSE;
  310. ////////////////// Calculate require space and reserve linear range
  311. ul32Offset = ulXScaleFB & ALIGNMENT_MASK;
  312. ul32MappedSize += ul32Offset ? PAGE_SIZE : 0;
  313. pvPtr = VirtualAlloc(0, ul32MappedSize, MEM_RESERVE, PAGE_NOACCESS);
  314. if(pvPtr == NULL)
  315.         return(FALSE);
  316. /////////////////////////////// Are we mapping a physical address ?
  317. ul32SourcePtr = (ulXScaleFB - ul32Offset);
  318. if (bPhysicalAddress)
  319. {
  320. ul32ExtraFlags = PAGE_PHYSICAL;
  321. ul32SourcePtr  = ul32SourcePtr / 256;
  322. }
  323.     if (bEnableCache == FALSE)
  324.     {
  325.         ul32ExtraFlags |= PAGE_NOCACHE;
  326.     }
  327. ///////////////////////////////////// Map virtual address to linear
  328. if(!VirtualCopy(pvPtr, (PVOID)ul32SourcePtr, ul32MappedSize,
  329. PAGE_READWRITE | ul32ExtraFlags)) 
  330. {
  331. VirtualFree(pvPtr, 0, MEM_RELEASE);
  332.         nDDRetVal |= DUALDISPERROR;
  333. return nDDRetVal;
  334. }
  335.     /* Copy this address so that it can eventually be de-allocated. */
  336.     sXScaleSurfaceInfo.ulPageAddress = (ULONG) pvPtr;
  337.     /* Get the frame buffer address - which may be an offset from the mapped address. */
  338.     sXScaleSurfaceInfo.ulPhysAddress = (LONG) ( (PBYTE) pvPtr + ul32Offset);
  339.     return nDDRetVal;
  340. }
  341. /***********************************************************************************
  342.  Function Name      : DE_CheckForScreenUpdate
  343.  Inputs             : hdcMarathon
  344.  Outputs            : bIsDirty
  345.  Returns            : Error code
  346.  Description        : Calls a Marathon drvesc to find out whether the Marathon primary
  347.                       surface has been updated. This means that the 'Desktop to XScale' 
  348.                       transfer functions only need to update the XScale frame buffer
  349.                       when a change has occurred.
  350. ************************************************************************************/
  351. LONG DE_CheckForScreenUpdate(HDC hdcMarathon, BOOL& bIsDirty)
  352. {
  353.     LONG nDDRetVal = DUALDISPSUCCESS;
  354.     LONG nRetVal = 0;
  355.     LONG nInput = sizeof(DISPCFG_DISPLAY_SYSTEM);
  356.     assert(hdcMarathon != NULL);
  357.     nRetVal = ExtEscape(hdcMarathon, DRVESC_DIRTY, 0, NULL, sizeof(BOOL), (LPSTR) &bIsDirty);
  358.     if (nRetVal < 0)
  359.     {
  360.         TEXTOUT(TEXT("DUALDISPDEMO: Drvesc failure: DRVESC_CONFIG_DISPLAYSYSTEM.n"));
  361.         nDDRetVal |= DUALDISPERROR;
  362.         assert(0);
  363.         return nDDRetVal;
  364.     }
  365.     return nDDRetVal;
  366. }