[入門指導(dǎo)]S5PV210下添加攝像頭驅(qū)動
OK210下添加攝像頭驅(qū)動
在OK210下添加攝像頭(自制的SDIO攝像頭)驅(qū)動,請參照如下流程:
1. 修改X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAIF\HAL\INC camera_typedef.h文件。
在上述文件中找到MODULE_SENSOR結(jié)構(gòu)體,在UNKNOWN_MODULE和MODULE_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上點(diǎn)擊右鍵,選擇add->new sources subproject
選擇 ,在subproject name 下輸入OV9650_MODULE(名稱自定)點(diǎn)擊完成。
3. 打開工程自動生成的文件夾,用文本編輯器打開sources文件,加入如下代碼:
INCLUDES= \
$(INCLUDES); \
$(_TARGETPLATROOT)\src\drivers\CAMERAIF\INC; \
$(_TARGETPLATROOT)\src\drivers\CAMERAIF\HAL\INC; \
$(_TARGETPLATROOT)\src\drivers\CMM; \
4. 打開上述工程,其中Readme文件可以刪除。在工程中添加兩個文件,ov9650_module_regs.h和ov9650_module.cpp。
5. ov9650_module_regs.h中記錄了需要寫入攝像頭I2C中的設(shè)置值。這些值決定了攝像頭的輸出數(shù)據(jù)的基本信息,包括采集信息的數(shù)據(jù)類型,視頻寬度高度等。一般由攝像頭供應(yīng)商提供。
6. ov9650_module.cpp文件主要是提供了OV9650的操作類的具體實(shí)現(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ù)(相機(jī)或FIFO輸入)。
//欲了解更多信息,請參閱聚會擴(kuò)展寄存器(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ù)(相機(jī)或FIFO輸入)。
//欲了解更多信息,請參閱聚會擴(kuò)展寄存器(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位]
//詳細(xì)設(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的選項(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)識)。
相關(guān)產(chǎn)品 >
-
OKMX6UL-C開發(fā)板
飛凌嵌入式專注imx6系列imx6ul開發(fā)板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計和生產(chǎn),i.mx6UL系列產(chǎn)品現(xiàn)已暢銷全國,作為恩智浦imx6ul,imx6ul開發(fā)板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。
了解詳情 -
OKMX6ULL-C開發(fā)板
40*29mm,雙網(wǎng)雙CAN,8路串口| i.MX6ULL開發(fā)板是基于NXP i.MX6ULL設(shè)計開發(fā)的的一款Linux開發(fā)板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對板連接器,適應(yīng)場景豐富。 了解詳情