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

📄 videosetup.cpp

📁 EP9315 BSP for WinCE 源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    { 690, VIDDIV_PDIV_3  | (115 & VIDDIV_VDIV_MASK) },
    { 696, VIDDIV_PDIV_3  | (116 & VIDDIV_VDIV_MASK) },
    { 702, VIDDIV_PDIV_3  | (117 & VIDDIV_VDIV_MASK) },
    { 708, VIDDIV_PDIV_3  | (118 & VIDDIV_VDIV_MASK) },
    { 714, VIDDIV_PDIV_3  | (119 & VIDDIV_VDIV_MASK) },
    { 720, VIDDIV_PDIV_3  | (120 & VIDDIV_VDIV_MASK) },
    { 726, VIDDIV_PDIV_3  | (121 & VIDDIV_VDIV_MASK) },
    { 732, VIDDIV_PDIV_3  | (122 & VIDDIV_VDIV_MASK) },
    { 738, VIDDIV_PDIV_3  | (123 & VIDDIV_VDIV_MASK) },
    { 744, VIDDIV_PDIV_3  | (124 & VIDDIV_VDIV_MASK) },
    { 750, VIDDIV_PDIV_3  | (125 & VIDDIV_VDIV_MASK) },
    { 756, VIDDIV_PDIV_3  | (126 & VIDDIV_VDIV_MASK) },
    { 762, VIDDIV_PDIV_3  | (127 & VIDDIV_VDIV_MASK) }
};


const unsigned long rgb_gs_lut_g[32] = 
{
    // ALL 0  ,    14.2% ,    28.6% ,    42.9% ,    57.1% ,     71.4% ,    85.7%  ,   100%
    0x00070000, 0x00004080, 0x000160c0, 0x00029912, 0x000366cc, 0x0004cfbe, 0x0005bf5e, 0x0007ffff, 
    0x00000000, 0x00001028, 0x00001838, 0x00002664, 0x0000d9bb, 0x0000f3cf, 0x0000eff7, 0x0007ffff, 
    0x00000000, 0x00008402, 0x00008606, 0x0000c99b, 0x0000b666, 0x0000fcf3, 0x0000fbff, 0x0007ffff, 
    0x00000000, 0x00000100, 0x00004181, 0x00003264, 0x00004d99, 0x00001f3c, 0x00007efd, 0x0007ffff, 
};

const unsigned long rgb_gs_lut_r[32] = 
{
    // ALL 0  ,    14.2% ,    28.6% ,    42.9% ,    57.1% ,     71.4% ,    85.7%  ,   100%
    0x00070000, 0x00060100, 0x00070c0c, 0x00002664, 0x00019b33, 0x0002fcf3, 0x0003dfaf, 0x0007ffff, 
    0x00000000, 0x00002040, 0x00008303, 0x0000c99b, 0x000066cc, 0x00001f3c, 0x0000f7ff, 0x0000ffff, 
    0x00000000, 0x00000814, 0x000060c0, 0x00003264, 0x0000d9bb, 0x0000e7df, 0x0000fdfb, 0x0000ffff, 
    0x00000000, 0x00004201, 0x00001838, 0x00004c89, 0x0000b666, 0x0000f9e7, 0x0000bf7e, 0x0000ffff, 
};
const unsigned long rgb_gs_lut_b[32] = 
{
    // ALL 0  ,    14.2%  ,    28.6%  ,    42.9%  ,    57.1%  ,     71.4% ,    85.7%  ,   100%
    0x00070000, 0x00040814, 0x00058303, 0x00064c89, 0x00074d99, 0x0000f3cf, 0x0001fbff, 0x0007ffff, 
    0x00000000, 0x00004201, 0x000060c0, 0x00009332, 0x0000b376, 0x0000fcf3, 0x00007efd, 0x0000ffff, 
    0x00000000, 0x00000080, 0x00001838, 0x000064cd, 0x00006ccd, 0x00001f3c, 0x0000dfaf, 0x0000ffff, 
    0x00000000, 0x00001020, 0x00008606, 0x00009932, 0x0000db33, 0x0000e7df, 0x0000f7fb, 0x0000ffff, 
};


void FillInGreyScaleLutsForRGB(void);

//****************************************************************************
// CalculateClosestFreq
//****************************************************************************
// CalculateClosestFreq
// 
//   ulPLLFreq           -  PLL output Frequency (Mhz)
//   ulRequestedVidFreq  -  Requested Video Clock Frequency.
//   pulActualVideoFreq  -  Returned Actual Video Rate.
//   pulVidDiv           -  Video Divider register.
//
//   Return            0 - Failure
//                     1 - Success
//
static int CalculateClosestFreq
(
    ULONG   ulPLLFreq, 
    ULONG   ulRequestedVideoFreq,
    PULONG  pulActualVideoFreq,
    PULONG  pulVidDiv
)
{
    
    ULONG   ulLower;
    ULONG   ulUpper;
    ULONG   ulDiv;
    int     x;


    //
    // Calculate the closest divisor.
    //
    ulDiv =  (ulPLLFreq * 2)/ ulRequestedVideoFreq;

    for(x = 1; x < sizeof(VidDivTable)/sizeof(DIV_TABLE); x++)
    {

        //
        // Calculate the next greater and lower value.
        //
        ulLower = VidDivTable[x - 1].ulTotalDiv;     
        ulUpper = VidDivTable[x].ulTotalDiv;     

        //
        // Check to see if it is in between the two values.
        //
        if(ulLower <= ulDiv && ulDiv < ulUpper)
        {
            break;
        }
    }

    //
    // Return if we did not find a divisor.
    //
    if(x == sizeof(VidDivTable)/sizeof(DIV_TABLE))
    {
        *pulActualVideoFreq = 0;
        *pulVidDiv          = 0;
        return 0;
    }

    //
    // See which is closer, the upper or the lower case.
    //
    if(ulUpper * ulRequestedVideoFreq - ulPLLFreq * 2 >  
      ulPLLFreq * 2 - ulLower * ulRequestedVideoFreq)
    {
        x-=1;
    }
    *pulActualVideoFreq = (ulPLLFreq * 2)/ VidDivTable[x].ulTotalDiv;
    *pulVidDiv          = VidDivTable[x].ulVidDiv;
    return(1);
}


//****************************************************************************
// CRTVideoSetup
//****************************************************************************
//
//  ulWidth                 - Screen Width
//  ulHeight                - Screen Height 
//  ulColorDepth            - Color Depth
//  ulFrequency             - Refresh rate in Hertz.
//  ulPhysicalFramePointer  - Physical Address of the frame buffer.
//  pStartStop              - OUT Start Stop values for HSYNC.
//
// Here is the video setup for standard CRT monitiors.  Remember that the 
// horizontal sync must be at least 33Mhz and the refresh rate must be
// 60 Hz.
// 
//                                                       VSync---------+
//                                                                     |
//  |                                                                  V |
//  |                                                                |< >|
//  |            |                                         |             |
//  |<  VBlank  >|<---------- Screen Height--------------->|<  VBlank   >|
//  |    Start   |                                         |     End     |
//  |                                                                    |
//  |<----------------------- VLines Total ----------------------------->|
//
//
//                                                                       
//  |                   |                                                |
//  |<--HBlank Start--->|                                                |
//  |                   |                                  |             |
//  |           |       |                                  |             |
//  |<  HSync  >|       |<---------- Screen Width--------->|<  HBlank   >|
//  |           |       |                                  |     End     |
//  |                                                                    |
//  |<----------------------- HClocks Total ---------------------------->|
//
//
//  VBlankStart = 6.04  % of Screen Height
//  VBlankEnd   = 3.54 % of Screen Height
//  VSync       = .41 % of Screen Height
//
//  HBlankEnd   = 2.34 % of Screen Width
//  HBlankStart = 20.1 % of Screen Width
//  HSyncStart  = 15 % of Screen Width 
//
//
// These are the proportions of the windows.
//
#define     VBLANKSTART_SIZE     604
#define     VBLANKEND_SIZE       354
#define     VSYNC_SIZE           41
//#define     HBLANKEND_SIZE       234
//#define     HBLANKSTART_SIZE     2010
//#define     HSYNC_SIZE           1500
#define     HBLANKEND_SIZE        400
#define     HBLANKSTART_SIZE     4010
#define     HSYNC_SIZE           2000
#define     SIZE_DIVISOR         10000


void CRTVideoSetup
(
    ULONG           ulWidth, 
    ULONG           ulHeight, 
    ULONG           ulColorDepth, 
    ULONG           ulFrequency, 
    ULONG           ulPhysicalFramePointer,
    StartStop *     pStartStop
)
{

    ULONG   ulVStartBlankSize;
    ULONG   ulVEndBlankSize;
    ULONG   ulVSyncSize;
    ULONG   ulVLinesTotal;
    ULONG   ulHStartBlankSize;
    ULONG   ulHEndBlankSize;
    ULONG   ulHSyncSize;
    ULONG   ulHClocksTotal;
    
    ULONG   ulVBlankStart;
    ULONG   ulVBlankStop;
    ULONG   ulVSyncStart;
    ULONG   ulVSyncStop;
    ULONG   ulHBlankStart;
    ULONG   ulHBlankStop;
    ULONG   ulHSyncStart;
    ULONG   ulHSyncStop;
    ULONG   ulVidDiv, ulVid1Div, ulVid2Div;
    ULONG   ulVid1Freq, ulVid2Freq;
    ULONG   ulRequestedVideoFreq;
    ULONG   ulTemp;

    ulTemp = *GPIO_PADDR;
    *GPIO_PADDR = ulTemp | 0x2;

    ulTemp = *GPIO_PADR;
    *GPIO_PADR = ulTemp | 0x2;

        
    //
    // Calculate the sizes of each of the blocks in pixels
    //
    ulVStartBlankSize   = (VBLANKSTART_SIZE * ulHeight) / SIZE_DIVISOR;
    ulVEndBlankSize     = (VBLANKEND_SIZE * ulHeight) / SIZE_DIVISOR;
    ulVSyncSize         = 1 + (VSYNC_SIZE * ulHeight) / SIZE_DIVISOR;
    ulVLinesTotal       = ulVStartBlankSize + ulVEndBlankSize + ulHeight;
    ulHStartBlankSize   = (HBLANKSTART_SIZE * ulWidth) / SIZE_DIVISOR;
    ulHEndBlankSize     = (HBLANKEND_SIZE * ulWidth) / SIZE_DIVISOR;
    ulHSyncSize         = (HSYNC_SIZE * ulWidth) / SIZE_DIVISOR;
    ulHClocksTotal      = ulHStartBlankSize + ulHEndBlankSize + ulWidth;

    //
    // Calculate the starting and stoping pointer for each in the frame.
    //
    pStartStop->ulVActiveStop   = ulVEndBlankSize;
    pStartStop->ulVActiveStart  = ulVEndBlankSize + ulHeight;
    pStartStop->ulHActiveStop   = ulHEndBlankSize;
    pStartStop->ulHActiveStart  = ulHEndBlankSize + ulWidth;
    ulVBlankStop                = ulVEndBlankSize;
    ulVBlankStart               = ulVEndBlankSize + ulHeight;
    ulVSyncStart                = ulVSyncSize;
    ulVSyncStop                 = 0;
    ulHBlankStop                = ulHEndBlankSize;
    ulHBlankStart               = ulHEndBlankSize + ulWidth;
    ulHSyncStop                 = ulHClocksTotal - ulHSyncSize;
    ulHSyncStart                = ulHClocksTotal;


    //
    // Change to Raster on P3.
    //
    HalWriteCommonReg(CSC_DEVCFG, DEVCFG_RAS | DEVCFG_RASONP3, DEVCFG_RASONP3);

    ulRequestedVideoFreq = ( ulFrequency * ulHClocksTotal * ulVLinesTotal);

    CalculateClosestFreq
    (
        PLL1_CLOCK, 
        ulRequestedVideoFreq,
        &ulVid1Freq,
        &ulVid1Div
    );
    CalculateClosestFreq
    (
        PLL2_CLOCK, 
        ulRequestedVideoFreq,
        &ulVid2Freq,
        &ulVid2Div
    );

    //
    // See which is closer, Video rate 1 or video rate 2.
    //
    if(abs(ulVid1Freq - ulRequestedVideoFreq) <abs(ulVid2Freq -ulRequestedVideoFreq))
    {
        ulVidDiv =ulVid1Div;
    }
    else
    {
        ulVidDiv =ulVid2Div | VIDDIV_PSEL;
    }
    

    HalWriteCommonReg(CSC_VIDDIV, 0xFFFFFFFF, VIDDIV_VENA | VIDDIV_ESEL | ulVidDiv);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_VLINESTOTAL      = ulVLinesTotal;
    ASSERT(ulVLinesTotal <VLINESTOTAL_MASK);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_VSYNCSTRTSTOP    = (ulVSyncStart<<RASTER_START_SHIFT) | (ulVSyncStop<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_VBLANKSTRTSTOP   = (ulVBlankStart<<RASTER_START_SHIFT) | (ulVBlankStop<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_VACTIVESTRTSTOP  = ( pStartStop->ulVActiveStart<<RASTER_START_SHIFT) | 
                               ( pStartStop->ulVActiveStop<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_VCLKSTRTSTOP     = (ulVLinesTotal<<RASTER_START_SHIFT) | (ulVLinesTotal<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_HCLKSTOTAL       = ulHClocksTotal;

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_HSYNCSTRTSTOP    = (ulHSyncStart<<RASTER_START_SHIFT) | (ulHSyncStop<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_HBLANKSTRTSTOP   = (ulHBlankStart<<RASTER_START_SHIFT) | (ulHBlankStop<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_HACTIVESTRTSTOP  = (pStartStop->ulHActiveStart<<RASTER_START_SHIFT) | 
                               (pStartStop->ulHActiveStop<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_HCLKSTRTSTOP     = (ulHClocksTotal<<RASTER_START_SHIFT) | (ulHClocksTotal<<RASTER_STOP_SHIFT);

    *RASTER_REALITI_SWLOCK   = 0xaa;
    *RASTER_LINECARRY        = 0x00;

    *RASTER_SCRNLINES        = ulHeight -1 ;
    *RASTER_LINELENGTH       = (ulWidth * ulColorDepth) / 32 -1;
    *RASTER_VLINESTEP        = (ulWidth * ulColorDepth) / 32;
    *RASTER_VIDSCRNPAGE      = ulPhysicalFramePointer & VIDSCRNPAGE_MASK;
    

⌨️ 快捷键说明

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