[入门指导]S5PV210下添加摄像头驱动

OK210下添加摄像头(自制的SDIO摄像头)驱动,请参照如下流程:

1. 修改X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAIF\HAL\INC camera_typedef.h文件。

在上述文件中找到MODULE_SENSOR结构体,在UNKNOWN_MODULEMODULE_ID_MAX之间添加一条记录,用于确定你所添加的摄像头的唯ID标识。记住该标识,该标识对以后的操作非常重要。比如你添加了摄像头OV9650的驱动,在标识处你可以添加了标识OV_9650(名称自定)。

在结构定义之后加入const char *SENSORNAMES[] = {"SYSLSI_S5K3BA", "SYSLSI_S5K4EAGX", "SYSLSI_S5K6AAFX", "TI_TVP5150", "OV_3640", "OV_9650"};字符串定义。

2. VS2005中的OK210的工程文件中X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAIF\HAL\MODULES上点击右键,选择add->new sources subproject



选择 ,在subproject name 下输入OV9650_MODULE(名称自定)点击完成。

3. 打开工程自动生成的文件夹,用文本编辑器打开sources文件,加入如下代码:

INCLUDES= \

    $(INCLUDES); \

    $(_TARGETPLATROOT)\src\drivers\CAMERAIF\INC; \

    $(_TARGETPLATROOT)\src\drivers\CAMERAIF\HAL\INC; \

    $(_TARGETPLATROOT)\src\drivers\CMM; \

4. 打开上述工程,其中Readme文件可以删除。在工程中添加两个文件,ov9650_module_regs.hov9650_module.cpp

5. ov9650_module_regs.h中记录了需要写入摄像头I2C中的设置值。这些值决定了摄像头的输出数据的基本信息,包括采集信息的数据类型,视频宽度高度等。一般由摄像头供应商提供。

6. ov9650_module.cpp文件主要是提供了OV9650的操作类的具体实现。具体代码请参考开发包中的相关文件。

7. X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAIF\HAL\HAL_MAIN文件夹,用文本编辑工具打开sources文件,在SOURCELIBS下加入$(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\OV9650_MODULE.lib一行。

8. X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAIF\HAL\INC下添加新文件ov9650_module.h(名称自定)

该文件中将设定摄像头的基本定义和ov9650_module.cpp文件中的操作类的定义。这里是OV9650的该文件代码:

#ifndef __OV9650_MODULE_H__

#define __OV9650_MODULE_H__

//注意这里包含的头文件

#include <bsp.h>

#include "module.h"

#include "camera_typedef.h"

//注意这里的CAM_OV9650_DEVICE_ID是硬件摄像头的I2C写地址

#define CAM_OV9650_DEVICE_ID      0x60

//这里为I2C的系统时钟,最大值不能超过400,推荐100

#define CAM_OV9650_I2C_CLOCK      100


//========================================================

//  OV9650 default mode

//摄像头采集端的模式,一般设置为ITU601或者ITU656

//对应210寄存器为CISRCFMT[n]> ITU601_656n(第31位)

//1 = ITU-R BT.601 YCbCr 8-bit mode enable

//0 = ITU-R BT.656 YCbCr 8-bit mode enable

//具体摄像头使用那种采集模式请参阅摄像头数据手册

#define OV9650_MODULE_ITUXXX CAM_ITU601

//指定外部摄像头扫描方法。

//对应210寄存器为CIGCTRL[n]> Cam_Interlace(第0位)

//1 =隔行扫描 0=逐行

//具体摄像头采用扫描方法请参阅摄像头数据手册

//比如TVP5150采取的就是逐行扫描方式

#define OV9650_MODULE_INTERLACE  0

//指定外部摄像头的输入模式。

//对应210寄存器为CIGCTRL[n]> SelCam_CAMIF(第3位)

//1=MIPI模式 0 =ITU模式

//具体摄像头采用输入模式请参阅摄像头数据手册

#define OV9650_MODULE_MIPI           (FALSE)

//指定摄像头在8位模式下输入的YCbCr顺序

//对应210寄存器为CISRCFMT[n]>Order422_CAM[14-15位]

//00 = Y0Cb0Y1Cr0…

//01 = Y0Cr0Y1Cb0…

//10 = Cb0Y0Cr0Y1…

//11 = Cr0Y0Cb0Y1…

//具体摄像头输出数据YCbCr顺序请参阅摄像头数据手册并参考摄像头设置字符串。

#define OV9650_MODULE_YUVORDER    CAM_ORDER_YCBYCR

//指定源水平像素数(相机或FIFO输入)。

//欲了解更多信息,请参阅聚会扩展寄存器(SrcHsize_CAM_ext)。

//该值应该为16的倍数。如果PreHorRatioWinOfsEn设定为0,则必须为4的倍数。

//对应210寄存器为CISRCFMT [n]> SrcHsize_CAM[16-28位]

//具体摄像头输出数据水平像素数请参阅摄像头数据手册并参考摄像头设置字符串。

#define OV9650_MODULE_HSIZE          640

//指定源垂直像素数(相机或FIFO输入)。

//欲了解更多信息,请参阅聚会扩展寄存器(SrcHsize_CAM_ext)。

//该值应该为PreVerRatio的倍数。

//如果V scale down或者WinOfsEn 0,则必须为2的倍数。

//对应210寄存器为CISRCFMT[n]> SrcVsize_CAM[0-13位]

//具体摄像头输出数据垂直像素数请参阅摄像头数据手册并参考摄像头设置字符串。

#define OV9650_MODULE_VSIZE          480

//指定窗口水平偏移像素单元。

//它应该是2的倍数。通道0和通道2:该值为16的倍数。

//对应210寄存器为CIWDOFST [n]> WinHorOfst [16-26]

//具体摄像头输出数据请参阅摄像头数据手册并参考摄像头设置字符串。

#define OV9650_MODULE_HOFFSET        0

//指定窗口垂直偏移像素单元。隔行输入的情况下,这个值应该是2的倍数。

//对应210寄存器为CIWDOFST [n]> WinVerOfst [0-11]

//具体摄像头输出数据请参阅摄像头数据手册并参考摄像头设置字符串。

#define OV9650_MODULE_VOFFSET        0

//控制CBCR值的偏移量

//对应210寄存器为CISRCFMT[n]> UVOffset [30]

//具体摄像头输出数据请参阅摄像头数据手册并参考摄像头设置字符串。

#define OV9650_MODULE_UVOFFSET       CAM_UVOFFSET_0

//控制摄像头模块的外部输入时钟

//具体摄像头需要使用的外部时钟频率请参阅摄像头数据手册

#define OV9650_MODULE_CLOCK          24000000

//控制210输出到显示的输出模式

//对应210寄存器为CISRCFMT[n]> OutFormat[29-30]

//详细设置请参考210芯片数据手册

#define OV9650_MODULE_CODEC          CAM_FORMAT_YCBYCR422_1PLANE


#define OV9650_MODULE_HIGHRST        1

#define OV9650_MODULE_INVPCLK        1

#define OV9650_MODULE_INVVSYNC       0

#define OV9650_MODULE_INVHREF        0

#define OV9650_MODULE_ OUTFLIP 1

//下面是OV9650摄像头操作类的设置,请参考该类的设置书写自己的摄像头操作类。

//========================================================

//  OV9650 infomation


class OV9650 : public CamModule

{

public:

    OV9650();    

    OV9650(ICamComm *CommIF);

    ~OV9650();    

    MODULE_STATUS Init();

    MODULE_STATUS Deinit();

    MODULE_STATUS InitSensor();

    MODULE_STATUS Power(BOOL bOnOff);

    MODULE_STATUS Standby(BOOL bActive);

    MODULE_STATUS Reset(BOOL bActive);


    MODULE_STATUS GetSupportFormat(MODULE_DESCRIPTOR *outModuleDesc);

    MODULE_STATUS SetFormatSize(CAMIF_IMG_SIZE Size);

    MODULE_STATUS SensorPrepare();

    MODULE_STATUS SensorStart();

};


#endif //__OV9650_MODULE_H__

9. 修改X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAIF\HAL\MODULES\COMMON\ module_interface.cpp文件。

在文件中找到ModuleInit函数,在switch中加入case OV_9650: g_pCamModule = new OV9650(); break;其中OV_9650为摄像头的唯一ID标识,OV9650是操作类的名称。

10. 修改文件X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAFILTER\CAMERA_PDD\camera_pdd.cpp

在文件中找到GetVideoFormatList函数,在switch循环中加入OV9650的选项。

其中参数DCAM_StreamMode_REG565_640X480_30可以在sensorformats.h文件中修改。

关于默认摄像头的选择:

(1)更新11月补丁后,需要更改WINCE600\PLATFORM\SMDKV210\SRC\BOOTLOADER\EBOOT下的menu.c文件。在menu.c文件中找到m_menuCameraType函数,在摄像头选择项中增加一条。在SetCameraType函数中,修改dwCameraType>6为新的数值。

(2)未更新11月补丁前,在CAMERAFILTER\CAMERA_PDD文件夹下找到source文件,用文本编辑器打开。找到下面这段代码:

!if 1

CDEFINES=$(CDEFINES) -DCAMERA_PORT=CAM_A_PORT

CDEFINES=$(CDEFINES) -DCAMERA_MODULE_NAME=OV_3640

!endif

将其中的OV_3640改为OV_9650(唯一标识)。