1. 程式人生 > >高通CAMIF和OV sensor除錯經驗分享(轉)

高通CAMIF和OV sensor除錯經驗分享(轉)

【摘要】
要借用某高通平臺的camera介面,聯合OV(OmniVision)公司的sensor,實現手機攝像頭的拍照及錄影功能,需要處理兩晶片、顯示屏和需求配合的問題,在這個過程中遇到並解決了許多問題。 
【關鍵詞】
拍照  預覽  CAMIF
一、問題的提出
新手上路,第一次見到ov sensor,第一次認識Qualcomm的 CAMIF,沒有任何經驗,除錯中遇到諸多劫難,如沒有預覽不到任何象素點、影象色彩不對、拍照無效區域、dispsize設定不合適預覽全屏問題、黑白模式上層設不成、預覽和拍照範圍不一致的問題、軟體轉90度壓扁問題等等。 
二、解決思路
先做基礎理論的儲備。
VGA :640x480;
QVGA :320x240;
YUV格式:4:2:2
曝光控制/伽瑪增益/白平衡等都是效果方面的調整。
對於象素數較大的sensor,如1280x1024,由於資料量較大,通常預覽解析度640x512拍照解析度是1280x1024,且拍照時的PCLK是預覽時的2倍,這樣可以對VFE(video front end)來說是同樣的幀速率。
Ov7670的暫存器0x15的bit6可以切換sensor輸出HREF或HSYNC,我們用HREF。
Camera_process_config_vfe初始化VFE暫存器;
Qcamraw_set_header設定sensor幀頭;
程式碼分層:
層        Drivers        services        Oem層        App層
程式碼位置        camsensor        camera        Oemcamera.c        Qcamera.c/Qcamcorder.c



Trace32命令:data.image addr. 640. 480. /GS8,可方便的看某buffer地址中的圖片,判斷取到的預覽圖片內容和最終顯示的屏上的差異。
camera_qdsp_cb是收到幀等事件的回撥,根據預覽和拍照的不同需要,QDSP會送來不同的格式,本例中拍照格式是YUV422PS,預覽格式是RGB565LE。
要得到需要的幀率,需要給sensor暫存器設定時加入空白象素和空白行。對於ov7670,0x92/0x93加入空白行個數。
幀率的計算按照以下公式:
fps*(640+144)*(510+x)*2 = 12M(Pclk)
其中x是空行數,{0x92, 0x00},{0x93, 0x00}時,x為0,fps為15;{0x92, 0x19},{0x93, 0x01}時,x為281(0x119),fps為9.67。
如下圖1是x為0時的時序圖:



圖 1   VGA Frame Timing
三、實踐情況
3.1預覽
首先關注暫存器設定是否成功,測試發現寫完暫存器,再讀出的值和寫的部分不同,因為某些暫存器是在自動重新整理的。
對於sensor,只要供電正常,且有MCLK,就應該有行場同步及PCLK訊號。開始沒有測到訊號,後查出來同步訊號在傳輸過程中由於某管腳對地短路,衰減了。
要保證程式碼中主晶片和sensor側象素數(寬、高)、同步訊號極性(高低電平)和取樣頻率(PCLK)設定一致,才能預覽。主晶片通過CAMIF介面的暫存器設定。在camera_process_config_vfe中寫入。
軟體設定如下:

測出9.679fps時的波形如下圖:




















15fps的時序如下:
VSYNC High:66ms(約510=17+480+10 lines)Low 394us   週期約66ms 即15fps;
HSYNC High:106us (約1280 clks) low 24.4us 週期約130us;
VSYNC上升沿到HSYNC上升沿的time :1.98ms,約17 lines;
HSYNC下降沿到VSYNC下降沿的time :1.57ms,約10 lines;
PCLK是12MHz.
HREF、VSYNC都用做同步訊號,高通新近平臺上通過取樣同步訊號得到資料,有效行前邊的無效行不需精確設定,只要同步訊號電平給定即可。檢測計數到夠一幀才會產生中斷資料。
查完一切狀態正常,但從log檔案可以看看主晶片還是是未接到sensor的幀;
後再測訊號,發現HREF訊號實際板子上沒傳到CPU子板上。
總結經驗:硬體除錯時注意,訊號測試要逐級測試,從輸出一直到輸入點上,考慮硬體通路可能存在的傳輸問題。硬體電路容易有對地短路的點,如遇到訊號傳輸異常的。可以斷電側對地電阻,確認是否對地短路。
3.2拍照無效區域的問題
           
Dispsize設為216x160可以在128*160的屏上全屏預覽,但拍出的照片有一條雜色區域,如圖所示,這個問題在預設Dispsize設定128x96時也有。
30萬畫素,資料量比較小,預覽和拍照可以用同一解析度,所以snapshot不用重設暫存器,驅動中重設暫存器引起了拍照無效區域的問題,去掉解決。
3.4預覽和拍照範圍不一致的問題
CAMIF輸出的是一個橫長的影象,在豎長的屏上預覽需要裁減,因此造成了使用者看到的和拍到的明顯不一致,為解決這個問題,需要把sensor從橫著放置改為豎直放置,但是所用高通平臺沒有一個MDP,即影象旋轉的硬體加速器,軟體上的旋轉可能會增加負擔,對此,做了必要的驗證工作。
從原理上看,不旋轉和旋轉90度的處理演算法沒有明顯差異。
現象上看,軟體令camera_default_rotation =90,camera預覽和拍照及camcorder預覽及錄下的視訊都順時針轉了90度。
用task profiling跟蹤,不旋轉和旋轉90度佔用CPU時間一樣。詳如下圖:
旋轉:0度;  display size: 216x160; Image size :160*120

     九宮格   QCAMERA預覽 拍照      拍照      QCAMERA預覽
旋轉:90度;  display size: 216x160; Image size :160*120

     九宮格   QCAMERA預覽 拍照      拍照      QCAMERA預覽

3.5拍小尺寸照片壓扁問題
軟體和硬體都轉過90度之後,拍出來的大尺寸照片和預覽只有了微小差異,但小照片卻被壓扁了,從理論上分析,寬高比等和屏同樣很協調,怎麼也想不出道理。
最終用模擬器仔細跟蹤拍照過程中各引數的設定,找到了原因:預覽的CAMIF window根據 display_aspect_ratio不同分別基於寬或高來計算,拍照的CAMIF window也需要這麼處理,否則看到的和拍到的會不同。
因此在程式碼上加了類似的處理。

相關推薦

CAMIFOV sensor除錯經驗分享()

【摘要】 要借用某高通平臺的camera介面,聯合OV(OmniVision)公司的sensor,實現手機攝像頭的拍照及錄影功能,需要處理兩晶片、顯示屏和需求配合的問題,在這個過程中遇到並解決了許多問題。  【關鍵詞】 拍照  預覽  CAMIF 一、問題的提出 新手上路,第一次見到ov sensor,第一次

CAMIFOV sensor除錯經驗分享

要借用某高通平臺的camera介面,聯合OV(OmniVision)公司的sensor,實現手機攝像頭的拍照及錄影功能,需要處理兩晶片、顯示屏和需求配合的問題,在這個過程中遇到並解決了許多問題。 【關鍵詞】 拍照  預覽  CAMIF 一、問題的提出 新手上路,第一次見到

CMOS Sensor除錯經驗分享

CMOS Sensor的除錯經驗分享     我這裡要介紹的就是CMOS攝像頭的一些除錯經驗。  首先,要認識CMOS攝像頭的結構。我們通常拿到的是整合封裝好的模組,一般由三個部分組成:鏡頭、感應器和影象訊號處理器構成。一般情況下,整合好的模組我們只看到外面的鏡頭、介面和封

SPI指紋模組driver除錯

對於指紋模組,剛接手的時候覺得不就是個SPI很簡單。後來發現,供應商的deamon給我埋下了好多坑。因此做此記錄。 1、dts配置解析,由模組和原理圖上看,得知需要配置模組reset引腳,模組irq引腳,然後就是SPI介面線路,CS,MISO,MOSI,CLK,這些資訊如

平臺framework,hal,kernel開啟log【

本文轉載自:https://blog.csdn.net/u010164190/article/details/78625636 1 1.Add framework log 2 #define LOG_NDEBUG 0 3 2.Add hal log 4 #define LOG_NDEBU

CMOSSensor的除錯經驗分享

目前,包括移動裝置在內的很多多媒體裝置上都使用了攝像頭,而且還在以很快的速度更新換代。目前使用的攝像頭分為兩種:CCD(Charge Couple Device電荷偶合器件)和 CMOS(Complementary Metal Oxide Semiconductor互補金

Android M(6.0) 靜默安裝靜默解除安裝經驗分享

靜默安裝和解除安裝經驗: 靜默解除安裝: String appPackage ="被解除安裝應用的包名"; Intent intent = new Intent(mContext, mContext.getClass()); PendingIntent sender = P

ACM經驗分享[]

完全 分享 靈活 查找 -a 去重 運用 cin 離線 明確規則 規則:以最少的時間過題 (這意味著0ms與1000ms是一樣的) 了解規則,善用規則 雖然這個題我不會但是AC是沒有問題的 --ACRush 大力出奇跡 學會對拍數據,準備好對拍腳本:測試很重要;小數據很容

程式設計師經驗分享()

“又是一年畢業時”,看到一批批學子離開人生的象牙塔,走上各自的工作崗位;想想自己也曾經意氣風發、躊躇滿志,不覺感嘆萬千……本文是自己工作6年的經歷沉澱或者經驗提煉,希望對所有的軟體工程師們有所幫助,早日實現自己的人生目標。本文主要是關於軟體開發人員如何提高自己的軟體專業技術方

平臺中gpio簡單操作除錯

        做底層驅動免不了gpio打交道,所以對其操作和除錯進行了一下簡單的梳理 一、gpio的除錯方法         在Linux下,通過sysfs,獲取gpio狀態,也可以操作gpio。 1、獲取gpio狀態         cd /sys/kerne

android lcd除錯 平臺lcd除錯深入分析總結(mipirgb介面)

    各位網友:最近發現我這篇文章轉載的到處都是,有的則以原創存在,轉載時請註明出處,還有文中錯誤的地方請指正!謝謝合作。      下面點lk方法適用於8660,8064。當然qrd則沒有那麼複雜。 一:點亮lcd in kernel 其實點亮lcd很簡單必須保證以後幾個步驟正確: 1:確認Lcd資訊所

[Matlab]橢圓濾波器設計:低、帶帶阻

fig atl info grid AR subplot 要求 ear 波紋 橢圓濾波器(Elliptic filter)又稱考爾濾波器(Cauer filter): 這是在通帶和阻帶等波紋的一種濾波器。 橢圓濾波器相比其他類型的濾波器,在階數

除錯經驗——條條大路羅馬(能用多種方法完成一件任務的重要性)

使用CitrixReciver訪問公司內網,發現密碼今天就要過期了(好險!)。 於是,使用首頁的“Change Password”連結,打不開。 無奈,在Webapp中搜索“change password”,找到了一個change password的新連結,但問題是,不能成功修改。

11月8日科技聯播:特斯拉宣佈其CFO接替馬斯克擔任董事長;蘋果拒不和解要對簿公堂

馬斯克讓位,特斯拉現任CFO接任董事長;蘋果拒不和解,要和高通對簿公堂,70億美元專利費矛盾激化;聯想公佈二季度營收,創四年來新高;遊戲審批遇阻,騰訊決定削減營銷預算節省開支,一起來看今天的科技快訊: 特斯拉董事會提CFO出任董事長,即刻生效 據彭博社訊息,特斯拉董事會提名Robyn Denholm出

攝像頭除錯(OV8856)

http://blog.chinaunix.net/uid-7213935-id-5749314.html 一.硬體分析 在除錯的時候,一定要拿到電路圖,模組規格書,SENSOR IC datasheet。 下面是主 camera 電路圖: 由上面電路圖我們看樣看出,此模組有以下主要線路: 1.

一階RC濾波器的演算法實現(低)3102

目前,專案需要處理訊號。目標訊號是特定頻率範圍內的訊號。高頻視為干擾。而一階RC濾波器容易實現。但是網上資料往往沒有詳細的推導。因此在這裡把筆記記下。本文的優勢是比較詳細,引數配置都有公式依據。 目錄 1、一階RC低通濾波器的演算法實現 1.1 演算法推導 1.2 波特圖 1.3

CAMERA 除錯

Camera sensor bring up 2016年08月12日 13:14:19 tamell5555 閱讀數:4083 標籤: android 眾所周知,camera在我們生活中應用十分廣泛,在未來智慧硬體社會,camera就是裝置的眼睛,它的

SDM845平臺Sensor學習——4.SLPI(SAM Sensor)--

四:Sensor SLPI層SAM Sensor例項分析 上文中,我們大致瞭解了物理sensor driver整個流程,但在專案中,一般寫這種sensor driver的情況很少。這種sensor driver基本上都是各個vendor廠商

SDM845平臺Sensor學習——2.Hal層--

二:Sensor Hal層程式碼分析 Hal code放在/vendor/qcom/proprietary/sensors-see/中 sensors-hal資料夾中包含framework和sensors資料夾,為本文重點分析物件

Camera 驅動除錯要點(一)

本文主要介紹QCOM camera除錯的重要引數; (1)Lane_assign 和lane_mask    現在攝像頭基本都是mipi介面型別,因為前後攝都對應到平臺這邊不同的mipi介面,相應的資料lane需要一一對應;   lane assign:   lan