您的位置:首页 > 其它

WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(4)-LCD驱动

2009-12-29 15:23 597 查看
在WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(2)(3)两节中,我们实现了Eboot在Nor Flash和Nand Flash上运行.因为在烧写Eboot到Nor Flash比较快速(使用H_Jtag),Nand Flash将来就仅仅用来存放OS Image.
我们使用PB下载系统镜像到RAM中运行的方式来运行CE OS,待可以成功运行后在保存到Nand Flash中实现从Flash中加载到RAM中运行(这里的主要工作是实现BINFS,之后再详细介绍)
一、开发环境
编译器: Platform Builder 5.0
目标板: GEC2410 S3C2410A,NAND Flash:64M K9F1208,NOR Flash:2M SST39VF1601 SDRAM 64M,CS8900
二、移植步骤
SMDK2410的BSP已经实现了大部分的功能,通过PB下载,KITL支持,这些都不需要额外的工作了.OAL部分基本功能也都实现了,初始化什么的,不过还是值得好好看看源代码学习的.这里就不多说了,首先我们需要做的是修改LCD驱动
1.LCD驱动
需要修改的部分和之前EBoot做的修改是一样的,就是设置LCD控制器寄存器.
SMDK2410的驱动位于/WINCE500/PUBLIC/COMMON/OAK/CSP/ARM/SAMSUNG/S3C2410X/下,我们只需要把其复制到/WINCE500/PLATFORM/GEC2410/SRC/COMMON/下,这样我们就可以在其基础上进行修改了.
LCD驱动位于/DISPLAY/S3C2410X_LCD/下,修改s3c2410x_lcd.cpp的InitializeLCDRegisters函数,使用实际LCD所需参数即可.
static BOOL InitializeLCDRegisters(DWORD dwPhysicalFrameBase)
{
volatile S3C2410X_IOPORT_REG *s2410IOP = NULL;
volatile S3C2410X_LCD_REG    *s2410LCD = NULL;
PHYSICAL_ADDRESS pa;

// Map the s3c2410x register pointers.
//
pa.QuadPart = S3C2410X_BASE_REG_PA_IOPORT;
s2410IOP = (S3C2410X_IOPORT_REG *) MmMapIoSpace(pa, sizeof(S3C2410X_IOPORT_REG), FALSE);

pa.QuadPart = S3C2410X_BASE_REG_PA_LCD;
s2410LCD = (S3C2410X_LCD_REG *) MmMapIoSpace(pa, sizeof(S3C2410X_LCD_REG), FALSE);

if (!s2410IOP || !s2410LCD)
{
RETAILMSG(1, (TEXT("ERROR: s3c2410x_lcd: InitializeLCDRegisters failed./r/n")));
return(FALSE);
}

// Set up the LCD controller registers to display a power-on bitmap image.
//
s2410IOP->GPCUP     = 0xFFFFFFFF;
s2410IOP->GPCCON    = 0xAAAA56A9;

s2410IOP->GPDUP     = 0xFFFFFFFF;
s2410IOP->GPDCON    = 0xAAAAAAAA;

//s2410IOP->GPGUP    &= ~(1 << 4);
//s2410IOP->GPGCON   &= ~(3 << 8);

s2410LCD->LCDCON1   =  (5           <<  8) |       /* VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz  */
(0   <<  7)  |       /* 0 : Each Frame                                   */
(3           <<  5) |       /* TFT LCD Pannel                                   */
(12          <<  1) |       /* 16bpp Mode                                       */
(0           <<  0) ;       /* Disable LCD Output                               */

s2410LCD->LCDCON2   =  (2        << 24) |   /* VBPD          :   1                              */
(LCD_LINEVAL_TFT << 14) |   /* Vertical Size : 320 - 1                          */
(2        <<  6) |   /* VFPD          :   2                              */
(4        <<  0) ;   /* VSPW          :   1                              */

s2410LCD->LCDCON3   =  (8        << 19) |   /* HBPD          :   6                              */
(LCD_HOZVAL_TFT  <<  8) |   /* HOZVAL_TFT    : 240 - 1                          */
(8        <<  0) ;   /* HFPD          :   2                              */

s2410LCD->LCDCON4   =  (LCD_MVAL        <<  8) |   /* MVAL          :  13                              */
(6        <<  0) ;   /* HSPW          :   4                              */

s2410LCD->LCDCON5   =  (0           << 12) |       /* BPP24BL       : LSB valid                        */
(1           << 11) |       /* FRM565 MODE   : 5:6:5 Format                     */
(0           << 10) |       /* INVVCLK       : VCLK Falling Edge                */
(0           <<  9) |       /* INVVLINE      : Inverted Polarity                */
(0           <<  8) |       /* INVVFRAME     : Inverted Polarity                */
(0           <<  7) |       /* INVVD         : Normal                           */
(0           <<  6) |       /* INVVDEN       : Normal                           */
(0           <<  5) |       /* INVPWREN      : Normal                           */
(0           <<  4) |       /* INVENDLINE    : Normal                           */
(0           <<  3) |       /* PWREN         : Disable PWREN                    */
(0           <<  2) |       /* ENLEND        : Disable LEND signal              */
(0           <<  1) |       /* BSWP          : Swap Disable                     */
(1           <<  0) ;       /* HWSWP         : Swap Enable                      */

s2410LCD->LCDSADDR1 = ((dwPhysicalFrameBase >> 22)     << 21) |
((M5D(dwPhysicalFrameBase >> 1)) <<  0);

s2410LCD->LCDSADDR2 = M5D((dwPhysicalFrameBase + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1);

s2410LCD->LCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT / 1);

//s2410LCD->LCDINTMSK |=3; // MASK LCD Sub Interrupt
s2410LCD->LPCSEL   |= ~0x7;

s2410LCD->TPAL      = 0x0;
s2410LCD->LCDCON1  |= 1;

// Unmap register buffers.
//
MmUnmapIoSpace((PVOID)s2410IOP, 0);
MmUnmapIoSpace((PVOID)s2410LCD, 0);

return(TRUE);
}

2.添加LCD驱动到系统镜像中(NK.bin)
(1)修改dir文件,将S3C2410X添加进来
/GEC2410/SRC/COMMON/dir:
DIRS=/
smartmedia /
S3C2410X /
BOOTPART
/GEC2410/SRC/COMMON/S3C2410X/dir:
DIRS= /
display
#sdhc /
#serial /
#touch /
#wavedev /
#usb /
我们先仅仅添加LCD驱动,其他的之后在移植,因此先注释掉其他驱动
(2)修改LCD驱动的source文件,设置其编译方式,我们编译成dll,并放到Platform的target目录下,这会覆盖原来CSP目录下生成的dll
RELEASETYPE=PLATFORM
TARGETNAME=s3c2410x_lcd
TARGETTYPE=DYNLINK
(3)在platform.bib中添加该dll
; @CESYSGEN IF CE_MODULES_DISPLAY
IF BSP_NODISPLAY !
s3c2410x_lcd.dll $(_FLATRELEASEDIR)/s3c2410x_lcd.dll NK SH
ENDIF BSP_NODISPLAY !
; @CESYSGEN ENDIF CE_MODULES_DISPLAY
3.重新Sysgen,下载到开发板,就可以看到windows ce的资源浏览器了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐