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

📄 display.c

📁 基于三星S3C2410的显示驱动程序
💻 C
字号:
#include <eframe.h>
#include <gwmeobj.h>
#include <edevice.h>
#include <eobjtype.h>

#include <s2410.h>

extern const _DISPLAYDRV _drvDisplay16BPP;
static COLORREF _PutPixel( _LPPIXELDATA lpPixelData );
static COLORREF _GetPixel( _LPPIXELDATA lpPixelData );
static BOOL _Line( _LPLINEDATA lpData );
static BOOL _BlkBitTransparentBlt( _LPBLKBITBLT lpData );
static BOOL _BlkBitMaskBlt( _LPBLKBITBLT lpData );
static BOOL _BlkBitBlt( _LPBLKBITBLT lpData );
static COLORREF _RealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat );
static COLORREF _UnrealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat );

static const _DISPLAYDRV oemDisplay16BPP = {
    _PutPixel,
    _GetPixel,
    _Line,
    _BlkBitTransparentBlt,
    _BlkBitMaskBlt,
    _BlkBitBlt,
    _RealizeColor,
    _UnrealizeColor,
};


static void Draw3OriginalColor(unsigned C1,unsigned C2,unsigned C3);
static void Draw3OriginalColorAlternate(unsigned win,unsigned C1,unsigned C2,unsigned C3);
static void DisplayerOff(void);

extern void msWait(unsigned);       //Added by Bruce
extern const int nSkipHeight;
extern const int nSkipWidth;
extern const unsigned short wSkipImage[];

//#define  ROTATE

static const _BITMAPDATA oemDisplayBitmap = 
{ 
	{ OBJ_BITMAP, NULL, NULL, NULL, NULL }, 
		0,
		1,
		16,
		240,
		320,
		240 * 2,
		(unsigned *)(FRAMEBUF_BASE) 
};

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


    s2410IOP = (IOPreg *)IOP_BASE;
    s2410LCD = (LCDreg *)LCD_BASE; 
    RETAILMSG( DEBUG_InitDisplay, ( "s2410IOP=0x%x, s2410LCD=0x%x.\r\n", s2410IOP, s2410LCD ) );

    // 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                                     */

//		lcdcon1 : LCD1_BPP_16T | LCD1_PNR_TFT | LCD1_CLKVAL(7) ,
		//lcdcon2 : LCD2_VBPD(4) | LCD2_VFPD(1) | LCD2_VSPW(1),
//		lcdcon3 : LCD3_HBPD(6) | LCD3_HFPD(30),
//		lcdcon4 : LCD4_HSPW(3) | LCD4_MVAL(13),
//		lcdcon5 : LCD5_FRM565 | LCD5_HWSWP | LCD5_PWREN,


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

    RETAILMSG( DEBUG_InitDisplay, ( "s2410LCD->rLCDCON1=0x%x.\r\n", s2410LCD->rLCDCON1 ) );                            

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

    s2410LCD->rLCDCON2   =  (4        << 24) |   /*4 VBPD          :   4                              */
                            (LINEVAL_TFT << 14) |   /* Virtical Size : 320 - 1                          */
                            (1        <<  6) |   /* 1 VFPD          :   1                              */
                            (1        <<  0) ;   /* 1 VSPW          :   1                              */
        
    RETAILMSG( 1, ( "s2410LCD->rLCDCON2=0x%x.\r\n", s2410LCD->rLCDCON2 ) );                                                        

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

    s2410LCD->rLCDCON3   =  (6        << 19) |   /* 6 HBPD          :   6                              */
                            (HOZVAL_TFT  <<  8) |   /* HOZVAL_TFT    : 240 - 1                          */
                            (30        <<  0) ;   /* HFPD          :   30                              */
    
    RETAILMSG( DEBUG_InitDisplay, ( "s2410LCD->rLCDCON3=0x%x.\r\n", s2410LCD->rLCDCON3 ) );
//    s2410LCD->rLCDCON4   =  (MVAL        <<  8) |   /* MVAL          :  13                              */
//                            (HSPW        <<  0) ;   /* HSPW          :   4                              */
    s2410LCD->rLCDCON4   =  (13        <<  8) |   /* MVAL          :  13                              */
                            (3        <<  0) ;   /* HSPW          :   4                              */

    RETAILMSG( DEBUG_InitDisplay, ( "s2410LCD->rLCDCON4=0x%x.\r\n", s2410LCD->rLCDCON4 ) );
    
//    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                           */
          //                  (0           <<  3) |   /* PWREN         : Disable PWREN                    */
            //                (0           <<  2) |   /* ENLEND        : Disable LEND signal              */
              //              (0           <<  1) |   /* BSWP          : Swap Disable                     */
                //            (1           <<  0) ;   /* HWSWP         : Swap Enable                      */

    s2410LCD->rLCDCON5   =  (0           << 12) |   /* BPP24BL       : LSB valid                        */
                            (1           << 11) |   /* FRM565 MODE   : 5:6:5 Format                     */
                            (0           << 10) |   /* INVVCLK       : VCLK Falling Edge                */
                            (0           <<  9) |   /* INVVLINE      : Inverted Polarity                */
                            (0           <<  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                      */
        
    RETAILMSG( 1, ( "s2410LCD->rLCDCON5=0x%x.\r\n", s2410LCD->rLCDCON5 ) );
    
    s2410LCD->rLCDSADDR1 = ((FRAMEBUF_DMA_BASE >> 22)     << 21) |
                           ((M5D(FRAMEBUF_DMA_BASE >> 1)) <<  0);
    RETAILMSG( 1, ( "s2410LCD->rLCDSADDR1=0x%x.\r\n", s2410LCD->rLCDSADDR1 ) );
    
    s2410LCD->rLCDSADDR2 = M5D((FRAMEBUF_DMA_BASE + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1);

    RETAILMSG( 1, ( "s2410LCD->rLCDSADDR2=0x%x.\r\n", s2410LCD->rLCDSADDR2 ) );
    
    s2410LCD->rLCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT / 1);
    RETAILMSG( 1, ( "s2410LCD->rLCDSADDR3=0x%x.\r\n", s2410LCD->rLCDSADDR3 ) );
    
/*    
#if (BOARD_TYPE == 1)
    s2410LCD->rLPCSEL   |= 0x3;
#else
    s2410LCD->rLPCSEL   |= 0x2;
#endif */
    s2410LCD->rLPCSEL = 2; //240*320 disable lpc3600

    s2410LCD->rTPAL     = 0x0;
    s2410LCD->rLCDCON1 |= 1;

//    RETAILMSG( 1, ( "copy logo(wSkipImage=0x%x, size=%d)++.\r\n", wSkipImage, ARRAY_SIZE_TFT_16BIT ) );
        
	memcpy((void *)FRAMEBUF_BASE, wSkipImage, 240*320*2 );
	
//    RETAILMSG( 1, ( "copy logo--.\r\n" ) );

}


static void DisplayerOff(void)
{
}

/*
static void ShowSkip( void )
{
	int i, j;
	LPWORD lpwLine = wSkipImage;
	int ySkipOffset = 0;//(600 - nSkipHeight) / 2;
	int xSkipOffset = 0;//(800 - nSkipWidth) / 2;
		
	LPWORD lpwDestLine = (LPWORD)FRAMEBUF_BASE + ySkipOffset * 240 + xSkipOffset;
	int nScanWords = nSkipWidth;

	for( i = 0; i < 7; i++ )
	{	
		LPWORD lpwSrc = lpwLine;
		LPWORD lpwDest = lpwDestLine;
		for( j = 0; j < nSkipWidth; j++ )
		{
			if( *lpwSrc != 0xffdf )
    			*lpwDest = *lpwSrc;
			lpwDest++;
			lpwSrc++;			
		}
		lpwLine += nScanWords;
		lpwDestLine += 240;
	}
	
	for( ; i < nSkipHeight - 27; i++ )
	{	
		LPWORD lpwSrc = lpwLine;
		LPWORD lpwDest = lpwDestLine;
		for( j = 0; j < nSkipWidth; j++ )
		{
			*lpwDest++ = *lpwSrc++;
		}
		lpwLine += nScanWords;
		lpwDestLine += 240;
	}

	for( ; i < nSkipHeight; i++ )
	{	
		LPWORD lpwSrc = lpwLine;
		LPWORD lpwDest = lpwDestLine;
		for( j = 0; j < nSkipWidth; j++ )
		{
			if( *lpwSrc != 0xffdf )
    			*lpwDest = *lpwSrc;
			lpwDest++;
			lpwSrc++;			
		}
		lpwLine += nScanWords;
		lpwDestLine += 240;
	}

}
*/

static int DoDestroy( void )
{
	return 1;
}

static int DoCreate( void )
{
    return 1;
}

static int DoOpen( void )
{
	InitDisplay();
	
//	ShowSkip();
	Sleep( 3000 );
	return TRUE;
}

DWORD CALLBACK GWDI_DisplayEnter( UINT msg, DWORD dwParam, LPVOID lParam )
{
    switch( msg )
    {
    case GWDI_CREATE:   //初始化硬件
        return DoCreate();
    case GWDI_OPEN:
    	return DoOpen();
    case GWDI_DESTROY:   //关掉显示设备
        return DoDestroy();
    case GWDI_GET_MODE_NUM:
        return 1;  //返回有多少种显示模式
    //case GWDI_POWEROFF:
        // 开关机处理
      //  return DoPowerOff();
    //case GWDI_POWERON:
    // 开关机处理
      //  return DoPowerOn();
    //case GWDI_GETBITMAP:
      //  *((_LPBITMAPDATA)lParam) = *((_LPBITMAPDATA)&oemDisplayBitmap);
        //return 1;
	case GWDI_GET_DISPLAY_PTR:
		*((_LPDISPLAYDRV*)lParam) = (_LPDISPLAYDRV)&oemDisplay16BPP;
		return 1;
    case GWDI_GET_BITMAP_PTR:
        *((_LPBITMAPDATA*)lParam) = (_LPBITMAPDATA)&oemDisplayBitmap;
        return 1;
    }
    return 0;
}

static COLORREF _PutPixel( _LPPIXELDATA lpPixelData )
{
	return _drvDisplay16BPP.lpPutPixel( lpPixelData );
}

static COLORREF _GetPixel( _LPPIXELDATA lpPixelData )
{
	return _drvDisplay16BPP.lpGetPixel( lpPixelData );
}

static BOOL _Line( _LPLINEDATA lpData )
{
	return _drvDisplay16BPP.lpLine( lpData );
}

static BOOL _BlkBitTransparentBlt( _LPBLKBITBLT lpData )
{
	return _drvDisplay16BPP.lpBlkBitTransparentBlt( lpData );
}

static BOOL _BlkBitMaskBlt( _LPBLKBITBLT lpData )
{
	return _drvDisplay16BPP.lpBlkBitMaskBlt( lpData );
}

static BOOL _BlkBitBlt( _LPBLKBITBLT lpData )
{
	return _drvDisplay16BPP.lpBlkBitBlt( lpData );
}

static COLORREF _RealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{
	DWORD r;
    DWORD g;
    DWORD b;

    //  8b 8g 8r format to 5b 6g 5r
    //r = ((color << 24) >> 27) & 0x001f;
    //g = ((color << 16) >> 21) & 0x07e0;
    //b = ((color << 8) >> 16) & 0xF800;

    //2003-09-06-DEL-Begin
	//  8b 8g 8r format to 5r 6g 5b
    //r = ((color << 24) >> 16) & 0xF800;
    //g = ((color << 16) >> 21) & 0x07e0;
    //b = ((color << 8) >> 27) & 0x001f;
    //return (b | g | r);
	//2003-09-06-DEL-end
/*
	r = ( (color & 0xff) * 0x1f / 0xff ) << 11;	
	g = ( ( (color >> 8 ) & 0xff) * 0x3f / 0xff ) << 5;
	b = ( ( (color >> 16 ) & 0xff) * 0x1f / 0xff );
	
	return r | g | b;
*/
    return _drvDisplay16BPP.lpRealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );
        

}

static COLORREF _UnrealizeColor( COLORREF color, LPCDWORD lpcdwPal, UINT uPalNumber, UINT uPalFormat )
{
    DWORD r;
    DWORD g;
    DWORD b;

	//  5b 6g 5r format to  8b 8g 8r
    //r = color & 0x001f;
	//g = color & 0x07e0;
	//b = color & 0xf800;

	//r = ((r << 27) >> 24);
    //g = ((g << 21) >> 16);
    //b = ((b << 16) >> 8);

	//2003-09-06-DEL-Begin
	//  5r 6g 5b format to  8b 8g 8r
    //r = color & 0xf800;
	//g = color & 0x07e0;
	//b = color & 0x001f;

	//r = ((r << 16) >> 24);
    //g = ((g << 21) >> 16);
    //b = ((b << 27) >> 8);
	//return (b | g | r);
	//2003-09-06-DEL-end

/*    r = ( (color & 0xf800) >> 11) * 0xff / 0x1f;
	g = ( ( (color & 0x07e0) >> 5) * 0xff / 0x3f ) << 8;
	b = ( ( (color & 0x001f)) * 0xff / 0x1f ) << 16;

	return r | g | b;
*/
    return _drvDisplay16BPP.lpUnrealizeColor( color, lpcdwPal, uPalNumber, uPalFormat );    

    
}

⌨️ 快捷键说明

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