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

wangxin_801115 2009-06-20 06:11:46
处理器是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 <<VIDCON0_CLKVAL_F_SHIFT);

s2450LCD->VIDCON1 = VIDCON1_S_HSYNC_INVERTED|VIDCON1_S_VSYNC_INVERTED;
s2450LCD->VIDTCON0=((lcd_vbpd-1)<<VIDTCON0_BPD_S)|((lcd_vfpd-1)<<VIDTCON0_FPD_S)|(lcd_vspw-1);
s2450LCD->VIDTCON1=((lcd_hbpd-1)<<VIDTCON0_BPD_S)|((lcd_hfpd-1)<<VIDTCON0_FPD_S)|(lcd_hspw-1);
s2450LCD->VIDTCON2 = ((lcd_line_value-1)<<VIDTCON2_LINEVAL_S)|(lcd_horizon_value-1);
s2450LCD->WINCON0 = (0<<WINCON_SWAP_S)|(WINCONx_16WORD_BURST<<WINCON_BURSTLEN_S)
|(window_color_mode<<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->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<<VIDWxADD2_OFFSET_SIZE_S)|(LCD_WIDTH*(lcd_color_depth/8));
if(window_color_mode == WINCONx_16BPP_565)
{
s2450LCD->WINCON0 |= (1<<WINCON_SWAP_S); // Half Word SWAP
}
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<LCD_WIDTH*LCD_HEIGHT; 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做的,我想驱动屏的框架应该是一样的,修改的地方无非是分辨率,时序和寄存器吧??
还有其他地方吗??

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

...全文
1064 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
yudong54 2011-03-31
  • 打赏
  • 举报
回复
支持各位对屏的处理!
aduo311 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 wangxin_801115 的回复:]
调通了
就是填那几个参数啊
你确定你们硬件没问题吗
[/Quote]

楼主是如何解决的,能说一下吗?
我现在同样碰到了这个问题
wangxin_801115 2010-06-11
  • 打赏
  • 举报
回复
调通了
就是填那几个参数啊
你确定你们硬件没问题吗
海阔任龟游 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 jessie9940509 的回复:]
楼主你好!请问您的屏的问题解决了吗?
[/Quote]

也想问问楼主后来是如何解决的?
最近也在2416上弄调屏。
鲍羊羊 2010-02-20
  • 打赏
  • 举报
回复
楼主你好!请问您的屏的问题解决了吗?
商海连横 2009-06-27
  • 打赏
  • 举报
回复
感觉应该没有什么问题,群创的7寸屏好像很好驱动的。换个能驱动83、84的屏的板子(2440)试验?
另外,楼主的2416片子性能怎么样?是用的ddr的ram和mlc的flash吗?
wangxin_801115 2009-06-26
  • 打赏
  • 举报
回复
ding !!
wangxin_801115 2009-06-26
  • 打赏
  • 举报
回复
Paul.Mi ??怎么跟坛子里另外一位大侠名字相似!!
wangxin_801115 2009-06-26
  • 打赏
  • 举报
回复
TO ym_luo 大侠:
依然不能用,现象还是一样
不过有新的发现:
我把
PIN8 : MODE 连接在GND上(即原来的接法,选择了)
PIN9 : DE (DataEnable) 连接在V3.3上

这时我下进内核的现象是:
一会满屏都是(有水纹)
一会满屏都是(有水纹)
一会满屏都是绿(有水纹)
一会变白一会变黑

请问这个是什么现象啊??

另外,我的BOOT是没有重新下过的,而BOOT中也有对屏的初始化操作,
这会不会影响NK启动后在KERNEL的初始化呢

最后请问ym_luo 大侠您是北京的吗?
ym_luo 2009-06-26
  • 打赏
  • 举报
回复
另外测一下,以便分析
VCC 3.3V
VLED 5V
DCLK = ???MHz
P10 :VS Vsync signal = ??Hz
P11 :HS Hsync signal = ??Hz
ym_luo 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 wangxin_801115 的回复:]
哦?这个现象是快正确了吗
我感觉好象是屏快让我烧掉了!

可是这种接法是正确的吗

另外我还需要怎么调呢?

BOOT我现在没法下进去!
[/Quote]
在NK中InitDisplay(void)后停下,不往后运行看是什么现象,这样排除因其它地方的问题导致一会满屏都是红(有水纹)
一会满屏都是蓝(有水纹)
一会满屏都是绿(有水纹)
一会变白一会变黑
wangxin_801115 2009-06-26
  • 打赏
  • 举报
回复
哦?这个现象是快正确了吗
我感觉好象是屏快让我烧掉了!

可是这种接法是正确的吗

另外我还需要怎么调呢?

BOOT我现在没法下进去!
ym_luo 2009-06-26
  • 打赏
  • 举报
回复
似乎是快正确了,建议你在BOOT下试试,不要加载NK。
wangxin_801115 2009-06-25
  • 打赏
  • 举报
回复
OK
我试试
thank U!!
ym_luo 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 wangxin_801115 的回复:]
OK ,现在的连接方式还是

PIN8 : MODE 连接在V3.3上
PIN9 : DE 连接在V3.3上 (现在连不到CPU DE上)
P10 :VS Vsync signal input连接CPU Vsync上
P11 :HS Hsync signal input连接CPU Hsync上
然后

VIDCON1_S_HSYNC_INVERTED
VIDCON1_S_VSYNC_INVERTED
的值改为0
也就是给s2450LCD->VIDCON1的第5,第6位清 ‘0’

这样吧!
[/Quote]
wangxin_801115 2009-06-25
  • 打赏
  • 举报
回复
OK ,现在的连接方式还是

PIN8 : MODE 连接在V3.3上
PIN9 : DE 连接在V3.3上 (现在连不到CPU DE上)
P10 :VS Vsync signal input连接CPU Vsync上
P11 :HS Hsync signal input连接CPU Hsync上
然后

VIDCON1_S_HSYNC_INVERTED
VIDCON1_S_VSYNC_INVERTED
的值改为0
也就是给s2450LCD->VIDCON1的第5,第6位清 ‘0’

这样吧!
ym_luo 2009-06-25
  • 打赏
  • 举报
回复
再给你两套参数,直接试一下:
//按Spec的典型值
#define LTE480_VBPD 29
#define LTE480_VFPD 13
#define LTE480_VSPW 3
#define LTE480_HBPD 40
#define LTE480_HFPD 40
#define LTE480_HSPW 48
#define LTE480_HOZVAL (800)
#define LTE480_LINEVAL (480)

#define LTE480_FRAME_RATE 34
或者
#define LTE480_FRAME_RATE 27
ym_luo 2009-06-25
  • 打赏
  • 举报
回复
好奇怪哦!调屏也就这些了..........
用示波器看一下
VCC 3.3V
VLED 5V
DCLK = ???MHz
根据你的设置计算出的DCLK应该是26.6MHz,
如果DCLK是26.6MHz,那就要重新调整HFPD、HBPD、HSPW、VFPD、VBPD、VSPW参数了.
我觉得2451 static void InitDisplay(void)这个函数写得很不好,
你看看把clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1; 写成clkval = 4,再调整HFPD、HBPD、HSPW、VFPD、VBPD、VSPW,使得(HFPD+HOZVAL+HBPD+HSPW)*(VFPD+LINEVAL+VBPD+VSPW)*60近似等于26.6MHz;
或者把clkval = (UINT8)(((float)S3C2450_HCLK/(float)(hsync_cnt*vclk_cnt*lcd_frame_rate*2))+0.5)-1; 写成clkval = 3,HFPD、HBPD、HSPW、VFPD、VBPD、VSPW暂不变,看有没有显示,如有显示,根据实际效果再调整HFPD、HBPD、HSPW、VFPD、VBPD、VSPW,使得(HFPD+HOZVAL+HBPD+HSPW)*(VFPD+LINEVAL+VBPD+VSPW)*60近似等于33.3MHz;
wangxin_801115 2009-06-25
  • 打赏
  • 举报
回复
TO ym_luo :

PIN8 : MODE 连接在V3.3上
PIN9 : DE 连接在V3.3上 (现在连不到CPU DE上)
P10 :VS Vsync signal input连接CPU Vsync上
P11 :HS Hsync signal input连接CPU Hsync上
然后

VIDCON1_S_HSYNC_INVERTED
VIDCON1_S_VSYNC_INVERTED
的值改为0
也就是给s2450LCD->VIDCON1的第5,第6位清 ‘0’

依然不行,现象还是跟以前一样!唉!
.......
ym_luo 2009-06-24
  • 打赏
  • 举报
回复
s2450LCD->VIDCON1 = VIDCON1_S_HSYNC_INVERTED|VIDCON1_S_VSYNC_INVERTED;
VIDCON1_S_HSYNC_INVERTED、VIDCON1_S_VSYNC_INVERTED值是多少,
Spec中
P10 :VS Vsync signal
P11 :HS Hsync signal
是高有效.
加载更多回复(38)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧