S3C2440的camera接口特性及WinCE 下的驱动
注意:C通道和P通道应分别分配。分配成功后,应将4组YCbCr信号的起始地址与分配给C通道的DMA缓冲区地址关联起来,将4组RGB信号的起始地址与分配给P通道的DMA缓冲区地址关联起来。格式不同时,关联的空间大小是不同的。如果C通道格式为YCbCr4:2:2,图像宽度为CoDstWidtlh,图像高度为CoDstHeight,分配的DMA地址为CoFrameBuffer,则二者的关联关系为:
这样分配的目的是,保证每一组YCbCr信号的地址空间是连续的,便于用户程序开发。
如果P通道格式为RGBl6,图像宽度为PrDstWidth,图像高度为PrDstHeight,分配的DMA地址为PrFrame Buffer,则二者的关联关系为:
如果P通道格式为RGB24,图像宽度为PrDstWidth,图像高度为PrDstHeight,分配的DMA地址为PrFrame Buffer,则二者的关联关系为:
2.3 配置CAMIF相关寄存器
①把输入视频信号宽度配置为720像素,高度配置为288像素;
②把输入视频信号格式配置为BT.656 YCbcr 4:2:2格式;
③把输入视频信号顺序配置为CbYCr;
④根据用户的LCD显示终端的分辨率配置P通道的图像宽度、高度像素和格式;
⑤根据用户对图像的处理需求来配置C通道的图像宽度、高度像素和格式;
⑥配置C通道的缩放系数;
⑦配置P通道的缩放系数;
⑧把C通道的DMA地址配置给4组起始地址寄存器;
⑨把P通道的DMA地址配置给4组起始地址寄存器。
2.4 创建camera流式驱动接口函数
WinCE下的硬件驱动程序大多采用流式驱动来开发,因为它有一个一致的接口函数供用户调用。此处,把接口函数命名为:CAM_Close()、CAM_Deinit()、CAM_Init()、CAM IOControl()、CAM()pen()、CAM PowerDown()、CAM_PowerUp()、CAM_Read()、CAM_Seek()和CAM-_Write()。
(1)CAM_Init()函数
该函数在驱动程序每次被设备管理器加载时调用。其实现的功能如下:
配置SAA7113,分配C通道、P通道的DMA内存空间,根据输入信号源属性和输出图像、预览图像属性配置CAMIF寄存器。
创建一个事件CameraEvent,使用WinCE内核函数InterruptInitialize(SYSINIR_CAM,CameraEvent,NULL,O)把该事件与camera的逻辑中断号SYSINIR_CAM关联起来,即当中断发生时激活该事件。
创建一个中断服务线程。在该线程内用WaitForSintgleObjcet(CameraEvent,INFINITE)函数阻塞线程,并等待CameraEvent激活。把预览视频图像的功能放到CameraEyent激活之后完成,即把P通道缓冲区的内容拷贝到显示终端。最后,用InterruptDone(SYSINIR_CAM)函数结束本次中断处理。
(2)CAM_IOControl()函数
可以说,该函数才真正是用户程序与驱动程序联系的主要通道,用户程序对camera接口的控制及数据采集均是通过该函数完成的。其主要功能有:
①打开/关闭P通道或C通道输出。
②修改配置参数。
③控制输出图像的放大或缩小。
④如果需要RGB数据,则读取P通道缓冲区内容;
如果需要YCbCr数据,则读取C通道缓冲区内容。注意,读取之前要根据状态寄存器CICOSTATUS或CIPRSTATUS的当前状态,确定访问哪一组缓冲区。
(3)CAM_Deinit()函数
当卸载本驱动时,该函数负责释放分配的内存空间和资源。
(4)CAM_Open()函数
该函数内部并没有具体的功能代码,只是当用户程序使用CreateFile(TEXT(“CAMl:”),GENERIC_READ|GENERIC WRITE,O,NULL,OP-EN_EXISTING,O,O)函数打开camera驱动时调用该函数,并返回一个文件句柄。基于该句柄用户才能进行后续操作。
(5)CAM_Close()函数
该函数内部并没有具体的功能代码,只有当用户程序使用CloseFile(hfile)函数关闭camera驱动时才调用该函数,并释放之前返回的文件句柄。其他接口函数没用赋予其具体功能。
结语
按照上述方法开发的驱动代码,连同其他驱动已在PB5.O环境下编译通过,生成的内核文件在原硬件平台下成功运行,P通道视频图像流畅,C通道图像质量较高。该方法弥补了目前国内在WinCE 5.O/6.O操作系统环境下CCD摄像头无法连接到S3C2440的camera接口的缺陷,为工程技术人员设计嵌入式图像采集系统时提供了一种有效手段。