基于ARM和CCD的视频采集模块驱动设计
DMA通道分别是:预览DMA通道和编码DMA通道,其中预览DMA通道用于液晶屏的显示,可以把YCbCr4:2:2格式的图像转换成RGB格式的数据,并存放于为预览DMA分配的内存中。编码通道用于图像的编解码处理,可以输出YCbCr4:2:0或YCbCr4:2:2格式到为编码DMA分配的内存中。
1.2 红外CCD摄像头和TVP5150视频解码器
系统中的红外CCD摄像头采用优质的1/3英寸SONYCCD芯片,优异的红外夜视功能,内置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的数据格式,同步信号内嵌于数据流中串行输出,也可以单独引脚与数据流并行输出。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 驱动设计
本系统驱动主要包括两大部分:处理器S3C6410的Camera接口驱动和视频解码器驱动。Camera接口驱动为上层的应用程序提供了底层支持,遵循V4L2标准;视频解码器TVP5150驱动完成了I2C设备的注册,遵循I2C通讯协议,实现了读写内部寄存器的接口函数。
2.1 Camera接口驱动
V4L2(Video For TWO)是Linux内核中关于视频设备的API接口,主要用来对视频设备进行开关、采集、输出等操作。在嵌入式系统中多采用Linux作为其软件平台,V4L2是Linux2.6采用的内核驱动模型,与之前版本的V4L存在很大差别。V4L2使在Linux下开发视频设备驱动程序具有统一的接口规范,这套规范给驱动程序开发提供了清晰的模型和接口。应用程序处于最上层,硬件设备处于最下层,这套规范就处于中间层。在Linux2.6发行版之前此类规范都是V4L,它将所有的视频设备驱动程序都放在其管理中,为编程人员减少了大量的工作。
本方案采用Linux为操作系统,内核版本为3.0.1,相对之前的linux2.6.28而言,内核版本进行了升级,升级之后的linux3.0.1版本兼容了更多的硬件,修复了之前系统中的bug和某些资源的冲突问题,系统安全性能得到了显著提高。Camera接口驱动正是按照V4L2标准来完成的。s3c_time_core.c文件实现了设备的注册和大部分系统调用,是驱动的核心,v4l2接口的ioctl系统调用依靠s3c_time_v4l2.c来实现。
在Linux操作系统中,设备被映射为特殊的文件,设备驱动程序为各种设备提供一致的访问接口,应用程序通过调用open、close、rea d、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设备
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)