Re: bootloader and framebuffer
Juergen Messerer <[email protected]> Tue, 16 Mar 2004 18:39:27 +0100
| Newsgroups | gmane.comp.handhelds.simpad.linux |
|---|---|
| Message-ID | <[email protected]> |
Okay here are the original files from the simpad bootloader.
Since Keith and koep also have taken the code from mediaq I think
we can release this part too.
The following lines should be call in the main thread of the bootloader.
#ifdef MEDIAQ
udelay(100);
mediaq_on();
setup_mq200();
#endif
I hope it will helps a littlebit.
Best regards
Juergen
Michael Lauer wrote:
>Am Mo, den 23.02.2004 schrieb Alex Lange um 12:38:
>
>
>>I need your help again with the hh.org bootldr. The kernel boots correctly
>>without the mq200 framebuffer support, but with framebuffer support the
>>kernel hangs when initialising it. Is there anything special that needs to be
>>set by the bootloader to get the framebuffer going?
>>
>>
>
>Sorry for disturbing the hibernation but... any news on that?
>
>
>
mq200.c.org
(text/plain, 20.9 KB)
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) 1999 MediaQ, Inc.
//
//#include <windows.h>
//#include <tchar.h>
#include "mqhw.h"
#include "mq200.h"
#include "misc.h"
//#define DUMP_REG
#define Sleep(a) udelay(a*1000)
int rand(void);
int display_on(int on);
void gen_pattern(void);
#define Random() rand()
// Prototypes
//
void writeBrightness(int brightness);
void FindPhysicalAddr(void);
int MapAddr(void);
unsigned long CheckID(void);
void ConfigDisplay(void);
void InitChip(void);
void SetupLCD(void);
void SetupCRT(void);
void SetupDAC(void);
PMQ_TIMING_PARAM GetMQTiming(USHORT,USHORT,USHORT);
void GetMQPLL(float,unsigned long*);
int InVBlank(void);
void do_blt(void);
void panel_demo(void);
void crt_demo(void);
void rfill(unsigned long x, unsigned long y,
unsigned long dx, unsigned long dy, unsigned long colour,unsigned long rop);
void rfill2(unsigned long x, unsigned long y,
unsigned long dx, unsigned long dy, unsigned long colour,unsigned long rop);
void s2s(unsigned sx,
unsigned int sy,
unsigned int dx,
unsigned int dy,
unsigned int w,
unsigned int h,
unsigned int rop);
void CleanUp(void);
void gen_lines(void);
void test_brightness(void);
#ifdef CHECK_GE_NOTBUSY
void WaitGENotBusy(void);
#endif //CHECK_GE_NOTBUSY
#ifdef CHECK_CMDFIFO
void WaitCmdFIFO(ULONG);
#endif //CHECK_CMDFIFO
#ifdef CHECK_SRCFIFO
void WaitSrcFIFO(ULONG);
#endif //CHECK_SRCFIFO
// Global data
//
char *m_pMMIO; // Pointer to memory-mapped register space
char *m_pFB; // Pointer to frame buffer address
unsigned long ulPhysicalMMIO; // Physical address of mmio
unsigned long ulPhysicalFB; // Physical address of frame buffer
unsigned long ulPLL2, ulPLL3;
DISPLAY_CONFIG dspconfig; // Display configuration
PFP_CONTROL_STRUC m_pFPControl; //Pointer to active FP structure
PMQ_TIMING_PARAM m_pCRTTiming; //Pointer to timing for CRT
void CHECK_IF_STATE_D( s )
{
unsigned long ulState = (s);
unsigned long ulPMReg;
while (1)
{
ulPMReg = pciREAD(PCI_PM_CNTL_STATUS);
if ((ulPMReg & 0x03L) == ulState)
break;
}
}
int ulID=0;
//
// Main program entry point ...
//
int setup_mq200 (void)
{
// *(long *)0xa000002c=0x42194449;
printf("MSC2=0x%08lx :: ", *(long *) 0xa000002c);
FindPhysicalAddr();
#if MAP_DEVICE
if (!MapAddr())
{
printf("MapAddr Fail ...\r\n");
return FALSE;
}
#endif
ulID = CheckID();
if (ulID != MQ200_DEVICE)
{
printf("Read back MQ200 ID is %08x ...\r\n",ulID);
printf("Correct Device ID should be 0x02004D51.\r\n");
return FALSE;
}
ConfigDisplay();
InitChip();
// do_blt();
gen_pattern();
gen_lines();
writeBrightness(128);
#if 0
test_brightness();
#endif
#if MAP_DEVICE
CleanUp();
#endif
return (TRUE);
}
//
// SH3 7709 and SH4:
// 0x93800000L
// TX3922:
// 0x6D800000L
// SA1110:
// 0x1B800000L (nCS[3])
// 0x43800000L (nCS[4])
// 0x4B800000L (nCS[5])
// PCI:
// From PCI configuration space
//
#define FB_BASE 0x4B800000L
void FindPhysicalAddr(void)
{
m_pFB = (char *) FB_BASE;
m_pMMIO = (char *) FB_BASE + 0x600000L;
ulPhysicalFB = FB_BASE;
ulPhysicalMMIO = FB_BASE + 0x600000L;
}
#if MAP_DEVICE
// Map physical address to linear address using system call
// - This will be different depending on target OS ...
//
int MapAddr(void)
{
BOOL status = TRUE;
// Allocate and map memory space for 2MB of frame buffer
//
m_pFB = (LPBYTE)VirtualAlloc( 0, FB_SIZE, MEM_RESERVE, PAGE_NOACCESS );
status = VirtualCopy( m_pFB, (LPVOID)ulPhysicalFB, FB_SIZE,
PAGE_READWRITE|PAGE_NOCACHE );
if ( status == FALSE )
return (FALSE);
// Allocate and map MQ200 register space
//
m_pMMIO = (LPBYTE)VirtualAlloc( 0, MMIO_SIZE, MEM_RESERVE, PAGE_NOACCESS );
status = VirtualCopy( m_pMMIO, (LPVOID)ulPhysicalMMIO, MMIO_SIZE,
PAGE_READWRITE|PAGE_NOCACHE );
if (status == FALSE)
return (FALSE);
return (TRUE);
}
#endif
// This routine return MQ200 PCI vendor ID
//
unsigned long CheckID(void)
{
return (pciREAD(PCI_VENDOR_DEVICE));
}
// This sample code demonstrates flat panel (LCD) running 800x600x8 mode
// and CRT running 1024x768x16 mode. Graphics Controller 2 (GC2) is used
// to drive LCD and GC1 to drive CRT. GC1 uses PLL2 and GC2 uses PLL3.
// MIU, GE and bus is clocked by PLL1 running 83MHz.
//
// - Memory limitation: (watch out starting boundary)
// GC1+GC2+DSTN half FB+HW cursor < 2MB
//
void ConfigDisplay(void)
{
dspconfig.paneltype = 4; // SVGA TFT (800x600)
dspconfig.panelbpp = 16 ; //8; // 16 bits per pixel mode
m_pFPControl = &FPControlData[dspconfig.paneltype-1];
dspconfig.panelstride = m_pFPControl->usHoriSize * dspconfig.panelbpp / 8;
dspconfig.panelstartaddr = 0;
dspconfig.crtx = 1024;
dspconfig.crty = 768;
dspconfig.crtbpp = 8;
dspconfig.crtfreq = 70;
dspconfig.crtstride = dspconfig.crtx * dspconfig.crtbpp / 8;
dspconfig.crtstartaddr = dspconfig.panelstride * m_pFPControl->usVertSize;
}
///////////////////////////////////////////////////////////////////////
//// Initialization sequence ...
////
//// 1. Setup DCR00R - for bus clock/MIU/GE etc...
//// 2. Enter D0 state from reset (D3 state)
//// 3. Setup PMU.
//// 4. Setup MIU.
//// 5. Misc registers
//// 6. Set up LCD-related registers and PLL - enable it afterwards
//// 7. Set up CRT-related registers and PLL - enable it afterwards
///////////////////////////////////////////////////////////////////////
void InitChip(void)
{
unsigned long ulClassRevID;
ULONG ulTemp;
// Set up DC00R (PLL1) for BIU, GE and MIU clock - 83MHz
dcREG(DC_0, MQInitParam.ulDC0);
Sleep(5);
pciREG(PCI_PM_CNTL_STATUS, ENTER_D0);
Sleep(30);
CHECK_IF_STATE_D(0); //Make sure in a stable state
// Get Revision ID
ulClassRevID = pciREAD(PCI_REV_CLASS) & 0x000000FF;
printf("MQ200 - Revision ID=%x ...\r\n",ulClassRevID);
//Set up PMU misc registers
// - also PMCLK_2048CYCLE and FP_PMCLK_128K if SA1110
pmuREG(PM_MISC, (GE_ENABLE | GE_BY_PLL1) );
pmuREG(D1_STATE, MQInitParam.ulD1);
pmuREG(D2_STATE, MQInitParam.ulD2);
//To initialize MIU bloc:
//
miuREG(MIU_CONTROL1, DRAM_RESET_DISABLE);
Sleep(5);
miuREG(MIU_CONTROL1, 0x00);
Sleep(50);
// Enable auto-refresh for 1B and above ...
if (ulClassRevID != MQ200_REV_1A)
MQInitParam.ulMIU2 |= AUTO_REF_ENABLE;
miuREG(MIU_CONTROL2, MQInitParam.ulMIU2);
miuREG(MIU_CONTROL3, MQInitParam.ulMIU3);
// MIU REG 5 MUST BE PROGRAMMED BEFORE MIU REG 4
miuREG(MIU_CONTROL5, MQInitParam.ulMIU5);
miuREG(MIU_CONTROL4, MQInitParam.ulMIU4);
Sleep(50);
miuREG(MIU_CONTROL1, MIU_ENABLE | MIU_RESET_DISABLE);
Sleep(50);
//Here, MIU is supposed to ready to serve ...
fpREG(FP_GPO_CONTROL, MQInitParam.ulGPO);
fpREG(FP_GPIO_CONTROL, MQInitParam.ulGPIO);
// Set up LCD panel : GC1 clocked by PLL2
SetupLCD();
// Set up CRT: GC2 clocked by PLL3
SetupCRT();
// Set up Palette
SetupDAC();
#ifdef DUMP_REG
ulTemp = dcREAD(DC_0); //get current setting
printf("DC0=%x\r\n",ulTemp);
ulTemp = pmuREAD(PM_MISC); //get current setting
printf("PM_MISC=%x\r\n",ulTemp);
ulTemp = pmuREAD(PLL2_CONTROL); //get current setting
printf("PLL2_CONTROL=%x\r\n",ulTemp);
ulTemp = pmuREAD(PLL3_CONTROL); //get current setting
printf("PLL3_CONTROL=%x\r\n",ulTemp);
ulTemp = miuREAD(MIU_CONTROL2); //get current setting
printf("MIU_CONTROL2=%x\r\n",ulTemp);
ulTemp = miuREAD(MIU_CONTROL3); //get current setting
printf("MIU_CONTROL3=%x\r\n",ulTemp);
ulTemp = miuREAD(MIU_CONTROL4); //get current setting
printf("MIU_CONTROL4=%x\r\n",ulTemp);
ulTemp = miuREAD(MIU_CONTROL5); //get current setting
printf("MIU_CONTROL5=%x\r\n",ulTemp);
ulTemp = gc1READ(GC1_CONTROL); //get current setting
printf("GC1_CONTROL=%x\r\n",ulTemp);
ulTemp = gc2READ(GC2_CONTROL); //get current setting
printf("GC2_CONTROL=%x\r\n",ulTemp);
ulTemp = fpREAD(FP_CONTROL); //get current setting
printf("FP_CONTROL=%x\r\n",ulTemp);
ulTemp = gc1READ(GC1_CRT_CONTROL); //get current setting
printf("GC1_CRT_CONTROL=%x\r\n",ulTemp);
printf("-------------------------------------------\r\n");
ulTemp = gc1READ(HD1_CONTROL); //get current setting
printf("HD1_CONTROL=%x\r\n",ulTemp);
ulTemp = gc1READ(VD1_CONTROL); //get current setting
printf("VD1_CONTROL=%x\r\n",ulTemp);
ulTemp = gc1READ(HS1_CONTROL); //get current setting
printf("HS1_CONTROL=%x\r\n",ulTemp);
ulTemp = gc1READ(VS1_CONTROL); //get current setting
printf("VS1_CONTROL=%x\r\n",ulTemp);
ulTemp = gc1READ(IW1_STRIDE); //get current setting
printf("IW1_STRIDE=%x\r\n",ulTemp);
ulTemp = gc1READ(IW1_START_ADDR); //get current setting
printf("IW1_START_ADDR=%x\r\n",ulTemp);
ulTemp = gc2READ(HD2_CONTROL); //get current setting
printf("HD2_CONTROL=%x\r\n",ulTemp);
ulTemp = gc2READ(VD2_CONTROL); //get current setting
printf("VD2_CONTROL=%x\r\n",ulTemp);
ulTemp = gc2READ(HS2_CONTROL); //get current setting
printf("HS2_CONTROL=%x\r\n",ulTemp);
ulTemp = gc2READ(VS2_CONTROL); //get current setting
printf("VS2_CONTROL=%x\r\n",ulTemp);
ulTemp = gc2READ(IW2_STRIDE); //get current setting
printf("IW2_STRIDE=%x\r\n",ulTemp);
ulTemp = gc2READ(IW2_START_ADDR); //get current setting
printf("IW2_START_ADDR=%x\r\n",ulTemp);
ulTemp = fpREAD(FP_CONTROL); //get current setting
printf("FP_CONTROL=%x\r\n",ulTemp);
ulTemp = fpREAD(FP_PIN_CONTROL); //get current setting
printf("FP_PIN_CONTROL=%x\r\n",ulTemp);
ulTemp = fpREAD(FP_GPO_CONTROL); //get current setting
printf("FP_GPO_CONTROL=%x\r\n",ulTemp);
ulTemp = fpREAD(FP_GPIO_CONTROL); //get current setting
printf("FP_GPIO_CONTROL=%x\r\n",ulTemp);
ulTemp = fpREAD(STN_CONTROL); //get current setting
printf("STN_CONTROL=%x\r\n",ulTemp);
ulTemp = fpREAD(DSTN_FB_CONTROL); //get current setting
printf("DSTN_FB_CONTROL=%x\r\n",ulTemp);
ulTemp = fpREAD(PWM_CONTROL); //get current setting
printf("PWM_CONTROL=%x\r\n",ulTemp);
#endif
display_on(1);
}
// This routine set up GC2 and flat panel registers. LCD is driven by
// graphics controller 2 and uses PLL3 as clock source.
//
void SetupLCD()
{
unsigned long ulTemp;
// Set up start address and stride
gc2REG(IW2_START_ADDR, dspconfig.panelstartaddr);
gc2REG(IW2_STRIDE, dspconfig.panelstride);
// Set up LCD Window-related registers
gc2REG(HW2_CONTROL, (m_pFPControl->usHoriSize - 1) << 16);
gc2REG(VW2_CONTROL, (m_pFPControl->usVertSize - 1) << 16);
// Set up LCD timing registers ...
gc2REG(HD2_CONTROL, m_pFPControl->ulHD);
gc2REG(VD2_CONTROL, m_pFPControl->ulVD);
gc2REG(HS2_CONTROL, m_pFPControl->ulHS);
gc2REG(VS2_CONTROL, m_pFPControl->ulVS);
// Set up DSTN half frame buffer address
if (m_pFPControl->ulFPControl & FP_TYPE_DSTN)
{
// Color D-STN memory requirement - no need to *3 for mono dstn panel
unsigned long ulDSTNFBSize = (((m_pFPControl->usHoriSize * 3 + 127) >> 7) *
m_pFPControl->usVertSize) << 3;
unsigned long ulScreenSize = dspconfig.panelstride * m_pFPControl->usVertSize +
dspconfig.crtstride * dspconfig.crty;
unsigned long ulStartAddr = (ulScreenSize + 127) >> 7;
unsigned long ulEndAddr = (ulScreenSize + ulDSTNFBSize + 15) >> 4;
fpREG(DSTN_FB_CONTROL, (ulStartAddr | ((ulEndAddr - 1) << 16)));
}
//Set up the rest of flat panel registers
fpREG(FP_CONTROL, m_pFPControl->ulFPControl);
fpREG(FP_PIN_CONTROL, m_pFPControl->ulFPPinControl);
fpREG(STN_CONTROL, m_pFPControl->ulSTNControl);
fpREG(PWM_CONTROL, m_pFPControl->ulPWMControl);
//FRC is NOT needed for TFT panel
if ( (m_pFPControl->ulFPControl & FP_TYPE_MASK) != FP_TYPE_TFT )
{
int i;
for ( i = 0; i < FRC_PATTERN_CNT; i++ )
fpREG((FRC_PATTERN + i * uBUSW), FRCControlData[0].ulFRCPattern[i]);
for ( i = 0; i < FRC_WEIGHT_CNT; i++ )
fpREG((FRC_WEIGHT + i * uBUSW), FRCControlData[0].ulFRCWeight[i]);
}
// Use PLL3 to drive LCD
GetMQPLL( m_pFPControl->fPLLFreq, &ulPLL3);
pmuREG(PLL3_CONTROL, ulPLL3);
pmuREG(PM_MISC, pmuREAD(PM_MISC) | PLL3_ENABLE);
ulTemp = FDx_1 | (1UL << 24)
| IM_ENABLE
| GxRCLK_PLL3;
switch(dspconfig.panelbpp)
{
case 8: ulTemp |= GC_8BPP; break;
case 16: ulTemp |= GC_16BPP_BP; break;
case 24: ulTemp |= GC_24BPP_BP; break;
case 32: ulTemp |= GC_32BPP_ARGB_BP; break;
}
gc2REG(GC2_CONTROL, ulTemp);
// Enable LCD driven by GC2
//
ulTemp = fpREAD(FP_CONTROL);
fpREG(FP_CONTROL, ulTemp|FPI_BY_GC2);
ulTemp = gc2READ(GC2_CONTROL);
gc2REG(GC2_CONTROL, ulTemp|GC_ENABLE);
}
// This routine set up GC1 registers. CRT is driven by
// graphics controller 1 and uses PLL2 as clock source.
//
void SetupCRT()
{
unsigned long ulTemp;
m_pCRTTiming = GetMQTiming(dspconfig.crtx,dspconfig.crty,dspconfig.crtfreq);
// Set up start address and stride
gc1REG(IW1_START_ADDR, dspconfig.crtstartaddr);
gc1REG(IW1_STRIDE, dspconfig.crtstride);
// Set up CRT Window-related registers
gc1REG(HW1_CONTROL, (dspconfig.crtx - 1) << 16);
gc1REG(VW1_CONTROL, (dspconfig.crty - 1) << 16);
gc1REG(HD1_CONTROL, m_pCRTTiming->ulHD);
gc1REG(VD1_CONTROL, m_pCRTTiming->ulVD);
gc1REG(HS1_CONTROL, m_pCRTTiming->ulHS);
gc1REG(VS1_CONTROL, m_pCRTTiming->ulVS);
gc1REG(GC1_CRT_CONTROL, m_pCRTTiming->ulCRTC);
// Use PLL2 to drive CRT
GetMQPLL( m_pCRTTiming->fPLLFreq, &ulPLL2);
pmuREG(PLL2_CONTROL, ulPLL2);
ulTemp = pmuREAD(PM_MISC) | PLL2_ENABLE;
pmuREG(PM_MISC,ulTemp);
ulTemp = FDx_1 | (1UL << 24)
| IM_ENABLE
| GxRCLK_PLL2;
switch(dspconfig.crtbpp)
{
case 8: ulTemp |= GC_8BPP; break;
case 16: ulTemp |= GC_16BPP_BP; break;
case 24: ulTemp |= GC_24BPP_BP; break;
case 32: ulTemp |= GC_32BPP_ARGB_BP; break;
}
gc1REG(GC1_CONTROL, ulTemp);
// Enable CRT driven by GC1
//
ulTemp = gc1READ(GC1_CRT_CONTROL);
gc1REG(GC1_CRT_CONTROL, ulTemp|CRT_BY_GC1);
ulTemp = gc1READ(GC1_CONTROL);
gc1REG(GC1_CONTROL, ulTemp|GC_ENABLE);
}
// Return correct CRT timing parameters pointer
//
PMQ_TIMING_PARAM GetMQTiming(USHORT x, USHORT y, USHORT freq)
{
unsigned int i;
for (i=0; i < MAX_MQTIMING; i++)
{
if ( MQTimingParam[i].usResoX == x
&& MQTimingParam[i].usResoY == y
&& MQTimingParam[i].usFreq == freq )
return ( (PMQ_TIMING_PARAM)&MQTimingParam[i] );
}
return (NULL); //not found
}
// Return PLL register setting value
//
void GetMQPLL(float fFreq, unsigned long *ulPLLData)
{
unsigned int i;
*ulPLLData = 0UL;
for ( i = 0; i < MAX_MQPLL; i++ )
if ( fFreq == MQPLLParam[i].fFreq )
{
*ulPLLData = MQPLLParam[i].ulPLLData;
break;
}
}
// Program DAC for 8BPP mode
//
void SetupDAC(void)
{
int i;
// Enable Int mask for GC1 VDE Falling Edge - required only for 2 GCs
// are on (accessed during blank time)
//
intREG(INT_MASK_REG,UM_GC1_VDE_F);
InVBlank();
for(i=0; i<16; i++)
{
palREG(i, PalDAC[i]);
}
// Reset Int mask for GC1 VDE Falling Edge
//
intREG(INT_MASK_REG,0);
}
#pragma optimize ("",off) // This is required to not let compiler mess up!
#ifdef CHECK_GE_NOTBUSY
void WaitGENotBusy()
{
while( 1 )
{
if ( !(cpuREAD(DRAW_STATUS) & GE_BUSY) )
return;
}
}
#endif //CHECK_GE_NOTBUSY
#ifdef CHECK_CMDFIFO
void WaitCmdFIFO( ULONG cnt )
{
ULONG ulStatus;
while( 1 )
{
ulStatus = cpuREAD(DRAW_STATUS) & CMD_FIFO_MASK;
if ( ulStatus >= cnt )
return;
}
}
#endif //CHECK_CMDFIFO
#ifdef CHECK_SRCFIFO
void WaitSrcFIFO( ULONG cnt )
{
ULONG ulStatus;
while( 1 )
{
ulStatus = cpuREAD(DRAW_STATUS) & SRC_FIFO_MASK;
if ( (ulStatus >> 6) >= cnt )
return;
}
}
#endif //CHECK_SRCFIFO
int InVBlank()
{
volatile PULONG ulIntStat;
ulIntStat = (PULONG)(m_pMMIO+IN_BASE+INT_STATUS_REG);
// Make sure int occurs first
udelay(1);
while ( !(*ulIntStat & ST_GC1_VDE_F) )
;
// Reset GC1 VDE F status bit - write 1 to clear the status
intREG(INT_STATUS_REG,ST_GC1_VDE_F);
udelay(1);
// Wait for next VDE falling edge for DAC access
while ( !(*ulIntStat & ST_GC1_VDE_F) );
// Here MQ200 should be in V blank period ...
return 1;
}
#pragma optimize ("",on)
#define LOOP_CNT 10
#define DELTA 80
// This rourine ping pong GE and GE2 for different BLT operations
//
void do_blt(void)
{
unsigned long ulTemp;
int crtx,crty,lcdx,lcdy;
int qx,qy;
int sx,sy;
int iterations;
int deltax,deltay;
// For CRT (GE)
geREG(BASE_ADDRESS,dspconfig.crtstartaddr);
ulTemp = dspconfig.crtstride;
switch (dspconfig.crtbpp)
{
case 8:
ulTemp |= GE_8BPP;
break;
case 16:
ulTemp |= GE_16BPP;
break;
case 32:
ulTemp |= GE_32BPP;
break;
}
geREG(DEST_STRIDE,ulTemp);
crtx = dspconfig.crtx;
crty = dspconfig.crty;
rfill(0, 0, crtx, crty, 0, 0xF0); // clear screen
// For LCD (GE2)
geREG(BASE_ADDRESS2,dspconfig.panelstartaddr);
ulTemp = dspconfig.panelstride;
switch (dspconfig.panelbpp)
{
case 8:
ulTemp |= GE_8BPP;
break;
case 16:
ulTemp |= GE_16BPP;
break;
case 32:
ulTemp |= GE_32BPP;
break;
}
geREG(DEST_STRIDE2,ulTemp);
lcdx = m_pFPControl->usHoriSize;
lcdy = m_pFPControl->usVertSize;
rfill2(0, 0, lcdx, lcdy, 0xFFFF, 0xF0); // clear screen
qx = lcdx / 4;
qy = lcdy / 4;
sx = (lcdx - qx) / 2;
sy = (lcdy - qy) / 2;
rfill2(sx, sy, qx, qy, 0xC9B5, 0xF0);
// Prepare for the demo looping ...
//
iterations = LOOP_CNT;
deltax = DELTA;
deltay = DELTA;
do {
unsigned int x = Random() % crtx;
unsigned int y = Random() % crty;
unsigned int dx = Random() % (crtx - x);
unsigned int dy = Random() % (crty - y);
unsigned int c = Random() % 16;
unsigned int rop = Random() % 16;
// CRT
if (dx && dy)
rfill(x, y, dx, dy, c, 0xF0);
// LCD
switch (c % 4)
{
case 0:
deltax = DELTA;
deltay = DELTA;
break;
case 1:
deltax = -DELTA;
deltay = DELTA;
break;
case 2:
deltax = DELTA;
deltay = -DELTA;
break;
case 3:
deltax = -DELTA;
deltay = -DELTA;
break;
}
dx = sx + deltax;
dy = sy + deltay;
s2s(sx,sy,dx,dy,qx,qy,(rop|rop<<4));
} while(--iterations);
}
void gen_pattern(void)
{
int i,j, off=0;
unsigned short *fb=(short *)m_pFB;
for( j=0; j < 600; j++ )
{
for( i=0; i < 800; i++ )
{
*fb++ = (i+off)&0xffff;
}
off+= ((1<<6)|(1<<11));
}
}
short set_pixel( int x, int y, int color)
{
unsigned short old, *fb=(short *)m_pFB;
fb = fb + x + (y * 800);
old=*fb;
*fb=color;
return(old);
}
void h_line( int x, int y, int dx, int color)
{
int i;
for( i=x; i < x+dx; i++ )
set_pixel(i,y,color);
}
void v_line( int x, int y, int dy, int color)
{
int i;
for( i=y; i < y+dy; i++ )
set_pixel(x,i,color);
}
void gen_lines(void)
{
int i;
for( i=0; i < 600; i+=20 )
h_line( 0, i, 799, 0xffff);
for( i=0; i < 800; i+=20 )
v_line( i, 0, 599, 0xffff);
}
// Rectangle fill using GE2
//
void rfill2(unsigned long x, unsigned long y,
unsigned long dx, unsigned long dy, unsigned long colour, unsigned long rop)
{
geWAITCMDFIFO(4);
geREG(WIDTH_HEIGHT2, dx | (dy << 16));
geREG(DEST_XY2, x | (y << 16));
geREG(PAT_FG_COLOR2, colour);
geREG(DRAW_CMD2,(MONO_PATTERN|MONO_SOLID|DO_BITBLT|rop));
}
// Screen to screen BLT using GE2
//
void s2s(unsigned int sx,
unsigned int sy,
unsigned int dx,
unsigned int dy,
unsigned int w,
unsigned int h,
unsigned int rop)
{
unsigned long ulCmd;
ulCmd = DO_BITBLT | rop;
if (sx > dx)
{
sx += (w - 1);
dx += (w - 1);
ulCmd |= X_DIR; // decrement on X
}
if (sy > dy)
{
sy += (h - 1);
dy += (h - 1);
ulCmd |= Y_DIR; // decrement on Y
}
geWAITCMDFIFO(4);
geREG(WIDTH_HEIGHT2, w | (h << 16));
geREG(SRC_XY2, sx | (sy << 16));
geREG(DEST_XY2, dx | (dy << 16));
geREG(DRAW_CMD2,ulCmd);
}
// Rectangle fill using GE
//
void rfill(unsigned long x, unsigned long y,
unsigned long dx, unsigned long dy, unsigned long colour, unsigned long rop)
{
geWAITCMDFIFO(4);
geREG(WIDTH_HEIGHT, dx | (dy << 16));
geREG(DEST_XY, x | (y << 16));
geREG(PAT_FG_COLOR, colour);
geREG(DRAW_CMD,(MONO_PATTERN|MONO_SOLID|DO_BITBLT|rop));
}
#if MAP_DEVICE
void CleanUp(void)
{
VirtualFree( m_pFB, 0, MEM_RELEASE );
m_pFB = NULL;
VirtualFree( m_pMMIO, 0, MEM_RELEASE );
m_pMMIO = NULL;
}
#endif
#define BRIGHTNESS_STEPS 7
#define MAX_BRIGHT_REG 0x000000fc
#define _pwmRegisters (unsigned long *)0x4be0e03c
void writeBrightness(int brightness)
{
unsigned long dutyCycle;
// Determine dutyCycle.
//Note: the lower the value, the brighter the display!
dutyCycle = MAX_BRIGHT_REG - brightness;
// Configure PWM0 (source clock = oscillator clock, pwm always enabled,
// zero, clock pre-divider = 4) pwm frequency = 12.0kHz
*_pwmRegisters = 0x00000044 | (*_pwmRegisters & 0xffffff00);
// Write to pwm duty cycle register.
*_pwmRegisters = ((dutyCycle << 8) & 0x0000ff00) | (*_pwmRegisters & 0xffff00ff);
}
void test_brightness(void)
{
int i,j=10;
while( j-- )
for( i=0; i < 0xfc; i++ )
{
writeBrightness(i);
udelay(10000);
}
}
void test_mq200(void)
{
while( ! serstat() )
{
gen_pattern();
}
serin();
while( ! serstat() )
{
do_blt();
}
}
mq200.h.org
(text/plain, 20.7 KB)
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) 1999 MediaQ, Inc.
//
//------------------------------------------------------------------------
//Data Structure for MQ200 initialization
//------------------------------------------------------------------------
typedef struct DisplayConfig
{
int paneltype; // Panel type
int panelbpp; // Color depth
int panelstride; // Stride for panel
int panelstartaddr; // Start address for LCD panel
int crtx; // X resolution for CRT
int crty; // Y resolution for CRT
int crtbpp; // CRT color depth
int crtfreq; // CRT V frequency
int crtstride; // Stride for CRT
int crtstartaddr; // Start address for CRT
} DISPLAY_CONFIG, *PDISPLAY_CONFIG;
typedef struct MQInitParam
{
ULONG ulDC0;
ULONG ulMIU2;
ULONG ulMIU3;
ULONG ulMIU5;
ULONG ulMIU4;
ULONG ulD1;
ULONG ulD2;
ULONG ulGPO;
ULONG ulGPIO;
ULONG ulBaseAddr;
} MQ_INIT_PARAM, *PMQ_INIT_PARAM;
//Data Structure for timing parameter of each resolution
//
typedef struct MQTimingParam
{
USHORT usResoX; //X resolution
USHORT usResoY; //Y resolution
USHORT usFreq; //Frequency
ULONG ulHD; //Horz display 1 control
ULONG ulVD; //Vert display 1 control
ULONG ulHS; //Horz sync 1 control
ULONG ulVS; //Vert sync 1 control
ULONG ulCRTC; // GC01R - CRT Control
float fPLLFreq; //Clock Frequency
} MQ_TIMING_PARAM, *PMQ_TIMING_PARAM;
//Data Structure for PLL data
//
typedef struct PLLParam
{
float fFreq; //Clock Frequency
ULONG ulPLLData; //PLLx control
} MQ_PLL_PARAM, *PMQ_PLL_PARAM;
//Data structure for flat panel interface
//
#define FRC_PATTERN_CNT 32
#define FRC_WEIGHT_CNT 8
typedef struct FRCControl
{
ULONG ulFRCPattern[FRC_PATTERN_CNT]; //FRC pattern control
ULONG ulFRCWeight[FRC_WEIGHT_CNT]; //FRC weight control
} FRC_CONTROL_STRUC, *PFRC_CONTROL_STRUC;
typedef struct FPControl
{
USHORT usHoriSize; //Flat panel hori size
USHORT usVertSize; //Flat panel vert size
ULONG ulHD; //Horz display control
ULONG ulVD; //Vert display control
ULONG ulHS; //Horz sync control
ULONG ulVS; //Vert sync control
ULONG ulCRTC; //GC01R - CRT Control
float fPLLFreq; //PLLx Frequency
ULONG ulFPControl; //Flat panel control
ULONG ulFPPinControl; //Flat panel pin control
ULONG ulSTNControl; //STN panel control
ULONG ulPWMControl; //Contrast control
} FP_CONTROL_STRUC, *PFP_CONTROL_STRUC;
//-----------------------------------------------------------------------
// Mode Data
//-----------------------------------------------------------------------
// PLL1 frequency and corresponding P/M/N parameters for DC00R register
// - make sure it's NOT above 95MHz
MQ_PLL_PARAM MQPLLParam[] =
{
{ 18.881F, 0x00ab0640 },
{ 25.175F, 0x00a30930 },
{ 31.500F, 0x00f50b30 },
{ 36.000F, 0x00d20830 },
{ 40.000F, 0x00e90830 },
{ 49.500F, 0x00900820 },
{ 50.000F, 0x00b20a20 },
{ 56.250F, 0x00b60920 },
{ 65.000F, 0x00fd0b20 },
{ 75.000F, 0x00f30920 },
{ 78.750F, 0x00cc0720 },
{ 83.000F, 0x00f20820 },
{ 94.500F, 0x007a0710 }
};
#define MAX_MQPLL (sizeof(MQPLLParam) / sizeof(MQPLLParam[0]))
// Palette data
ULONG PalDAC[16] =
{
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00C0C0C0,
0x000000FF,
0x0000FF00,
0x0000FFFF,
0x00FF0000,
0x00FF00FF,
0x00FFFF00,
0x00FFFFFF
};
// Init Parameters ....
//
MQ_INIT_PARAM MQInitParam =
{
0x0ef2082a,
//0x0143E086,
0x0043E086,
0x6D6AABFF,
0x0000010d,
0x00000001,
0x05000271,
0x00000071,
0x00000000,
0x00000000,
0x00000000
};
// LCD/CRT timing parameters for each resolution
//
MQ_TIMING_PARAM MQTimingParam[] =
{
{ //0 640 x 480 60Hz (25.175 MHz)
640,480,60, // X/Y/Freq
(800-2) | (640L << 16), // HD Total + HD End
(525-1) | ((480L-1) << 16), // VD Total + VD End
656 | (752L << 16), // HS Start + HS End
490 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
25.175F, // PLLx frequency
},
{ //1 640 x 480 72Hz (31.5 MHz)
640,480,72, // X/Y/Freq
(832-2) | (640L << 16), // HD Total + HD End
(520-1) | ((480L-1) << 16), // VD Total + VD End
//664 | (704L << 16), // HS Start + HS End
688 | (728L << 16), // HS Start + HS End
489 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
31.5F, // PLLx frequency
},
{ //2 640 x 480 75Hz (31.5 MHz)
640,480,75, // X/Y/Freq
(840-2) | (640L << 16), // HD Total + HD End
(500-1) | ((480L-1) << 16), // VD Total + VD End
//656 | (720L << 16), // HS Start + HS End
680 | (744L << 16), // HS Start + HS End
481 | (484L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
31.5F, // PLLx frequency
},
{ //3 640 x 480 85Hz (36 MHz)
640,480,85, // X/Y/Freq
(832-2) | (640L << 16), // HD Total + HD End
(509-1) | ((480L-1) << 16), // VD Total + VD End
696 | (752L << 16), // HS Start + HS End
481 | (484L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
36.0F, // PLLx frequency
},
{ //4 800 x 600 60Hz (40 MHz)
800,600,60, // X/Y/Freq
(1054-2) | (800L << 16), // HD Total + HD End
(628-1) | ((600L-1) << 16), // VD Total + VD End
839 | (967L << 16), // HS Start + HS End
601 | (605L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
40.0F, // PLLx frequency
},
{ //5 800 x 600 72Hz 50 MHz)
800,600,72, // X/Y/Freq
(1040-2) | (800L << 16), // HD Total + HD End
(666-1) | ((600L-1) << 16), // VD Total + VD End
856 | (976L << 16), // HS Start + HS End
637 | (643L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
50.0F, // PLLx frequency
},
{ //6 800 x 600 75Hz (49.5 MHz)
800,600,75, // X/Y/Freq
(1056-2) | (800L << 16), // HD Total + HD End
(625-1) | ((600L-1) << 16), // VD Total + VD End
816 | (896L << 16), // HS Start + HS End
601 | (604L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
49.5F, // PLLx frequency
},
{ //7 800 x 600 85Hz (56.25 MHz)
800,600,85, // X/Y/Freq
(1047-2) | (800L << 16), // HD Total + HD End
(631-1) | ((600L-1) << 16), // VD Total + VD End
832 | (896L << 16), // HS Start + HS End
601 | (604L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
56.25F, // PLLx frequency
},
{ //8 1024 x 768 60Hz (65 MHz)
1024,768,60, // X/Y/Freq
(1344-2) | (1024L << 16), // HD Total + HD End
(806-1) | ((768L-1) << 16), // VD Total + VD End
1048 | (1184L << 16), // HS Start + HS End
771 | (777L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
65.0F, // PLLx frequency
},
{ //9 1024 x 768 70Hz (75 MHz)
1024,768,70, // X/Y/Freq
(1327-2) | (1024L << 16), // HD Total + HD End
(806-1) | ((768L-1) << 16), // VD Total + VD End
1047 | (1183L << 16), // HS Start + HS End
771 | (777L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
75.0F, // PLLx frequency
},
{ //10 1024 x 768 75Hz (78.750 MHz)
1024,768,75, // X/Y/Freq
(1312-2) | (1024L << 16), // HD Total + HD End
(806-1) | ((768L-1) << 16), // VD Total + VD End
1040 | (1136L << 16), // HS Start + HS End
769 | (772L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
78.75F, // PLLx frequency
},
{ //11 1024 x 768 85Hz (94.5 MHz)
1024,768,85, // X/Y/Freq
(1375-2) | (1024L << 16), // HD Total + HD End
(808-1) | ((768L-1) << 16), // VD Total + VD End
1072 | (1168L << 16), // HS Start + HS End
769 | (772L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
94.5F, // PLLx frequency
}
};
#define MAX_MQTIMING (sizeof(MQTimingParam) / sizeof(MQTimingParam[0]))
//-----------------------------------------------------------------------
// Panel Data
//-----------------------------------------------------------------------
// Flat panel control register
//
FP_CONTROL_STRUC FPControlData[] =
{
// Type 1 : SSTN VGA 8Bit Color - 72Hz
// - Sanyo SSTN 640x480 8-bit color interface
//
{ // Flat panel control
640,
480,
// Flat panel timing
(832-2) | (640L << 16), // HD Total + HD End
(520-1) | ((480L-1) << 16), // VD Total + VD End
688 | (728L << 16), // HS Start + HS End
489 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
31.5F, // PLLx frequency
// Flat panel Control
FP_TYPE_SSTN
| FP_COLOR
| SSTN_8BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x00400000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
//| FP_SCLK_16mA
//| FP_FD0_16mA
//| FP_DATA_16mA
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0000
,
0x5ca1
},
// Type 2 : DSTN 16 Bit VGA Color - 72Hz
// - Hitachi 8.2" SX21V001
// - Sanyo 10.4" LM-CJ53-22NTK
// - Sharp 10.4" LM64C35P
//
{ // Flat panel control
640,
480,
// Flat panel timing
(832-2) | (640L << 16), // HD Total + HD End
(520-1) | ((480L-1) << 16), // VD Total + VD End
688 | (728L << 16), // HS Start + HS End
489 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
31.5F, // PLLx frequency
// Flat panel Control
FP_TYPE_DSTN
| FP_COLOR
| DSTN_16BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x0c840000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
//| FP_SCLK_16mA
//| FP_FD0_16mA
//| FP_DATA_16mA
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 3 : TFT 18 Bit VGA - 60Hz
// - NEC 10.4" NL6448AC33-24
//
{ // Flat panel control
640,
480,
// Flat panel timing
(800-2) | (640L << 16), // HD Total + HD End
(525-1) | ((480L-1) << 16), // VD Total + VD End
656 | (752L << 16), // HS Start + HS End
490 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
25.175F, // PLLx frequency
// Flat panel Control
FP_TYPE_TFT
| FP_COLOR
| TFT_18BITS_COLOR
| DITHER_PATTERN_3
| DITHER_BASE_6BITS
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 4 : TFT 18 Bit SVGA - 60Hz
// - Hitachi 12.1" 800x600 TX31D24VC1CAA
//
{ // Flat panel control
800,
600,
// Flat panel timing
(1054-2) | (800L << 16), // HD Total + HD End
(628-1) | ((600L-1) << 16), // VD Total + VD End
839 | (967L << 16), // HS Start + HS End
601 | (605L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
40.0F, // PLLx frequency
// Flat panel Control
FP_TYPE_TFT
| FP_COLOR
| TFT_18BITS_COLOR
| DITHER_PATTERN_3
| DITHER_BASE_6BITS
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
//| FHSYNC_ACTIVE_L
//| FVSYNC_ACTIVE_L
//| FP_FSCLK_MAX
//| FP_FD2_MAX
//| FP_DATA_MAX
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 5 : DSTN 16Bit SVGA Color Panel - 72Hz
// - Hitachi 10.0" SX25S001
// - Hitachi 12.1" SX25S003
//
{ // Flat panel control
800,
600,
// Flat panel timing
(1040-2) | (800L << 16), // HD Total + HD End
(666-1) | ((600L-1) << 16), // VD Total + VD End
856 | (976L << 16), // HS Start + HS End
637 | (643L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
50.0F, // PLLx frequency
// Flat panel Control
FP_TYPE_DSTN
| FP_COLOR
| DSTN_16BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x0c840000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
//| FP_SCLK_16mA
//| FP_FD0_16mA
//| FP_DATA_16mA
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 6 : DSTN 8 Bit VGA Color - 72Hz
//
{ // Flat panel control
640,
480,
// Flat panel timing
(832-2) | (640L << 16), // HD Total + HD End
(520-1) | ((480L-1) << 16), // VD Total + VD End
688 | (728L << 16), // HS Start + HS End
489 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
31.5F, // PLLx frequency
// Flat panel Control
FP_TYPE_DSTN
| FP_COLOR
| DSTN_8BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x0c840000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
//| FP_SCLK_16mA
//| FP_FD0_16mA
//| FP_DATA_16mA
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 7 : SSTN VGA 16Bit Color - 72Hz
//
{ // Flat panel control
640,
480,
// Flat panel timing
(832-2) | (640L << 16), // HD Total + HD End
(520-1) | ((480L-1) << 16), // VD Total + VD End
688 | (728L << 16), // HS Start + HS End
489 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
31.5F, // PLLx frequency
// Flat panel Control
FP_TYPE_SSTN
| FP_COLOR
| SSTN_16BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x00400000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
//| FP_SCLK_16mA
//| FP_FD0_16mA
//| FP_DATA_16mA
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0000
,
0x5ca1
},
// Type 8 : SSTN VGA 8Bit Color - 60Hz
// - Sanyo SSTN 640x480 8-bit color interface
//
{ // Flat panel control
640,
480,
// Flat panel timing
(800-2) | (640L << 16), // HD Total + HD End
(525-1) | ((480L-1) << 16), // VD Total + VD End
656 | (752L << 16), // HS Start + HS End
490 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
25.175F, // PLLx frequency
// Flat panel Control
FP_TYPE_SSTN
| FP_COLOR
| SSTN_8BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x00400000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0000
,
0x5ca1
},
// Type 9 : DSTN 16 Bit VGA Color - 60Hz
// - Hitachi 8.2" SX21V001
// - Sanyo 10.4" LM-CJ53-22NTK
// - Sharp 10.4" LM64C35P
//
{ // Flat panel control
640,
480,
// Flat panel timing
(800-2) | (640L << 16), // HD Total + HD End
(525-1) | ((480L-1) << 16), // VD Total + VD End
656 | (752L << 16), // HS Start + HS End
490 | (492L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
25.175F, // PLLx frequency
// Flat panel Control
FP_TYPE_DSTN
| FP_COLOR
| DSTN_16BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x0c840000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 10 : DSTN 16Bit SVGA Color Panel - 60Hz
// - Hitachi 10.0" SX25S001
// - Hitachi 12.1" SX25S003
// - Sanyo LM-FC53-22NTK
//
{ // Flat panel control
800,
600,
// Flat panel timing
(1054-2) | (800L << 16), // HD Total + HD End
(628-1) | ((600L-1) << 16), // VD Total + VD End
839 | (967L << 16), // HS Start + HS End
601 | (605L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
40.0F, // PLLx frequency
0x0C1B4129
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0001
,
//0x5ca1
0x80100000
},
// Type 11 : DSTN 24Bit XGA Color Panel - 60Hz
// - Hitachi 12.1" SX25S003
//
{ // Flat panel control
1024,
768,
// Flat panel timing
(1344-2) | (1024L << 16), // HD Total + HD End
(806-1) | ((768L-1) << 16), // VD Total + VD End
1048 | (1184L << 16), // HS Start + HS End
771 | (777L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
65.0F, // PLLx frequency
// Flat panel Control
FP_TYPE_DSTN
| FP_COLOR
| DSTN_24BITS_COLOR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x0c840000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 12 : DSTN 16Bit XGA Color Panel - 60Hz
// - Hitachi 12.1" SX25S003
//
{ // Flat panel control
1024,
768,
// Flat panel timing
(1344-2) | (1024L << 16), // HD Total + HD End
(806-1) | ((768L-1) << 16), // VD Total + VD End
1048 | (1184L << 16), // HS Start + HS End
771 | (777L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
65.0F, // PLLx frequency
// Flat panel Control
FP_TYPE_DSTN
| FP_COLOR
| DSTN_16BITS_MONOCLR
| DITHER_PATTERN_3
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x0c840000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 13 : TFT 18Bit XGA - 60Hz
// - Hitachi 12.1" 800x600 TX31D24VC1CAA
//
{ // Flat panel control
1024,
768,
// Flat panel timing
(1344-2) | (1024L << 16), // HD Total + HD End
(806-1) | ((768L-1) << 16), // VD Total + VD End
1048 | (1184L << 16), // HS Start + HS End
771 | (777L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
65.0F, // PLLx frequency
// Flat panel Control
FP_TYPE_TFT
| FP_COLOR
| TFT_18BITS_COLOR
| DITHER_PATTERN_3
| DITHER_BASE_6BITS
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| FHSYNC_ACTIVE_L
| FVSYNC_ACTIVE_L
//| FP_SCLK_16mA
//| FP_DATA_16mA
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 14 : TFT 24Bit XGA - 60Hz
// - Hitachi 12.1" 800x600 TX31D24VC1CAA
//
{ // Flat panel control
1024,
768,
// Flat panel timing
(1344-2) | (1024L << 16), // HD Total + HD End
(806-1) | ((768L-1) << 16), // VD Total + VD End
1048 | (1184L << 16), // HS Start + HS End
771 | (777L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
65.0F, // PLLx frequency
// Flat panel Control
FP_TYPE_TFT
| FP_COLOR
| TFT_24BITS_COLOR
| DITHER_PATTERN_3
| DITHER_BASE_6BITS
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| FHSYNC_ACTIVE_L
| FVSYNC_ACTIVE_L
//| FP_SCLK_16mA
//| FP_DATA_16mA
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 15 : TFT 18 Bit SVGA - 60Hz (Similar to type 4)
// - NEC 12.1" 800x600 TX31D24VC1CAA
//
{ // Flat panel control
800,
600,
// Flat panel timing
(1054-2) | (800L << 16), // HD Total + HD End
(628-1) | ((600L-1) << 16), // VD Total + VD End
839 | (967L << 16), // HS Start + HS End
601 | (605L << 16), // VS Start + VS End
BLANK_PED_ENABLE,
40.0F, // PLLx frequency
// Flat panel Control
FP_TYPE_TFT
| FP_COLOR
| TFT_18BITS_COLOR
| DITHER_PATTERN_3
| DITHER_BASE_6BITS
,
// Flat panel pin control
0x03000020
//FSCLK_OUTPUT_ENABLE
//| FHSYNC_ACTIVE_L
//| FVSYNC_ACTIVE_L
//| FP_FSCLK_MAX
//| FP_FD2_MAX
//| FP_DATA_MAX
,
// STN panel control
0x00bd0001
,
0x5ca1
},
// Type 16 : SSTN VGA 8Bit Color - 90Hz
// - Sharp LM8M64 SSTN 640x240 8-bit color interface
//
{ // Flat panel control
640,
240,
// Flat panel timing
(793-2) | (640L << 16), // HD Total + HD End
(262-1) | ((240L-1) << 16), // VD Total + VD End
647 | (704L << 16), // HS Start + HS End
245 | (246L << 16), // VS Start + VS End
HSYNC_POLARITY_LOW|VSYNC_POLARITY_LOW|BLANK_PED_ENABLE,
25.175F, // PLLx frequency
// Flat panel Control
FP_TYPE_SSTN
| FP_COLOR
| SSTN_8BITS_MONOCLR
| DITHER_PATTERN_1
| DITHER_BASE_4BITS
| FRC_16LEVEL
| 0x00400000
,
// Flat panel pin control
FSCLK_OUTPUT_ENABLE
| SCLK_MASK
//| FP_SCLK_16mA
//| FP_FD0_16mA
//| FP_DATA_16mA
| FDE_ACTIVE_L
,
// STN panel control
0x00bd0000
,
0x5ca1
}
};
// Flat panel FRC weight/pattern registers
//
FRC_CONTROL_STRUC FRCControlData =
{
0x97A4C5F8, 0x61E3DB02,
0x3D0E6F52, 0xCB4971A8,
0x794A2B16, 0x8F0D35EC,
0xD3E081BC, 0x25A79F46,
0x1F2C4D70, 0xE96B538A,
0xB586E7DA, 0x43C1F920,
0xF1C2A39E, 0x0785BD64,
0x5B680934, 0xAD2F17CE,
0x794A2B16, 0x8F0D35EC,
0xD3E081BC, 0x25A79F46,
0x97A4C5F8, 0x61E3DB02,
0x3D0E6F52, 0xCB4971A8,
0xF1C2A39E, 0x0785BD64,
0x5B680934, 0xAD2F17CE,
0x1F2C4D70, 0xE96B538A,
0xB586E7DA, 0x43C1F920,
0x80800000, 0x88888420,
0x94a49248, 0xaaaaaa54,
0x6b5b55ab, 0x77776db7,
0x7f7f7bdf, 0xffff7fff
};
misc.h
(text/plain, 2 KB)
int printf(const char *fmt,...); void udelay(long usec); void InitIo(void); void set_led(int onoff ); int pr_chk_sum(void); int cache_off(void); void cache_on(void); void cache_flush(void); void cache_restore(int); void hardware_poll(void); int pcmcia_id(void); void InitSerial(void); int serout(int); int serin(void); int serstat(void); int debounce(int status); void setup_memory_timing(void); int restore_timing(int newspeed); int setup_write_timing(void); extern char * set_progress(int cur,int len); int set_image_length(int len); int puts( const char *s); int display_on(int); int setup_color(void); int cmp_mem(long *s1, long *s2, int size, int flag ); long cmp_flash(long *s1, long *s2, int size ); long gtext_sum(void); long get_stackptr(void); long stack_used( void); void print_stack(void); void enable_irq(int no); void disable_irq(int no); int test_mem(unsigned long start, unsigned long end, int print); typedef void (*Function)(void); unsigned exceptionHandler(int v,Function fkt); extern void catch_irq(void); void trash_cache(void); int erase_memory(void); int get_processor_id(void); unsigned long gen_checksum(unsigned long start,unsigned long cnt); int check_boot_memory(void); #define UCH typedef unsigned char uch; typedef unsigned short ush; typedef unsigned long ulg; ulg decompress_image(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p, char *data_start, int data_size); int gethex(int (*inp)(void), int (*outp)(int) ); int get_string(char *dst,int (*eof)(int),int maxcnt,int (*inp)(void),int (*outp)(int)); int memdump( void *adr, int cnt ); int memdumpw( void *adr, int cnt ); int memdumpl( void *adr, int cnt ); void serial_get_file(void); int test_serial_download(void); void fast_cpy_wrds(long *, long *,long); void test_codec_gpios(void); extern int serial_download_available; extern int download_started; extern void test_smc(void); void create_flashimage(unsigned long magic); void burst_test(void); void power_off(void); void soft_reset(void);