新闻中心

EEPW首页 > 电源与新能源 > 设计应用 > 基于TMS320DM365的网络摄像机底层软件应用

基于TMS320DM365的网络摄像机底层软件应用

作者:时间:2012-08-11来源:网络收藏
r>e.JPG


这种ARM和DSP分开的软件结构,使得整个Davinci框架下的系统的软件开发被分成了四个部分:图像算法开发、Codec Server集成开发、CodecEngine集成开发和应用程序开发。基础的图像算法可以通过TI提供的CCS开发工具,图像的编码算法被存储为.lib的库文件。而Codec Server的开发是调用一系列的.lib算法库,实现各种库文件的对ARM部分的接口。Ciodec Engine是开发调用Codec Server的Stuh和Skelet on,完善整个图像处理功能的调用,而面向厂商或是使用者的应用程序的开发,只需要针对不同应用情况编译基于Linux的应用程序,其中图像处理算法等内容,作为黑箱供这些使用者调用。

3
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所示。

f.JPG


整个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设备、



评论


相关推荐

技术专区

关闭