[入門指導(dǎo)]S5PV210下添加攝像頭驅(qū)動(dòng)

原創(chuàng) 2015-08-28 09:00:00 開發(fā)板攝像頭驅(qū)動(dòng)

OK210下添加攝像頭驅(qū)動(dòng)


OK210下添加攝像頭(自制的SDIO攝像頭)驅(qū)動(dòng),請(qǐng)參照如下流程:

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

在上述文件中找到MODULE_SENSOR結(jié)構(gòu)體,在UNKNOWN_MODULEMODULE_ID_MAX之間添加一條記錄,用于確定你所添加的攝像頭的唯一ID標(biāo)識(shí)。記住該標(biāo)識(shí),該標(biāo)識(shí)對(duì)以后的操作非常重要。比如你添加了攝像頭OV9650的驅(qū)動(dòng),在標(biāo)識(shí)處你可以添加了標(biāo)識(shí)OV_9650(名稱自定)。

在結(jié)構(gòu)定義后加入

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上點(diǎn)擊右鍵,選擇add->new sources subproject

選擇 ,在subproject name 下輸入OV9650_MODULE(名稱自定)點(diǎn)擊完成。

3. 打開工程自動(dòng)生成的文件夾,用文本編輯器打開sources文件,加入如下代碼:

INCLUDES= \

    $(INCLUDES); \

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

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

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

4. 打開上述工程,其中Readme文件可以刪除。在工程中添加兩個(gè)文件,ov9650_module_regs.hov9650_module.cpp

5. ov9650_module_regs.h中記錄了需要寫入攝像頭I2C中的設(shè)置值。這些值決定了攝像頭的輸出數(shù)據(jù)的基本信息,包括采集信息的數(shù)據(jù)類型,視頻寬度高度等。一般由攝像頭供應(yīng)商提供。

6. ov9650_module.cpp文件主要是提供了OV9650的操作類的具體實(shí)現(xiàn)。具體代碼請(qǐng)參考開發(fā)包中的相關(guān)文件。

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(名稱自定)

該文件中將設(shè)定攝像頭的基本定義和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的系統(tǒng)時(shí)鐘,最大值不能超過(guò)400,推薦100

#define CAM_OV9650_I2C_CLOCK      100

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

//  OV9650 default mode

//攝像頭采集端的模式,一般設(shè)置為ITU601或者ITU656

//對(duì)應(yīng)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

//具體攝像頭使用那種采集模式請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)

#define OV9650_MODULE_ITUXXX CAM_ITU601

//指定外部攝像頭掃描方法。

//對(duì)應(yīng)210寄存器為CIGCTRL[n]> Cam_Interlace(第0位)

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

//具體攝像頭采用掃描方法請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)

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

#define OV9650_MODULE_INTERLACE  0

//指定外部攝像頭的輸入模式。

//對(duì)應(yīng)210寄存器為CIGCTRL[n]> SelCam_CAMIF(第3位)

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

//具體攝像頭采用輸入模式請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)

#define OV9650_MODULE_MIPI           (FALSE)

//指定攝像頭在8位模式下輸入的YCbCr順序

//對(duì)應(yīng)210寄存器為CISRCFMT[n]>Order422_CAM[14-15]

//00 = Y0Cb0Y1Cr0…

//01 = Y0Cr0Y1Cb0…

//10 = Cb0Y0Cr0Y1…

//11 = Cr0Y0Cb0Y1…

//具體攝像頭輸出數(shù)據(jù)YCbCr順序請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)并參考攝像頭設(shè)置字符串。

#define OV9650_MODULE_YUVORDER    CAM_ORDER_YCBYCR

//指定源水平像素?cái)?shù)(相機(jī)或FIFO輸入)。

//欲了解更多信息,請(qǐng)參閱聚會(huì)擴(kuò)展寄存器(SrcHsize_CAM_ext)。

//該值應(yīng)該為16的倍數(shù)。如果PreHorRatioWinOfsEn設(shè)定為0,則必須為4的倍數(shù)。

//對(duì)應(yīng)210寄存器為CISRCFMT [n]> SrcHsize_CAM[16-28]

//具體攝像頭輸出數(shù)據(jù)水平像素?cái)?shù)請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)并參考攝像頭設(shè)置字符串。

#define OV9650_MODULE_HSIZE          640

//指定源垂直像素?cái)?shù)(相機(jī)或FIFO輸入)。

//欲了解更多信息,請(qǐng)參閱聚會(huì)擴(kuò)展寄存器(SrcHsize_CAM_ext)。

//該值應(yīng)該為PreVerRatio的倍數(shù)。

//如果V scale down或者WinOfsEn 0,則必須為2的倍數(shù)。

//對(duì)應(yīng)210寄存器為CISRCFMT[n]> SrcVsize_CAM[0-13]

//具體攝像頭輸出數(shù)據(jù)垂直像素?cái)?shù)請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)并參考攝像頭設(shè)置字符串。

#define OV9650_MODULE_VSIZE          480

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

//它應(yīng)該是2的倍數(shù)。通道0和通道2:該值為16的倍數(shù)。

//對(duì)應(yīng)210寄存器為CIWDOFST [n]> WinHorOfst [16-26]

//具體攝像頭輸出數(shù)據(jù)請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)并參考攝像頭設(shè)置字符串。

#define OV9650_MODULE_HOFFSET        0

//指定窗口垂直偏移像素單元。隔行輸入的情況下,這個(gè)值應(yīng)該是2的倍數(shù)。

//對(duì)應(yīng)210寄存器為CIWDOFST [n]> WinVerOfst [0-11]

//具體攝像頭輸出數(shù)據(jù)請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)并參考攝像頭設(shè)置字符串。

#define OV9650_MODULE_VOFFSET        0

//控制CBCR值的偏移量

//對(duì)應(yīng)210寄存器為CISRCFMT[n]> UVOffset [30]

//具體攝像頭輸出數(shù)據(jù)請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)并參考攝像頭設(shè)置字符串。

#define OV9650_MODULE_UVOFFSET       CAM_UVOFFSET_0

//控制攝像頭模塊的外部輸入時(shí)鐘

//具體攝像頭需要使用的外部時(shí)鐘頻率請(qǐng)參閱攝像頭數(shù)據(jù)手冊(cè)

#define OV9650_MODULE_CLOCK          24000000

//控制210輸出到顯示的輸出模式

//對(duì)應(yīng)210寄存器為CISRCFMT[n]> OutFormat[29-30]

//詳細(xì)設(shè)置請(qǐng)參考210芯片數(shù)據(jù)手冊(cè)

#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攝像頭操作類的設(shè)置,請(qǐng)參考該類的設(shè)置書寫自己的攝像頭操作類。

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

//  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函數(shù),在switch中加入case OV_9650: g_pCamModule = new OV9650(); break;其中OV_9650為攝像頭的唯一ID標(biāo)識(shí),OV9650是操作類的名稱。

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

在文件中找到GetVideoFormatList函數(shù),在switch循環(huán)中加入OV9650的選項(xiàng)。

其中參數(shù)DCAM_StreamMode_REG565_640X480_30可以在sensorformats.h文件中修改。

 

關(guān)于默認(rèn)攝像頭的選擇。

(1)更新11月補(bǔ)丁后,需要更改WINCE600\PLATFORM\SMDKV210\SRC\BOOTLOADER\EBOOT下的menu.c文件。在menu.c文件中找到m_menuCameraType函數(shù),在攝像頭選擇項(xiàng)中增加一條。在SetCameraType函數(shù)中,修改dwCameraType>6為新的數(shù)值。

(2)未更新11月補(bǔ)丁前,在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(唯一標(biāo)識(shí))。



相關(guān)產(chǎn)品 >

  • OKMX6UL-C開發(fā)板

    飛凌嵌入式專注imx6系列imx6ul開發(fā)板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計(jì)和生產(chǎn),i.mx6UL系列產(chǎn)品現(xiàn)已暢銷全國(guó),作為恩智浦imx6ul,imx6ul開發(fā)板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。

    了解詳情
    OKMX6UL-C開發(fā)板
  • OKMX6ULL-C開發(fā)板

    40*29mm,雙網(wǎng)雙CAN,8路串口| i.MX6ULL開發(fā)板是基于NXP i.MX6ULL設(shè)計(jì)開發(fā)的的一款Linux開發(fā)板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對(duì)板連接器,適應(yīng)場(chǎng)景豐富。 了解詳情
    OKMX6ULL-C開發(fā)板

推薦閱讀 換一批 換一批