>
首页 » 业界动态 » 音视频编解码器AT2042的linux设备驱动程序设计

音视频编解码器AT2042的linux设备驱动程序设计

作者:张菁,周德新,郝福珍  时间:2006-10-08 00:33  来源:
摘 要:论文在分析各种多媒体压缩标准的基础上,详细介绍了Pentamicro 公司的2 通道A/V 编解码器AT2042 的功能结构和主要特点,提出了一种基于AT2042 芯片的网络视频服务器的硬件设计方案,给出了Linux 系统下AT2042 设备驱动程序的详细设计。

关键词:视频压缩;MPEG-4;网络视频服务器;设备驱动程序

引言

在数字多媒体压缩领域,ITU ,ISO 等组织制定了许多成功的编码标准,如以JPEG 和JPEG2000 为代表的静止图像压缩标准,以MPEG-1 和MPEG-2 为代表的中高码率多媒体数据编码标准,以H.261,H.263,H.263+,H.263++ 等为代表的低码率、甚低码率运动图像压缩标准,以及覆盖范围更宽面向对象应用的MPEG-4 。这些标准之间在码率、图像质量、实现复杂度、差错控制能力及可编辑性上有着很大差别,满足了各种数字图像应用的不同需要。

与传统的基于像素的视频压缩标准不同,MPEG-4 采用基于对象的视频编码方法,它不仅可以实现对视频图像数据的高效压缩,还可以提供基于内容的交互功能。此外,为了使压缩后的码流具有对于信道传输的鲁棒性,MPEG-4 还提供了用于误码检测和恢复的一系列工具,这样采用MPEG-4 标准压缩的视频数据可应用于带宽受限、易发生误码的网络环境中。

韩国Pentamicro 公司的2 通道MPEG-4 A/V编解码器AT2042,以其多种音视频压缩标准、专用运动侦测算法、代码转换和速率转换功能、实时数字水印等技术优势,广泛应用于各种高可靠性和高性价比的嵌入式网络视频监控系统中。

AT2042的功能结构及主要特点

AT2042 是一个内置微控制器ARM946E 的2通道A/V CODEC 芯片,主要完成对视频和语音数据的编码和解码,支持多种音视频编解码标准,可直接与IBM、Motorola、ARM、Xscale 和Axis 等多种CPU 接口,无需其它附加电路。AT2042 的内部结构如图1 所示。

图1 AT2042 的内部结构

AT2042 内部主要有以下四个部分:
(1)接口部分,主要包括音视频数据I/O 接口、控制接口和内存接口;
(2)视频编解码部分,包括MotionEstimation/Prediction、DCT/QIQ/IDCT 和VLC/VLD;
(3)音频编解码部分Audio Codec;
(4)内置微控制器ARM946E。

AT2042 有以下主要特点:
(1)支持MPEG-1、MPEG-2、MPEG-4、H.263 和Motion-JPEG 等多种视频压缩标准,以及ADPCM、MPEG-1 Layer- Ⅱ和Layer- Ⅲ等音频压缩标准;
(2)支持多种图像分辨率和帧速率,支持CBR 和VBR 两种码率控制方式;
(3)运动侦测功能,侦测区域和灵敏度可选;音视频编解码器AT2042 的linux 设备驱动程序设计
(4)视频采用ITU-R 656 / ITU-R 601 接口标准,音频采用PCM,I2S 商用接口标准;
(5 )内置ARM946E 核,在系统上电/复位时,AT2042 的固件程序可由外部主机载入AT2042 外挂的SDRAM;
(6)外部主CPU 通过AT2042 的两个寄存器和四个FIFO 与AT2042 通信,编解码数据的输入输出可用中断方式。

基于AT2042的网络视频服务器的硬件设计

网络视频服务器是一种内置Web 服务器的嵌入式数字远程监控系统,集视频采集、实时压缩和网络传输功能为一体,广泛应用于分布式的安全监控、视频会议和可视电话等领域。网络视频服务器有自己的IP 地址和网络接口,可直接接入网络,用户用普通的Web 浏览器作为客户端可以实时观看视频服务器发送的图像。图2是基于AT2042 的网络视频服务器的硬件原理图。

图2 基于AT2042 的网络视频服务器的硬件原理图

图中,视频编解码电路是模拟视频信号和AT2042 之间的接口电路,负责视频数据的模/数和数/模转换以及数字视频信号格式转换,输入的模拟视频信号先经过视频编解码电路进行前端处理,产生符合AT2042 视频接口标准的8 比特ITU-R BT.656 数字视频信号。输入的模拟音频信号经过模拟音频ADC 电路产生符合AT2042音频接口标准的I2S 数字音频信号。之后,在外部主CPU 的控制下,该数字音视频数据经过压缩/ 解压芯片AT2042 进行硬件压缩编码,产生的压缩编码数据流通过芯片内部集成的MuxFIFO 接口输出。

网络视频服务器的解压缩编码是压缩编码的逆过程,需要解压的数据流经过AT2042 内部集成的Demux FIFO 接口输入,解压缩编码的基本原理类似于压缩编码,不再赘述。

Linux系统下AT2042设备驱动程序设计

系统调用是操作系统内核和应用程序之间的接口,设备驱动程序则是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序主要完成以下的功能:

(1)对设备初始化和释放;
(2)把数据从内核传送到设备和从设备读取数据;
(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据;
(4)检测和处理设备出现的错误。

基于AT2042 的网络视频服务器系统的主控操作系统为Linux 实时操作系统,将AT2042 定义为Linux 系统中一个标准字符设备,对AT2042的驱动是编写Linux 系统下的芯片级设备驱动程序。设备驱动程序可以包含在Linux 内核中,但为了升级和修改方便,我们将其作为一个独立的模块,待系统启动后再动态加载到内核中。

AT2042 设备驱动程序工作于内核模式,完成对AT2042 的初始化、编解码数据的读写以及编解码功能参数的设置。它提供了AT2042 和上层应用程序之间的接口,向下通过芯片接口实现对AT2042 芯片的直接控制,向上则为应用程序提供驱动程序接口。AT2042 设备驱动程序包含的功能函数主要有模块入口函数、设备操作函数集合和中断服务程序。

模块入口函数
模块入口函数即模块加载/ 卸载的入口点,它向内核注册和取消注册AT2042 设备的驱动程序,提供两个函数:模块加载函数init_module()和模块卸载函数cleanup_module()。加载函数init_module()向内核注册了AT2042设备驱动程序模块所能提供的所有功能,它调用内核函数register_chrdev()获得AT2042 设备的驱动号,将设备登记到相应的设备数组,并返回设备的主驱动号;卸载函数cleanup_module()仅当模块被卸载时才调用, 它通过调用内核函数unregister_chrdev(),取消了在init_module()中所完成的注册。

设备操作函数集合
用户进程通过设备文件同硬件打交道,对设备文件的操作就是系统调用,把系统调用和设备驱动程序关联起来的是一个非常关键的数据结构file_operations,定义如下:
struct file_operations {
int (*seek)(struct inode * ,struct file *,off_t ,int);
int (*read)(struct inode * ,struct file *,char ,int);
int (*write)(struct inode * ,struct file *,off_t ,int);
int (*readdir)(struct inode * ,struct file*, struct dirent * ,int);
int (*select)(struct inode * ,struct file *,int ,select_table *);
int (*ioctl)(struct inode * ,struct file *,unsined int ,unsigned long);
int (*mmap)(struct inode * ,struct file *,struct vm_area_struct *);
int (*open) (struct inode * ,struct file *);
int (*release) (struct inode * ,struct file*);
int (*fsync) (struct inode * ,struct file *);
int (*fasync) (struct inode * ,struct file *,int);
int (*check_media_change) (struct inode *,struct file *);
int (*revalidate) (dev_t dev);
};

这个结构的每个成员都对应着一个系统调用,用户进程利用系统调用在对设备文件进行操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着就把控制权交给该函数。

在AT2042 设备驱动程序中,设备操作函数集合被定义为file_operations 型结构体变量
at2042_fops,定义如下:
static struct file_operations at2042_fops = {
read: muxfifo_read,
write: demuxfifo_write,
ioctl:at2042_ioctl,
open: at2042_open,
release: at2042_release,
};
内核通过设备操作函数集合来访问设备驱动程序所提供的功能函数,这些功能函数包含了应用程序能够对AT2042 设备调用的所有操作,这些操作通常称为“方法”,包括:

(1)open 方法:由函数at2042_open 实现,主要完成初始化工作,为驱动程序以后的操作做准备。此外,open 还会增加设备计数,防止文件在关闭前模块被卸载出内核。open 主要完成如下工作:
①检查设备相关错误,如设备未就绪或相似的硬件问题;
②如果是首次打开,初始化设备;
③识别次设备号,如有必要更新f_op 指针;
④分配和填写要放在filp->private_data里的数据结构;
⑤增加使用计数。
(2)release方法:由函数at2042_release实现,作用与open 正好相反,它应该:
①使用计数减1;
②释放在filp->private_data中open分配的内存;
③在最后一次关闭操作时关闭设备。
(3)read 方法:由函数muxfifo_read 实现,将数据从用户空间写到内核空间。
(4)write 方法:由函数demuxfifo_write实现,将数据从内核空间读到用户空间。
(5)ioctl方法:由函数at2042_ioctl实现,提供了一种对设备进行I/O 控制的方法。

中断服务程序
由函数at2042_interrupt_handle实现,用于响应编解码数据输入输出的中断,完成音视频数据的读写。

结论

Linux 操作系统以其开放源码、容易定制和扩展、多硬件平台支持和内置网络功能等优点,逐渐成为嵌入式系统的研究热点和广泛使用的系统平台。论文介绍的音视频编解码器AT2042 在Linux系统下的设备驱动程序,采用模块化的设计方案和动态加载方式,有效控制了内核的大小,经过系统测试,能够在网络视频服务器系统上稳定运行,为AT2042 芯片在嵌入式远程视频监控系统中的广泛应用提供了基础。

相关推荐

R&S公司推出一款用于PC的离线分析软件R&S VEGA

R&S  离线分析软件  MPEG-2  2011-05-27

分布式存储的两种应用方案

DVR  网络视频服务器  iSCSI  2011-03-25

视频压缩系统中大容量存储器的应用设计

存储器  视频压缩  2010-11-26

Maxim推出4通道模/数转换前端

Maxim  视频压缩  MAX9530  2010-11-16

广电安防监控系统中视频编解码卡的设计与实现

视频编解码卡  MPEG-4  2010-07-20

MPEG-7标准及其应用简介

在线研讨会
焦点