宠物智能喂养系统视频采集驱动设计

2014-01-16 09:21郭来霄
电子设计工程 2014年4期
关键词:解码器适配器驱动程序

盛 平,郭来霄

(江苏大学 计算机科学与通信工程学院,江苏 镇江 212013)

随着我国社会经济的快速发展,城市化进程不断加速。我国国民生活水平不断得到提高,我国宠物业也得到了飞速的发展。由于城市生活的封闭性、个性化和人口老龄化等问题不断凸显出来。人民生活中休闲、消费和情感寄托方式也呈多样化的发展。家庭宠物的饲养已经成为了城市居民生活消遣的新方式。

宠物的喂养和看护往往是宠物主人最关心的问题,目前宠物主要还是依靠人工进行喂食,宠物看护系统还停留在专人看护和宠物店托管的模式下。现有的宠物看护装置只解决了不让宠物饿肚子的简单层面,而没有解决主人不在家时,宠物和主人的互动要求。主人比较关心的问题,比如宠物现在在做什么,有没有吃饭,宠物健康状况怎么样等,这些心理诉求的满足才是一套宠物看护系统要解决的问题。而现在的设备还不能满足这一需求。

目前的家庭宠物看护系统为数不多,算得上看护系统的产品功能单一,只是简单的测量宠物环境和喂食,不能同时满足用户既可以远程喂养宠物又可以在线观看宠物进食情况和活动状况的需求。近年来随着嵌入式技术迅速的发展,嵌入式系统已经成熟并得到广泛应用,把嵌入式系统与Web技术结合起来,将Web技术引入到测控系统,实现基于嵌入式Web服务器的远程测控系统,有良好的应用前景[1]。在嵌入式Linux平台下利用Boa作为Web服务器的远程测控系统可以实现上述需求,搭载有高度集成的嵌入式实时视频采集平台的宠物智能喂养系统能很好的满足客户的不同需求。通过嵌入式实时视频采集平台上的红外CCD摄像头,宠物主人可以在白天或者晚上用智能手机、平板电脑、PC电脑等通过WEB控制宠物进食同时可以查看宠物进食和活动情况。

在本系统中,驱动程序用来完成用户和硬件的交互,是硬件设备正常工作的先决条件,充当着不可缺少的角色。本文提出一种基于S3C6410的Linux3.0.1内核版本下的视频采集系统驱动设计方案,并已成功用于宠物智能喂养系统中,收到良好的效果。

1 硬件系统构架

宠物智能喂养系统主要由图像采集模块、视频解码模块、S3C6410、喂食模块、喂水模块和显示模块组成。红外CCD摄像头用于采集智能喂养系统工作状态中的宠物的进食和活动情况图像,由于S3C6410不能识别采集到的PAL制式信号,因此需要做视频解码处理,这里选用TI公司推出的Tvp5150解码器,用于将采集到的PAL制式信号转换成YCrCb格式。S3C6410是整个系统的核心部分,转换后的数字信号数据经编码DMA通道进入Camera单元的编码缩放器,经过高编码质量和压缩比的H264编码后保存到用户程序开辟的缓存区中,然后传输到live555流媒体服务器接收程序中,live555实现了对编码后视频流的流化和相关的处理,最后通过嵌入网页端的流媒体播放器VLC media player播放器实时显示。系统中的喂食模块可以实现宠物所需食物的定量投放,喂水模块可以实现自动喂水和远程喂水的功能。另外为了方便对图像进行相关处理,需要NAND FLASH用于存储截取的图像,同时,SDRAM、JTAG和供电部分等常用外围接口是开发过程中不可缺少的部分。由此搭建的高度集成的实时视频采集系统具有显著的小型化效果。系统整体框架如图1所示。

1.1 S3C6410开发平台

S3C6410是基于 16/32-bit RISC ARMll76JZF-S内核的低成本、低功耗、高性能微处理器,具有高达533 MHz的主频,4 G ROM和512 M RAM,性能强大,堪比当今主流智能手机。S3C6410内部集成了许多功能强大的硬件加速器,像视频处理、移动图像处理、显示控制和图像缩放等,集成了Camera接口单元、系统管理器、LCD控制器、定时器、通用I/0端口、12C总线接口等硬件外设,具有先进的OTG接口和能支持SLC/MLC等主流的NAND FLASH[2]。与本系统直接相关的Camera接口单元由7个模块组成:图形多路选择器、捕获单元、预览缩放器、编码缩放器、预览DMA通道、编码DMA通道和SFR(特殊功能寄存器)[3]。系统中的两个DMA通道分别是:预览DMA通道和编码DMA通道,其中预览DMA通道用于液晶屏的显示,可以把YCbCr4:2:2格式的图像转换成RGB格式的数据,并存放于为预览DMA分配的内存中。编码通道用于图像的编解码处理,可以输出YCbCr4:2:0或YCbCr4:2:2格式到为编码DMA分配的内存中。

1.2 红外CCD摄像头和TVP5150视频解码器

系统中的红外CCD摄像头采用优质的1/3英寸SONY CCD芯片,优异的红外夜视功能,内置24颗红外灯,夜视距离达5~10 m。其技术参数:DC 12 V 220 mA,红外灯打开时DC 12 V 1 000 mA,420 TVL,像素频率27 MHz,输出PAL制式视频信号。

TVP5150是TI公司推出的一款超低功耗高性能视频解码器,可以对NTSC/PAL/SECAM各制式信号自动识别、切换、设置相应的寄存器,TVP5150解码器优化的架构使其正常工作时功耗仅115 mW,广泛应用于便携、批量大、高性能和高质量的视频产品中。TVP5150解码器有一个模拟输入通道,可以接受1路S-VIDEO信号或2路复合视频信号 (CVBS),红外CCD摄像头采集到的图像以每秒25帧的速度向TVP5150输出PAL制式的图像数据,TVP5150对输入的PAL制式信号进行自动识别并进行A/D转换,转换为符合ITU-R BT.656标准的8位数字YCbCr4:2:2信号。ITU-R BT.656是ITU-R BT.601附件A中的数字接口标准,ITU-R BT.656输出8位Y:Cb:Cr=4:2:2的数据格式,同步信号内嵌于数据流中串行输出,也可以单独引脚与数据流并行输出[4]。TVP5150可以输出8位4:2:2的 ITU-R BT.656信号或8位 4:2:2的 ITU-R BT.601信号,这和S3C6410的Camera模块的输入信号格式一致,为视频格式转换节省了大量工作,TVP5150解码器内部含有多个特殊功能寄存器,可被编程使用I2C串行接口,用户通过I2C总线设置外部视频解码芯片TVP5150的内部寄存器,从而设定工作状态。TVP5150芯片的原理图如图2所示。

图2 TVP5150原理图Fig.2 diagram of TVP5150

2 驱动设计

本系统驱动主要包括两大部分:处理器 S3C6410的Camera接口驱动和视频解码器TVP5150驱动。Camera接口驱动为上层的应用程序提供了底层支持,遵循V4L2标准;视频解码器TVP5150驱动完成了I2C设备的注册,遵循I2C通讯协议,实现了读写内部寄存器的接口函数。

2.1 Camera 接口驱动

V4L2(Video For Two)是Linux内核中关于视频设备的API接口,主要用来对视频设备进行开关、采集、输出等操作。在嵌入式系统中多采用Linux作为其软件平台,V4L2是Linux2.6采用的内核驱动模型,与之前版本的V4L存在很大差别。V4L2使在Linux下开发视频设备驱动程序具有统一的接口规范,这套规范给驱动程序开发提供了清晰的模型和接口。应用程序处于最上层,硬件设备处于最下层,这套规范就处于中间层。在Linux2.6发行版之前此类规范都是V4L,它将所有的视频设备驱动程序都放在其管理中,为编程人员减少了大量的工作[5]。

本方案采用Linux为操作系统,内核版本为3.0.1,相对之前的linux2.6.28而言,内核版本进行了升级,升级之后的linux3.0.1版本兼容了更多的硬件,修复了之前系统中的bug和某些资源的冲突问题,系统安全性能得到了显著提高。Camera接口驱动正是按照V4L2标准来完成的。s3c_time_core.c文件实现了设备的注册和大部分系统调用,是驱动的核心,v412接口的ioctl系统调用依靠s3c_time_v412.c来实现。

在Linux操作系统中,设备被映射为特殊的文件,设备驱动程序为各种设备提供一致的访问接口,应用程序通过调用open、close、read、write等函数去操作相应的设备文件来访问设备。open()函数用来打开视频文件设备;camera接口底层的读写用 read()和 write()实现;mmap()取代了以前 的copy_to_user()方式,用内存映射方式把设备内存映射到应用程序内存中,从而直接处理设备内存;当video_device配置完毕,在 s3c_time_probe()中通过 video_register_device()函数完成注册。

2.2 TVP5150驱动

2.2.1 Linux下I2C驱动体系结构

I2C总线是由PHILIPS公司开发的微电子通信控制领域广泛采用的一种新型总线标准,用于连接微控制器及其外围设备,其最主要的特点是简单性和有效性。Linux系统中把I2C设备当作一个普通的字符设备来处理,对I2C设备具有很好的支持,Linux下的I2C体系结构分为3个组成部分:I2C核心、I2C总线驱动和I2C设备驱动。

I2C核心是内核用来维护和管理I2C的核心部分,提供了I2C总线驱动和设备驱动的注册,注销方法,I2C总线驱动是对I2C硬件体系结构中适配器端的实现,主要包含了I2C适配器数据结构i2c_adapter、I2C适配器的 algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数。I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数[6]。Linux I2C体系结构图如图3所示。

2.2.2 TVP5150驱动实现

Linux3.0.1相对linux2.6.28而言驱动程序函数接口发生了一些变化,驱动程序进行了优化,TVP5150驱动具体实现如下:TVP5150驱动程序首先要实现对I2C core层的接口,用以挂接I2C adapter层来实现对I2C总线及I2C设备具体的访问方法,主要包括需要编写 TVP5150_init()、TVP5150_probe()、TVP5150_remove()等接口函数。

图3 Linux I2C体系结构图Fig.3 Structure diagram of Linux I2C system

tvp5150_init()初始化函数,主要调用i2C_add_driver(&tvp5150_i2c_driver)添加设备驱动。

tvp5150_probe()在使用 i2C_add_driver()注册时被调用,用来检查被发现的所有的I2C适配器是否符合I2C驱动的特定条件,如果符合相关条件则进行连接,并通I2C适配器来实现对I2C总线及I2C设备的访问。

tvp5150_remove()在删除Tvp5150时被调用,使Tvp5150解码器脱离I2C适配器,并且清除描述该设备相关数据结构。

本文的驱动程序主要实现以下环节:

首先增加了填充camera接口的结构体:static struct s3c_fimc_camera tvp5150_da-ta,结构体中主要描述了摄像头的参数,比如图像尺寸720×240,图像格式ITU_656_YCBCR422_8BIT,像素频率27 MHz等。这些数据在初始化camera接口时要用到。在 tvp5150_probe(struct i2c_client*c, const struct i2c_device_id*id)函数中增加了一个函数接口s-3c_fimc_r egister_camera(&tvp5150_data)用于把上面这个结构体填入struct s3c_fimc_config s3c_fimc这个全局变量中,其次定义tvp5150驱动配置参数的结构体tvp5150_i2c_driver,在tvp5150_init()函数中调用 i2c_add_driver(&tvp5150_i2c_driver)添加驱动,之后 tvp5150_probe()被调用时 tvp5150_attach_adapter()会被调用,通过遍历系统中的所有I2C总线驱动来探测Tvp5150,然后调用内核中已经注册的适配器来连接Tvp5150。 tvp5-150_attach_adapter()函数主要调用 i2c_detect(adapter,driver)函数来探测设备,探测到目标设备之后创建一个struct i2c_client结构来标识这个设备。

初始化Tvp5150内部特殊功能寄存器的操作主要通过tvp5150_probe()函数来实现,函数中调用i2c_smbus_write_byte_data (c,TVP5150_init_reg[i].subaddr, TVP5150_init_reg[i].value)来完成寄存器的设置,从而完成了初始化tvp5150的过程。其图像采集驱动流程图如图4所示。

3 驱动移植和相关实验结果

1)驱动程序编写好之后,在Kconfig-camera文件中添加与驱动相对应项目的编译配置选项:

config TVP5150

图4 图像采集驱动流程图Fig.4 Flow diagram of image capturing driver

bool"TVP5150"

depends on VIDEO_FIMC

---help---

LYT TVP5150 camera module support

2)在Makefile文件中添加对驱动的编译条目:

obj-$(CONFIG_TVP5150) +=tvp5150.o

3)修改 mach-smdk6410.c文件:

在i2c_board_info i2c_devs0[]_initdata结构体中{I2C_BOARD_INFO ("ov965x", 0x30), }, 语 句 后 面 添 加{I2C_BOARD_INFO("tvp5150", 0x5c), },

4)进入 linux-3.0.1 内核目录,执行 make menuconfig进行相关的配置:

其中 External Camera (TVP5150) --->

ResetType(0=low,1=high)前面的选择框里要选择0

5)进入内核目录执行make zImage,重新编泽内核,生成内核文件,将新的内核烧写到开发板,运行测试程序即可测试到视频设备采集到的实时图像,如图5~7所示。

图5 宠物智能喂养系统中喂食部分采集图像Fig.5 Image capturing diagram of intelligent feeding system

图6 食物从喂食装置进入喂食箱时的图像Fig.6 Image of food entering the feeding box from the feeding device

4 结束语

图7 宠物食物进入喂食箱后的图像Fig.7 Image after food entering feeding box

通过开发实例详细介绍了宠物智能喂养系统视频采集的驱动设计,实现了TI公司视频解码芯片TVP5150驱动程序的设计,并成功移植到开发板上,具有较高的性价比,可用于视频采集、远程监控等众多领域,该系统视频监控的实现满足了远程实时观看宠物进食和活动情况的需求,对宠物看护系统的进一步完善提供了帮助,在实际测试中,该系统测试结果令人满意,实现了对宠物远程定时定量的喂食,该系统成本很低,具有很好的应用和推广价值。

[1]卞东进,顾昊琳,潘应云.基于嵌入式Linux的Web远程测控系统的设计与实现[J].电子工程师,2008,34(7):68-70.BIAN Dong-jin,GU Hao-lin,PAN Ying-yun.Design and implementation of a remotement measurement and control system based on Embedded Linux Web Server[J].Electronic Engineer, 2008,34(7):68-70.

[2]S3C6410数据手册.三星公司[Z].2008.

[3]刘宁,周孟特,王智芳,等.便携式红外电路故障检测仪视频采集驱动设计[J].计算机工程与科学,2010,33(12):189-193.LIU Ning,ZHOU Meng-te,WANG Zhi-fang,et al.The driver design of video capturing in Portable Infrared Detection Testers[J].Computer Engineering&Science,2010,33(12):189-193.

[4]王凯.基于TVP5150的视频LCD显示设计[J].电子设计工程,2011,19(1):178-181.WANG Kai.Design of Video LCD monitor based on TVP5150[J].Electronic Design Engineering,2011,19 (1):178-181.

[5]张辉,李新华,刘波,等.基于V4L2的视频设备驱动开发与移植[J].电脑知识与技术,2010,6(15):3988-3990.ZHANG Hui,LI Xin-hua,LIU Bo,et al.The video device driver programming and proting based on V4L2[J].Computer Knowledge and Technology,2010,6(15):3988-3990.

[6]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2010.

猜你喜欢
解码器适配器驱动程序
科学解码器(一)
科学解码器(二)
科学解码器(三)
线圣AudioQuest 发布第三代Dragonfly Cobalt蓝蜻蜓解码器
计算机硬件设备驱动程序分析
基于3D打印的轻型导弹适配器
潜空导弹垂直发射出筒适配器受载变形仿真研究
电源适配器怎么选
美国麦格普公司新型M—LOK相机三脚架适配器
基于MPC8280的CPU单元与内部总线驱动程序设计