標籤:
網路攝影機主要參數:
1、MCLK 24MHz;
2、PCLK 48~52MHz~;
3、電壓 1.8V(1.5V)、2.8V;
4、scl(IIC時鐘)100KHz或者400KHz。
下載:常用網路攝影機規格書(個別有android驅動程式) :bf3703 30W、gc0308 30W、ov7670、gt2005 200W、gt2015 200W、NT99250 200W、s5k5ba 200W、s5k4ba
一、網路攝影機驅動
我們以GT2005為例,來講述一個網路攝影機驅動的調試過程:
網路攝影機和主控的關係圖,如下:
網路攝影機驅動比較簡單,完成一面三大步就可以:
網路攝影機的上電、時鐘這些基本條件;
IIC保證網路攝影機的初始化;
網路攝影機工作後傳回資料到主控。
完成這三個步驟就完成了網路攝影機基本工作的調試。
1、 網路攝影機的上電、時鐘這些基本條件的實現
電源部分,上電時對應規格書,確認上電時序;MCLK網路攝影機的主時鐘是否提供,看下面是和電和規格書中的
(1)、主意網路攝影機工作要兩組電壓:1.8V(1.5V)、2.8V還有MCLK
程式中對電源控制:我們在arch\arm\mach-smdkv310.c中,完成上面兩個步驟的代碼,(這一點不同平台也許有所不同,這裡這是一個執行個體,這部分代碼只是針對三星平台的)
[cpp] view plaincopy
- #ifdef CONFIG_VIDEO_GT2005
- static void set_cam2005_main_power(int onoff)
-
- {
-
- unsigned int gpio;
- int err;
-
- if(onoff)
- {
- err = gpio_request(S5PV210_GPB(2), "GPB");
- if (err)
- printk(KERN_ERR "#### failed to request GPB2 for CAM\n");
- s3c_gpio_cfgpin(S5PV210_GPB(2),S3C_GPIO_OUTPUT);
- s3c_gpio_setpull(S5PV210_GPB(2), S3C_GPIO_PULL_UP);
- gpio_direction_output(S5PV210_GPB(2), 1);
- gpio_free(S5PV210_GPB(2));
-
- //RESET
- err = gpio_request(S5PV210_GPE1(4), "GPE1");
- if (err)
- printk(KERN_ERR "#### failed to request GPE1_4 for CAM\n");
- s3c_gpio_setpull(S5PV210_GPE1(4), S3C_GPIO_PULL_NONE);
- gpio_direction_output(S5PV210_GPE1(4),0);
- mdelay(100);
- gpio_direction_output(S5PV210_GPE1(4), 1);
- gpio_free(S5PV210_GPE1(4));
-
-
- //PWDN CAM_back
- err = gpio_request(S5PV210_GPB(4), "GPB");
- if (err)
- printk(KERN_ERR "#### failed to request GPB4 for CAM\n");
- s3c_gpio_cfgpin(S5PV210_GPB(4),S3C_GPIO_OUTPUT);
- s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP);
- gpio_direction_output(S5PV210_GPB(4), 0);
- mdelay(100);
- gpio_direction_output(S5PV210_GPB(4), 1);
- gpio_free(S5PV210_GPB(4));
-
- }
- else
- {
- ………………
- }
- return;
- }
- #endif
提供MCLK代碼如下:
[cpp] view plaincopy
- static int smdkv210_cam_clk_init(void)
- {
- unsigned int tempvalue=0;
- tempvalue = readl(S5P_CLK_DIV1);
- tempvalue = (tempvalue &0xffff0fff);
- writel(tempvalue,S5P_CLK_DIV1);
- tempvalue = readl(S5P_CLK_SRC1);
- tempvalue = (tempvalue &0xffff0fff)|0x00001000;
- writel(tempvalue,S5P_CLK_SRC1);
-
- return 0;
- }
這時拿示波器抓到上電時的波形和MCLK24MHZ的時鐘,訊號就說明我們完成了這一步,其實在實際工作中,我們一般出問題的時候才會測這些資料,確認問題點。
上電時序:
(1)、上電時序;
(2)、MCLK如下所示。
2、 IIC和一些參數的配置
[cpp] view plaincopy
- #ifdef CONFIG_VIDEO_GT2005
- static struct GT2005_platform_data GT2005_plat = {
- .default_width = 640,
- .default_height = 480,
- .pixelformat = V4L2_PIX_FMT_UYVY, // .freq = 24000000,
- .is_mipi = 0,
- };
-
- static struct i2c_board_info GT2005_i2c_info = {
- I2C_BOARD_INFO("GT2005", 0x78 >> 1), //1、IIC地址
- .platform_data = >2005_plat,
- };
-
- static struct s3c_platform_camera GT2005 = {
- #ifdef CAM_ITU_CH_A
- .id = CAMERA_PAR_A,
- #else
- .id = CAMERA_PAR_B,
- #endif
- .type = CAM_TYPE_ITU, //2、資料介面選擇(ITU\MIPI等)
- .fmt = ITU_601_YCBCR422_8BIT,
- .order422 = CAM_ORDER422_8BIT_CBYCRY, //3、映像資料格式
-
- .i2c_busnum = 1,
- .info = >2005_i2c_info,
- .pixelformat = V4L2_PIX_FMT_UYVY,
- .srclk_name = "mout_mpll", //4、這部分關係到時鐘
- .clk_name = "sclk_cam1",
- .clk_rate = 24000000, /* 24MHz */
- .line_length = 640, /* 640*480 */
- /* default resol for preview kind of thing */
- .width = 640,
- .height = 480,
- .window = {
- .left = 16,
- .top = 0,
- .width = (640 - 16),
- .height = 480,
- },
-
- /* Polarity */ //5、訊號的極性, .inv_pclk = 0,
- .inv_vsync = 1,
- .inv_href = 0,
- .inv_hsync = 1,
-
- .initialized = 0,
- .cam_power=set_cam2005_main_power
- };
- #endif
注意下面幾個參數:
(1)、IIC地址
(2)、資料介面選擇(ITU\MIPI等),這幾個資料介面我們在前面提到過;
(3)、映像資料格式 ,這就是我們前面提到的YVU\UVY之類不同的資料順序;
(4)、這部分關係到時鐘;
(5)、輸出訊號的極性,就是我們PCLK、VSYNC、HSVNC這些訊號的極性,不正確時會沒有映像之類現象,這個也要注意了。
完成這一步確認IIC通訊是否正常,如所抓到波形:
3、 完成上面兩步,網路攝影機基本配置完成,我們確認下輸出端PCLK、VHSN、SVSN、D1-D7
二、網路攝影機調試過程中常遇到的問題
1、錄相在預覽時正常,播放錄影時花屏(程式解釋為三星s5pv210/s5pv310是的,其它的可以參考,找相應代碼)
原因分析:
(1)錄相用fimc2,
在android/device/samsung/proprietary/libcamera/SecCamera.cpp中
int SecCamera::startRecord(void)
[cpp] view plaincopy
- m_cam_fd_rec = open(CAMERA_DEV_NAME2, O_RDWR);
-
- vendor\sec\sec_proprietary\smdkc110\libcamera\SecCamera.h
- #define CAMERA_DEV_NAME2 "/dev/video2"
(2)所用的視頻格式,在
android/device/samsung/proprietary/libcamera/SecCameraHWInterface.cpp中
void CameraHardwareSec::m_initDefaultParameters(int camera_id)
[cpp] view plaincopy
- int default_preview_pixel_format = mSecCamera->getPreviewDefaultPixelFormat();
- switch (default_preview_pixel_format) {
- default:
- case V4L2_PIX_FMT_NV21:
- p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP);
- break;
- case V4L2_PIX_FMT_NV12T:
- p.setPreviewFormat("yuv420sp_tiled");
- break;
- }
-
- 其中mSecCamera->getPreviewDefaultPixelFormat()在
- vendor\sec\sec_proprietary\smdkc110\libcamera\SecCamera.cpp中實現,
- int SecCamera::getPreviewDefaultPixelFormat(void)
- {
- return DEFAULT_PREVIEW_PIXEL_FORMAT;
- }
- 在android/device/samsung/proprietary/libcamera/SecCamera.h中設定初始值。我們這裡設的是
- #ifdef DUAL_PORT_RECORDING
- #define DEFAULT_PREVIEW_PIXEL_FORMAT (V4L2_PIX_FMT_NV21)
- #else
- #define DEFAULT_PREVIEW_PIXEL_FORMAT (V4L2_PIX_FMT_NV12T)
- #endif
以上得出視頻格式為V4L2_PIX_FMT_NV21。
2、映像幹擾問題,如所示
原因可能是:
(1)、網路攝影機模組有問題,換一個網路攝影機試一下;
(2)、資料線驅動能力不足,這個可以在網路攝影機寄存器裡面改,問下網路攝影機模組FAE,看改那些地方;
(3)、兩個網路攝影機共用資料線時,不工作的網路攝影機會把工作的資料訊號減弱;
(4)、PCB 走線太長,也會有幹擾,不過我覺得這個可能性小,調試好就一款這樣的的,模組廠FAE說的,不過他們模組本身也有問題,兩方面因素都有吧:PCB(線過長)、模組打樣也有問題。
3、YUV順序不對:
yuv順序不對時,出現如下現象。
看下網路攝影機規格書,把相應寄存器的值改一下就可以了。如下以紅框裡是不同yuv順序,找到改為相應的。
4、 預覽方向不對(網路攝影機寄存器只能改以 180度為基數的,90度的就要在FIMC中改)
想知道和比較明確說明翻轉角度,最常用的就是寫一個“F”,然後看預覽裡的是怎麼轉的。
上面有90度的翻轉,因為這是FIMC中的寄存器,一般不會改這一部分的值。要不就在模組寄存器中改,要不就在上層。上面只是說明如何去確認映像翻轉。
看下GT2005關於翻轉的寄存器吧:
5、 雜光,鬼影:
其行業的專業術語統稱為Flare,是指在拍攝光源或者強光物體時,邊緣出現光影或出現一個完整物體的影子,而且這種現象只能減輕不能完全消失,原因是由於鏡片的材質導致光線不但存在折射還存在反射,整機由於鏡頭面到保護鏡片距離很大會更明顯!
6、 常見問題相關
網路攝影機效果評測都有哪些?
以上以gt2005為例,說了一下網路攝影機驅動,和驅動中常見到的問題,如果上面的問題解決,網路攝影機點亮,說明在平台是運行是沒問題的,小的問題和細節,要找模組廠的FAE過來協助解決,不過你想多研究一下的話,也可以,如果項目允許,就多看看,做到調試一個驅動,所有問題都瞭解,這樣對工作經驗、積累很重要的,希望對大家有用。
android camera(四):camera 驅動 GT2005