基于ARM的MPEG-4数字录像机的设计实现
扫描二维码
随时随地手机看文章
【关键词】 ARM EP9315 IME6400 MPEG-4 Linux 设备驱动
【Abstract】 In this paper, designing and implementing a digital video recorder which is based on the processor ARM9 hardware series EP9315 and Linux software is achieved; the paper’s content include the general function and structure of the system, the designing of core hardware module and the designing of corresponding devices Linux drivers and application.
【Keyword】 ARM EP9315 IME6400 MPEG-4 Linux Module Driver
随着科技的飞速发展,消费类电子,通信,电视电影广播与计算机技术紧密结合起来。而数字化信息,尤其是数字化视频信息,具有数据量大,存储传输困难的特点,是制约人类获得信息的主要瓶颈。这种形势对数字视频记录设备的研制提出了新的要求:大批量的应用要求降低监控记录设备成本,多样的应用环境、分散、孤立的监控点要求监控记录设备尽可能一体化、小型化、独立、便携、低功耗、供电方便、性能可靠。针对这些新问题和新要求,作者设计实现了一种基于嵌入式系统和MPEG-4编码标准的数字录像机,系统集成度高、体积小、功耗低、独立、便携,适合大量的各类视频监控和记录应用。
1 系统框架及原理说明
本系统选用的主要模块是低功耗ARM9系列微处理器EP9315和专业视频压缩编码处理芯片IME6400,周围外部设备有SAA7118 A/D数模转换芯片,RAM芯片,ROM芯片,网络模块和电源模块。系统电路原理图如图1所示。整个电路采用5V电源供电,系统启动后,外部输入的视频和音频信号分别经过视频数模转换模块和音频模块进行解码,随后通过IIC总线送入IME6400视频处理芯片生成MPEG-4视频音频复合数据流,系统控制芯片EP9315从IME6400的HOST总线将数据流取出存放到硬盘中,并且控制与外部设备的通信。
图1:系统总体框图
2 MPEG-4标准
2.1 MPEG-4压缩算法的基本原理
MPEG-4视频压缩算法采用了基于对象的处理方案,对视频图像中的每个目标进行单独处理,能够在保证图像质量的情况下,极大的降低码率。在相同的图像质量下,MPEG-4的输出码流可以比MPEG-2降低一半。正因为如此,MPEG-4压缩算法已得到了广泛的应用。MPEG-4中视频对象(VO)可能是场景中的某一物体、某个区域、也可能是计算机产生的二维、三维图形等。VO的选定依赖于具体的应用和系统所处的环境:在要求超低比特率的情况下,VO可以是一个矩形帧,与以前的MPEG-1、H.263标准兼容;对于基于内容的应用,每一个VO有三类信息描述:运动信息、形状编码、纹理编码。MPEG-4的编码结构中,首先是从原始视频流中分割出VO,之后由编码控制机制为不同的VO及相应的3种类型的信息分配码率,然后是各个VO独立编码,最后将各VO的码流复合成一个位流。解码过程是编码的逆过程。编码的图2所示:
2.2 MPEG-4码流的形成
如图3所示,MPEG-4压缩算法将一幅图象分为多个对象,这些对象按不同的层,每个层又分为不同的平面按顺序变换为视频码流。它的基本视频流格式如图3所示。每个视频对象分为多个视频对象层,每个视频对象层形成一个基本流,这一基本流类似与MPEG-2中的GOP。每个基本流都有自己的视频对象序列头,不同的视频对象序列头可以分别按不同的顺序传送,这就极大地提高了MPEG-4传送流的灵活性。
图3 MPEG-4视频码流的基本构成
3 硬件设计
3.1 控制模块设计
系统控制模块选用CIRRUS LOGIC公司的EP9315A微处理器,此处理器是基于ARM920T内核,高性能,低功耗,32位CPU,自带MMU,16k指令cache和16k数据cache和Maverick Crunch数学协处理器;主频200MHz,系统总线100MHz;所支持的操作系统包括WINCE , Linux【1】。为了便于设计和调试,硬件设计上采用核心板加底板的模块化设计方法,在核心板上集成了基于EP9315的最小系统,通过底板来扩展外部功能。在核心板上主要配置了64MB的NAND Flash 和64MB的SDRAM及提供RTC时钟和工作时钟的晶体,并将其丰富的外设接口资源引出。在底板上扩展出USB主机接口、以太网口、UART接口、IDE接口等,以实现与外部设备间的数据传输和通信。
EP9315支持硬盘的挂载,可以通过外部IDE接口将视频数据直接存入硬盘,但在开发初期采用通过与PC机服务器网络挂载方式,将记录数据通过网络协议存入PC机硬盘中,便于回放和调试。IME6400的HOST接口映射到处理器的第6个Memory Bank中,将EP9315的nGCS3片选管脚直接连接IME6400的nCS,地址线ADD[1:5]通过总线驱动芯片后与HOST接口的HA[0:4]相连【2】,同时将IME6400异步模式下的中断管脚GPIO0与EP9315的中断管脚FPGIO1相连。
3.2 视频音频编解码模块设计
视频A/D芯片选用Philips公司的高性能可编程解码芯片SAA7118,该芯片支持多种输入模式,具有抗混叠滤波、自动钳位、自动增益变换、亮度、对比度、饱和度调整等功能,其工作时钟为24.576MHz。通过设定SAA7118的内部的配置寄存器93H[6]为1使能其HOST端口,实现与IME6400的无缝连接。音频A/D芯片采用BURR-BROWN公司的PCM1800,它对模拟音频进行高信噪比20bit数字采样,生成PCM数字音频流。
压缩编码采用INTIME公司的MPEG-4编码芯片IME6400。该芯片是一款高性能的单片多通道MPEG-4数字压缩编码芯片,它支持多种编码模式和比特率控制,并提供了丰富的外围硬件接口。IME6400总线具有四种工作模式,通过mode管脚定义,在这里mode[1:0]设定为11,即异步工作模式。在这种模式下,当IME6400将GPIO0管脚置低电平时,FIFO缓冲区中存满NFIFOSIZE=1k大小的输出数据流,外部接口在得到GPIO0下降沿电平后便可以从IME6400的HOST接口寄存器Encodedstream中读取数据流。GPIO0管脚直接与EP9315的中断管脚FGPIO相连,在处理器获取下降沿信号后便中断当前操作,从IME6400读取数据。在读取完毕后,EP9315要向IME6400的HOST总线寄存器USER4发送一个不同值,通知IME6400数据读取完成。随后IME6400可以在FIFO中装载新的压缩数据流以保证EP9315的继续读取【3】。
4 软件设计
Linux系统具有稳定、高效、易定制、易裁减、开放源码等优点,因此本系统选用嵌入式Linux作为操作系统,在芯片中植入Linux系统作为视频记录的应用环境。编写Linux环境下的硬件设备接口程序主要分两个部分:硬件设备驱动程序和应用程序,驱动程序需要在视频录像前加载到Linux内核中,然后运行记录程序,本系统采用的动态加载驱动的方式。在前面说过用网络挂载硬盘来记录视频可以便于测试视频录像质量和调试软硬件,具体的操作是:在PC服务器上用nfs协议共享一个硬盘空间作为记录硬盘,然后通过minicom串口通信定义EP9315启动时首先通过网络挂载记录硬盘,
fconfig
fis load zImage
exec -c "root=/dev/nfs nfsroot=主机地址:共享硬盘空间 ip=嵌入式系统地址console=ttyS0,57600 devfs=mount"
随后视频录像数据的处理就相当于在PC机上进行操作,可以克服嵌入式操作系统功能不全,可视化程度不高的缺点【4】。
4.1 驱动程序编写
编写linux驱动程序的最主要工作就是file_operations结构中各入口点的实现,即对应于open()、release()、read()、write()、ioctrl()等系统调用子函数的编写【5】。
·Open函数ime6400_open(struct inode *inode, struct file *filp),IME6400打开后用于模块加载后的计数,防止系统非法释放模块资源。
·Read函数ime6400_read(struct file *fp, char *buf, size_t size),在IME6400数据缓冲区读满后从内核空间传送到用户空间。
·Write函数ime6400_write(struct file * fp, const char * buf, size_t size, loff_t *ppos),将摄像头获取数据从用户空间传送到内核空间。
·Ioctrl函数ime6400_ioctl(struct inode *inode, struct file *filp, unsigned int command, unsigned long arg),用于从用户空间向内核空间传递定义参数。
此外,驱动程序中还包括:
·IME6400片选的声明
#define BASE_ADDR 0x28000000
将IME6400的片选信号映射到片选4(ncs4管脚)。
·IME6400中断的申请
set_external_irq(IRQ_EINT8,EXT_FALLING_EDGE,GPIO_PULLUP_DIS); request_irq(IRQ_EINT8, &ime6400_irq, SA_INTERRUPT,"ime6400", NULL)。
根据硬件手册,这里将中断定义为中断8,用于在IME6400存入内核缓冲区后通知EP9315读取数据流。
4.2 应用程序编写
本系统应用程序主要实现在加载设备驱动后将视频流从硬件接口层拷到存储设备,具体操作上运用了多线程设计方法,这种方法的优点在于可以共享进程资源,线程间的转换和调用时间短,效率高,声明的几个线程可以相互独立地完成各自任务,并进行实时通信,传递参数。这里主要创建了三个线程:读数据线程,写数据线程,串口监听线程。
pthread_create(&t1,NULL,(void *)read_thread,NULL);
pthread_create(&t2,NULL,(void *)write_thread,NULL);
pthread_create(&t1,NULL,(void *)listen_thread,NULL);
系统启动后,系统首先通过IIC初始化EP9315和IME6400,然后串口监听线程listen_thread()调用函数侦测是否有来自串口的控制指令输入,如果没有输入指定指令将无限期等待,如果得到输入指令则向读线程read_thread()发送信号量sem,通知读线程准备调用读取数据函数IME6400_read()。在IME6400中FIFO缓冲区内记录数据满后系统获得中断,中断程序将数据流拷入内核空间,若缓冲区满则读线程调用ime_read()拷贝数据到用户空间,并向IME6400寄存器USER4发送新的值通知IME6400可以存入新的记录数据流,从而进行下一步编码。ime_read()拷贝完成后返回,由读线程向写线程发送信号量sem1通知写线程write_thread()调用fwrite()函数将数据写到硬盘,完成后发送信号量sem2通知读线程,然后再由读线程进行下一轮类似前面的操作。与此同时,监听线程一直在侦测是否有串口输入的用户指令,如果有则调用中止函数或重新初始化函数来退出程序或重新启动系统。
5 结论
该录像系统已经基本完成了测试工作,可以选择8种分辨率和两种帧率,最高标准可以达到720×576分辨率,25fps。在选择640×480分辨率,25fps录制模式时,图像质量最好,图像显示稳定,对于快速运动的物体可以无码字丢失;在选择720×576,全帧率模式时,硬盘可以连续录制4~5个小时。目前系统需要解决的问题是改进录制高质量图像的码流的稳定性问题,可以考虑在EP9315和硬盘之间加驱动芯片以提高处理器挂载能力。
参考文献:
【1】 EP9315 User`s Guide. CIRRUS LOGIC, Inc. 2004
【2】 EP9315 User`s Guide. CIRRUS LOGIC, Inc. 2004
【3】 IME6400 firmware manual. Intime Corporation. 2003
【4】 FS-EP9315 USER GUIDE ISSUE 1.8. Shenzhen uCdragon Technology Co. Ltd. 2005.6
【5】 钱晨 徐荣华 王钦若,基于linux操作系统的设备驱动程序开发,微计算机信息,2004.09, 131-133