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

原創(chuàng) 2020-03-07 15:38:00 S5PV210 210開發(fā)板 攝像頭驅(qū)動添加

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

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)識。記住該標(biāo)識,該標(biāo)識對以后的操作非常重要。比如你添加了攝像頭OV9650的驅(qū)動,在標(biāo)識處你可以添加了標(biāo)識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上點擊右鍵,選擇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中的設(shè)置值。這些值決定了攝像頭的輸出數(shù)據(jù)的基本信息,包括采集信息的數(shù)據(jù)類型,視頻寬度高度等。一般由攝像頭供應(yīng)商提供。

6. ov9650_module.cpp文件主要是提供了OV9650的操作類的具體實現(xiàn)。具體代碼請參考開發(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)時鐘,最大值不能超過400,推薦100

#define CAM_OV9650_I2C_CLOCK      100


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

//  OV9650 default mode

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

//對應(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

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

#define OV9650_MODULE_ITUXXX CAM_ITU601

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

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

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

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

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

#define OV9650_MODULE_INTERLACE  0

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

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

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

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

#define OV9650_MODULE_MIPI           (FALSE)

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

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

//00 = Y0Cb0Y1Cr0…

//01 = Y0Cr0Y1Cb0…

//10 = Cb0Y0Cr0Y1…

//11 = Cr0Y0Cb0Y1…

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

#define OV9650_MODULE_YUVORDER    CAM_ORDER_YCBYCR

//指定源水平像素數(shù)(相機或FIFO輸入)。

//欲了解更多信息,請參閱聚會擴展寄存器(SrcHsize_CAM_ext)。

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

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

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

#define OV9650_MODULE_HSIZE          640

//指定源垂直像素數(shù)(相機或FIFO輸入)。

//欲了解更多信息,請參閱聚會擴展寄存器(SrcHsize_CAM_ext)。

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

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

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

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

#define OV9650_MODULE_VSIZE          480

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

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

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

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

#define OV9650_MODULE_HOFFSET        0

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

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

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

#define OV9650_MODULE_VOFFSET        0

//控制CB,CR值的偏移量

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

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

#define OV9650_MODULE_UVOFFSET       CAM_UVOFFSET_0

//控制攝像頭模塊的外部輸入時鐘

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

#define OV9650_MODULE_CLOCK          24000000

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

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

//詳細設(shè)置請參考210芯片數(shù)據(jù)手冊

#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è)置,請參考該類的設(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)識,OV9650是操作類的名稱。

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

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

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

關(guān)于默認攝像頭的選擇:

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

(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(唯一標(biāo)識)。



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

  • FET1012A-C核心板

    LS1012A處理器采用64位Arm Cortex-A53內(nèi)核,可提供超過4,000的CoreMark性能以及用于數(shù)據(jù)包處理和安全性的硬件加速,以及任何1W典型電源通信處理器的整體性能。飛凌嵌入式LS1012A核心板基于NXP公司LS1012A處理器設(shè)計開發(fā),主頻1GHz,集多種SATA 3.0、PCIE2.0、USB3.0高速接口于一體。支持2個真千兆以太網(wǎng),可達線速。LS1012A是一款適用于NAS、物聯(lián)網(wǎng)網(wǎng)關(guān)、寬帶以太網(wǎng)網(wǎng)關(guān)和工業(yè)自動化等市場應(yīng)用的低功耗產(chǎn)品。 了解詳情
    FET1012A-C核心板
  • FET3568-C核心板

    RK3568性能強而穩(wěn) 國產(chǎn)芯|飛凌嵌入式RK3568系列核心板,采用瑞芯微國產(chǎn)高性能AI處理器RK3568設(shè)計生產(chǎn),RK3568兼具CPU、GPU、NPU、VPU于一身,RK3568 性能、性價比在同類產(chǎn)品中具有較高優(yōu)勢,RK3568處理器是一款定位中高端的通用型SoC, 飛凌RK3568核心板主要面向工業(yè)互聯(lián)網(wǎng)、HMI、NVR存儲、車載中控、工業(yè)網(wǎng)關(guān)等領(lǐng)域。目前RK3568系列已經(jīng)批量穩(wěn)定出貨

    了解詳情
    FET3568-C核心板

推薦閱讀 換一批 換一批