控制/MCU
近几年,随着计算机技术和电了技术的飞跃式发展,通过不断的系统功能集成和优化,网络覆盖面积和传输稳定性日益增加,将传统模拟视频监控系统中的模拟信号部分已舍弃,完成了全数字化的视频监控系统,并加入了AD转换功能,使整个视频数据能在网络上进行传输,满足了各类行业部门及家庭对网络可视化业务的需求。这种全数字化的视频监控系统存系统设备规模和系统功能性上,较之前的模数混合型系统,有了巨大的变化和升级。一般网络视频监控系统只需要摄像机、路由器和计算机就能搭建,拓扑结构简单。利用计算机的强大的处理能力,改善了监控系统的控制效率、提高了监控系统的智能化和采集图像的质量。基于网络技术搭建的系统结构,结构清晰、布线简单、系统扩展性强,并且一台主控计算机再也不会像DVR一佯对于搭载的摄像机设备有数量限制,同时这种拓扑结构也降低了大型监控系统的管理难度和维护维修成本。对于系统应用层而的开发能在计算机这种统一的设计平台上进行,大大简化了对于特殊监控系统的开发难度。
本设计决定选用行业内较为成熟的TI公司DaVinci设计框架。该设计方案集成了ARM和DSP两个部分,这种设计结构将系统中的图像处理模块和摄像机控制模块结合起来。
文中将描述基于TMS320DM365网络摄像机的底层程序,包括了系统的内核、驱动、启动程序等,摄像机系统基于DaVinci框架。整个硬件基础可以参考之前发表的文章《基于TMS320DM365的网络视频监控系统》。
1.1 DaVinci框架简介
DaVinci(达芬奇)框架是一套由TI公司提出的集成了DSP处理器、软件、工具的综合型解决方案系列,非常适合用于开发各类数字视频终端设备,包括了数字音频、视频、成像、视觉应用等。该技术的目的是让开发厂商能够更轻松、更快速地开发各种低成本的创新型数字视频产品。Davinci技术系列组件,其中不仅包括了相应的处理器、软件、工具,还提供一系列的解决方案和技术支持等。由于基于DaVinci框架下设计出的产品之间兼容性和共通性很高,所以很多大型的公司也乐于使用TI的DaVinci解决方案,以增加自身产品在周边行业内的兼容性。并且DaVinci框架拥有一套全方位的软件支持,提供了下至一般的操作系统驱动,上至应用程序接口API,甚至DSP的编码程序也是作为一个固有程序包,集成在BIOS和Code Server中。
1.2 DaVinci硬件基础
作为底层驱动软件的基础,这里需要详细对DaVinci框架的硬件结构进行描述。DaVinci数字视频处理芯片是整个DaVinci技术框架的的核心,其最大特点为整个处理芯片集成了ARM和DSP两种核心,实现了两种核心的并行工作和通信机制。TMS320DM365作为DaVinci技术框架下的一款新型芯片,也和之前系列芯片拥有相同的系统,一个通用的DaVinci系统结构如图1所示。
DSP即数字信号处理器,其主要特点就是能够进行大量的乘加运算,拥有高速计算能力,并且DSP的数据和程序分离存储,这样充分利用了所有线宽,进一步加速了DSP的处理速度,在数字摄像机中DSP专门用于计算量庞大的图像处理算法。DSP其功能包括了VPSS(Video Process ing Subsystem)和VICP(Video Image Collaborative Processer)两个部分。视频处理系统VPSS是DM365的视频信号采集模块,与其他摄像机控制芯片相比,最显着的特点是DM365带有一个ISIF模块,可以直接获取CCD和CMOS的输出图像。相较于一般图像处理芯片需要先一步进行A /D处理,DM365能更加快速地获取图像信号。视频/影像协处理器(VICP)作为DM365芯片中DSP部分的主体,主要功能是视频图像的压缩算法,一般使用的H.264压缩方式,其中还包括了运动补偿、对象识别等算法,这些图像处理算法占整个系统运算量的600%~80%。
ARM处理器尽管没有DSP那么快速的图像处理速度,但是ARM较大的程序存储量和迅速的任务切换能力,使得它适合复杂的、多线程的任务调控,支持实时的操作系统。ARM子系统管理和协调芯片内其他功能模块的工作,采用流水线的工作方式执行系统控制任务,例如系统的初始化、参数配置、电源管理和用户功能等。
两者之间的通讯方式如图2所示,芯片中ARM可以访问DSP的片内存储器,包括L2RAM和L1 P/D,DSP也可以访问ARM的片内存储器,并且ARM和DSP共享DDR2和AEMIF,其中AEMIF是指异步的外接存储器接口(Asynchronous External MemoryInterface)。因此通常情况下ARM只需要将处理数据的地址指针传递给DSP,而不需要大量的数据传输。系统中的DSP和ARM通过2个内核相互中断实现通信,ARM使用DSP的4个通用中断和1个不可屏蔽中断来控制DSP;而DSP通过两个中断来中断ARM。DSP的电源、时钟、复位都是由ARM进行控制。
由于DaVinci系统双处理核心的硬件结构,整个DaVinci的软件框架也类似于硬件框架分为ARM核心的软件和DSP部分的软件。整个软件框架图如图3所示,ARM内核中的软件主要为操作系统、驱动和应用层面的软件,DSP内核里运行音视频编解码算法处理,ARM通过TI的Codec Eng ine机制调用DSP完成编解码。
在DSP部分,软件由最底层的DSP/BIOSTM内核,内核上层是Codec engine,用于和ARM端的Linux通信,最顶层是图像处理箅法。针对图像处理算法,DaVinci框架提供了数字信号处理算法接口标准(XDAIS)和针对流媒体的XDM。所有符合XDAIS和XDM标准的图像处理算法包都可以被用于DaVinci的DSP中。并且在XDAIS和XDM中也包括了一套流程完整的基础的图像处理算法,用户可以按照其标准进行修改,或者自行重新开发。再加上由第三方开发的符合XDM标准的软件包,地丰富了整个DSP图像处理软件部分的资源。
ARM部分的软件系统使用基于Linux的嵌入式软件系统,软件结构如图4所示。整个系统基于Linux的实时操作系统,在Linux上需要加入文件系统、图形用户接口和任务管理,最顶层是应用层面的软件,在应用软件中DaVinci系统只提供常用的API。
Linux实时操作系统中,应用程序、引导加载程序(Boot Loader)、驱动程序(Driver)和操作系统(Operating System)的内核镜像都是相互独立的,可以单独编译修改。只要符合各个部分特有的接口和程序存放位置,就能被整个系统识别并且调用。引导程序是UBL和u-boot,用于初始化硬件系统,引导Linux操作系统的加载,完成内核文件加载后,将控制权交给操作系统。操作系统的内核镜像uImage,是一个基础的操作系统平台,调用驱动程序和应用程序,实现多线程机制,完成了系统调用等工作。驱动程序和应用程序是事先存储在操作系统特定文件夹内的,被操作系统Linux按顺序调用,开发者可以根据自己的需要自行修改。Linux内的文件系统主要提供内核中所有文件的存储、检索和更新等功能,同样包括了驱动程序和应用程序的文件操作。一般不提供保护和加密等安全机制。文件系统通过调用和命令方式提供文件的各种操作,主要包括设置、修改对文件和目录的用户权限;提供针对目录的创建、修改和删除等功能;提供针对文件的创建、打开、读写、关闭和撤销等功能。
对于应用层面的开发而言,并不需要考虑DSP部分的图像处理实现算法,直接将DSP部分作为一个黑箱进行处理,通过图像服务接口,从ARM部分通过语句进行调用。图像服务的接口提供了用户调用DSP中的图像处理程序的接口,整个服务接口使用Codec中间框架系统。Linux端的程序通过Codec引擎访问DSP处理器中的Codec Server。整个Codec框架包括了多种API和SPI,从软件角度可以看做是一个介于应用程序和DSP中图像处理算法之间的接口,如图5所示。这样ARM端的应用程序开发者,可以不用去考虑DSP中复杂的音视频算法。
这种ARM和DSP分开的软件结构,使得整个Davinci框架下的系统的软件开发被分成了四个部分:图像算法开发、Codec Server集成开发、CodecEngine集成开发和应用程序开发。基础的图像算法可以通过TI提供的CCS开发工具,图像的编码算法被存储为.lib的库文件。而Codec Server的开发是调用一系列的.lib算法库,实现各种库文件的对ARM部分的接口。Ciodec Engine是开发调用Codec Server的Stuh和Skelet on,完善整个图像处理功能的调用,而面向厂商或是使用者的应用程序的开发,只需要针对不同应用情况编译基于Linux的应用程序,其中图像处理算法等内容,作为黑箱供这些使用者调用。
3.1 Linux系统内核
Linux系统内核使用的linux-2.6.32,相较于之前的版本增添了虚拟化内存、改进了文件系统、支持低传输延迟时间模式、内存控制器支持SOFtlimits、支持S+Core架构、支持Intel Moorestown及其新的固件接口、支持运行时电源管理、以及新的驱动。常用的LINUX操作系RADHAT Enterprise 6,ubuntu-10.04.debian 6.稳定版本,这些都是使用linux-2.6.32内核。Linux-2.632作为ARM部分所使用的基层操作系统,在TI上也有提供,不过所提供的是一个非常宽泛的、适用于多种DaVinci框架内核产品的一个完整内核,无论是功能还是驱动都非常完善,但是缺点是启动时间长、容量大,所以我们必须存原有的TI系统内核的基础上进行一定的修改。整个修改基于Linux操作系统运行。
第一步是系统内核的精简开始。整个精简过程主要是在内核文件中删除自己不需要使用东西,如平台信息、芯片信息和驱动等,并且在Kconfig和Makefile里面将删除信息屏蔽。首先完成在内核系统中平台信息和芯片信息的文件删减,然后通过Makefile文件重新修改编译方法,经过重新编译以后,内核的精简已经完成,在Linux环境中使用tar jcf或tar zcf压缩的Linux内核,整个内核的大小下降到了51M,相当于原来尺寸的二分之一。当然可以化简的还可以包括了include和driver里面的一些不需要使用的驱动,但是由于大小并不是很大,所以这里也就没有去除。
第二步开始内核系统的配置。因为之前已经修改了内核系统文件的内容,选项即使都已经按照默认的方式配置完毕,但是存细部还需要一定的修改,使用make linux_config进入内核配置界面。首先需要修改的是“General setup”内的晶振,将原本27000000所表示27MHz时钟参数,改为硬件使用的24MHz时钟。然后在“Device Drivers”中配置NAND flash的大小、分块信息;USB的驱动设置一般设定为主机用于,识别U盘等其他USB设备;在选择视频传输的方式的时候,需要选择以太网络的“10M or 100M Ethernet MAC support”传输方式:并且开启I2C和串口功能等。
第三步检测核对程序内核,确保底层功能程序与硬件设备的匹配。最重要的machdavinci\dm365.c,内部都是管脚定义包括了I/O口的
复用。sound\soc\codecs有tlv320aicxx.c等音频芯片驱动:soc\davinci里有PCM、I2S等驱动。完成所有检测核对之后,用make指令编辑linux内核,生产一个bin文件,烧录到DM365处理器中,即可运行系统内核。
3.2 启动程序
Bootloader是嵌入式系统启动之后加载的第一段程序,也就是俗称的启动程序,这段代码一般用于初始化处理芯片,映射内存空间,完成系统基本硬件设置,为之后的操作系统内核提供运行环境及。所以这段程序的长度和运行时间都非常短,但对于整个系统来说是非常重要的。文中使用u-boot作为Bootloader程序,作为一种通用程序,它支持多种体系结构的处理器。其功能涵盖了flash烧写、操作系统内核启动等功能。整个u-boot的软件流程如图6所示。
整个u-boot的启动过程可以分为三个阶段。首先在flash中启动代码,设置异常的入口地址和异常处理函数、配置系统主频、I/O寄存器初始化、初始化存储空间,然后将之后的程序加载到RAM中,起始地址设定,并在RAM中运行,设置硬件系统结构类型、启动参数地址、打开芯片外围设备的使能端、设置内核参数、复制镜像文件和设置入口函数。最后运行嵌入式系统内核镜像。
将u-boot系列文件导入摄像机后开启电源,通过RS232串口,可以读取系统的启动信息。整个启动过程可以分为三个不同阶段。第一阶段首先u-boot驱动先确定启动的ubl版本和启动方式,检测Flash和总线状态,一般传统的启动方式为NANDFlash启动。第二阶段确认RAM等基本传输硬件状态,检测时钟信号,接下来开始将Flash中的u-boot启动程序转入RAM中。最后一阶段检测所有的硬件信息,并将这些信息传给Linux内核,然后运行Linux内核,当硬件信息有错误时,会跳出错误报告。所检测的硬件信息主要有:CPU内核和状态、PLL状态、RAM存储器、TCP网络协议、I/O口等。这一步骤结束后,系统地控制权将完全转交给Linux。启动一系列内核文件后,会出现Linux的用户登录界面。
完成所有硬件检测和驱动安装以后,高清网络摄像机的所有硬件都开始工作,并且拥有最基本的功能,能够传输模拟视频信号,并且可以登录网络,自动获得IP地址。但是通过游览器进行图像的获取,需要进一步烧录应用程序。同时,还可以通过串口实时地设置摄像机内Linux内核的设置。
3.3 驱动程序移植
驱动程序是硬件运行功能实现的基础。由于所设计的DM365网络摄像机配有USB等多功能通用硬件接口,所以即使是成品之后,处于扩展的原因,新硬件的添加也会非常频繁,这里就必须让设备驱动也更新。这里我们想使用一个最简便的GPIO驱动程序来作为一个驱动程序移植的范例。
驱动移植的一个整体流程,是将针对某一硬件功能的驱动软件加入Linux嵌入式调用的特殊语句,并且存放在内核操作系统特定的存放位置,修改内核配置文件,使这个驱动能被调用。完成这些修改之后,就能在应用程序层面使用这个硬件设备了。
首先是对CPIO驱动源码的修改和放置,GPIO是嵌入式系统最简单、最常用的资源了,比如点亮LED,控制蜂呜器,输出高低电平,检测按键,等等。GPIO分输入和输出,在linux-2.6.32内核中,本来就有有关GPIO的最底层的寄存器驱动,所以不用另外新建驱动程序,其位置是在\arch\arm\mach-dayrinci目录下的gpio.c,这个是寄存器级的驱动,与一般单片机MCU一样,GPIO的设置都是通过特殊寄存器的数值决定的。据DM365的芯片DATASHEET,DM365的CPIO分为3组BANK,BANK01组包括GPIO0~GPIO31,BANK23组包括GPIO32~GPIO63,BANK45组包括GPIO64~GPIO70,由于硬件资源的原因,DM365并不是GPIO管脚就是纯粹的GPIO脚,GPIO管脚和其他一些标准接口复用相同的引脚,比如SPI和GPIO复用,I2C和CPIO复用等,到底是使用CPIO还是其他接口,在初始化的时候,都需要对PINMUX0和PINMUX1两个寄存器进行设置,而这两个寄存器的设置则在\arch\arm\mach-davrinci目录下mux_cfg.c和对应的mux.h里,当然如果只是用一些只作为I/O功能的管脚,则不需要对着两个寄存器进行设置相较于单片机对于I/O口的设置,DM365的GPIO驱动多了一些嵌入式系统特有的功能语句。比如:需要定义一个设备名称用于程序内部的调用,#define DEVICE_NAME“dm365_gpios” /*定义设备驱动的名字,或设备节点名称*/并且定义驱动文件的API,在Linux系统当中,所有设备都可以当做文件进行操作。
static const struct file_operations
davinci_dm365_gpio_fileops={
.owner=THIS_MODULE,
.open=davinci_dm365_gpio_open,
.ioctl=davinci_dm365_gpio_ioctl,
};
定义内核初始化的函数功能,这一部分是ARM最基础的IO口这几方法,这里就不进行详细介绍。
完整这些内容后,这个GPIO的驱动程序就可以被Linux系统内核调用了。之后修改内核文件的设置,修改Kconfig文件,加入一段GPIO设置,说明GPIO驱动功能等。存makefile文件的128行,加入语句:ohi-$(DAVINCI_DM365_GPIOS)+=dm365_gpios.o,输出之前驱动软件的.o ut文件,这样整个内核配置完成。之后这个I/O口的驱动程序就可以在应用程序中利用语句:fd=open(“/dev/dm365_gpios”,0);来运行。
这里使用了一个较为简单常见的GPIO驱动来举例,是为了更简单地描述整个Linux嵌入式系统驱动软件的移植过程。对于其他更为专业的硬件驱动,如usb设备、无线网络设备等,一般建议从设备购买商那边获取面向Linux的驱动软件,然后经过部分修改后移植进入Linux内核中,最后修改设置文件和makefile文件完成驱动的调用功能。
网络摄像机,简化了传统的以DVR和NVR作为系统的核心的网络监控系统。每个摄像头都可以作为一个独立的视频监控系统,拥有网络传输功能和IP地址。系统结构上能够更具有逻辑性和层次性,系统组件也更为便利、有很大的扩展能力,方便了跨地域的大型监控系统组建和访问。而这种硬件结构上优化的基础就是一个功能强大、扩展性好的软件平台,整个DM365网络摄像机在软件方面选用了拥有丰富源代码和极高稳定性的Linux操作系统,并在该基础上实现了底层软件和上层应用程序的设计分离,使得整个系统的软件开发和使用更为方便和高效。本文详细描述基于DM365的网络摄像机的底层软件应用,包括了整个系统的软件结构、驱动软件的移植、内核系统的优化和启动程序加载等应用性问题。
全部0条评论
快来发表一下你的评论吧 !