【轉】android camera(四):camera 驅動 GT2005

關鍵詞:android ?camera CMM 模組 camera參數 ?GT2005 攝像頭常見問題

平臺信息:

內核:linux
系統:android

平臺:S5PV310(samsung exynos 4210)?

作者:xubin341719(歡迎轉載,請注明作者)

android camera(一):camera模組CMM介紹

android camera(二):攝像頭工作原理、s5PV310 攝像頭接口(CAMIF)

android camera(三):camera V4L2 FIMC

android camera(四):camera 驅動 GT2005


攝像頭主要參數:

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中,完成上面兩個步驟的代碼,(這一點不同平臺也許有所不同,這里這是一個實例,這部分代碼只是針對三星平臺的)

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

2、 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), //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)

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

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過來協助解決,不過你想多研究一下的話,也可以,如果項目允許,就多看看,做到調試一個驅動,所有問題都了解,這樣對工作經驗、積累很重要的,希望對大家有用。

原文:http://blog.csdn.net/xubin341719/article/details/7727518

轉載于:https://www.cnblogs.com/cslunatic/p/3242414.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處:https://dhexx.cn/hk/18312.html

如若內容造成侵權/違法違規/事實不符,請聯系我的編程經驗分享網進行投訴反饋,一經查實,立即刪除!


相關文章:

  • 動態給表格TD 添加單擊事件
  • Spring三級緩存解決循環依賴
  • SPARK-SQL - Column相關的api操作大全
  • 【Demo 0014】網絡編程(ASI API)
  • 花布條錯誤案例
  • SPARK-SQL - sort排序相關的api大全
  • SPFA算法學習筆記
  • Java 8 新特性Lambda 表達式
  • 天將降大任于斯人也,必先苦其心志,勞其筋骨,餓其體膚,空乏其身,行拂亂其所為,所以動心忍性,增益其所不能...
  • SPARK-SQL - group分組聚合相關的api,groupBy().count(),groupBy().avg()等
  • MySQL創建定時任務
  • hdu 4657 Find Permutation
  • SPARK-SQL - group分組聚合api,agg()
  • SpringBoot整合lettuce+RedissonSentinel(哨兵模式)
  • C++大數類模板
  • matlab 中txt文件(含字符及數值)處理
  • SPARK-SQL - groupBy分組聚合相關的api,pivot實現行轉列
  • 輕松搞懂Java中的自旋鎖
  • SPARK-SQL - join關聯的api
  • NetworkManager 命令配置nmcli注意
  • HDU 4662 MU Puzzle 數論或者水題
  • Linux服務器使用Scp命令將數據拉取和接收到遠程服務器
  • C# 窗體間傳值方法大匯總
  • 第三方過濾器在TVideoGrabber中的使用
  • java獲取系統變量之System.getenv()和System.getProperty()
  • Jmeter壓測工具入門測試使用
  • [轉]Android讀寫文件
  • 一些食物的酸堿性
  • Spark Streaming入門 - 從Socket接收數據 實現wordCount統計單詞個數
  • Linux下使用Crontab定時執行腳本及多種案例
  • 怎樣安裝和制作淘寶店鋪裝修掛件
  • jdbcTemplate的學習經歷
  • Java正則表達式入門學習與實踐
  • Java:集合,Collection接口框架圖
  • Spark Streaming入門-編程入口JavaStreamingContext的實例化,構造方法匯總
  • IOS-synthesize和dynamic的異同(轉)
  • V8 API Reference Guide
  • Hadoop的內置的基本數據類型
  • Java中String的replace、replaceAll和replaceFirst方法
  • 【數據庫復習】第二章關系數據庫2
  • GhostDoc的使用
  • HDU 4870Rating(推公式)
  • spark常用RDD算子 - saveAsTextFile、saveAsObjectFile 可保存到本地文件或hdfs系統中
  • Linux服務器編輯jar包并重新運行與直接修改jar包
  • hdu 4686 Arc of Dream(矩陣快速冪)
  • 糾結的CLI C++與Native C++的交互
  • kafka概述,架構說明,相關的名詞解釋
  • JAVA基礎知識
  • 棧Stack和段寄存器SS,SP(學習匯編)
  • 【轉載】Linux下動態共享庫加載時的搜索路徑詳解