新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于ARM和CCD的视频采集模块驱动设计

基于ARM和CCD的视频采集模块驱动设计

作者:时间:2014-05-20来源:网络收藏

 

本文引用地址:http://www.eepw.com.cn/article/247107.htm

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设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。I 2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。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()等接口函数。

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,结构体中主要描述了摄像头的参数,比如图像尺寸720x240,图像格式ITU_656_YCBCR422_8BIT,像素频率27 MHz等。这些数据在初始化camera接口时要用到。在tvp5150_probe(struct i2c_client*c,const structi2c_device_id*id)函数中增加了一个函数接口s-3c_fime_register_camera(&tvp5150_data)用于把上面这个结构体填入struct s3c_fimc_config s3c_fimc这个全局变量中,其次定义tvp5150驱动配置参数的结构体tvp5150_i2c_driver,在tvp5150_in it()函数中调用i2c_add_driver(&tvp5150_i2c_driver)添加驱动,之后tvp5150_probe()被调用时tvp5150_attach_adapter()会被调用,通过遍历系统中的所有I2C总线驱动来探测Tvp5150,然后调用内核中已经注册的适配器来连接Tvp5150。tvp5-150_attach_adapter()函数主要调用i2c_detect(adapter,driver)函数来探测设备,探测到目标设备之后创建一个strnct 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文件中添加与驱动相对应项目的编译配置选项:

模拟信号相关文章:什么是模拟信号


linux相关文章:linux教程


摄像头相关文章:摄像头原理


关键词: ARM CCD

评论


相关推荐

技术专区

关闭