[入門指導]S5PV210下添加攝像頭驅動
在OK210下添加攝像頭(自制的SDIO攝像頭)驅動,請參照如下流程:
1. 修改X:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\CAMERAIF\HAL\INC camera_typedef.h文件。
在上述文件中找到MODULE_SENSOR結構體,在UNKNOWN_MODULE和MODULE_ID_MAX之間添加一條記錄,用于確定你所添加的攝像頭的唯一ID標識。記住該標識,該標識對以后的操作非常重要。比如你添加了攝像頭OV9650的驅動,在標識處你可以添加了標識OV_9650(名稱自定)。
在結構定義之后加入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.h和ov9650_module.cpp。
5. ov9650_module_regs.h中記錄了需要寫入攝像頭I2C中的設置值。這些值決定了攝像頭的輸出數(shù)據(jù)的基本信息,包括采集信息的數(shù)據(jù)類型,視頻寬度高度等。一般由攝像頭供應商提供。
6. ov9650_module.cpp文件主要是提供了OV9650的操作類的具體實現(xiàn)。具體代碼請參考開發(fā)包中的相關文件。
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(名稱自定)
該文件中將設定攝像頭的基本定義和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
//攝像頭采集端的模式,一般設置為ITU601或者ITU656。
//對應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
//指定外部攝像頭掃描方法。
//對應210寄存器為CIGCTRL[n]> Cam_Interlace(第0位)
//1 =隔行掃描 0=逐行
//具體攝像頭采用掃描方法請參閱攝像頭數(shù)據(jù)手冊
//比如TVP5150采取的就是逐行掃描方式
#define OV9650_MODULE_INTERLACE 0
//指定外部攝像頭的輸入模式。
//對應210寄存器為CIGCTRL[n]> SelCam_CAMIF(第3位)
//1=MIPI模式 0 =ITU模式
//具體攝像頭采用輸入模式請參閱攝像頭數(shù)據(jù)手冊
#define OV9650_MODULE_MIPI (FALSE)
//指定攝像頭在8位模式下輸入的YCbCr順序
//對應210寄存器為CISRCFMT[n]>Order422_CAM[第14-15位]
//00 = Y0Cb0Y1Cr0…
//01 = Y0Cr0Y1Cb0…
//10 = Cb0Y0Cr0Y1…
//11 = Cr0Y0Cb0Y1…
//具體攝像頭輸出數(shù)據(jù)YCbCr順序請參閱攝像頭數(shù)據(jù)手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_YUVORDER CAM_ORDER_YCBYCR
//指定源水平像素數(shù)(相機或FIFO輸入)。
//欲了解更多信息,請參閱聚會擴展寄存器(SrcHsize_CAM_ext)。
//該值應該為16的倍數(shù)。如果PreHorRatioWinOfsEn設定為0,則必須為4的倍數(shù)。
//對應210寄存器為CISRCFMT [n]> SrcHsize_CAM[第16-28位]
//具體攝像頭輸出數(shù)據(jù)水平像素數(shù)請參閱攝像頭數(shù)據(jù)手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_HSIZE 640
//指定源垂直像素數(shù)(相機或FIFO輸入)。
//欲了解更多信息,請參閱聚會擴展寄存器(SrcHsize_CAM_ext)。
//該值應該為PreVerRatio的倍數(shù)。
//如果V scale down或者WinOfsEn 為0,則必須為2的倍數(shù)。
//對應210寄存器為CISRCFMT[n]> SrcVsize_CAM[第0-13位]
//具體攝像頭輸出數(shù)據(jù)垂直像素數(shù)請參閱攝像頭數(shù)據(jù)手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_VSIZE 480
//指定窗口水平偏移像素單元。
//它應該是2的倍數(shù)。通道0和通道2:該值為16的倍數(shù)。
//對應210寄存器為CIWDOFST [n]> WinHorOfst [第16-26位]
//具體攝像頭輸出數(shù)據(jù)請參閱攝像頭數(shù)據(jù)手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_HOFFSET 0
//指定窗口垂直偏移像素單元。隔行輸入的情況下,這個值應該是2的倍數(shù)。
//對應210寄存器為CIWDOFST [n]> WinVerOfst [第0-11位]
//具體攝像頭輸出數(shù)據(jù)請參閱攝像頭數(shù)據(jù)手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_VOFFSET 0
//控制CB,CR值的偏移量
//對應210寄存器為CISRCFMT[n]> UVOffset [第30位]
//具體攝像頭輸出數(shù)據(jù)請參閱攝像頭數(shù)據(jù)手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_UVOFFSET CAM_UVOFFSET_0
//控制攝像頭模塊的外部輸入時鐘
//具體攝像頭需要使用的外部時鐘頻率請參閱攝像頭數(shù)據(jù)手冊
#define OV9650_MODULE_CLOCK 24000000
//控制210輸出到顯示的輸出模式
//對應210寄存器為CISRCFMT[n]> OutFormat[第29-30位]
//詳細設置請參考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攝像頭操作類的設置,請參考該類的設置書寫自己的攝像頭操作類。
//========================================================
// 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標識,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文件中修改。
關于默認攝像頭的選擇:
(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(唯一標識)。
相關產(chǎn)品 >
-
FET1012A-C核心板
LS1012A處理器采用64位Arm Cortex-A53內(nèi)核,可提供超過4,000的CoreMark性能以及用于數(shù)據(jù)包處理和安全性的硬件加速,以及任何1W典型電源通信處理器的整體性能。飛凌嵌入式LS1012A核心板基于NXP公司LS1012A處理器設計開發(fā),主頻1GHz,集多種SATA 3.0、PCIE2.0、USB3.0高速接口于一體。支持2個真千兆以太網(wǎng),可達線速。LS1012A是一款適用于NAS、物聯(lián)網(wǎng)網(wǎng)關、寬帶以太網(wǎng)網(wǎng)關和工業(yè)自動化等市場應用的低功耗產(chǎn)品。 了解詳情 -
FET3568-C核心板
RK3568性能強而穩(wěn) 國產(chǎn)芯|飛凌嵌入式RK3568系列核心板,采用瑞芯微國產(chǎn)高性能AI處理器RK3568設計生產(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)關等領域。目前RK3568系列已經(jīng)批量穩(wěn)定出貨
了解詳情