
电 子 测 量 技 术
EL ECTRON IC M EASU REM EN T TECHNOLO GY
第29卷第6期
2006年12月
基于S3C2440A 的嵌入式视频系统设计3
周晓光 潘延涛
(北京邮电大学自动化学院北京100876)
摘 要:文中介绍基于嵌入式处理器S3C2440A 构建的视频系统,包括硬件体系结构和软件系统及其Linux 驱动程序的设计流程。提出嵌入式视频系统的一般设计方法,满足目前嵌入式系统中对视频系统的多方面需求。关键词:视频系统;驱动程序;摄像头;液晶显示屏
Design of embedded video system based on S3C2440A
Zhou Xiaoguang Pan Yantao
(Beijing University of Post &Telecommunication ,School of Automation ,Beijing 100876)
Abstract :This paper introduced the designing flow of embedded video system which included hardware and software system based on embedded processor S3C2440A and concerned device drivers on Linux platform.It brings forward a commonly designing method for embedded video system that satisfied with various requirements of video system in embedded system.
K eyw ords :video system ;driver program ;camera ;L CD
3基金项目:2003年重点科技项目“基于移动终端的可视化警力布控追逃系统”资助项目
0 引 言
嵌入式视频系统广泛应用于掌上终端、PDA 、GPS 自
动导航、3G 手机等嵌入式领域,因此视频信息的采集和处理技术成为嵌入式系统的关键技术。由于视频信息的数据量大,加之人们对视频信息的实时性、图像质量的要求越来越高,而数字化视频系统可以充分利用计算机的快速处理能力,对图像信息进行压缩、分析、存储和显示,因此基于ARM 或DSP 的数字化视频处理系统正逐步取代传统的图像处理系统,并呈现强劲的发展趋势。
本文针对三星公司的S3C2440A ARM 处理器构建的嵌入式视频系统就是作为多功能警用手持终端机的组成部分实现的,文中将详细介绍该嵌入式视频系统的设计方法。
1 系统硬件设计
利用S3C2440A 丰富的外部接口和ARM920T 出色的内核性能可以很方便地构建一个嵌入式视频系统的硬件平台,用于掌上终端等嵌入式设备。图1是应用与多功能警用掌上终端的视频系统的硬件框图。该系统硬件工作流程为:S3C2440A 从NAND Flash 芯片装载并执行引导程序,引导程序将NAND Flash 中的内容拷贝到SDRAM 中,拷贝完成后在SDRAM 中执行软件系统主程序。其中
S3C2440A 为了支持从NAND Flash 装载引导程序,在NAND Flash 控制器接口中装备了一个被称作
“Setppingstone ”的内部SRAM 缓冲区,每当系统启动时,NAND Flash 存储器中起始4K 字节的内容会被装入“Setppingstone ”中并被执行。当启动视频系统工作后,CMOS 摄像头采集到的图像数据经过Camera 接口的2个DMA 通道,以不同的编码格式缓存在各自的ping 2pong 存储器中,需要保存的图像被编码后保存到Flash 中,用于显示的图像数据由L CD 控制器通过专用的DMA 通道将图像数据从ping 2pong 存储器输出到L CD 驱动器,这一过程是自动完成的,不需要CPU 的参与,然后L CD 驱动器根据特定的时序将图像完整地显示在液晶屏上。在实际的操作中可以通过I 2C 总线接口对CMOS 摄像头的工作参数进行设置。
在这个嵌入式硬件平台中,主CPU 是韩国三星公司的S3C2440A 。作为存储引导程序和嵌入式操作系统内核的NAND Flash 是M 2Systems 公司的MD2811-D32,容量是32MB ,还有足够的空间存储应用程序和重要的数据。SDRAM 被用来运行操作系统、应用程序,以及作为各类数据的缓存,基于成本、图像数据量大、图像处理过程复杂等原因,本系统采用2片SAMSUN G 公司的K4S561632E 作为系统的SDRAM ,实现位扩展,使数据总线宽度为32bit ,总容量为MB 。
・
48・
周晓光等:基于S3C2440A 的嵌入式视频系统设计
第6期
CMOS 摄像头配合
S3C2440A 的CAMIF 接口实现了
视频原始数据的采集以及前期的一些处理工作。CMOS
摄像头以其低廉的价格、实用的图像质量、高集成度和相对较少的功耗,在嵌入式视频系统中得到了广泛的应用。本系统采用的CMOS 摄像头是OV9650FSL ,该芯片具有1280×1024的像素阵列大小。通过串行SCCB 接口与S3C2440A 的I 2C 总线接口相连,其曝光时间、白平衡、增益、饱和度、伽马校正等参数均可通过对芯片内部寄存器的读写进行设置[2]。
图1 视频系统硬件平台
在图像显示部分,本系统采用S HARP 公司的3.5寸
TF T 有源彩色液晶显示器L Q035Q7DB02配合S3C2440A 的L CD 控制器接口和触摸屏接口工作。由于在本设计中采用16位方式,即R G B565,因此无需对帧缓冲中的数据进行解码,所以L CD 控制器不处理而直接把数据送到输出FIFO ,输出FIFO 再将数据通过引脚送到L Z9FC22以驱动液晶显示。
2 系统软件设计
软件系统建立在Linux 22.4.20平台上。2.1 底层软件设计
底层软件设计也就是设备驱动程序的编写,设备驱动程序需要完成的任务包括:对设备及对应资源的初始化和释放;读取应用程序传送给设备文件的数据并回送应用程序请求的数据。这需要在用户空间、内核空间、总线及外
设之间传输数据[3]
。2.1.1 摄像头驱动
CMOS 摄像头驱动以MODUL ES 的形式编写,因为
MODUL ES 形式的驱动可动态加载到Linux 内核[4]
。
程序的设计围绕下面的file_operations 数据结构体展开,主要编码工作就是具体实现结构体中相应的各个函数的功能。通过这些系统调用,应用程序就可实现对CMOS 摄像头的打开、关闭、视频数据的读取、内部寄存器的设置等操作。
static struct file_operations cam_fop s ={
owner : T HIS_MODUL E ,
llseek : no_llseek , open : cam_open , read : cam_read , write : cam_write , ioctl : cam_ioctl , release : cam_release ,
};
另外有2个很重要的宏为:
(1)module_init (init_s3c2440_ov9650)
它是驱动程序的入口点,相当于应用程序的main 函数,用户进程加载该驱动程序时就会自动调用init_s3c2440_ov9650函数,主要实现的功能有:
①产生下降沿脉冲,使OV9650复位;②初始化S3C2440A 的摄像头接口,主要是配置相关的寄存器,包括配置端口J 的引脚功能,作为摄像头的控制和数据线;将端口J 的数据寄存器清零;
③配置U PLL 时钟频率及摄像头的输入时钟频率等;④配置端口E 的控制寄存器,设置I 2C 总线的控制功能,主要是设置I 2C 总线的数据位、停止位、摄像头从地址、时钟频率等;
⑤通过request_irq ()系统调用向Linux 系统申请注册中断,以便随时响应用户对摄像头设备文件的调用。
(2)module_exit (exit_s3c2440_ov9650)
用户进程卸载该驱动程序时,自动调用exit_s3c2440_
ov9650函数,主要完成进程地址空间、存储缓冲区的释放,关闭中断请求等工作。2.1.2 L CD 驱动
本文将L CD 作为字符设备加以访问和管理。Linux 把显示驱动看作字符设备,把要显示的数据一字节一字节地送往L CD 驱动器。在L CD 驱动设计的过程中首要的是配置L CD 控制器,而在配置L CD 控制器中最重要的一步则是帧缓冲区(FrameBuffer )的指定。用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上的。帧缓冲区的大小由屏幕的分辨率和显示色彩数决定。驱动帧缓冲的实现是整个驱动开发过程的重点。
帧缓冲设备也属于字符设备,采用“文件层2驱动层”的接口方式。在文件层为之定义的数据结构与第2.1.1节介绍的摄像头驱动中使用的数据结构相同。其中的函数对具体的硬件进行操作、对寄存器进行设置、对显示缓冲进行映射。驱动程序中的主要结构体还有:
(1)struct fb_fix_screeninfo :记录帧缓冲设备和指定显示模式的不可修改信息。它包含了屏幕缓冲区的物理地址和长度;
(2)struct fb_var_screeninfo :记录帧缓冲设备和指定显示模式的可修改信息。它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。其中变量xres 定义了屏幕一行所占的像素数,yres 定义了屏幕一列所占的像素
・
58・
数,bit s_per_pixel定义了每个像素用多少个位来表示;
(3)struct f b_info:Linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一个fb_info结构相对应。其中成员变量modename为设备名称,font name为显示字体,f bop s为指向底层操作的函数的指针。
程序设计的主要工作是:
(1)初始化S3C2440A的L CD控制器
通过写寄存器,设置显示模式和颜色数,然后分配L CD显示缓冲区。缓冲区大小为:点阵行数×点阵列数×用于表示一个像素的比特数/8。缓冲区通常分配在大容量的片外SDRAM中,起始地址保存在L CD控制寄存器中。本文采用的L CD显示方式为240×320,16位彩色,因此需要分配的显示缓冲区为150K B。最后是初始化一个f b_info结构,填充其中的成员变量,并调用register_ framebuffer(&fb_info),将f b_info登记入内核。
(2)编写成员函数
编写结构体f b_op s中对应的成员函数,以及实现下面3个函数。
static int s3c2440f b_get_fix(struct f b_fix_screeninfo 3fix,int con,struct f b_info3info);
static int s3c2440f b_get_var(struct f b_var_screeninfo 3var,int con,struct f b_info3info);
static int s3c2440f b_set_var(struct f b_var_screeninfo 3var,int con,struct f b_info3info);
对于s3c2440f b_get_fix(),应用程序传入的是f b_fix_ screeninfo结构,在函数中对其成员变量赋值,主要是smem_start(缓冲区起始地址)和smem_len(缓冲区长度),最终返回给应用程序。而s3c2440f b_set_var()函数需要传入的参数是f b_var_screeninfo,函数中需要对xres、yres和bit s_per_pixel分别赋值为240、320、16。
2.2 应用程序设计
软件系统还包括上层的应用程序。本文使用的Mini GU I是一个轻量级的图形用户支持系统,它完全支持中文、提供了完备的多窗口机制、实现了窗口消息的传递机制、支持多种图形文件格式等
,特别适合于作为嵌入式Linux系统的图形平台。
在应用程序中,主要实现对摄像头数据的读取并在L CD上显示,以及对摄像头、L CD参数的配置,对图形数据的保存等。程序设计的流程如下:打开/dev/s3c2440fb 或/dev/s3c2440camera设备文件;用struct file_operations 结构体中定义的系统调用实现各种操作;关闭设备文件。整个软件系统的层次结构如图2所示。
图2 软件系统的层次结构
3 结 论
基于S3C2440A的嵌入式视频系统可作为一个模块被广泛应用到PDA、移动手持终端、支持多媒体应用的3G手机、宽带可视电话、视频会议等系统中实现图像采集、处理和显示。在本文中介绍的设计系统的基础上,在S3C2440A的UAR T接口上链接中兴公司的CDMA1x模块以及适当的外围器件和应用程序,即可实现具有通讯、数据传输、照相功能的智能手机。
参考文献
[1]S3C2440A Userπs manual2004[Z].SUMSUN G Co.
Ltd:62282,3532385.
[2] OV9650FSL Userπs manual2003[Z].OmniVision Co.
Ltd:3220.
[3] 孙天泽,袁文菊.嵌入式设计及Linux驱动开发指南
[M].北京:电子工业出版社,2005.
[4] 魏永明,骆刚,姜君.Linux设备驱动程序[M].北京:中
国电力出版社,2002.
・
6
8
・
