三星的2416驱动7寸屏AT070TN84的问题!!!!急!!!!

clhlx0785   2009-6-20 18:11 楼主
处理器是s3c2416   ,BSP是2450的(据说这两个处理器类似), LCD是 7寸TFT屏AT070TN84!!!!

现在的现象是,我在OEMINIT中初始化LCD,并让其显示蓝色,然后进入CE系统,但是,该显示蓝色的时候LCD显示的就象屏被关掉没上电一样(类似灰黑色),然后进入CE系统后,屏上就是雪花飘飘!!
此时通过查看打印信息可以知道系统已经跑起来了,插拔USB有反映

static void InitDisplay(void)
{
    UINT8 pagewidth_in_byte=0,offsize_in_byte=0;   
    volatile S3C2450_IOPORT_REG *s2450IOP =
                               (S3C2450_IOPORT_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_IOPORT, FALSE);
    volatile S3C2450_LCD_REG    *s2450LCD = (S3C2450_LCD_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_LCD, FALSE);
    volatile S3C2450_INTR_REG    *s2450INTR = (S3C2450_INTR_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_INTR, FALSE);
    UINT8 clkval=0;
    UINT16 hsync_cnt,vclk_cnt;
    UINT16 lcd_horizon_value,lcd_line_value;
    UINT8 lcd_vbpd,lcd_vfpd,lcd_vspw,lcd_hbpd,lcd_hfpd,lcd_hspw;
    UINT8 lcd_frame_rate;   
    UINT8 lcd_color_depth = LCD_COLOR_DEPTH;
    UINT32 window_color_mode = (lcd_color_depth == 32) ? WINCONx_24BPP_888 : WINCONx_16BPP_565;
    int i;
#if (LCD_COLOR_DEPTH == 16)   
    unsigned short *pFB;
#elif (LCD_COLOR_DEPTH == 32)
    unsigned int *pFB;
#endif

    s2450IOP->MISCCR |= (1<<28);  // select LCD controller for TFT lcd controller
    s2450IOP->GPCUDP     = 0xFFFFFFFF;
    s2450IOP->GPCCON    = 0xAAAAAAAA;
    s2450IOP->GPDUDP     = 0xFFFFFFFF;
    s2450IOP->GPDCON    = 0xAAAAAAAA;
    s2450IOP->GPLCON = s2450IOP->GPLCON & ~(0x3ff<<20) | (0x1<< 28) | (0x1<< 26) | (0x1<< 24) | (0x1<< 22) | (0x1<< 20);
    s2450IOP->GPLDAT |= (0x1f<<10);


    s2450IOP->GPBUDP &= ~0x3;
    s2450IOP->GPBCON = (s2450IOP->GPBCON & ~((3<<6)|(3<<2)|(3<<0))) | ((1<<6)|(1<<2)|(1<<0)); // Backlight Pwm control
    s2450IOP->GPBDAT  |=((1<<0) |(1<<3));

    s2450IOP->GPBDAT &= ~(1<<1);

#if (LCD_MODULE_TYPE == LCD_MODULE_LTE480WV)
            lcd_horizon_value = LTE480_HOZVAL;
            lcd_line_value = LTE480_LINEVAL;
            lcd_vbpd = LTE480_VBPD;
            lcd_vfpd = LTE480_VFPD;
            lcd_vspw = LTE480_VSPW;
            lcd_hbpd = LTE480_HBPD;
            lcd_hfpd = LTE480_HFPD;
            lcd_hspw = LTE480_HSPW;
            lcd_frame_rate = LTE480_FRAME_RATE;
            InitLDI_LTE480();

#elif (LCD_MODULE_TYPE == LCD_MODULE_LTV350)
            lcd_horizon_value = LTV350_HOZVAL;
            lcd_line_value = LTV350_LINEVAL;
            lcd_vbpd = LTV350_VBPD;
            lcd_vfpd = LTV350_VFPD;
            lcd_vspw = LTV350_VSPW;
            lcd_hbpd = LTV350_HBPD;
            lcd_hfpd = LTV350_HFPD;
            lcd_hspw = LTV350_HSPW;
            lcd_frame_rate = LTV350_FRAME_RATE;
            InitLDI_LTV350();
#endif
    pagewidth_in_byte = lcd_horizon_value / 8 * LCD_COLOR_DEPTH;
    offsize_in_byte = 0;
    s2450LCD->WINCON0 &= ~0x01;
    s2450LCD->WINCON1 &= ~0x01;
    s2450LCD->VIDCON0 &= (~3); // ENVID Off using Per Frame method
    s2450LCD->VIDCON0 = VIDCON0_S_RGB_IF|VIDCON0_S_RGB_PAR
                        |VIDCON0_S_VCLK_GATING_OFF|VIDCON0_S_CLKDIR_DIVIDED
                        |VIDCON0_S_CLKSEL_HCLK;
    hsync_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value);
    vclk_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);

    clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1;   
    s2450LCD->VIDCON0 |= (clkval <
    s2450LCD->VIDCON1 = VIDCON1_S_HSYNC_INVERTED|VIDCON1_S_VSYNC_INVERTED;
    s2450LCD->VIDTCON0=((lcd_vbpd-1)<     s2450LCD->VIDTCON1=((lcd_hbpd-1)<     s2450LCD->VIDTCON2 = ((lcd_line_value-1)<     s2450LCD->WINCON0 = (0<                         |(window_color_mode<// 4word burst, 16bpp,
    s2450LCD->VIDOSD0A = (0<     s2450LCD->VIDOSD0B = ((lcd_horizon_value-1)<     s2450LCD->VIDW00ADD0B0 = (UINT32)IMAGE_FRAMEBUFFER_DMA_BASE;        
    s2450LCD->VIDW00ADD1B0 = (UINT32)IMAGE_FRAMEBUFFER_DMA_BASE + (LCD_WIDTH*LCD_HEIGHT *(lcd_color_depth/8));
    s2450LCD->VIDW00ADD2B0 = (offsize_in_byte<     if(window_color_mode == WINCONx_16BPP_565)
    {
        s2450LCD->WINCON0 |= (1<     }
    s2450LCD->WINCON0 |= 0x1;   // Window Enable   
    s2450LCD->VIDCON0 |= 0x3;
    s2450INTR->INTSUBMSK |= (0xf << IRQ_SUB_LCD1);    // MASK all LCD Sub Interrupt
    if(  LCD_MODULE_TYPE == LCD_MODULE_LTV350)
    {
        memcpy((void *)IMAGE_FRAMEBUFFER_UA_BASE, prayer16bpp, LCD_ARRAY_SIZE_TFT_16BIT);
    }
    else if(LCD_MODULE_TYPE == LCD_MODULE_LTE480WV)
    {
        pFB = (unsigned short *)IMAGE_FRAMEBUFFER_UA_BASE;
        for (i=0; i             *pFB++ = 0x001F;        // Blue
    }
}

其中
void InitLDI_LTE480(void)
{
   volatile S3C2450_IOPORT_REG *s2450IOP = (S3C2450_IOPORT_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_IOPORT, FALSE);
    delayLoop(LCD_DELAY_1MS*10);
    s2450IOP->GPBDAT |= (1<<1);    // PCI High   
}
描述:
1、我的屏的种类是LCD_MODULE_TYPE == LCD_MODULE_LTE480WV
2、这个驱动是WINCE50下三星原场的驱动,我看了几个BSP,寄存器都是这么写的
3、         lcd_horizon_value = LTE480_HOZVAL;
            lcd_line_value = LTE480_LINEVAL;
            lcd_vbpd = LTE480_VBPD;
            lcd_vfpd = LTE480_VFPD;
            lcd_vspw = LTE480_VSPW;
            lcd_hbpd = LTE480_HBPD;
            lcd_hfpd = LTE480_HFPD;
            lcd_hspw = LTE480_HSPW;
            lcd_frame_rate = LTE480_FRAME_RATE;
    我看了一下这个原厂BSP带的是:
           #define LTE480_VBPD         (7)     // 8-1
           #define LTE480_VFPD         (5)     // 5-1   
           #define LTE480_VSPW         (1)     // 1-1
           #define LTE480_HBPD         (13)    // 13-1
           #define LTE480_HFPD         (8)     // 8-1
           #define LTE480_HSPW         (3)     // 3-1
           #define LTE480_HOZVAL       (800)   // Horizontal pixel 800
           #define LTE480_LINEVAL      (480)   // Vertical pixel 480
           #define LTE480_FRAME_RATE   (30)
可是我对照了一下AT070TN84的资料觉得它设置的有问题
我按照图中的时序查得出的一套值:
按照SPEC上写的典型值得到另外一套值:
可是这三套都不对!!
其中LTE480_FRAME_RATE   我不知道是哪个表示的,所以我用原来默认的30而且我看SPEC中的DCLK也是30,不知道是不是这个

问题:
1、对时序的值的确定,请问是用SPEC中表的典型值对还是我自己查的对??这两个值差很多,我不知道那个典型值是不是我想要的这几个时序值
2、我的板子现在下不了BOOT,而BOOT中的这几个时序我都没修改,但是我想在BOOT中初始化错误了,但是在kernel中重新初始化如果正确应该可以显示的,是这样吗?
3、这几个时序的值是要求非常准确吗?如果差一点是应该什么都显示不了?还是基本可以显示出图来???
4、除了这个时序请问还有什么地方是驱动屏要注意到的吗???
5、对屏的开发工作,除了软件上注意的问题外,硬件上需要注意什么问题,我需要得到什么样的硬件信息??
   比如怎么连接??才能确保屏的正确驱动??
6、这个驱动是我直接拿三星的BSP做的,我想驱动屏的框架应该是一样的,修改的地方无非是分辨率,时序和寄存器吧??
   还有其他地方吗??

谢谢各位,新手对屏完全不了解!!!

回复评论 (56)

可是我对照了一下AT070TN84的资料觉得它设置的有问题
我按照图中的时序查得出的一套值:
           #define LTE480_VBPD        4-1 = 3
          #define LTE480_VFPD        4-1 = 3
          #define LTE480_VSPW        2-1 = 1
          #define LTE480_HBPD        2-1 = 1
          #define LTE480_HFPD        3-1 = 2
          #define LTE480_HSPW        2-1 = 1
          #define LTE480_HOZVAL      (800)  // Horizontal pixel 800
          #define LTE480_LINEVAL      (480)  // Vertical pixel 480
          #define LTE480_FRAME_RATE  (30)

按照SPEC上写的典型值得到另外一套值:
           #define LTE480_VBPD        29-1 = 28        
           #define LTE480_VFPD        525-3-29-480 - 1 = 12
          #define LTE480_VSPW        3-1 = 2
          #define LTE480_HBPD        40-1 = 39
          #define LTE480_HFPD        928-48-40-800 - 1 = 39
          #define LTE480_HSPW        48-1 = 47
          #define LTE480_HOZVAL      (800)  // Horizontal pixel 800
          #define LTE480_LINEVAL      (480)  // Vertical pixel 480
          #define LTE480_FRAME_RATE  (30)
点赞  2009-6-20 18:18
顶!
点赞  2009-6-21 12:56
对于这个LCD开发是有共性的,网上有一些文档,的我博客也转载 了一些。

哈哈,没有现成的,我们就慢慢来哦,我现在也要面对没有源码的200W摄像头 OV2640
点赞  2009-6-21 18:06
应该按照Spec典型植,灰白图象与这几个没关系吧
点赞  2009-6-21 22:19
84那块屏比较奇怪的,我感觉是它的Spec写的有问题。我手头83 84的都有,比较了一下,两块屏的引脚完全兼容,时序也基本一样。按理83能点亮的驱动,84也能用,但无论如何没能点亮,上电后就乱闪。到系统起来后就一直白屏!楼主不妨买块83的试试看!
点赞  2009-6-22 08:55
再请教几个问题:
1、现在的雪花飘飘是不是与时序关系不是太大??我按照SPEC的时序写进去,如果不对的话是不是也应该出个大概的图象来?
2、请问现在雪花飘飘的现象有可能与哪些因素有关呢??硬件or软件??
3、硬件连接图我没有,我也不知道用了哪些GPIO连的屏,以前没做过屏驱动,
   请问我是否需要知道硬件上连接用了哪些GPIO呢??比如背光??
点赞  2009-6-22 09:24
引用: 引用 5 楼 wjf_zjut 的回复:
84那块屏比较奇怪的,我感觉是它的Spec写的有问题。我手头83 84的都有,比较了一下,两块屏的引脚完全兼容,时序也基本一样。按理83能点亮的驱动,84也能用,但无论如何没能点亮,上电后就乱闪。到系统起来后就一直白屏!楼主不妨买块83的试试看!

请问您看84的那个屏的时序是不是跟我写出的那个是一样的,因为我不确定我找的对不对!
            #define LTE480_VBPD        29-1 = 28        
          #define LTE480_VFPD        525-3-29-480 - 1 = 12
          #define LTE480_VSPW        3-1 = 2
          #define LTE480_HBPD        40-1 = 39
          #define LTE480_HFPD        928-48-40-800 - 1 = 39
          #define LTE480_HSPW        48-1 = 47
          #define LTE480_HOZVAL      (800)  // Horizontal pixel 800
          #define LTE480_LINEVAL      (480)  // Vertical pixel 480
          #define LTE480_FRAME_RATE  (30)
点赞  2009-6-22 09:27
首先,根据屏的Spec计算出或者Spec直接会给出你需要多大的pclk,计算如下:
pclk = (HFPD+HOZVAL+HBPD+HSPW)*(VFPD+LINEVAL+VBPD+VSPW)*60(这是刷新率,通用60,也可以根据屏的支持范围有所调整)
接着,根据pclk设置CPU的相关寄存器,以使近似得到pclk,因为通常得不到很精准的pclk,在此我把根据pclk设置CPU的相关寄存器得到clk称作pclk1吧,
根据pclk1再对HFPD、HBPD、HSPW、VFPD、VBPD、VSPW这几个参数作些调整就可以得到正确的显示了。
最后,是要修改display driver中的分辨率及颜色掩码(如RGB565的为ULONG gBitMasks[] = {0xf800,0x07e0,0x001f},
RGB888的为ULONG gBitMasks[] = {0xff0000,0x00ff00,0x0000ff})
另外,由小分辨率屏换成大分辨率的还要确保显存要够用,显存大小至少为一屏大小的4倍。
点赞  2009-6-22 09:47
TO ym_luo :
有几个问题请教您:
1、请问pclk 这个在哪设置的???
2、根据pclk设置CPU的相关寄存器,以使近似得到pclk,因为通常得不到很精准的pclk,在此我把根据pclk设置CPU的相关寄存器得到clk称作pclk1吧,
根据pclk1再对HFPD、HBPD、HSPW、VFPD、VBPD、VSPW这几个参数作些调整就可以得到正确的显示了。
   请问这几个值不是在SPEC上写的吗?
   还有如果值不准确只是屏显示的图片有点问题吧,不会显示黑白的雪花吧??

3、最后,是要修改display driver中的分辨率及颜色掩码(如RGB565的为ULONG gBitMasks[] = {0xf800,0x07e0,0x001f},
RGB888的为ULONG gBitMasks[] = {0xff0000,0x00ff00,0x0000ff})
这个地方??
我现在是在kernel下初始化屏,然后要给屏填充蓝色,然后才进入系统
可是现在填充蓝色都做不到,显示灰黑色(就类似背光没开),进入系统后显示的就是黑白的雪花(黑色多)

请问我要显示蓝色是不是还没调用display driver?
4、另外,由小分辨率屏换成大分辨率的还要确保显存要够用,显存大小至少为一屏大小的4倍。
   我现在定义的是 DISPLAY             80100000  00100000  RESERVED  
   我的屏是800*480的7寸屏
   而我看到代码中有这样一个公式:LCD_WIDTH*LCD_HEIGHT *(lcd_color_depth/8)其中lcd_color_depth = 16
   这个是不是您说的这个缓存大小呢??
5、代码中还有一个公式,不知道是算什么的
     hsync_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value);
    vclk_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);
    clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1;   
谢谢!
点赞  2009-6-22 11:47
又发现了个问题:
我的config.bib中怎么定义了两个用于缓存的RAM地址:
IF WINCEDEBUG = retail
    NK      80200000  01900000  RAMIMAGE
;    RAM     81B00000  02100000  RAM         ; For 24Bpp LCd
    RAM     81B00000  02500000  RAM       ; For 16Bpp LCD
; Common RAM areas
    ARGS                80020000  00000800  RESERVED
    SLEEP               80028000  00002000  RESERVED
    EDBG                80030000  00020000  RESERVED
    DISPLAY             80100000  00100000  RESERVED   
;    TEST_FRAMEBUFFER    83C00000  00400000  RESERVED   ; For 24Bpp LCD test
;    CF_DMA_BUF        83FE0000  00020000  RESERVED
点赞  2009-6-22 13:02
引用: 引用 9 楼 wangxin_801115 的回复:
TO ym_luo :
有几个问题请教您:
1、请问pclk 这个在哪设置的???
2、根据pclk设置CPU的相关寄存器,以使近似得到pclk,因为通常得不到很精准的pclk,在此我把根据pclk设置CPU的相关寄存器得到clk称作pclk1吧,
根据pclk1再对HFPD、HBPD、HSPW、VFPD、VBPD、VSPW这几个参数作些调整就可以得到正确的显示了。
  请问这几个值不是在SPEC上写的吗?
  还有如果值不准确只是屏显示的图片有点问题吧,不会显示黑白的雪花…

1.pclk是我们期望得到的值,根据pclk = (HFPD+HOZVAL+HBPD+HSPW)*(VFPD+LINEVAL+VBPD+VSPW)*60计算出或者屏的Spec直接会给出。
2.就是你函数中的clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1;   
    s2450LCD->VIDCON0 |= (clkval < HFPD、HBPD、HSPW、VFPD、VBPD、VSPW这是Spec中写的,但可能会根据你实际的pclk而调整。说到底这一堆就是时序的问题,参数不对是会什么也显示不出来的,就是常说屏没点亮(当然不是指背光啊)。
3.你说的很对。
4.对,但是还有config.bib中的配置。
5.hsync_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value); 就是我写公式中的(VFPD+LINEVAL+VBPD+VSPW)
    vclk_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);就是我写公式中的(HFPD+HOZVAL+HBPD+HSPW)
但是我感觉你那是不是写反了,不敢确定
vclk_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value);
hsync_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);
最后,clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1;要计算正确的clkval填入寄存器,以便得到我们期望的pclk。

总的来说,如果不是硬件问题,你的问题应该就是时序问题了。
点赞  2009-6-22 15:41
TO ym_luo :
非常感谢您
1、您说的我的这个公式
     clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1;   
   就是设置计算pclk 吗??(对不起我菜鸟)
2、hsync_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value); 就是我写公式中的(VFPD+LINEVAL+VBPD+VSPW)
    vclk_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);就是我写公式中的(HFPD+HOZVAL+HBPD+HSPW)
  我真希望它写反了,但是应该没有,因为我看几个BSP都是这么写的!
  如http://topic.eeworld.net/u/20081126/18/c5188fc5-c5af-4e6f-bd51-5d6c4ee559ab.html这位仁兄的BSP
3、这个时序我真不知道该添什么好了
   这个BSP的LCD驱动就是一个通用的框架,初始化中给寄存器可配置的也就是这几个值
            VBPD    VFPD  VSPW    HBPD  HFPD
          HSPW    HOZVAL  LINEVAL  FRAME_RATE 吧
   我按照SPEC上把值添上怎么也应该给点面子亮几个大样出来看看 啊
4、您还有其他联系方式吗?如QQ  MSN
   方便的话在线请教您!!
点赞  2009-6-22 17:44
昨晚通宵搞这个东西,依然未遂--!

现在贴出打印信息,请各位英雄帮忙分析一下:
FCLK:400000000, HCLK:133333333, PCLK:66666666
LCD_MODULE_TYPE == LCD_MODULE_LTE480WV
lcd_horizon_value = 799, lcd_line_value = 479
lcd_vbpd = 28, lcd_vfpd = 12, lcd_vspw = 2
lcd_hbpd = 39, lcd_hfpd = 39, lcd_hspw = 47, lcd_frame_rate = 30
hsync_cnt = 521  ++vclk_cnt = 924  ++

clkval = 4   ++++++++++++++++++++++++++++   通过此公式计算:  
    clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1;   
    clkval  = 4;

InitDisplay LCD_MODULE_LTE480WV LCD_COLOR_DEPTH=16
InitDisplay-----------------------------------
MPLLCON=0x80640061
HCLKCON=0xFFFD9206
PCLKCON=0xFFFBFF82
SCLKCON=0xFFE1D7E0
BANKCFG=0x00049253
BANKCON1=0x44000040
BANKCON2=0x005D0035
BANKCON3=0x44000032
REFRESH=0x0000040D
.........
我看代码是要把clkval的值写到s2450LCD->VIDCON0寄存器中的第6位
其中S3C2450_HCLK通过打印信息得到是133333333
这样计算应该是正确的吧???
“总的来说,如果不是硬件问题,你的问题应该就是时序问题了。”
如果是时序问题,那除非
lcd_horizon_value = 799, lcd_line_value = 479
lcd_vbpd = 28, lcd_vfpd = 12, lcd_vspw = 2
lcd_hbpd = 39, lcd_hfpd = 39, lcd_hspw = 47, lcd_frame_rate = 30
这些值不对,可是,我看SPEC,看另外一个BSP都是这几个数,如果差也不会差这么多吧??
点赞  2009-6-23 09:26
点赞  2009-6-23 10:57
你看一下是不是有一个Data Enable信号不对或者没接上
点赞  2009-6-23 11:16
引用: 引用 15 楼 ym_luo 的回复:
你看一下是不是有一个Data Enable信号不对或者没接上

请问是在硬件上吗??
我在软件上可以设置的吗??
点赞  2009-6-23 11:21
硬件必须连上,软件上我看已经设置了,参数上好像也对了,再查查硬件,供电等等.
点赞  2009-6-23 11:53
把屏的DE与其它连接断开,直接接上3.3V试试
点赞  2009-6-23 12:00
我找到这个引脚了
硬件上是否连接现在还在确认

请问这个脚是高电平有效还是低电平有效,这个资料上没说

还有第8脚MODE :HV or DE Mode Control  我看目前给我的图直接连的GND 选择的应该是HV模式

这个是否正确呢?
   
点赞  2009-6-23 12:01
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复