现在的位置: 首页 > 综合 > 正文

2440 wince的24bpp(24位)颜色深度实现

2013年12月06日 ⁄ 综合 ⁄ 共 2199字 ⁄ 字号 评论关闭

 

2440 wince24bpp24位)颜色深度实现

作者:JNU_kinke

Wince设计LCD显示的地方有三个文件:

S3c2440a_lcd.h (d:/wince500/platform/smdk2440/src/inc) 7528       2009-11-14

Init.c (d:/wince500/platform/smdk2440/src/kernel/oal)       13050     2009-11-14

S3c2440disp.cpp (d:/wince500/platform/smdk2440/src/drivers/display)    33090     2009-11-14

 

1S3c2440a_lcd.h文件主要定义LCD的分辨率、时序等参数需要修改的参数如下:

       #define LCD_VBPD          2    //((7)&0xff)      //((2)&0xff)

       #define LCD_VFPD          2    //((43-1)&0xff)      //((6)&0xff)

       #define LCD_VSPW         10    //((4-1) &0x3f)      //((10) &0x3f)

      

       #define LCD_HBPD          2    //((48)&0x7f)      //((37)&0x7f)

       #define LCD_HFPD          2    //((16)&0xff)      //((20)&0xff)

       #define LCD_HSPW         41    //((128)&0xff)      //((41)&0xff)

      

       #define    CLKVAL_TFT    (4)   // VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz

       #define    LCD_CON5                ((0<<12) |(1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3)  | (1<<2)  |(0<<1) | (0)) 

LCD_CON5的配置主要依据S3C2440 datasheet中的描述,看截图1:

截图1

 

2init.c文件中的InitDisplay(void)函数主要负责LCD控制器的初始化并显示一张LOGO。因为在S3c2440a_lcd.h文件修改的一些参数这里用到了,所以在此修改的参数不多,主要修改三个地方。

       s2440LCD->LCDCON1   =    (13  <<  1) |    // 24bpp Mode

                                (0   <<  0) ;              // disable LCD

 

    s2440LCD->LCDSADDR2 = M5D(((DWORD)IMAGE_FRAMEBUFFER_DMA_BASE + ((DWORD)LCD_XSIZE_TFT * LCD_YSIZE_TFT *4)) >> 1);

 

    s2440LCD->LCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT*2 / 1); 

显示LOGO部分代码也要修改,16BPP负责ARM内存对齐原则,用memcpy函数把LOGO数值copy到显示缓冲区就可以了,当然大小端要处理好。24BPP颜色有效部分3字节而实际占有了4字节,这是字对齐原则。代码如下:

typedef  DWORD  (*FBT)[LCD_XSIZE_TFT];

#if  BPP16     //16BPP

     memcpy((void*)IMAGE_FRAMEBUFFER_UA_BASE,ScreenBitmap, LCD_ARRAY_SIZE_TFT_16BIT);

#else          //24BPP

    int x,y,p =0;

       DWORD c;

      FBT frameBuffer16BitTft;

      frameBuffer16BitTft =(FBT) IMAGE_FRAMEBUFFER_UA_BASE;

      for( y = 0 ; y < LCD_YSIZE_TFT ; y++ )

    {

        for( x = 0 ; x < LCD_XSIZE_TFT ; x++ )

        {

            c = ScreenBitmap[p] | (ScreenBitmap[p+1]<<8) |(ScreenBitmap[p+2]<<16) ;     

            if ( ( x < LCD_XSIZE_TFT) && ( y < LCD_YSIZE_TFT) )

                frameBuffer16BitTft[y][x] = c ;

            p += 3 ;

        }

    }

#endif    

 

3S3c2440disp.cpp文件是LCD驱动的主文件和初始化入口,winceGDI图形系统通过调用S3C2440DISP()的得到显示参数(实现分辨率、颜色深度动态撤换?!)。这个文件修改三处即OK。如下图所示:

截图2

 

重新编译NK,运行可看效果。

抱歉!评论已关闭.