S3C2451I80接口显示屏自动刷屏问题

1.      S3C2451支持的显示屏接口类型及其工作原理

LCD控制器把位于系统内存(systemmemory)的视频缓冲区(video buffer)中的图像数据(image data)传送给一个外部的LCD驱动接口。S3C2451支持两种驱动接口,一种是常见的RGB接口,其他的就是另一种I80系统接口,也叫I80接口,这是I80接口最早主要是用于单片机领域。

 

 I80-LCD屏它与RGB-LCD屏主要区别在于显存的位置,RGB-LCD的显存是由系统内存充当的,因此其大小只受限于系统内存的大小,这样 RGB-LCD可以做出较大尺寸。而I80-LCD的设计之初主要考虑单片机的内存较小,因此都是把显存内置在LCD模块内部,然后软件通过专门显示命令来更新显存,因此I80屏往往不能做得很大.同时显示更新速度也比RGB- LCD慢.

 

显示数据的传输模式也有差别,RGB屏只需显存组织好数据。启动显示后,LCD-DMA会自动把显存中的图像数据通过RGB接口送到LCM。而I80屏则需要发送画点的命令来修改I80内部RAM。(即不能直接I80屏RAM)所以RGB显示速度明显比I80快,而且播放视频方面,I80-LCD也比较慢,下面借用网友的图片有助于理解:


图1


图2

 

2.      S3C2451 I80系统接口和显示屏的接口

2.1  S3C2451 I80系统接口

S3C2451显示控制器支持I80系统接口,定义及时序如下:


图3

因为我们采用的显示屏数据接口只有DB[15:0],也就是说显示接口原理图设计的之后只需要从LCD控制器接口中连接响应数量的数据接口即可,S3C2451对16BPP I80系统接口的引脚描述如下:

图4

 

2.2  I80显示屏接口

我们采用的显示屏是TFT1N7095-Ev1.0,接口类型是系统并行接口(system parallel interface),其采用的驱动IC是SSD1289Z。此显示屏提供的接口如下:

⑴GND和VDD引脚

⑵控制引脚

CS--->片选信号。

RS--->数据或是命令选择。

WR--->写数据,低电平使能写操作。

RD--->读数据,低电平使能读操作。

RESET--->复位LCD模块,低电平复位。

 

⑶数据引脚DB[15:0]

⑷触摸屏控制引脚YD、XL、YU和XR

⑸背光控制引脚LEDK1~LEDK5(负极)和LEDA(正极)

 

驱动IC SSD1289Z的主要功能概述如下:


图5

3.      S3C2451 I80系统接口的数据显示

3.1  主要寄存器设置

 

为确保I80系统接口能够正常传送数据给显示屏,需要设置很多寄存器,下面说明最重要的的部分:

 

⑴配置LCD控制器为I80系统接口


图6

⑵使能视频输出和逻辑


图7

⑶设置基于软件触发的控制寄存器


图8

设置此位为1后,LCD控制寄存器的DMA从系统内存的视频缓冲区中取出图像数据并发送给显示器,且此为自动清理(否则一直触发)

 

3.2  创建定时刷屏的线程

在显示驱动中开一个线程,定时刷新屏

线程的主要部分如下:

while(1)

         {

                   RefreshLcd= WaitForSingleObject(hRefreshLcd, dwTimeOut);

                   EnterCriticalSection(&VideoHwLock);

                   RefreshLCD(pCtxt->pLcdConReg,LcdClockDivideValue);

                   LeaveCriticalSection(&VideoHwLock);

    }

其中刷屏是靠RefreshLCD来实现的,函数体如下:

void RefreshLCD(volatile S3C2450_LCD_REG*s2450LCD,UINT8 clkval)

{

         s2450LCD->VIDCON0|= (clkval <<VIDCON0_CLKVAL_F_SHIFT);

 

         s2450LCD->SYSIFCON0=(HX8347_CS_SETUP2<<16)|(HX8347_WR_SETUP2<<12)|(HX8347_WR_ACT2<<8)|(HX8347_WR_HOLD2<<4)|(1<<2)|(1<<1)|(1);

         //kandimark at 2013.05.23

         //s2450LCD->SYSIFCON1= (HX8347_CS_SETUP2<<16)|(HX8347_WR_SETUP2<<12)|(HX8347_WR_ACT2<<8)|(HX8347_WR_HOLD2<<4)|(1<<2)|(1<<1)|(1);

         s2450LCD->VIDTCON2= ((LCD_LINEVAL-1)<<VIDTCON2_LINEVAL_S)|(LCD_HOZVAL-1);

 

         //s2450LCD->WINCON0= (0<<WINCON_SWAP_S)|(WINCONx_16WORD_BURST<<WINCON_BURSTLEN_S)|(WINCONx_16BPP_565<<WINCON_BPP_S);// 4word burst, 16bpp,

         s2450LCD->WINCON1=(0<<WINCON_SWAP_S)|(WINCONx_16WORD_BURST<<WINCON_BURSTLEN_S)|(WINCONx_16BPP_565<<WINCON_BPP_S);// 4word burst, 16bpp,

         //s2450LCD->VIDOSD0A= (0<<VIDOSDxAB_HORIZON_X_S)|(0);

         //s2450LCD->VIDOSD0B= ((lcd_horizon_value-1)<<VIDOSDxAB_HORIZON_X_S)|(lcd_line_value-1);

         s2450LCD->VIDOSD1A= (0<<VIDOSDxAB_HORIZON_X_S)|(0);

         s2450LCD->VIDOSD1B= ((LCD_HOZVAL-1)<<VIDOSDxAB_HORIZON_X_S)|(LCD_LINEVAL-1);

 

         //s2450LCD->VIDW00ADD0B0= (UINT32)IMAGE_FRAMEBUFFER_DMA_BASE;

         s2450LCD->VIDW01ADD0= (UINT32)IMAGE_FRAMEBUFFER_DMA_BASE;

         //buffer end address

         //s2450LCD->VIDW00ADD1B0= (UINT32)IMAGE_FRAMEBUFFER_DMA_BASE + (LCD_WIDTH*LCD_HEIGHT*2);

         s2450LCD->VIDW01ADD1= (UINT32)IMAGE_FRAMEBUFFER_DMA_BASE + (LCD_WIDTH*LCD_HEIGHT*2);

         //buffer size

         //s2450LCD->VIDW00ADD2B0= (offsize_in_byte<<VIDWxADD2_OFFSET_SIZE_S)|(LCD_WIDTH*2);

         s2450LCD->VIDW01ADD2= (0<<VIDWxADD2_OFFSET_SIZE_S)|(LCD_WIDTH*2);

 

         //s2450LCD->WINCON0|= (1<<WINCON_SWAP_S);

         s2450LCD->WINCON1|= (1<<WINCON_SWAP_S);

 

         s2450LCD->WINCON1|= 0x1;

         s2450LCD->VIDCON0|= 0x3;

 

         s2450LCD->CPUTRIGCON2= 1;//kandi open at 2013.05.23

}

 

 

3.3  屏写周期

驱动IC中对I80时序参数描述如下:


图9

由图9可知一个写周期(写16位数据)最小值为100ns,而我们显示驱动的设计是一个像素点用RGB565数据表示,也就是16位数据表示,那么对于分辨率为240*320的显示屏来说,如果要从系统的显存中取出一个画面的数据主要需要的时间= 从设置CPUTRIGCON2 = 1到DMA从显存中取出数据的时间(在此我称为T1)+把显示数据写入显示屏的时间(在此我称为T2),其中T1的时间很难定量,虽然DMA的操作不需要占用CPU的时间,但从CPUTRIGCON2 = 1到DMA开始取数据的时间很难定量;T2至少需要240*320*100n=7.68ms。

3.4   

 

4.      问题的解决

为什么会在不切换界面的情况下,从上到下屏幕以白色界面把当前界面刷了一遍,然后马上就又可以看到刷屏前的界面,主要分析产生此问题的原因有两个:

⑴显存的数据发生变化

首先是如果系统系统显存的数据发生变化,那为什么采用RGB接口的另一种产品不会有这个现象,从而推断问题应该不在这里。还有一种可能的原因就是显示屏驱动IC自带的GRAM数据发生变化,但是根据向显示屏厂家了解,他们及他们的客户都没有遇到这样的问题。

 

⑵两次刷屏之间的间隔时间

根据上面的分析,写一次全屏数据至少需要7.68ms,但是显示驱动中负责刷屏的线程的刷屏周期是40ms,按道理来说应该是足够了。我在做了其他优化(把此线程中没有用到的代码去掉,以及把线程中设置CPUTRIGCON2 = 1的动作移到RefreshLCD函数中),再把刷屏周期分别改为80ms、60ms和50ms测试都没有发现刷屏的问题。

 

那很有可能就是系统在处理一次刷屏之后,还要经过一段时间,刷屏线程才能重新获得处理器的执行时间,才能开始再一次刷屏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值