Wince6.0 下Camera(OV3640) 驱动开发笔记1——基于S5PC100

来源:互联网 发布:kettle 大数据 编辑:程序博客网 时间:2024/05/17 06:31

http://blog.csdn.net/figthter_cui/article/details/5936373

 

由于项目需要开始搞S5PC100的摄像头驱动,camera类型是OV3640.以前还没有做摄像头驱动,缺乏相关的经验,另外基于S5PC100的摄像头驱动代码结构又比较复杂,谁让A8的功能强大呢,功能多了强了开发起来难度自然就增大了。总之,目前的感觉是——好复杂!

   既然项目需要,那么容易要上,有困难也要上,慢慢啃吧。

   先说一下S5PC100支持输入的camera数据类型,有三种:ITU-R BT 60/656 类型,DMA(AXI 64bit interface)类型,MIPI(CSI)类型。相应的接口有两种方式:并口方式和MIPI方式。在三星官方开发板上有这两种类型的camera接口。

   看了一天官方给的camera驱动代码,发现其结构相比2440的比较复杂,总体接口分为三大部分,即S5PC100 camera控制器设置部分,摄像头操作部分(读、写、控制等),摄像头滤波器部分(主要是特殊效果处理,对这一部分还不是很清楚)。通过阅读代码发现,每一种类型的摄像头抽象出来一个类,包含了控制摄像头的各个函数,例如:

class S5K4EAGX : public CamModule
{
public:
    S5K4EAGX();   
    S5K4EAGX(ICamComm *CommIF);
    ~S5K4EAGX();   
    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);
};

  该类是对摄像头S5K4EAGX的抽象类,包括了初始化,电源管理,相关设置等。可以发现该类是CamModule的继承类,那么CamModule是一个什么类呢?从继承与被继承的知识可以知道CamModule类应该是对所有类型摄像头的抽象,其结构如下:

class CamModule : public ICamModule, public ICamModuleExtension
{
public:
    CamModule();   
    CamModule(ICamComm *CommIF);
    virtual ~CamModule();

    virtual MODULE_STATUS SetOperationMode(CAMIF_OPERATION_MODE mode);
    virtual MODULE_STATUS StartCapture();
    virtual MODULE_STATUS StopCapture();
    // Extension
    virtual MODULE_STATUS Flash();
    virtual MODULE_STATUS SetBrightness();
    virtual MODULE_STATUS Effect();
    virtual MODULE_STATUS Whitebalance();
    virtual MODULE_STATUS Framerate();   
  
protected:
    ICamComm *m_oCommIF;
    MODULE_PWR_STATUS PowerStatus;
    UINT32 SensorID;
    BOOL IsInitialize;
    CAMIF_OPERATION_MODE OperationMode;
    CAMIF_IMG_SIZE PreviewSize;
    CAMIF_IMG_SIZE StillSize;
    MODULE_DESCRIPTOR   ModuleDescriptor;
    volatile S5PC100_GPIO_REG    *m_regIOP;   
//  Properties[];   
}

  从其成员函数可以看出该类是更高层次的操作,包括设置操作方式,开始(停止)采集,设置图像效果等。该类还有两个父类ICamModule, ICamModuleExtension。通过阅读代码可知这两个类是两个虚拟类,相应代码如下:

ICamModule 

ICamModuleExtension

由此可见开发摄像头驱动的起点是从 CamModule一个继承类,类似于class S5K4EAGX : public CamModule{}。这一点有点类似于display驱动。

 好了,知道从那里下手了,接下来的就是编写OV3640的抽象类,其父类是 CamModule。

 今天就先到这里,明天编写OV3640的抽象类以及成员变量和成员函数的实现。