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

📄 cfw.c

📁 这是一下精电5.7寸屏在WINCE5.0下的显示驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
        INTERRUPTS_OFF( );
        
        //
        // We're awake! The wake-up ISR (or any other ISR) has already run.
        //
        if (dwPrevMSec != *pCurMSec) {
            //
            // We completed the full period we asked to sleep.  Update the counters.
            //
            *pCurMSec  += (dwIdleMSec - RESCHED_PERIOD); // Subtract resched period, because ISR also incremented.
            CurTicks.QuadPart += (dwIdleMSec - RESCHED_PERIOD) * dwReschedIncrement;

            currIdle.QuadPart += dwIdleMSec;
        } else {
            //
            // Some other interrupt woke us up before the full idle period was
            // complete.  Determine how much time has elapsed.
            //
            currIdle.QuadPart += CPUGetSysTimerCountElapsed(dwIdleMSec, pCurMSec, &dwPartialCurMSec, pCurTicks);
        }
    }

    // Re-arm counters
    CPUSetSysTimerCount(RESCHED_PERIOD);
    CPUClearSysTimerIRQ( );

    // Update global idle time
    curridlelow = currIdle.LowPart;
    curridlehigh = currIdle.HighPart;

    return;
}




//------------------------------------------------------------------------------
//
//  DWORD GetTickCount(VOID)    Return count of time since boot in milliseconds
//
//------------------------------------------------------------------------------
DWORD 
SC_GetTickCount(void) 
{
    DWORD dwInc = 0, dwPartial = dwPartialCurMSec;
	DWORD curReturnMSec;
    ULARGE_INTEGER cdummy = {0, 0};
	curReturnMSec=*pCurMSec;
    CPUGetSysTimerCountElapsed(RESCHED_PERIOD, &dwInc, &dwPartial, &cdummy);
	return (curReturnMSec==*pCurMSec)?curReturnMSec+dwInc:*pCurMSec;
}


volatile BOOL fResumeFlag;
extern void CPUEnterIdleMode(void);



//------------------------------------------------------------------------------
// Initialize SDMMC block.. 
//------------------------------------------------------------------------------
static void InitSDMMC(void) 
{
	volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;

	/* Initialize SDMMC and Configure SDMMC Card Detect	*/
	/* ::::::::::::::::::::::::::::::::::: GPIO Configure ::::::::::::::::::::::::::::::::::::: */
	RETAILMSG(1,(TEXT("SDMMC config current rGPGCON: %x\r\n"), s2410IOP->rGPGCON));  
	/* We must need this PULL-UP routines to inialize. */
	//s2410IOP->rGPGUP = 0xF800;   
	s2410IOP->rGPGUP &= ~(1<<10);	
	s2410IOP->rGPGCON &= ~((0x3 << 20));   
	s2410IOP->rGPGCON |=  ((0x2 << 20));		/* External Interrupt #18 Enable				*/
	RETAILMSG(1,(TEXT("SDMMC config set rGPGCON: %x\r\n"), s2410IOP->rGPGCON));   

	s2410IOP->rEXTINT2 &= ~(0x7 << 8);			/* Configure EINT18 as Both Edge Mode		*/
	s2410IOP->rEXTINT2 |=  (0x7 << 8);

	/* Configure SDMMC Write Protect */
	s2410IOP->rGPHUP = 0x0;   
	s2410IOP->rGPHCON &= ~((0x3 << 16));   
	s2410IOP->rGPHCON |=  ((0x0 << 16));		/* GPH8/UCLK Write Protect Pin					*/

	RETAILMSG(1,(TEXT("SDMMC config Init Done.\r\n")));   
}


static void HzhInitPIO(void)
{
	volatile IOPreg *s2410IOP;
	
	s2410IOP = (IOPreg *)IOP_BASE;
	
	s2410IOP->rGPGCON &= ~(3<<18);
	s2410IOP->rGPGCON |= 1<<18;		//GPG9 output 1
	s2410IOP->rGPGDAT |= 1<<9;

	//add by zzm
	s2410IOP->rGPBCON &= ~(0x3<<20);// set GPB10 signal out
	s2410IOP->rGPBCON |= (0x1<<20);	// set GPB10 signal out
	s2410IOP->rGPBUP |= (0x1<<10);	// set GPB10 signal high
	s2410IOP->rGPBDAT |= (0x1<<10);	// set GPB10 signal high
}


static void InitKeyBoard(void)
{
	volatile IOPreg *s2410IOP;
	
	s2410IOP = (IOPreg *)IOP_BASE;
	
	s2410IOP->rGPECON &= ~(3<<22);
	s2410IOP->rGPECON |= (1<<22);		//GPE11 output 0
	s2410IOP->rGPEDAT &= ~(1<<11);
	
	s2410IOP->rGPECON &= ~(3<<26);
	s2410IOP->rGPECON |= (1<<26);		//GPE13 output 0
	s2410IOP->rGPEDAT &= ~(1<<13);
	
	s2410IOP->rGPGCON &= ~(3<<4);
	s2410IOP->rGPGCON |= 1<<4;		//GPG2 output 0
	s2410IOP->rGPGDAT &= ~(1<<2);
	
//	s2410IOP->rGPGCON &= ~(3<<12);
//	s2410IOP->rGPGCON |= 1<<12;		//GPG6 output 0
//	s2410IOP->rGPGDAT &= ~(1<<6);
	
}


//------------------------------------------------------------------------------
// Initialize and test the LCD block.. 
//------------------------------------------------------------------------------

/*
// Define some values for TFT 16bpp
#if(LCDTYPE == TFT16BPP)    // TFT 640*480 / 16bpp
#define FR_WIDTH            240
#define FR_HEIGHT           320
#define PhysicalVmemSize    FR_HEIGHT*FR_WIDTH*LCDTYPE


struct FrameBuffer {
   unsigned short pixel[FR_HEIGHT][FR_WIDTH];
};

#else if(LCDTYPE == STN8BPP)// STN 320*240 / 8bpp
#define FR_WIDTH            320
#define FR_HEIGHT           240
#define PhysicalVmemSize    FR_HEIGHT*FR_WIDTH

struct FrameBuffer {
   unsigned char pixel[FR_HEIGHT][FR_WIDTH];
};
#endif
*/

struct FrameBuffer *FBuf;

static void InitDisplay()
{
    //int i, j;
    volatile IOPreg *s2410IOP;
    volatile LCDreg *s2410LCD;    

    s2410IOP = (IOPreg *)IOP_BASE;
    s2410LCD = (LCDreg *)LCD_BASE; 

    // LCD port initialize.
    s2410IOP->rGPCUP  = 0xFFFFFFFF;
    s2410IOP->rGPCCON = 0xAAAAAAAA;

    s2410IOP->rGPCCON = 0xAAAAAAAA;

    s2410IOP->rGPDUP  = 0xFFFFFFFF;
    s2410IOP->rGPDCON = 0xAAAAAAAA;

    s2410IOP->rGPGCON &= ~(3 << 8);                 /* Set LCD_PWREN as output                          */
    s2410IOP->rGPGCON |=  (1 << 8);

    s2410IOP->rGPGDAT |=  (1 << 4);                 /* Backlight ON                                     */



    s2410LCD->rLCDCON1   =  (1           <<  8) |   /* VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz  */
                            (1           <<  7) |   /* 0 : Each Frame                                   */
                            (3           <<  5) |   /* TFT LCD Pannel                                   */
                            (12          <<  1) |   /* 16bpp Mode                                       */
                            (0           <<  0) ;   /* Disable LCD Output                               */

    s2410LCD->rLCDCON2   =  (16         << 24) |   /* VBPD          :   1                              */
                            (LINEVAL_TFT << 14) |   /* Virtical Size : 320 - 1                          */
                            (12        <<  6) |   /* VFPD          :   2                              */
                            (2          <<  0) ;   /* VSPW          :   1                              */

    s2410LCD->rLCDCON3   =  (35        << 19) |   /* HBPD          :   6                              */
                            (HOZVAL_TFT  <<  8) |   /* HOZVAL_TFT    : 240 - 1                          */
                            (36        <<  0) ;   /* HFPD          :   2                              */


    s2410LCD->rLCDCON4   =  (13          <<  8) |   /* MVAL          :  13                              */
                            (28       <<  0) ;   /* HSPW          :   4                              */

    s2410LCD->rLCDCON5   =  (0           << 12) |   /* BPP24BL       : LSB valid                        */
                            (1           << 11) |   /* FRM565 MODE   : 5:6:5 Format                     */
                            (0           << 10) |   /* INVVCLK       : VCLK Falling Edge                */
                            (1           <<  9) |   /* INVVLINE      : Inverted Polarity                */
                            (1           <<  8) |   /* INVVFRAME     : Inverted Polarity                */
                            (0           <<  7) |   /* INVVD         : Normal                           */
                            (0           <<  6) |   /* INVVDEN       : Normal                           */
                            (0           <<  5) |   /* INVPWREN      : Normal                           */
                            (0           <<  4) |   /* INVENDLINE    : Normal                           */
                            (1           <<  3) |   /* PWREN         : Disable PWREN                    */
                            (0           <<  2) |   /* ENLEND        : Disable LEND signal              */
                            (0           <<  1) |   /* BSWP          : Swap Disable                     */
                            (1           <<  0) ;   /* HWSWP         : Swap Enable                      */                            

    s2410LCD->rLCDSADDR1 = ((FRAMEBUF_DMA_BASE >> 22)     << 21) |
                           ((M5D(FRAMEBUF_DMA_BASE >> 1)) <<  0);

    s2410LCD->rLCDSADDR2 = M5D((FRAMEBUF_DMA_BASE + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1);

    s2410LCD->rLCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT / 1);

#if (BOARD_TYPE == 1)
    s2410LCD->rLPCSEL   = 0;//|= 0x3;
#else
    s2410LCD->rLPCSEL   = 0;//|= 0x2;
#endif

	s2410LCD->rLCDINTMSK |=(3); // MASK LCD Sub Interrupt
    s2410LCD->rTPAL       = 0x0;
    s2410LCD->rLCDCON1   |= 1;
    
    RETAILMSG(1,(TEXT("rLCDCON1 : %x\r\n"), s2410LCD->rLCDCON1));
	RETAILMSG(1,(TEXT("rLCDCON2 : %x\r\n"), s2410LCD->rLCDCON2));
	RETAILMSG(1,(TEXT("rLCDCON3 : %x\r\n"), s2410LCD->rLCDCON3));
	RETAILMSG(1,(TEXT("rLCDCON4 : %x\r\n"), s2410LCD->rLCDCON4));
	RETAILMSG(1,(TEXT("rLCDCON5 : %x\r\n"), s2410LCD->rLCDCON5));
	RETAILMSG(1,(TEXT("rLCDSADDR1 : %x\r\n"), s2410LCD->rLCDSADDR1));
	RETAILMSG(1,(TEXT("rLCDSADDR2 : %x\r\n"), s2410LCD->rLCDSADDR2));
	RETAILMSG(1,(TEXT("rLCDSADDR3 : %x\r\n"), s2410LCD->rLCDSADDR3));
	RETAILMSG(1,(TEXT("rLCDINTMSK : %x\r\n"), s2410LCD->rLCDINTMSK));
	RETAILMSG(1,(TEXT("rLPCSEL : %x\r\n"), s2410LCD->rLPCSEL));
	RETAILMSG(1,(TEXT("rTPAL : %x\r\n"), s2410LCD->rTPAL));

	memcpy((void *)FRAMEBUF_BASE, ScreenBitmap, ARRAY_SIZE_TFT_16BIT);
//    rle_express(ScreenBitmap, (unsigned short *)FRAMEBUF_BASE, 0x8a8c / 2);

}


static void OEMInitInterrupts(void)
{
	volatile INTreg *s2410INT = (INTreg *)INT_BASE;
	volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;

    //RETAILMSG(1, (TEXT("Clear pending interrupts...\r\n")));

	// Configure EINT9 for CS8900 interrupt.
	//
	s2410IOP->rGPGCON  = (s2410IOP->rGPGCON  & ~(0x3 << 0x2)) | (0x2 << 0x2);		// GPG1 == EINT9.
	s2410IOP->rGPGUP   = (s2410IOP->rGPGUP   |  (0x1 << 0x1));						// Disable pull-up.
	s2410IOP->rEXTINT1 = (s2410IOP->rEXTINT1 & ~(0xf << 0x4)) | (0x1 << 0x4);		// Level-high triggered.

	// Configure EINT14 for dm9000 interrupt.
	//
	s2410IOP->rGPGCON  = (s2410IOP->rGPGCON  & ~(0x3 << 12)) | (0x2 << 12);	// GPG6 == EINT14.
	s2410IOP->rGPGUP   = (s2410IOP->rGPGUP   |  (0x1 << 6));						// Disable pull-up.
	s2410IOP->rEXTINT1 = (s2410IOP->rEXTINT1 & ~(0xf << 24)) | (0x1 << 24);		// Level-high triggered.

	// Configure EINT8 for PD6710 interrupt.
	//
	s2410IOP->rGPGCON  = (s2410IOP->rGPGCON  & ~(0x3 << 0x0)) | (0x2 << 0x0);		// GPG0 == EINT8.
	s2410IOP->rGPGUP   = (s2410IOP->rGPGUP   |  (0x1 << 0x0));						// Disable pull-up.
	s2410IOP->rEXTINT1 = (s2410IOP->rEXTINT1 & ~(0xf << 0x0)) | (0x1 << 0x0);		// Level-high triggered.

	// Mask and clear all peripheral interrupts (these come through a second-level "GPIO" interrupt register).
	//
	s2410IOP->rEINTMASK = BIT_ALLMSK;	// Mask all EINT interrupts.
	s2410IOP->rEINTPEND = BIT_ALLMSK;	// Clear pending EINT interrupts.

	// Mask and clear all interrupts.
	//
    s2410INT->rINTMSK = BIT_ALLMSK;			// Mask all interrupts (reset value).
	s2410INT->rINTMSK &= ~BIT_BAT_FLT;
    s2410INT->rSRCPND = BIT_ALLMSK;			// Clear pending interrupts.
    s2410INT->rINTPND = s2410INT->rINTPND;	// S3C2410X developer notice (page 4) warns against writing a 1 to any
											//  0 bit field in the INTPND register.  Instead we'll write the INTPND value itself.
    
}

/*
static void OEMInitInterrupts(void)
{
	volatile INTreg *s2410INT = (INTreg *)INT_BASE;
	volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;

    //RETAILMSG(1, (TEXT("Clear pending interrupts...\r\n")));

	s2410INT->rSUBSRCPND = BIT_SUB_ALLMSK;
	s2410INT->rINTSUBMSK = BIT_SUB_ALLMSK;

	s2410IOP->rEINTMASK = 0xffffff;
	s2410IOP->rEINTPEND = 0xffffff;

    s2410INT->rSRCPND = BIT_ALLMSK;     // Clear pending bit
    s2410INT->rINTPND = BIT_ALLMSK;

    s2410INT->rINTMSK = BIT_ALLMSK;			// Mask all interrupts (reset value).
	s2410INT->rINTMSK &= ~BIT_BAT_FLT;
    s2410INT->rSRCPND = BIT_ALLMSK;			// Clear pending interrupts.
    s2410INT->rINTMSK &= ~(BIT_TIMER4);    
    s2410INT->rINTPND = s2410INT->rINTPND;	
    
}
*/

/*
static void OEMInitInterrupts(void)
{
	volatile INTreg *s2410INT = (INTreg *)INT_BASE;
	volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;

	// Configure EINT9 for CS8900 interrupt.
	//
	s2410IOP->rGPGCON  = (s2410IOP->rGPGCON  & ~(0x3 << 0x2)) | (0x2 << 0x2);		// GPG1 == EINT9.
	s2410IOP->rGPGUP   = (s2410IOP->rGPGUP   |  (0x1 << 0x1));						// Disable pull-up.
	s2410IOP->rEXTINT1 = (s2410IOP->rEXTINT1 & ~(0xf << 0x4)) | (0x1 << 0x4);		// Level-high triggered.

	// Configure EINT8 for PD6710 interrupt.
	//
	s2410IOP->rGPGCON  = (s2410IOP->rGPGCON  & ~(0x3 << 0x0)) | (0x2 << 0x0);		// GPG0 == EINT8.
	s2410IOP->rGPGUP   = (s2410IOP->rGPGUP   |  (0x1 << 0x0));						// Disable pull-up.
	s2410IOP->rEXTINT1 = (s2410IOP->rEXTINT1 & ~(0xf << 0x0)) | (0x1 << 0x0);		// Level-high triggered.

	// Mask and clear all peripheral interrupts (these come through a second-level "GPIO" interrupt register).
	//
	s2410IOP->rEINTMASK = BIT_ALLMSK;	// Mask all EINT interrupts.
	s2410IOP->rEINTPEND = BIT_ALLMSK;	// Clear pending EINT interrupts.

	// Mask and clear all interrupts.
	//
    s2410INT->rINTMSK = BIT_ALLMSK;			// Mask all interrupts (reset value).
	s2410INT->rINTMSK &= ~BIT_BAT_FLT;
    s2410INT->rSRCPND = BIT_ALLMSK;			// Clear pending interrupts.
    s2410INT->rINTPND = s2410INT->rINTPND;	// S3C2410X developer notice (page 4) warns against writing a 1 to any
											//  0 bit field in the INTPND register.  Instead we'll write the INTPND value itself.
}
*/

⌨️ 快捷键说明

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