三星的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 <<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做的,我想驱动屏的框架应该是一样的,修改的地方无非是分辨率,时序和寄存器吧??
还有其他地方吗??
谢谢各位,新手对屏完全不了解!!!