基于PXA270的LCD显示系统的设计与实现
/pxafb.c文件中,结构如下:
int __init pxafb_init(void)
{
struct pxafb_info *fbi;
int ret;
…………
fbi = pxafb_init_fbinfo(); //初始化一些重要的数据结构
…………
/* Initialize video memory */
ret = pxafb_map_video_memory(fbi); //在内存中创建一个图像缓存区
…………
pxafb_set_var(&fbi->fb.var, -1, &fbi->fb);
…………
ret = register_framebuffer(&fbi->fb); //登记,使画面缓冲区与控制台设备驱动的高层挂钩
…………
/ * Ok, now enable the LCD controller */
set_ctrlr_state(fbi, C_ENABLE);
…………
return ret;
}
首先是pxafb_init_fbinfo()的调用,目的在于对几个数据结构进行初始化,并设置有关的基本的参数,例如所用的字体、显示屏的规格等,还有为了搭建帧缓冲器的设备驱动框架做一些准备。接着通过pxafb_map_video_memory()函数在内存中创建帧缓冲区,实际上是为一个内存区间另外建立一个映射。这里分配用于帧缓冲区的内存区间应该是不经高速缓存、不加写缓冲的,这样才可以一经写入便立即反映在显示屏上,而无需先对高速缓存进行刷新。
pxafb_set_var()函数是为控制台设备驱动的高层提供一个驱动帧缓冲区的界面。同时也确定一些与画面缓冲区有关的参数,并记录在一个fb_var_screeinfo数据结构中。确定了这些参数以后,如果目标帧缓冲区属于当前选定的控制台设备,就通过pxa_activate_var()函数把这些参数分门别类地组合生成PXA270各有关寄存器的映像,并最终设置到PXA270的各个LCD控制寄存器中。
这里用到6个寄存器:
DBAR1:DMA通道1的基地址寄存器,用于调色板;
DBAR2:DMA通道2的基地址寄存器,用于画图;
LCCR0:黑白/彩色模式选择,单画面/双画面显示方式、被动/主动显示模式选择;
LCCR1:控制着水平方面的扫描,包括每行的像素、水平同步脉冲宽度、在水平扫描行的开头和末尾各空出几个像素等参数;
LCCR2:控制着垂直方面的扫描,包括每个画面的行数、垂直同步脉冲宽度、在画面的顶部和底部各空出几行等参数;
LCCR3:控制着像素时钟的频率以及各种同步脉冲的极性。
这些宏操作都在/drivers/video/pxafb.h文件里。
#if defined(CONFIG_FB_LB064v02)
#define LCD_PIXCLOCK 250000//54000//150000
#define LCD_BPP 16
#define LCD_XRES 640
#define LCD_YRES 480
#define LCD_HORIZONTAL_SYNC_PULSE_WIDTH 46
#define LCD_VERTICAL_SYNC_PULSE_WIDTH 1
#define LCD_ BEGIN_OF_LINE_WAIT_COUNT 96
#define LCD_BEGIN_FRAME_WAIT_COUNT 35
#define LCD_END_OF_LINE_WAIT_COUNT 4
#define LCD_END_OF_FRAME_WAIT_COUNT 0
#define LCD_SYNC (FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT)
#define LCD_LCCR0 (LCCR0_OUC | LCCR0_CMDIM | LCCR0_RDSTM | LCCR0_OUM | LCCR0_BM | LCCR0_QDM | LCCR0_PAS |LCCR0_EFM | LCCR0_IUM | LCCR0_SFM | LCCR0_LDM )
#define LCD_LCCR3 (LCCR3_PCP | LCCR3_HSP | LCCR3_VSP)
#endif
最后是通过register_framebuffer()进行各项登记,使帧缓冲区与控制台设备驱动的高层相连。参数fbi是一个指向fb_info数据结构的指针,通过这个数据结构使帧缓冲区与文件系统连接起来。
3.2 帧缓冲区的操作
对帧缓冲区的操作,应用程序首先要打开代表帧缓冲区的设备文件,帧缓冲区的file_operations数据结构是fb_fops。
static struct file_operations fb_fops = {
owner: THIS_MODULE,
read: fb_read, // 读操作
write: fb_write, // 写操作
ioctl: fb_ioctl, // 控制操作
mmap: fb_mmap, // 映射操作
open: fb_open, // 打开操作
release: fb_release, // 关闭操作
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
get_unmapped_area: get_fb_unmapped_area,
#endif
};
应用程序层对帧缓冲设备的访问同对文件的访问操作类似。在应用程序中,对帧缓冲设备(dev/fb)的操作只需调用文件层的操作函数。首先打开/dev/fb设备文件;随后用ioctl操作取得屏幕的分辨率和bpp值,从而计算出屏幕缓冲区的大小,并将屏幕的
- 采用灵活的汽车FPGA 提高片上系统级集成和降低物料成本(04-28)
- 从LCD电极读数的单片机接口技术(01-15)
- 嵌入式Linux下彩色LCD驱动的设计与实现(03-09)
- 基于FPGA的液晶显示控制器设计(02-17)
- LCD部分专业术语解释(03-06)
- 点阵LCD的驱动显控原理(上册)(03-20)
