三星的2416驱动7寸屏AT070TN84的问题!!!!急!!!!
处理器是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做的,我想驱动屏的框架应该是一样的,修改的地方无非是分辨率,时序和寄存器吧??
还有其他地方吗??
谢谢各位,新手对屏完全不了解!!!
可是我对照了一下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)
对于这个LCD开发是有共性的,网上有一些文档,的我博客也转载 了一些。
哈哈,没有现成的,我们就慢慢来哦,我现在也要面对没有源码的200W摄像头 OV2640
84那块屏比较奇怪的,我感觉是它的Spec写的有问题。我手头83 84的都有,比较了一下,两块屏的引脚完全兼容,时序也基本一样。按理83能点亮的驱动,84也能用,但无论如何没能点亮,上电后就乱闪。到系统起来后就一直白屏!楼主不妨买块83的试试看!
再请教几个问题:
1、现在的雪花飘飘是不是与时序关系不是太大??我按照SPEC的时序写进去,如果不对的话是不是也应该出个大概的图象来?
2、请问现在雪花飘飘的现象有可能与哪些因素有关呢??硬件or软件??
3、硬件连接图我没有,我也不知道用了哪些GPIO连的屏,以前没做过屏驱动,
请问我是否需要知道硬件上连接用了哪些GPIO呢??比如背光??
引用: 引用 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)
首先,根据屏的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倍。
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;
谢谢!
又发现了个问题:
我的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
引用: 引用 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。
总的来说,如果不是硬件问题,你的问题应该就是时序问题了。
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
方便的话在线请教您!!
昨晚通宵搞这个东西,依然未遂--!
现在贴出打印信息,请各位英雄帮忙分析一下:
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都是这几个数,如果差也不会差这么多吧??
你看一下是不是有一个Data Enable信号不对或者没接上
引用: 引用 15 楼 ym_luo 的回复:
你看一下是不是有一个Data Enable信号不对或者没接上
请问是在硬件上吗??
我在软件上可以设置的吗??
硬件必须连上,软件上我看已经设置了,参数上好像也对了,再查查硬件,供电等等.
我找到这个引脚了
硬件上是否连接现在还在确认
请问这个脚是高电平有效还是低电平有效,这个资料上没说
还有第8脚MODE :HV or DE Mode Control 我看目前给我的图直接连的GND 选择的应该是HV模式
这个是否正确呢?