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
由此可见开发摄像头驱动的起点是从 CamModule一个继承类,类似于class S5K4EAGX :
public CamModule{}。这一点有点类似于display驱动。
好了,知道从那里下手了,接下来的就是编写OV3640的抽象类,其父类是 CamModule。
今天就先到这里,明天编写OV3640的抽象类以及成员变量和成员函数的实现。
由于项目需要开始搞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的抽象类以及成员变量和成员函数的实现。
相关文章推荐
- Wince6.0 下Camera(OV3640) 驱动开发笔记1——基于S5PC100
- Wince6.0 下Camera(OV3640) 驱动开发笔记
- Wince6.0 下Camera(OV3640) 驱动开发全程记录
- Wince6.0 下Camera(OV3640) 驱动开发全程记录
- Wince6.0 下Camera(OV3640) 驱动开发全程记录
- FS_S5PC100平台上Linux Camera驱动开发详解(二)
- FS_S5PC100平台上Linux Camera驱动开发详解(一)
- FS_S5PC100平台上Linux Camera驱动开发详解(二)
- FS_S5PC100平台上Linux Camera驱动开发详解(一) .
- FS_S5PC100平台上Linux Camera驱动开发详解(一)
- FS_S5PC100平台上Linux Camera驱动开发详解(一)
- FS_S5PC100平台上Linux Camera驱动开发详解(二)
- 基于Docker的开发模式驱动持续集成落地实施(脑图学习笔记)
- FS_S5PC100平台上Linux Camera驱动开发详解(二)
- S5PC100平台上Linux Camera驱动开发详解(二)
- 基于V4L2的视频驱动开发(1)---Camera
- 嵌入式软件开发培训笔记——基于S5PC100的课程设计
- FS_S5PC100平台上Linux Camera驱动开发详解(一)
- FS_S5PC100平台上Linux Camera驱动开发详解(一)
- 基于V4L2的视频驱动开发(以s3c2440和ov9650举例)