wince 6.0 如何更改 LCD驱动程序,需要修改哪些文件

wince 6.0 如何更改 LCD驱动程序,需要修改哪些文件,第1张

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

TFT***_***

#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

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit SCLK = P3^1//液晶时钟线

sbit SDAT = P3^0//液晶数据线

void SEND_BYTE_LCD(uchar data_to_lcd)

void SEND_DATA_SER(bit codeordata, uchar SERIAL_DATA)//code 为1

void wrlcd(uchar HANG, uchar LIE, uchar *SENTENCE)

void lcdinit(void)

//void delay(uchar deltime)

/*********************************************************/

//延时程序

/********************************************************/

void delay(uint deltime)

{

uchar i

uint j

for (j = 0j <deltimej++)

for (i = 0i <255i++)

}

/*********************************************************

液晶写命令子程序

**********************************************************/

void SEND_BYTE_LCD(uchar data_to_lcd)

{

uchar j

for (j = 0j <8j++)

{

SDAT = (bit) (data_to_lcd &0x80)

SCLK = 0

SCLK = 0

SCLK = 0

SCLK = 0

SCLK = 0

SCLK = 1

SCLK = 1

SCLK = 1

SCLK = 1

SCLK = 1

data_to_lcd <<= 1

SCLK = 0

SCLK = 0

SCLK = 0

SCLK = 0

SCLK = 0

}

}

void SEND_DATA_SER(bit codeordata, uchar SERIAL_DATA)

{

uchar first, second, third

if (codeordata)

{

first = 0xf8

}

else

{

first = 0xfa

}

second = SERIAL_DATA &0xf0

third = SERIAL_DATA <<4

SEND_BYTE_LCD(first)

SEND_BYTE_LCD(second)

SEND_BYTE_LCD(third)

}

void wrlcd(uchar HANG, uchar LIE, uchar *SENTENCE)

{

uchar position

position = HANG + LIE

SEND_DATA_SER(1, position)

delay(2)

while (*SENTENCE)

{

SEND_DATA_SER(0, *SENTENCE++)

}

}

void lcdinit(void)

{

delay(100)

SEND_DATA_SER(1, 0X30)

delay(4)//基本功能设置

//SEND_DATA_SER(1,0X06)delay(2)

SEND_DATA_SER(1, 0X0C)

delay(4)

SEND_DATA_SER(1, 0X01)

delay(40)

SEND_DATA_SER(1, 0X02)

delay(40)

// SEND_DATA_SER(1,0X80)delay(2)

delay(10)

}

单片机ser通常是指单片机的串行口(Serial Port),它也被称为USART (Universal Synchronous/Asynchronous Receiver / Transmitter)。串行口是单片机和外部设备进行通信的一种方式,可以通过串行通信协议(如UART、SPI、I2C等)与其他设备进行数据的收发和控制。

其中,UART (Universal Asynchronous Receiver/Transmitter) 是一种异步串行通信协议,适用于低速率的数据传输(如常见的RS232接口),SPI (Serial Peripheral Interface) 是一种全双工同步串行通信协议,适用于高速率的数据传输,I2C (Inter-Integrated Circuit) 是一种双线串行通信协议,适用于在电路板上短距离的快速数据交换。

通过单片机的串行口,可以连接外设,例如传感器、显示屏、无线模块等,实现单片机与外界设备的数据通信和控制。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11369459.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存