SAA7113 的CE 引脚与S3C2440 的一个GPIO 引脚相连,这样可以控制SAA7113的工作状态。当无须采集图像时,将该GPIO 口输出低电平,使SAA7113芯片处于低功耗状态,节省电能的消耗。
对照图2和图3可以看出,SAA7113芯片就是图2的“外部图像传感器”。它向嵌入式系统的摄像机接口提供了采样到的标准ITU 视频数据。这些数据经过DMA的P端口或C端口控制传输到了内存,这样就可以在内存中对图像数据作进一步的加工处理。
1.2 图像采样接口的驱动
按照Linux视频设备驱动的模型V4L(video for Linux)编写了SAA7113与S3C2440摄像机接口的驱动。驱动使用C端口模式与DMA进行通信。采样1帧图像之前,首先设置采样图像的分辨率和剪辑窗口大小等参数,然后设置DMA控制器访问的视频采样输出缓冲的内存地址,接着就可以通过设置S3C2440的CAMIF接口控制寄存器启动1帧图像的采集。当采集完1帧图像时,CAMIF接口会自动启动1次C端口的DMA通信,把采集的图像数据传到内存。传输结束后,会产生一个C端口的中断,通知驱动1帧数据采样和传输结束。具体来说,这个驱动需要实现以下功能:
初始化S3C2440的CAMIF接口的时钟寄存器。主要是根据SAA7113的外接晶振频率设置摄像机时钟分频寄存器(CAMDIVN)。该寄存器的0~3位是分频系数,其计算方法是:
CAMCLK_DIV=UPLL/(CAMCLK * 2)-1
(初始化代码略— — 编者注)
配置CAMIF接口的采样参数。主要是输入源图像数据的格式、输出的图像格式、采样的窗口大小、DMA的访问地址等参数。这里定义了一个结构,用于存储与CAMIF接口相关的配置信息:
struct s3c2440_camif_cfg_t {
int src_x; //输入的源图像宽度
int src_y; //输入的源图像高度
int dst_x; //输出的目标图像宽度