4.3寸24BPP屏驱动笔记
--作者:赖玉平(Auly)aulyp@163.com
一、2442平台
1 , 先在EBoot 中的main.c文件修改InitDisplay()函数,目的是先摸索针对该款LCD硬件特性设置2442的LCD控制器,这样只要通每次烧个EBoot进去,就能看到效果,
修改:⑴ LCDCON1 TFT LCD Pannel 选 24BPP (必须)
⑵ LCDCON5 第0位,HWSWP――――――――0 (必须)
⑶ LCDCON5 第6位,INVVDEN -------------0 (必须)
⑷ 硬件上把原来DE脚上0欧到地的电阻去掉 (必须)
⑸ LCDCON3 HBPD-------------45
⑹ 原来的乘2变为乘4,这样才能变为全屏,本来只能显两半屏 (必须)
s2440LCD->LCDSADDR2 = M5D((IMAGE_FRAMEBUFFER_DMA_BASE + (480 * 272 * 4)) >> 1);
⑺ s3c2440disp.cpp文件中, m_colorDepth = 32;//24BPP的屏,(必须)是32
结果:成功在EBoot中控制LCD显示各种颜色,
2 在Driver 文件夹中修改Display文件夹中的驱动,这是进入到CE系统时的驱动
要修改的文件有:
A wince500/platform/smdk2442/src/inc--àS3c2440a_lcd.h
主要有LCD控制器的寄存器定义、LCD控制器的工作时序定义、分辨率的定义等等。
B wince500/platform/smdk2442/src/KERNEL/OAL –Init.c
InitDisplay()函数中,设置LCD控制器的参数
(发现刚进到InitDisplay马上就跳出来了,所以本BSP中没用到里面的配置)
跟踪发现,也没有进入OFF.C中的InitDisplay()函数
(1)display文件夹中,S3c2440disp.cpp文件,函数S3C2440DISP::S3C2440DISP()是负责设置LCD参数的。RegOpenKeyEx()打开注册表,
RegQueryValueEx()查询注册表
(2)GetRotateModeFromReg()获得旋转模式,读注册表
RegOpenKeyEx()打开注册表,
RegQueryValueEx()查询注册表
总结:1 在EBoot里设了LCD控制器,后面就不用设了,在DRIVER里的s3c2440disp.cpp只要设一些屏幕参数就可以了,如m_cxPhysicalScreen m_cyPhysicalScreen等
m_colorDepth = 32;//24BPP的屏,必须是32
二、2450平台
1 修改了 Bsp_cfg.h 加入LCD_MODULE_P043F1A4 模式,并选
2 加入预编译宏#ifdef LCDP043F1A4 只要在 source.cmn文件中加入定义就可切换
4 修改
lcd_vbpd = 2;//
lcd_vfpd = 4;// 都是典型值,没有 -1 操作
lcd_vspw = 10;// 10
lcd_hbpd = 4;//
lcd_hfpd = 8;//
lcd_hspw = 41;//
5 修改clkval = 9; 使输出VCLK=9.5MHZ
HSYNC=15.7KHZ
VSYNC = 54.9HZ
6 改变WINCON0 中的第2位为WINCONx_24BPP_888 模式
7 修改VIDW00ADD1B0 窗口0 buffer结束地址 (非常重要) 如果没改好,LCD控制器不工作
s2450LCD->VIDW00ADD1B0 = (UINT32)((IMAGE_FRAMEBUFFER_DMA_BASE&0x007fffff + LCD_WIDTH*(LCD_HEIGHT+1)));
8 修改VIDW00ADD2B0 虚拟屏页宽 (非常重要) 如果没改好,LCD控制器不工作
s2450LCD->VIDW00ADD2B0 = (offsize_in_byte<<VIDWxADD2_OFFSET_SIZE_S)|(LCD_WIDTH*4);// offsize_in_byte=0;
9 关掉 Half-Word swap ,因为如果反转,数据将变为B-G-R 蓝色在高8位了
// s2450LCD->WINCON0 |= (1<<WINCON_SWAP_S); //enable Half-Word swap
以上是去掉原来2450驱动中的语句
10 *pFB 要改为unsigned int 型
11 进入init.c 中,在InitDisplay()函数中,在开始就加入return; 因为不想再初始一次LCD控制器,
12 修改DRIVERS文件夹中的dir文件,使只编译display 文件夹
13
14,在drivers/display文件夹中,S3c2450disp.cpp ---->S3C2450DISP::S3C2450DISP()函数,
修改参数如下:
m_RedMaskSize = 8;
m_RedMaskPosition = 16;
m_GreenMaskSize = 8;
m_GreenMaskPosition = 8;
m_BlueMaskSize = 8;
m_BlueMaskPosition = 0;
m_colorDepth = 32; //必须的
m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength*2;
15 drivers/display文件夹,Surf.cpp ----> SetVisibleSurface函数
如7,8步修改参数,否则在关闭media player时,进入这里重新初始会把LCD控制器 破坏,变成白屏
16 drivers/display -----ddoverlay.cpp文件:
InitOverlay()函数,如果要用成24位,记得在这里要进行修改,不然一旦调用OVERLAY,就会使得LCD控制器不工作了