android camera(四):camera 驅動 GT2005

攝像頭主要參數:android

一、MCLK  24MHz;ide

二、PCLK  48~52MHz~;調試

三、電壓 1.8V(1.5V)、2.8V;orm

四、scl(IIC時鐘)100KHz或者400KHz。視頻

下載:經常使用攝像頭規格書(個別有android驅動程序)  :bf3703 30W、gc0308 30W、ov7670、gt2005 200W、gt2015 200W、NT99250 200W、s5k5ba 200W、s5k4ba接口

1、攝像頭驅動ip

咱們以GT2005爲例,來說述一個攝像頭驅動的調試過程:get

攝像頭和主控的關係圖,以下:it

攝像頭驅動比較簡單,完成一面三大步就能夠:io

攝像頭的上電、時鐘這些基本條件;

IIC保證攝像頭的初始化;

攝像頭工做後傳回數據到主控。

完成這三個步驟就完成了攝像頭基本工做的調試。

一、 攝像頭的上電、時鐘這些基本條件的實現

電源部分,上電時對應規格書,確認上電時序;MCLK攝像頭的主時鐘是否提供,看下面是和電和規格書中的

(1)、主意攝像頭工做要兩組電壓:1.8V(1.5V)、2.8V還有MCLK


程序中對電源控制:咱們在arch\arm\mach-smdkv310.c中,完成上面兩個步驟的代碼,(這一點不一樣平臺也許有所不一樣,這裏這是一個實例,這部分代碼只是針對三星平臺的)

#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代碼以下:

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以下所示。

二、 IIC和一些參數的配置

#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), //一、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,   //二、數據接口選擇(ITU\MIPI等)
    .fmt        = ITU_601_YCBCR422_8BIT,
    .order422    = CAM_ORDER422_8BIT_CBYCRY, //三、圖像數據格式 
 
    .i2c_busnum    = 1,
    .info        = >2005_i2c_info,
    .pixelformat    = V4L2_PIX_FMT_UYVY,    
    .srclk_name    = "mout_mpll",              //四、這部分關係到時鐘
    .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 */                            //五、信號的極性,    .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通訊是否正常,以下圖所抓到波形:

三、 完成上面兩步,攝像頭基本配置完成,咱們確認下輸出端PCLK、VHSN、SVSN、D1-D7

2、攝像頭調試過程當中常遇到的問題

一、錄相在預覽時正常,播放錄像時花屏(程序解釋爲三星s5pv210/s5pv310是的,其它的能夠參考,找相應代碼)


緣由分析:
(1)錄相用fimc2,

在android/device/samsung/proprietary/libcamera/SecCamera.cpp中
int SecCamera::startRecord(void)

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)

 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。

二、圖像干擾問題,以下圖所示


緣由多是:

(1)、攝像頭模組有問題,換一個攝像頭試一下;

(2)、數據線驅動能力不足,這個能夠在攝像頭寄存器裏面改,問下攝像頭模組FAE,看改那些地方;

(3)、兩個攝像頭共用數據線時,不工做的攝像頭會把工做的數據信號減弱;

(4)、PCB 走線太長,也會有干擾,不過我以爲這個可能性小,調試好就一款這樣的的,模組廠FAE說的,不過他們模組自己也有問題,兩方面因素都有吧:PCB(線過長)、模組打樣也有問題。

三、YUV順序不對:

yuv順序不對時,出現以下現象。


看下攝像頭規格書,把相應寄存器的值改一下就能夠了。以下以紅框裏是不一樣yuv順序,找到改成相應的。

四、 預覽方向不對(攝像頭寄存器只能改以 180度爲基數的,90度的就要在FIMC中改)

想知道和比較明確說明翻轉角度,最經常使用的就是寫一個「F」,而後看預覽裏的是怎麼轉的。

上面有90度的翻轉,由於這是FIMC中的寄存器,通常不會改這一部分的值。要不就在模組寄存器中改,要不就在上層。上面只是說明如何去確認圖像翻轉。

看下GT2005關於翻轉的寄存器吧:

五、 雜光,鬼影:

其行業的專業術語統稱爲Flare,是指在拍攝光源或者強光物體時,邊緣出現光影或出現一個完整物體的影子,並且這種現象只能減輕不能徹底消失,緣由是因爲鏡片的材質致使光線不但存在折射還存在反射,整機因爲鏡頭面到保護鏡片距離很大會更明顯!


 

六、 常見問題相關
攝像頭效果評測都有哪些?


以上以gt2005爲例,說了一下攝像頭驅動,和驅動中常見到的問題,若是上面的問題解決,攝像頭點亮,說明在平臺是運行是沒問題的,小的問題和細節,要找模組廠的FAE過來協助解決,不過你想多研究一下的話,也能夠,若是項目容許,就多看看,作到調試一個驅動,全部問題都瞭解,這樣對工做經驗、積累很重要的,但願對你們有用。

n  

相關文章
相關標籤/搜索