📄 videosetup.cpp
字号:
{ 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 + -