天天看點

wince lcd驅動移植 歡迎加入Wince技術讨論群QQ#326444254

歡迎加入Wince技術讨論群QQ#326444254

今天調試LCD,把320x240改為240x320,慚愧的很,以為僅僅改頭檔案就行。誰知一直顯示有問題。以前都是改過的,為何現在不行了呢?暈啊。上網看看,發現忘記修改dsplay驅動了。要設定:

    m_nScreenWidth = 240;

    m_nScreenHeight = 320;

    m_colorDepth = 16;

    m_cxPhysicalScreen = 240;

    m_cyPhysicalScreen = 320;

看到一篇好文,摘錄如下:http://blog.sina.com.cn/s/blog_53a06e8701008bpz.html

WinCE的LCD驅動程式編寫指南(2008-02-09 13:08:53)

    本文以1024*768分辨率的TFT_16BPP真彩LCD為例,說明在WIN CE 4.2中驅動程式的修改事項,目标闆的微處理器是S3C2410A。

該LCD的時序圖如下圖所示:

Note:LCD時序的參數和時鐘相位因不同LCD而異,請參考相應LCD的datasheet.

在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

********

}

紅色部分為修改後的内容:

WORD TempBuffer[1025][768];

S3C2410DISP::S3C2410DISP (void)

{ ********

m_nScreenWidth = 1024;

m_nScreenHeight = 768;

*********

}

  到此修改工作基本完成,但還要一個問題:1024*768分辨率占用的顯示緩沖區大小是:1024*768*2 = 1536 K Bytes,是以要确認所配置設定的記憶體空間夠不夠,是在config.bib檔案中定義的。如果以前定義的足夠大,後面的步驟可以省略了。

3. s3c2410disp.cpp

…\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp

 項就是顯示緩沖區的記憶體空間定義, 8c100000是開始位址, 00100000是大小。可以看出原先隻定義了1M Bytes的記憶體空間給LCD顯示緩沖區;而1024*768需要1536 K Bytes的記憶體空間,是以需要修改這裡的定義。但是一旦修改到config.bib檔案的内容,将會涉及到很多地方的修改工作,過程比較繁瑣。所幸的是我的目标闆DISPLAY前面還有0x8C100000-(0x8C058000+0x00004000) = 656K Bytes未配置設定的記憶體空間,是以做如下修改:

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

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;

}

*********

}

 在(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

出現過一次錯誤:

Data Abort: Thread=83c324e4 Proc=82026450 'gwes.exe'

AKY=00000009 PC=000238e4(gwes.exe+0x000138e4) RA=00000001(???+0x00000001) BVA=080f1000 FSR=00000007

原因是觸摸屏矯正資料少寫一組。

  "CalibrationData"="664,476 127,852 1194,852 1178,88 152,92 "

繼續閱讀