Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246557
  • 博文数量: 35
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 334
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-10 21:31
文章分类

全部博文(35)

文章存档

2010年(22)

2009年(13)

我的朋友

分类: 嵌入式

2009-12-09 10:28:44

本文以1024*768分辨率的TFT_16BPP真彩LCD为例,说明在WIN CE 4.2中驱动程序的修改事项,目标板的微处理器是S3C2410A
 
该LCD的时序图如下图所示:
 
NoteLCD时序的参数和时钟相位因不同LCD而异,请参考相应LCDdatasheet.
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
 
 

完!
阅读(2006) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-18 23:32:30

这位兄弟,最近部门在内部推荐,机会较好,真诚希望你或者这里的朋友能关注下 ------------------------------------------------------------------------------------------ 全球TOP3通信公司创新项目招募人才(机会较好,待遇从优) 地点:上海   包括但不限于以下方面:(1)嵌入式技术和linux开发(2)编译环境开发(3)应用和业务软件开发(4)浏览器和互联网技术(5)媒体平台:媒体技术和算法(6)通信协议:传输,组网以及协议开发等   招聘范围:中高级技术专家,技术带头人,3年以上工作经验   待遇:从优,只要您有实力,待遇一切可谈   关于我们:提供一个良好的技术和开发环境,提供优越的个人发展空间通道以及完善的培训制度,个人配股激励计划。   若有任何疑问或者兴趣,欢迎邮件:BlankHt@163.com   静候您或者您的朋友回音。