关于WIN CE如何更换液晶屏的问题

3539591   2008-3-15 19:52 楼主
最近在改WIN CE5。0的液晶屏,以前没搞过,有点儿头大。
想问一下各位,我能不能先不改代码,直接把我原来的屏弄下来,换上我要换的屏,那样会不会可能烧坏我的新屏呢?
希望和有做过这方面的朋友交流一下,我的QQ309881451 EMAIL:dding832@126.com msn:dding832@msn.com(不经常上)
谢谢!

回复评论 (15)

LCD的接口、IC都一样吗?
点赞  2008-3-16 08:46
楼主这个问题不怎么好回答你啊,不同的lcd信号线是不同的,要看你更换的排线了,这个最好还是先好好lcd的datasheet,有可能要做相应的排线更改,而且在lcd的排线设计中还要注意信号线的长度,这个东西很容易干扰的!最后提醒一下,在确定没有搞错线的顺序前,不要轻易上电,很容易烧坏屏!!!!
点赞  2008-3-16 21:28
我现在的屏是在买开发板的时候带的,应该是一个模块,因为在在屏的小板上除了屏之外还有一些屏的外围电路,然后才是小板到主板之间的排线,主板上还连了一个总路线驱动芯片是74LVCH162245,不知道是3V到5V的转换还是增大电流的作用,然后从这个芯片出来再直接连S3C2410,大致就是这么一个连接顺序。
to chimeng813:
你说的线序是不是指那几根数据线,我原来的是16位的RGB565,可2410是24位的数据线,不太明白怎么弄。其它的各个时序信号线和什么同步信号之类的线是不是只要是RGB接口的屏都是一样的啊?然后把数据线弄好就可以接了

多谢指教,谢谢
点赞  2008-3-18 09:10
小弟现在还想问一事,就是那种CPU屏(屏数据线不是RGB格式的,是8位或16位的数据线挂到CPU的数据总线上,当做一个总线的外设用),这种屏可以做在Win ce +s3c2410上吗?
点赞  2008-3-22 11:44
有驱动程序就行。
点赞  2008-3-23 23:42
对,现在就是这个驱动不知道怎么改,根本原因是不知道这个WIN CE的DISPLAY驱动的显示机制和2410的LCD 驱动器原理
有这方面经验的兄台知道给小弟指条明路吧
点赞  2008-3-24 10:20
驱动改也比较麻烦,都是虚地址没法用硬件地址直接操作,我也头疼,后来干脆不用WinCE直接用个uC/GUI,一天就搞定图形界面了
点赞  2008-3-24 17:05
呵呵,但是UC/GUI没有CE其它强大的功能啊,而且在图形显示上面,也远不如CE
点赞  2008-3-27 08:47
正在 看LCD的CE驱动, 有一个地方不是太理解:
在void S3C2410DISP::InitializeHardware (void)方法中,有两段代码是从注册表分别提取LCDVirtualFrameBase,LCDPhysicalFrameBase,这两个地址我在注册表中看到已经超过了32位,这是为什么呢,地址可以超过32吗?这两个数是根据什么来算的呢,我现在想换屏这两个地址必需改吗?他们是不是通过config.bib文件夹中的DISPLAY处算出来的呢?代码如下:


MEMORY

; [Notification]
; Not yet implemented MULTIPlEXIP Kernel features.
; Do not "SET IMGMULTIXIP=1"
; Please check "SET IMGMULTIXIP=" so that IMGMULTIXIP are not defined


       
        ; NK name
        #define NKNAME NK
       
        ; NK Start address
        #define NKSTART                8C200000
        #define NKLEN                01D00000
       
        #define RAMSTART        8E000000 ;8E000000
        #define RAMLEN                02000000 ;01F00000

        $(NKNAME)   $(NKSTART)      $(NKLEN)    RAMIMAGE
        RAM         $(RAMSTART)     $(RAMLEN)   RAM

;        NK                                        80040000  01EB0000  RAMIMAGE
;        RAM                         8c200000  01C00000  RAM

; Common RAM areas
        AUD_DMA                     8c002000  00002000  RESERVED
        DRV_GLB                     8c010000  00010000  RESERVED
        DBGSER_DMA                  8c022000  00002000  RESERVED
        SER_DMA                     8c024000  00002000  RESERVED
        IR_DMA                      8c026000  00002000  RESERVED
        SD_DMA                              8c028000  00008000  RESERVED
        EDBG                        8c030000  00020000  RESERVED
        CPXIPCHAIN                  8c050000  00008000  RESERVED
        SLEEP_BUFF                        8c058000  00004000        RESERVED
        DISPLAY                     8c100000  00100000  RESERVED   

另外,从注册表取出这两上数来之后又得用以下函数,分配了一块以注册表LCDVirtualFrameBase项为基地址,大于缓冲区空间的一块内存区域,代码如下:

// map frame buffer into process space memory
        m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0x40000), MEM_RESERVE, PAGE_NOACCESS);                //0x40000为大小值而非地址
        if (m_VirtualFrameBuffer == NULL)
        {
            RETAILMSG(0,(TEXT("m_VirtualFrameBuffer is not allocated\n\r")));
                return;
        }
        else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0x40000), PAGE_READWRITE | PAGE_NOCACHE))
        {
            RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is not mapped\n\r")));
            VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);
            return;
        }

        RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is mapped at %x(PHY : %x)\n\r"), m_VirtualFrameBuffer, gdwLCDVirtualFrameBase));
        RETAILMSG(0, (TEXT("Clearing frame buffer !!!\n\r")));
       
        ptr = (WORD *)m_VirtualFrameBuffer;

        // clear rest of frame buffer out
        for (index = 0; index < 320*240; index++)
        {
                if(index < 3200)
                {
                        ptr[index] = 0xf800;
                }
                else if(index < 6400)
                {
                        ptr[index] = 0x07e0;
                }
                else if(index < 9600)
                {
                        ptr[index] = 0x001f;
                }
                else
                {
                        ptr[index] = 0xffff;
                }
        }

        RETAILMSG(1, (_T("--S3C2410DISP::InitializeHardware\r\n")));


最后把这块内存空间的地址给了GPE对象的成员变量m_VirtualFrameBuffer作为,这块内存和DISPLAY DMA(在config.bib文件中的DISPLAY)的区域是一块区域吗?


另外这个方法是干什么的呢?

void        S3C2410DISP::GetPhysicalVideoMemory(unsigned long *physicalMemoryBase, unsigned long *videoMemorySize)
{
        RETAILMSG(0, (TEXT("S3C2410DISP::GetPhysicalVideoMemory\r\n")));

        *physicalMemoryBase = gdwLCDVirtualFrameBase;
        *videoMemorySize = m_cbScanLineLength * m_nScreenHeight;
}

===========================================================
附:我的BSP是优龙提供的,板子是2410,系统WIN CE
新手问题多多,还请各位前辈不吝赐教,小弟拜谢^_^
点赞  2008-3-27 09:59
分不够可加:P
点赞  2008-3-27 10:00
没人?????????????
点赞  2008-3-31 09:07
深圳程序员QQ群联盟成立两年多,拥有三十个以上的QQ群,人数达二千多人,有30%以上的成员的经验丰富的老手,包括国内外顶级大公司的成员(如微软、IBM,SUN,华为)、国内著名高校和研究院成员,和有丰富实践经验的高级程序,还有少数女程序员。现推介如下QQ群,如有兴趣速速加入:深程高级群:17538442c++:15195967 .NET:12203296 mobile:31501597嵌入式:37489763 JAVA:4247660   
——————————————————————————————————————————  
希望大家不要认为群能给你带来什么,这只是一个平台,让同等水平的程序员有个交流的机会或许能得到一点信息或许能带来一点启发。
点赞  2008-3-31 11:11
网上有篇写得还挺详细的,关于2410的LCD驱动修改的基本都说到了,硬件的基本没说.
在WIN CE 操作系统中,LCD2VGA Card (简称)使用的是标准16BIT_TFT 真彩LCD 的驱动程序。在这
里只以1024*768 分辨率为例说明在WIN CE 4.2 中驱动程序的修改事项,目标板的微处理器是S3C2410X。
在WIN CE 4.2 中修改LCD 驱动程序有五个相关文件,分别是:
1. …\WINCE420\PLATFORM\SMDK2410\INC\s2410.h
2. …\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c
3. …\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp
4. …\WINCE420\PLATFORM\SMDK2410\FILES\config.bib
5. …\ WINCE420\PLATFORM\SMDK2410\FILES\platform.reg
1. s2410.h
…\WINCE420\PLATFORM\SMDK2410\INC\s2410.h
主要有LCD 控制器的寄存器定义、LCD 控制器的工作时序定义、分辨率的定义等等。红色部分为修改
后的内容:
#define LCDTYPE TFT16BPP
#define LCD_TYPE TFTxxx_xxx
#define SCR_XSIZE_TFT (1280)
#define SCR_YSIZE_TFT (960)
#define LCD_XSIZE_TFT (1024)
#define LCD_YSIZE_TFT (768)
#define VBPD ((2-1)&0xff)
#define VFPD ((2-1)&0xff)
#define VSPW ((2-1) &0x3f)
#define HBPD ((16-1)&0x7f)
#define HFPD ((200-1)&0xff)
#define HSPW ((16-1)&0xff)
#define CLKVAL_TFT (1) //这个值的定义在LCD 初始化函数中并不用到,而是直接用数值表示。
2. cfw.c
…\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c
红色部分为修改后的内容:
static void InitDisplay()
{
********
s2410LCD->rLCDCON1=(1<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// CLKVAL_TFT = 1 , HCLK = 100MHz -> VCLK = 25MHz
//TFT LCD panel
//16 bpp for TFT
s2410LCD->rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
s2410LCD->rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
s2410LCD->rLCDCON4=(MVAL<<8)|(HSPW);
s2410LCD->rLCDCON5=
(1<<11)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<3)|(0<<1)|(1<<0);
//5:6:5 Format
//The video data is fetched at VCLK falling edge
//VLINE/HSYNC pulse polarity-Normal
//VFRAME/VSYNC pulse polarity-Normal
//VD (video data) pulse polarity-Normal
//VDEN signal polarity-Normal
//Disable PWREN signal
//Byte swap Disable
//Half-Word swap Enable
********
}
3. s3c2410disp.cpp
…\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp
红色部分为修改后的内容:
WORD TempBuffer[1025][768];
S3C2410DISP::S3C2410DISP (void)
{
********
m_nScreenWidth = 1024;
m_nScreenHeight = 768;
*********
}
到此修改工作基本完成,但还要一个问题:1024*768 分辨率占用的显示缓冲区大小是:1024*768*2 =
1536 K Bytes,因此要确认所分配的内存空间够不够,是在config.bib 文件中定义的。如果以前定义的足够大,
后面的步骤可以省略了。
4. config.bib
…\WINCE420\PLATFORM\SMDK2410\FILES\config.bib
#define NKNAME NK
#define NKSTART 8C200000
#define NKLEN 01D00000
#define RAMSTART 8E000000
#define RAMLEN 01F00000
$(NKNAME) $(NKSTART) $(NKLEN) RAMIMAGE
RAM $(RAMSTART) $(RAMLEN) RAM
AUD_DMA 8c002000 00002000 RESERVED
DRV_GLB 8c010000 00010000 RESERVED
DBGSER_DMA 8c022000 00002000 RESERVED
SER_DMA 8c024000 00002000 RESERVED
IR_DMA 8c026000 00002000 RESERVED
SD_DMA 8c028000 00008000 RESERVED
EDBG 8c030000 00020000 RESERVED
CPXIPCHAIN 8c050000 00008000 RESERVED
SLEEP_BUFF 8c058000 00004000 RESERVED
DISPLAY 8c100000 00100000 RESERVED
DISPLAY 项就是显示缓冲区的内存空间定义, 8c100000 是开始地址, 00100000 是大小。可以看出原先
只定义了1M Bytes 的内存空间给LCD 显示缓冲区;而1024*768 需要1536 K Bytes 的内存空间,因此需要
修改这里的定义。但是一旦修改到config.bib 文件的内容,将会涉及到很多地方的修改工作,过程比较繁琐。
所幸的是我的目标板DISPLAY前面还有0x8C100000-(0x8C058000+0x00004000) = 656K Bytes 未分配的内
存空间,因此做如下修改:
AUD_DMA 8c002000 00002000 RESERVED
DRV_GLB 8c010000 00010000 RESERVED
DBGSER_DMA 8c022000 00002000 RESERVED
SER_DMA 8c024000 00002000 RESERVED
IR_DMA 8c026000 00002000 RESERVED
SD_DMA 8c028000 00008000 RESERVED
EDBG 8c030000 00020000 RESERVED
CPXIPCHAIN 8c050000 00008000 RESERVED
SLEEP_BUFF 8c058000 00004000 RESERVED
;DISPLAY 8c100000 00100000 RESERVED
DISPLAY 8c060000 001a0000 RESERVED
5. 在(4)中修改了DISPLAY 显示缓冲区的开始地址,因此要在“s2410.h”中做相应的修改:
…\WINCE420\PLATFORM\SMDK2410\INC\s2410.h
#define DMA_BUFFER_BASE 0xAC000000
#define DMA_PHYSICAL_BASE 0x30000000
//#define FRAMEBUF_BASE (DMA_BUFFER_BASE + 0x00100000)
//#define FRAMEBUF_DMA_BASE (DMA_PHYSICAL_BASE + 0x00100000)
#define FRAMEBUF_BASE (DMA_BUFFER_BASE + 0x00060000)
#define FRAMEBUF_DMA_BASE (DMA_PHYSICAL_BASE + 0x00060000)
6. 在(4)中修改了DISPLAY 显示缓冲区的大小, 因此要在“s3c2410disp.cpp”中做相应的修改:
…\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp
红色部分为修改后的内容:
void S3C2410DISP::InitializeHardware (void)
{
*********
m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0x1A0000), MEM_RESERVE, PAGE_NOACCESS);
if (m_VirtualFrameBuffer == NULL)
{
RETAILMSG(0,(TEXT("m_VirtualFrameBuffer is not allocated\n\r")));
return;
}
else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0x1A0000),
PAGE_READWRITE | PAGE_NOCACHE))
{
RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is not mapped\n\r")));
VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);
return;
}
*********
}
7. 在(4)中修改了DISPLAY 显示缓冲区的开始地址,还要对注册表文件“platform.reg”做相应的修改:
…\ WINCE420\PLATFORM\SMDK2410\FILES\platform.reg
[HKEY_LOCAL_MACHINE\Drivers\Display\S3C2410\CONFIG]
"DisplayDll"="s3c2410disp.dll"
;"LCDVirtualFrameBase"=dword:ac100000
;"LCDPhysicalFrameBase"=dword:30100000
"LCDVirtualFrameBase"=dword:ac060000
"LCDPhysicalFrameBase"=dword:30060000
点赞  2008-4-7 17:14
有没有解决这个问题,我也想换不同型号的屏,也不知道要改哪里?如果楼主解决了,请给与说明一下要修哪些部分!谢谢啦
点赞  2008-4-8 16:15
已经搞定
逼得我看了N天的鸟文
其实就是把新屏的datasheet弄懂,再把2410的弄懂就可以了
好像说的是费话,呵呵

注意几个时序信号就可以了,特别是数据使能信号线,最影响屏的显示,天壤之别
其它的按着你的驱动改就可以了

多谢以上朋友的回复^_^
点赞  2008-4-10 15:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复