
在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) 是一种双线串行通信协议,适用于在电路板上短距离的快速数据交换。
通过单片机的串行口,可以连接外设,例如传感器、显示屏、无线模块等,实现单片机与外界设备的数据通信和控制。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)