梁皓东,张国平,潘 梁
(1.华中师范大学 物理科学与技术学院,湖北 武汉 430079;2.湖北省武黄高速管理处 湖北 武汉 430079)
视频展示台是将实物、文稿、图片和过程等信息转换为图像信号输出在投影机、显示器上展示出来的一种演示设备。便携式视频展示台由于具有体积小,易于携带等优点,被广泛用于教学、大型会议及产品展示等场合,具有较大的研究前景。本视频展示台的设计采用三星基于ARM9内核的S3C2440A芯片,运用模块化的设计原则,具有体积小、便携带、低功耗、易维护性等特点,整个系统的设计由两部分构成,分别是实物、图片、文档或者过程等图像采集部分和VGA传输显示部分。此视频展示台的显示分辨率为800×600。
本便携式视频展示台采用三星S3C2440A处理器,其CPU的工作频率可达400 MHz,可以很好的处理图像数据。它的外设包括:LCD控制器、CAMIF单元、UART接口、IIC BUS接口、USB主从接口等。系统采用具有极快读写速度的2片32 MB的SDRAM来保证linux操作系统的流畅运行,采用具有掉电保护功能的128 MB的Nandflash来存放操作系统和驱动程序。此外,130万像素的ov9650摄像头用来采集视频图像数据,ADV7120将数字RGB信号转换成VGA显示需要的模拟彩色信号,显示分辨率为800×600。电源管理模块能够提供多种供电,包括芯片内核电压采用1.8 V供电,芯片的IO口部分采用3.3 V供电。为了给实物、文档、图片或者演示过程提供照明光源,在ov9650摄像头旁边加了一圈led小灯。下图1是方案的硬件电路设计框图。
视频采集模块是本便携式视频展示台的一个重要组块之一。本模块采用摄像头接口控制单元CAMIF和IIC总线来控制和传输OV9650摄像头采集实物、图片、文档或者过程等视频数据。选择CMOS传感器是因为它有功耗低、编程方便、成本低等优点。其主要引脚及功能描述如下:CAMCLKOUT是CPU输出的采样时钟,帧同步信号VSYNC、行同步信号HREF、像素时钟信号PCLK由OV9650内部产生,输入到S3C2440A芯片中,用于对图像采集进行控制。摄像头在每个PCLK脉冲过程中依次采集—个字节的数据,直到一帧图像数据采集完成[1]。
图1 实物投影仪硬件电路设计框图Fig.1 Design block diagram of portable video
摄像头采集的数据经过处理后进入帧缓冲区,帧缓冲区由4个Ping Pong存贮器组成,因此图像帧的读写操作可以同时进行。然后通过预览DMA连到AHB总线上,通过AHB总线将数据送往内存。整个过程由linux操作系统来控制,如图2所示。
图2 视频图像采集过程Fig.2 The process of video image
file_operations结构是Linux2.6内核提供的一个标准化的文件操作实现接口,定义ov9650_ops为file_operations结构。编写用于上层软件接口函数:
通过这些调用函数,应用程序就可实现对CMOS摄像头的打开、关闭、视频数据的读取、内部寄存器的设置等进行操作。在启动驱动程序时,系统首先调用已经定义的ov9650摄像头驱动程序的入口函数init(ov9650_init)对摄像头进行初始化,初始化的主要内容是复位、通过IIC配置相关摄像头寄存器、摄像头采样时钟配置以及中断配置等,然后等待进一步命令。应用程序使用结束后,系统调用已经定义的ov9650出口函数 exit(ov9650_exit)退出[2]。
本便携式视频展示台的另一个重要组块是VGA显示模块。S3C2440A带有LCD控制器,可以很方便地控制驱动扫描式接口的TFT显示。其主要功能引脚有:像素时钟信号引脚VCLK/LCD,场同步信号引脚VFRAME/VSYNC,行同步信号引脚 VLINE/HSYNC,VD[23:0]是 LCD数据输出端口。 当把VSYNC、HSYNC、VCLOCK等信号参数设定好,并把帧内存(frame memory)的地址告诉LCD控制器后,LCD控制器即可通过DMA自动获取帧内存中的图像数据[3]。
VGA接口使用模拟RGB通道,逐点、逐行扫描。VGA接口信号为模拟信号,其关键信号有5个,分别是行同步信号,场同步信号,红色模拟信号,绿色模拟信号和篮色模拟信号。电子枪从左至右,从上而下的进行扫描,每行结束时,用行同步信号进行同步。扫描完所有的行后用场同步信号进行场同步。
通过比较LCD扫描式接口时序和VGA时序可知,LCD控制器驱动TFT显示的行场同步信号时序和VGA行场同步信号时序很像。只是信号的极性VGA是负极性,LCD信号是正极性,这个通过调整Linux内核显示模块来调整LCD的时序以适应SVGA时序即可。因此,可以利用高性能视频D/A转换芯片ADV7120将S3C2440A自带的LCD扫描式接口转换为VGA接口,然后用带有VGA接口的显示器显示。此外,LCD控制器用于控制数据信号的使能的引脚VDEN在D/A转换模块中可用来控制信号转换的使能,LCD控制器的VCLK可用作D/A转换模块的时钟信号。
ADV7120的输入及控制信号非常简单:3组8位的数字视频数据输入端,用以连接LCD控制器的数据输出接口VD[23:0],数据输入端采用标准TTL电平接口;4条视频控制信号线包括复合同步信号SYNC、消隐信号BLANK、白电平参考信号REF WHITE和像素时钟信号CLOCK,外接一个1.23 V数模转换参考电压源和1个输出满度调节。
ADV7120的输出信号只有4条:3条模拟RGB信号和同步参考电流输出信号Isync。VGA接口的行场同步信号和LCD扫描式接口的行场同步信号是一致的,因此LCD控制器接口中的行场同步扫描信号HSYNC和VSYNC直接接到VGA接口。LCD控制器和VGA接口是由硬件实现的两种接口的电器转接,不需要写任何驱动程序,这是在嵌入式系统平台上扩张VGA接口最方便的方案[4],也是本便携式视频展示台体积小,易携带性设计的基础。
3.3.1 LCD帧缓冲设备驱动结构
帧缓冲是Linux为显示设备提供的一个接口,它把一些显示设备描述成一个缓冲区,允许应用程序通过FrameBuffer定义好的接口访问这些图形设备,而不用去关心具体的硬件细节。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。LCD控制器驱动是VGA设备驱动的核心,是一个标准的linux2.6内核下的framebuffer设备驱动。在VGA驱动设计的过程中首要的是配置LCD控制器。而在配置LCD控制器中最重要的一步则是帧缓冲区(FrameBuffer)的指定。因此,驱动帧缓冲是实现是整个驱动开发过程的重点。帧缓冲驱动需要完成的的工作主要有5个部分:编写初始化函数,编写成员函数,读写,映射,输入输出控制。
1)初始化LCD控制器
通过写寄存器,设置显示模式和颜色数,然后分配LCD显示缓冲区。缓冲区大小为:点阵行数×点阵列数×用于表示一个像素的比特数/8。缓冲区通常分配在大容量的片外SDRAM中,起始地址保存在LCD控制寄存器中。文中采用的LCD显示方式为800×600,需要分配的显示缓冲区为960 KB。最后是初始化一个fb_info结构,填充其中的成员变量,并调用register_framebuffer( &fb_info),将 fb_info 登记入内核[5]。
2)编写成员函数
该函数主要用于编写fb_info()结构体中指针fb_ops()对应的底层操作函数,主要是3个函数:
static int s3c2440fb_get_fix (struct fb_fix_screeninfo*fix,int con, st ruct fb_info 3 info);
static int s3c2440fb_get_var (struct fb_var_screeninfo*var,int con, st ruct fb_info 3 info);
static int s3c2440fb_set_var (struct fb_var_screeninfo*var,int con, st ruct fb_info 3 info);
以上这些函数都是用来获取fb_info()中的成员变量的,当应用程序调用ioctl()操作时将会调用这些函数。
读写函数就是用来读写屏幕缓冲区,地址映射操作可以将文件的内容映射到用户空间,这样用户就可以通过读写这段地址来访问缓冲区了。输入输出操作就是设备文件ioctl()读取和设置显示设备的参数,具体的ioctl()的实现由底层驱动程序来完成[6]。
3.3.2 根据VGA时序设定LCD控制器寄存器
本便携式视频展示台选择SVGA显示,像素时钟信号VCLK为 40 MHz,分辨率为 800x600,帧频率为 60 Hz,16位真色彩显示,SVGA时序如下图所示。
根据图3、图4所示 SVGA显示时序的特点,对LCD控制器中的控制寄存器进行如下配置。
1)LCDCON1寄存
CLKVAL:确定VCLK频率的参数。公式为VCLK=HCLK/[(CLKVAL+1)x2]. 在 本 设 计 中 S3C2440A 的 HCLK=100 MHz,VCLK=40 MHz, 故 需 设 置 CLKVAL=0.25, 设 置BPPMODE=0xC,即选择TFT 16位模式。
图3 VGA行数据时序Fig.3 Line timing
图4 VGA帧数据时序Fig.4 Frame timing
2)LCDCON2 寄存器
VBPD:确定帧同步信号和帧数据传输前的时延,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图4所示,VBPD=p/c=0.6 ms/20 μs=30。
VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延时,是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,VFPD=r/c=0.026 ms/20 μs=10。
LINEVAL:确定显示的垂直方向大小,LINEVAL=YSIZE-1=599。
VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值,VSPW=o/c=0.1 ms/20 μs=5。
3)LCDCON3 寄存器
HBPD:确定行同步信号和行数据传输前的延时,描述行数据传输前延迟时间内VCLK脉冲个数,HBPD=b×VCLK=2.2 μs×40 MHz=88.
HOZAL:确定显示的水平方向尺寸。这里HOZAL=XSIZE-1=799。
HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,HFPD=d×VCLK=1 μs×40 MHz=40。
4)LCDCON4 寄存器
HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内 VCLK 脉冲个数,HSPW=a×VCLK=3.2 μs×40 MHz=128。
5)LCDCON5 寄存器
BPP24BL:确定数据存储格式。此处设置BPP24BL=0x0,即选择小端模式存放。
FRM565:确定16位数据输出格式。设置FRM565=0x1,即选择5:6:5的输出格式。
文中根据市场对视频展示台的大量需求现状,提出了基于ARM9的S3C2440的便携式视频展示台的设计方案。与用CPLD/FPGA来实现VGA显示的系统相比,本方案节约成本和资源,且接口电路简单,应用灵活、可靠。由本方案做成的视频展示台体积小,易于携带。本方案经过Linux软件测试论证,方案切实可行,对实物、图片、文档或者过程的显示效果清晰,无抖动。
[1]OV9650FSL Userps manual 2003[Z].OmniVision Co.Ltd:3220.
[2]周晓光,潘延涛.基于S3C2440A的嵌入式视频系统设计[J].电子测量技术,2006,6(12):84-86.ZHOU Xiao-guang,PAN Yan-tao.Design of embedded video system based on S3C2440A [J].Electronic Measurement Technology,2006,6(12):84-86.
[3]纪宁宁,孙灵燕.S3C2440A驱动RGB接口TFT LCD的研究[J].液晶与显示,2008,1(2):96-100.JI Ning-ning,SUN Ling-yan.Study of TFT LCD about RGB driver of S3C2440[J].Chinese Journal of Liquid Crystals and Displays,2008,1(2):96-100.
[4]郑佃好,张红雨,张洪斌.基于ADV7125的嵌入式系统VGA接口设计[J].新器件新技术,2011,8(4):37-45.ZHENG Tian-hao,ZHANG Hong-yu,ZHANG Hong-bing.Embedded System VGA Interface Design Based on ADV7125[J].Newproduct&Tech,2011,8(4):37-45.
[5]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.
[6]刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006.