您的位置:首页 > 其它

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

2013-09-22 15:18 399 查看
/article/8733723.html

由于项目需要开始搞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
class ICamModuleExtension
{
public:
// Feature Extension
virtual MODULE_STATUS Flash() = 0;
virtual MODULE_STATUS SetBrightness() = 0;
virtual MODULE_STATUS Effect() = 0;
virtual MODULE_STATUS Whitebalance() = 0;
virtual MODULE_STATUS Framerate() = 0;
}


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

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

今天就先到这里,明天编写OV3640的抽象类以及成员变量和成员函数的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: