新闻中心

EEPW首页>嵌入式系统>设计应用> 基于GIO/FVID的DSP视频处理驱动程序

基于GIO/FVID的DSP视频处理驱动程序

——
作者:华中科技大学 臧博,吴裕斌,曹丹华 时间:2007-01-26 来源:《单片机与嵌入式系统应用》 收藏


引言

随着时代的发展,dsp技术在远程监控、可视电话、工业检测等视频处理领域得到了广泛的应用,对于不同的视频处理系统,会使用不同的视频设备,所以有必要为视频设备设计驱动程序,为高层应用程序提供统一的接口来操作底层硬件。只要是遵行此驱动程序接口标准开发的高层应用程序,都可以在具有相同接口的不同硬件平台上运行,具有很好的通用性和可移植性,同时高层应用程序设计人员只要会使用设备驱动程序提供的api接口,就不必了解底层硬件的具体实现,可以大大地提高整体视频系统的开发效率。

对于视频设备,ti公司提出了对应的视频设备驱动程序模型,但这些模型主要是针对6000系列高端dsp,甚至是dm64x这样的视频处理专用dsp设计的,而tms320f2812(简称f2812)dsp这样的低端处理器,内部存储空间较小,且没有dm64x那样专用的视频接口,本文针对这类问题,提出了对ti视频驱动模型进行简化和改造的方法,使视频设备驱动程序占用尽量少的系统资源,来完成对视频硬件设备的操作,这种视频驱动模型的裁减方法,对于使用低端处理器的视频处理系统具有可借鉴性。

1 基于dsp/bios的外设驱动开发模型

ti公司为开发dsp的外设驱动程序,推出了dsp/bios device drive kit[1],定义了标准的设备驱动模型,并提供了一系列的api接口,如图1所示,外设驱动程序分为两层:

本文引用地址://m.amcfsurvey.com/article/21546.htm

①类驱动(class driver),类驱动程序用来为应用程序提供接口,这部分程序与设备无关,主要功能包括维护设备数据缓冲区,向上提供api接口供应用层程序调用,并协调应用程序对外设操作的同步和阻塞,向下提供适配层与迷你驱动层相连,实现api接口函数到迷你驱动程序的映射,类驱动程序与硬件无关,只要外设驱动模型选定了,类驱动程序就定下来了,不需要作多少修改。

②迷你驱动(mini driver),迷你驱动程序与设备相关,所以设计迷你驱动程序是外设驱动开发中的重点,迷你驱动程序与类驱动层的接口格式是统一的,但迷你驱动程序对底层硬件的操作是根据硬件平台的不同而变化的,迷你驱动接收类驱动层发出的iom_packet命令包,决定对底层硬件进行什么样的操作。

外设驱动程序模型又可以分为以下3类[2]:

1)pip/pio模型。基于数据管道的i/o模型,每个管道都在维护自己的一个缓冲区。当数据写入缓冲区,或从缓冲区取出数据时,便会激发notifyreader和notifywriter函数实现数据的同步。

2)sio/dio模型,基于数据的i/o模型,一个数据流是单向的,要么是输入,要么是输出,而且sio/dio模型使用异步方式来操作i/o,对于数据的读写、处理可以同时进行[3]。

3)gio模型,通用的i/o模型,灵活性很强,且没有适配层、直接操作迷你驱动程序,主要用来设计新型的设备驱动模型。

2 视频处理系统硬件平台

硬件平台如图2所示,系统以ti公司的f2812 dsp作为中心处理器,以模拟摄像机进行视频信号采集,再使用saa7111视频解码芯片将其转换为bt601格式的数字视频信号,dsp将数字视频信号处理后,再写入输出帧缓存al422中,并控制视频编码芯片adv7177,将其转换为模拟电视信号输出。整个系统以1片cpld——ispmach lc4128来协调各个芯片之间的时序关系。

3 视频设备驱动程序开发

3.1 设备驱动程序模型的选择

如上文介绍,常用的驱动程序模型包括3类:pio、sio和gio。比较这3种模型可以知道:pio支持更底层的通信,适合设计比较简单的外设驱动程序,例如在ti公司的6x11dsk板上实现的音频采集和回放,一般都是基于pio模型的[4],而sio模型具有很好的缓冲器分配回收机制,比较适合描述视频设备,但是sio的很多功能在本系统中使用不到,而且gio模型设计的目的解决针对特殊硬件的新型设备,所以最终考虑使用gio的设备驱动模型。

ti公司最初设计的gio模型[3]其实是有缺陷的,主要在数据缓冲区管理的问题上,应用程序在取得缓冲区进行数据处理之后,却无法将缓冲区返回设备驱动程序,于是ti公司在推出dm642这一款主要用于视频处理的dsp芯片的同时,对gio模型进行了改进,提出了专门针对视频设备的fvid模型[5],fvid模型是建立在gio模型之上的,以fvid_alloc、fvid_exchange、fvid_free函数对gio模型中的gio_submit函数进行封装,解决了gio模型中驱动程序不能回收缓冲区的问题。

此外,fvid模型还专门设计了fvid_frame结构,此结构中包含了常用的视频信号的信息,如行数、列数、yuv结构、场频等,很适合描述视频数据帧,但fvid主要是针对dm64x系统设计的,dm64x的很多功能在f2812 dsp上都不具备。所以本设计针对f2812 dsp射频处理系统,对fvid模型进行了一定的简化,保留类驱动程序,而重写了迷你驱动层程序。

3.2 视频处理程序运行流程

在设计完成的视频驱动程序基础上,开发一个典型的视频处理应用程序,其运行流程如图3所示,首先使用fvid_create函数建立gio_capture和gio_play两个视频通道,再以gio_capture通道的fvid_control函数发出cmd_start,采集到1帧视频数据,应用程序以gio_capture通道的fvid_alloc函数向驱动程序申请采集到的数据帧,进行处理后再以fvid_exchange函数将修改后的数据帧返回驱动程序,最后再调用gio_play通道的fvid_control函数发出cmd_display命令将数据帧输出,由图3可以看到,应用程序调用的这些fvid_xxx接口函数会自动由类驱动程序层层向下映射,到达迷你驱动层程序,而迷你层程序可以直接操纵底层硬件设备,来完成整个视频的采集、处理和显示的过程。

3.3 迷你驱动程序的设计

迷你层驱动程序是整个设计的重点所在,下面详细介绍其实现方法,迷你层驱动程序主要由表1所列的几个函数组成。

对各个函数的具体实现如下:

1)mdbindev函数。在应用程序建立设备接口(如fvid_create函数)时被调用,完成对外部设备的初始化,而与其对应的是mdubinddev函数,使用mdubinddev函数会使设备处于无效状态,不能再使用。

2)mdcreatechan函数,使用此函数为应用程序和驱动程序建立通信通道,同时为每个通道申请缓冲区,在ti公司发布的fvid模型中,为每个通道都分配了3个缓冲区,轮流与外部设备交换数据,每个缓冲区对应1帧视频数据,这样的设计在dm642这样可以外扩大容量sdram的系统中是完全可行的,但是对于本系统,f2812 dsp外部只扩展了512k×16位的sram,既要做视频输入的帧缓存,又要存放一部分程序,这样存储空间就不够了,所以本设计中进行了简化,对视频输入设备采用两缓冲区轮转的机制,如图4(a)所示,而对于视频输出设备,以al422 fifo作为硬件帧缓存,而不在sram中再为其分配缓冲区,与mdcreatechan对应的是mddeletechan函数,用于删除设备通道,释放缓冲区资源。

3)mdsubmitchan函数。负责管理缓冲区,分别接受应用程序发出的fvid_alloc、fvid_exchange、fvid_free三个命令并进行处理,其中fvid_alloc命令对应图4中(a)到(b)的过程,应用程序从两个缓冲区中取出最新的一帧视频数据,对其中的数据做处理,而只剩下一个缓冲区用来接收外部设备输入的数据,fvid_exchange对应图4中(b)到(c)的过程,应用程序处理完1帧数据,将这1帧数据返回驱动程序,准备用来显示,同时再读入新的1帧数据进行处理,fvid_free对应图4中(c)到(a)的过程,应用程序将处理完的数据帧返回驱动程序,而不再向驱动程序申请新的数据帧。以上3个命令是针对视频输入接口gio_capture而言的,而对于输出设备接口gio_play,在sram中没有分配缓冲区,所以其mdsubmitchan函数内部设为空函数。

4)mdcontrolchan函数,用来操作外部视频设备,完成对视频数据的采集和输出,对于gio_capture和gio_play这两个设备接口的mdcontrolchan函数接受的命令是不同的;

视频输入gio_capture接口的mdcontrolchan函数只接受cmd_start命令,完成1帧视频数据的采集,而视频输出gio_play接口的mdcontrolchan函数只接受cmd_display命令,完成视频信号的输出。

3.4 视频驱动模型裁剪的一般方法

ti公司设计的gio/fvid视频设备驱动原型相对复杂,且占用较多的系统资源,要使其可以应用于更通用的低端处理器系统,就必须进行改造和裁减,在改造中要注意以下几个方面:

1)阻塞的i/o操作,ti公司的6000系列的dsp具有edma功能,传输数据不需要cpu的干预,而dm64x还具有专用的射频接口,传输数据不会占用外部扩展总线,所以视频数据的处理和输入输出是可以并行的,而低端处理器是不具备这样功能的,视频设备一般都是通过外部扩展总线连接的,所以对视频设备的操作必须设计为阻塞型的i/o操作,视频数据输入/输出的过程是由cpu来完成的,且要保证对视频设备的操作不会被其他操作中断。

2)对视频数据缓冲区的管理,gio/fvid视频设备驱动原型中使用的3缓冲区模型,虽然功能很完善,却占用了太多的存储空间,所以对于实际的视频处理系统就要进行调整,该为两缓冲区甚至是单缓冲区模型,对象具有独立硬件缓存的输出设备,可以考虑不再为其分配动态缓冲区。

3)对视频设备的操作,mdcontrolchan函数主要用来操作外部视频设备,只要保留对实际系统有用的操作就足够了,而gio/fvid视频设备驱动原型中定义的很多操作都可以省略。

4 小结

本文介绍了基于dsp/bios的外设驱动程序模型,并针对基于f2812 dsp的视频处理系统这一具体的硬件平台,重点介绍了开发gio/fvid设备驱动的流程和针对低端处理器系统的视频驱动模型裁减方法,本视频驱动程序为开发各种视频处理应用程序(如jpeg图像)压缩、mpeg视频压缩、视频监控程序等)提供了有力的支持,本文介绍的设备驱动程序的开发方法,对于同类视频处理系统,特别是对于使用ti2000系列dsp这样系统资源比较有限的视频处理系统,具有很好的可借鉴性。



关键词:

评论


相关推荐

技术专区

关闭