[入門指導]S5PV210下添加攝像頭驅動
OK210下添加攝像頭驅動
在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中的設置值。這些值決定了攝像頭的輸出數據的基本信息,包括采集信息的數據類型,視頻寬度高度等。一般由攝像頭供應商提供。
6. ov9650_module.cpp文件主要是提供了OV9650的操作類的具體實現。具體代碼請參考開發包中的相關文件。
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的系統時鐘,最大值不能超過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
//具體攝像頭使用那種采集模式請參閱攝像頭數據手冊
#define OV9650_MODULE_ITUXXX CAM_ITU601
//指定外部攝像頭掃描方法。
//對應210寄存器為CIGCTRL[n]> Cam_Interlace(第0位)
//1 =隔行掃描 0=逐行
//具體攝像頭采用掃描方法請參閱攝像頭數據手冊
//比如TVP5150采取的就是逐行掃描方式
#define OV9650_MODULE_INTERLACE 0
//指定外部攝像頭的輸入模式。
//對應210寄存器為CIGCTRL[n]> SelCam_CAMIF(第3位)
//1=MIPI模式 0 =ITU模式
//具體攝像頭采用輸入模式請參閱攝像頭數據手冊
#define OV9650_MODULE_MIPI (FALSE)
//指定攝像頭在8位模式下輸入的YCbCr順序
//對應210寄存器為CISRCFMT[n]>Order422_CAM[第14-15位]
//00 = Y0Cb0Y1Cr0…
//01 = Y0Cr0Y1Cb0…
//10 = Cb0Y0Cr0Y1…
//11 = Cr0Y0Cb0Y1…
//具體攝像頭輸出數據YCbCr順序請參閱攝像頭數據手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_YUVORDER CAM_ORDER_YCBYCR
//指定源水平像素數(相機或FIFO輸入)。
//欲了解更多信息,請參閱聚會擴展寄存器(SrcHsize_CAM_ext)。
//該值應該為16的倍數。如果PreHorRatioWinOfsEn設定為0,則必須為4的倍數。
//對應210寄存器為CISRCFMT [n]> SrcHsize_CAM[第16-28位]
//具體攝像頭輸出數據水平像素數請參閱攝像頭數據手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_HSIZE 640
//指定源垂直像素數(相機或FIFO輸入)。
//欲了解更多信息,請參閱聚會擴展寄存器(SrcHsize_CAM_ext)。
//該值應該為PreVerRatio的倍數。
//如果V scale down或者WinOfsEn 為0,則必須為2的倍數。
//對應210寄存器為CISRCFMT[n]> SrcVsize_CAM[第0-13位]
//具體攝像頭輸出數據垂直像素數請參閱攝像頭數據手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_VSIZE 480
//指定窗口水平偏移像素單元。
//它應該是2的倍數。通道0和通道2:該值為16的倍數。
//對應210寄存器為CIWDOFST [n]> WinHorOfst [第16-26位]
//具體攝像頭輸出數據請參閱攝像頭數據手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_HOFFSET 0
//指定窗口垂直偏移像素單元。隔行輸入的情況下,這個值應該是2的倍數。
//對應210寄存器為CIWDOFST [n]> WinVerOfst [第0-11位]
//具體攝像頭輸出數據請參閱攝像頭數據手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_VOFFSET 0
//控制CB,CR值的偏移量
//對應210寄存器為CISRCFMT[n]> UVOffset [第30位]
//具體攝像頭輸出數據請參閱攝像頭數據手冊并參考攝像頭設置字符串。
#define OV9650_MODULE_UVOFFSET CAM_UVOFFSET_0
//控制攝像頭模塊的外部輸入時鐘
//具體攝像頭需要使用的外部時鐘頻率請參閱攝像頭數據手冊
#define OV9650_MODULE_CLOCK 24000000
//控制210輸出到顯示的輸出模式
//對應210寄存器為CISRCFMT[n]> OutFormat[第29-30位]
//詳細設置請參考210芯片數據手冊
#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函數,在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函數,在switch循環中加入OV9650的選項。
其中參數DCAM_StreamMode_REG565_640X480_30可以在sensorformats.h文件中修改。
關于默認攝像頭的選擇。
(1)更新11月補丁后,需要更改WINCE600\PLATFORM\SMDKV210\SRC\BOOTLOADER\EBOOT下的menu.c文件。在menu.c文件中找到m_menuCameraType函數,在攝像頭選擇項中增加一條。在SetCameraType函數中,修改dwCameraType>6為新的數值。
(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(唯一標識)。