mini2440提供了一个摄像头接口,可以输出RGB24,RGB16的原始图像还可以输出编码的如YUV格式的图像,并提供了偏移翻转,放大缩小的功能。与开发板配套的摄像头模块为CAM130,采用ov9650的芯片。操作摄像头接口实现视频的采集与显示,主要配置两个部分的寄存器:ov9650的寄存器,摄像头接口寄存器。
ov9650寄存器在模块的内部,s3c2440是以sccb总线来与ov9650通信。sccb总线类似iic总线,而且mini2440摄像头接口的sccb总线就接在了他的iic接口上,所以可以通过Iic来配置ov9650的寄存器,同样也可以用gpio来模拟sccb总线的时序。ov9650有大量的寄存器需要设置,但是一般不需要我们关心,厂商将一些常用的配置写成数组,直接赋值就可以了。需要我们关心的是厂商ID寄存器,这个一般在摄像头初始化之前用来判定摄像头是否正确安装。
摄像头接口寄存器的配置比较麻烦,大体上需要配置三类的寄存器。第一类是摄像头接口输入视频格式寄存器CISRCFMT,功能是设置摄像头接口的输入数据的格式与长宽。s3c2440的摄像头接口提供了两个DMA通道,一个预览输出DMA,有四块DMA缓冲区,这个通道用于将采集到的视频图像直接显示到Lcd上。另外一个是编码输出DMA,也有四块DMA缓冲区,用于后期处理视频。所以第二类是预览输出视频格式寄存器。这类寄存器主要有以下几个:
CIPRTRGFMT 这个寄存器主要设置目标图像的长宽与是否进行旋转与镜像处理
CIPRCTRL 突发长度寄存器,这里的值与目标图像的宽度有关,有计算公式,不需要关许只需要调用函数计算然后赋值给它就可以了
CIPRSCPRERATIO
CIPRSCPREDST
CIPRSCCTRL 这三个寄存器主要是设置缩放比例以及与缩放偏移相关的参数,需要以原始图像以及目变图像的大小作为参数,通过一定的公式计算得出。公式是固定的直接用就可以了,不需要关心。CIPRSCCTRL这个寄存器尤其重要,因为第30位是视频输出的格式,1为RGB24,0为RGB16格式,需要根据LCD的类型设置。我的mini2440采用的T35的lcd就是RGB16的屏,所以这里需要设置成0,否则输出到lcd的图像颜色就不对,如果是RGB24的屏,则第30位要设置成1。
CIPRTAREA 目标图像面积寄存器,这个主要用于决定DMA一次传送的数据量
CIPRCLRSA1
CIPRCLRSA2
CIPRCLRSA3
CIPRCLRSA4 这四个寄存器是DMA目的寄存器,也就是摄像头接口输出存放数据的地方,如果直接显示的话就要都赋值成Lcd的帧缓冲首地址
第三类寄存器是编码输出视频格式寄存器,与第二类相似。摄像头接口还有一些功能寄存器需要设置,如时钟寄存器CAMDIVN,与控制寄存器CIGCTRL,负责设置信号的极性以及摄像头的复位。综上所述,操作摄像头需要以下几个步骤:
(1) 读取厂商ID,来判定摄像头是否安装正确,这首先需要正确操作sccb总线,这一步也可以用来判定sccb总线时序是否正确。
(2) 配置摄像头,事先将寄存器的地址以及对应的值写入数组,直接通过循环完成配置,配置完成之后就不需要操作sccb总线了,也就是不需要管ov9650这端了。以下的操作设置摄像头接口这端的寄存器就可以了。
(3) 设置摄像头所需的时钟,设置控制寄存器,复位摄像头。
(4) 根据lcd的类型以及需要显示视频的大小,设置源图像寄存器,预览输出寄存器等
以上是使用摄像头接口的预览输出功能的基本操作步骤,还有每采集一帧图像,摄像头都会产生中断。具体程序在我的下载资源里: http://download.csdn.net/detail/yaozhenguo2006/4001720 是在ubuntu下用amr-linux-gcc编译的,如果安装了arm-linux-gcc并且将命令导入到了环境变量里,直接在代码目录下make就可以了,程序参考了http://blog.csdn.net/zhaocj/article/details/5653479,感谢博主对摄像头详尽的讲述。在mini2440开发板上(配套lcd为统宝3.5寸屏)程序是可以正确运行的,如果其他的屏幕需要改一下参数。