请求gooolgeman----关于2440lcd 24bpp显示问题 !!!

hzxiaobao   2009-11-10 17:18 楼主
我在移置2440的Bootload中的lcd驱动时候,设置24bpp Mode显示,现在屏幕上显示的内容为屏幕的上半边水平依次显示了两个一摸一样的我欲显示的开机画面,下半部分无任何显示,请问应该调节那几个参数啊。
我显示16bpp mode时候可以正常显示并调试通过了。

回复评论 (14)

应该是你的LCD显示的视频缓冲区的结束地址的size小了一半,把原先的结束地址范围扩大LCD_WIDTH*LCD_HEIGHT试试看,因为24bpp显示比16bpp的buffer要大LCD_WIDTH*LCD_HEIGHT。
点赞  2009-11-10 23:14
引用: 引用 1 楼 heyme 的回复:
应该是你的LCD显示的视频缓冲区的结束地址的size小了一半,把原先的结束地址范围扩大LCD_WIDTH*LCD_HEIGHT试试看,因为24bpp显示比16bpp的buffer要大LCD_WIDTH*LCD_HEIGHT。


恩,把显示驱动设置为32位。
点赞  2009-11-11 00:04
首先谢谢楼上两位的意见,我按照你们的建议做,还不可以正常显示
以下是 我的代码:
rLCDSADDR1 = (((U32)LCDFRAMEBUFFER >> 22) << 21) | ((M5D((U32)LCDFRAMEBUFFER >> 1)) <<  0);
    rLCDSADDR2 = M5D(((U32)LCDFRAMEBUFFER + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * LCD_XSIZE_TFT * LCD_YSIZE_TFT)) >> 1);    //2
    rLCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT  / 1);   

最后 GOOOGLE MAN的 “把显示驱动设置为32位”,具体的思路是怎样的呢?先谢了
点赞  2009-11-11 13:48
引用: 引用 3 楼 andylkz 的回复:
首先谢谢楼上两位的意见,我按照你们的建议做,还不可以正常显示
以下是 我的代码:
rLCDSADDR1 = (((U32)LCDFRAMEBUFFER >> 22) < < 21) | ((M5D((U32)LCDFRAMEBUFFER >> 1)) < ? ? rLCDSADDR2 = M5D(((U32)LCDFRAMEBUFFER + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * LCD_XSIZE_TFT * LCD_YSIZE_TFT)) >> 1);? ? //2
? ? rLCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) < < 11) | (LCD_XSIZE_TFT? / 1);?

最后 GOOOGLE MAN的 “把显示驱动设置为32位”,具体的思路是怎样的呢?先谢了


前几天刚有一个人解决了,我帮你问问。呵呵,我没有做过。

我看他帖子是这样的,
点赞  2009-11-11 13:51
哇,谷歌男真是有效率,这么快就回复啦!

那好,给他帖子看看……
点赞  2009-11-11 14:10

16bpp正常显示的时候rLCDSADDR1 2 3 的设置是怎么样的?贴出来看看呢?
从上面你贴出来的代码来看好像还是有问题。
  
点赞  2009-11-11 14:20
嗯,以下是我16BPP显示的代码
初始化:
void Lcd_Init(void)
{
        frameBuffer16BitTft =(FBT) LCDFRAMEBUFFER;
       
        rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
       
            rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
        rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
        rLCDCON4=(MVAL<<8)|(HSPW);
        rLCDCON5=(1<<11)|(0<<10)|(1<<9)|(1<<8)| (0<<7) |(0<<6)|(1<<3)|(BSWP<<1)|(1);       
            rLCDSADDR1 = ((LCDFRAMEBUFFER >> 22) << 21) | ((M5D(LCDFRAMEBUFFER >>   1)) <<  0);
    rLCDSADDR2 = M5D((LCDFRAMEBUFFER + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1);
    rLCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT / 1);   

        rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
        rTCONSEL&=(~7); // Disable LPC3600 diff 2410
        rTPAL=0; // Disable Temp Palette
       
        Fill_Screen(0x0);
        rLCDCON1|=1;
}

显示程序
void paint_logo(const unsigned char bmp[])
{
        int x,y,p =0;
        U32 c;
        FBT logotemp;

        for( y = 0 ; y < LCD_YSIZE_TFT ; y++ )
    {
        for( x = 0 ; x < LCD_XSIZE_TFT ; x++ )
        {
            c = bmp[p+1] | (bmp[p]<<8) ;
                        
            if ( ( x < LCD_XSIZE_TFT) && ( y < LCD_YSIZE_TFT) )
                frameBuffer16BitTft[y][x] = c ;
            
            p += 2 ;
        }
    }
  }
而下面是24BPP初始化:
void Lcd_Init(void)
{
        frameBuffer16BitTft =(FBT) LCDFRAMEBUFFER;
               
        rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(13<<1)|0;  //12
       
            rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
        rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
        rLCDCON4=(MVAL<<8)|(HSPW);
        rLCDCON5=(0<<12)|(1<<11)|(0<<10)|(1<<9)|(1<<8)| (0<<7) |(0<<6)|(1<<3)|(0<<1)|(0);       
    rLCDSADDR1 = (((U32)LCDFRAMEBUFFER >> 22) << 21) | ((M5D((U32)LCDFRAMEBUFFER >> 1)) <<  0);
    rLCDSADDR2 = M5D(((U32)LCDFRAMEBUFFER + (U32)(LCD_XSIZE_TFT * LCD_YSIZE_TFT *4)) >> 1);   
    rLCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT *2 / 1);   

        rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
        rTCONSEL&=(~7); // Disable LPC3600 diff 2410
        rTPAL=0; // Disable Temp Palette
       
        Fill_Screen(0x0);
        rLCDCON1|=1;
}

24BPP显示程序

void paint_logo(const unsigned char bmp[])
{
        int x,y,p =0;
        U32 c;
        FBT logotemp;
   

        for( y = 0 ; y < (2*LCD_YSIZE_TFT) ; y++ )
    {
        for( x = 0 ; x <(2* LCD_XSIZE_TFT) ; x++ )
        {
             c =  bmp[p+2] | (bmp[p+1]<<8)|(bmp[p]<<16)  ;         
                     
            if ( ( x < 2*LCD_XSIZE_TFT) && ( y < 2*LCD_YSIZE_TFT) )
                frameBuffer16BitTft[y][x] = c ;
            
            p += 3 ;              
        }
    }
   
  }
因为是24BPP,占3Byte 所以 c =  bmp[p+2] | (bmp[p+1]<<8)|(bmp[p]<<16)  ;

代码就是上面这些,帮忙看看有什么缺陷,谢谢
点赞  2009-11-11 15:09
看了那个rLCDSADDR2和rLCDSADDR3的设置好像是对的。
但也发现一些问题,一起讨论:
1,这个const unsigned char bmp[] 是个什么样的结构,24bpp和16bpp用的是一个数组吗?要是同一个数组可能有错误了,也许这就是一个为RGB565的BMP图片,你需要的是把565变成888的24bpp
2,24bpp时:首先应该定义(U32)frameBuffer16BitTft[y][x]吧?
3,24bpp时,两个For循环应该都不需要乘以2。我觉得应该是这样的:
  for( y = 0 ; y < (LCD_YSIZE_TFT) ; y++ )
    {
        for( x = 0 ; x <(LCD_XSIZE_TFT) ; x++ )
        {
            //这一段还是取BMP【】的两个字节,主要是将上面得到的16bpp时候的数C扩充成RGB888的结构,写一个函数转换一下。   
                     
            if ( ( x < LCD_XSIZE_TFT) && ( y                 frameBuffer16BitTft[y][x] = c ;
            
            p += 2 ;              
        }
    }
  
  }
  
点赞  2009-11-11 15:41
还是菜鸟  make下!帮你顶了!!
点赞  2009-11-11 15:57
结贴结贴啦,终于解决问题了,多谢HeyMe还有gooogleman的热情帮助,其中寄存器的配置原来是没有问题的
最重要是显示部分要修改,结合了HeyMe建议,但是最后发现还是要取BMP[]的三个字节,因为是24BYTR,RGB888模式。
点赞  2009-11-11 16:23
引用: 引用 8 楼 heyme 的回复:
1,这个const unsigned char bmp[] 是个什么样的结构,24bpp和16bpp用的是一个数组吗?要是同一个数组可能有错误了,也许这就是一个为RGB565的BMP图片,你需要的是把565变成888的24bpp


不是同一个数组,我用VS2005写了一个软件,把24位的位图转换为16进制的数组。
点赞  2009-11-11 16:53
引用: 引用 10 楼 andylkz 的回复:
结贴结贴啦,终于解决问题了,多谢HeyMe还有gooogleman的热情帮助,其中寄存器的配置原来是没有问题的
最重要是显示部分要修改,结合了HeyMe建议,但是最后发现还是要取BMP[]的三个字节,因为是24BYTR,RGB888模式。


wince下你搞定了吗?就是进入桌面会怎么样?
点赞  2009-11-12 10:53
在BOOTLOADER下可以实现,与之前16BPP相比显示图片曲线更圆滑。接下来做Wince的显示,等结果出来再跟大家分享,哈哈....
点赞  2009-11-12 11:03
mark
点赞  2009-11-20 11:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复