基於mini2440的ov9650攝像頭裸機測試

 mini2440提供了一個攝像頭接口,可以輸出RGB24,RGB16的原始圖像還可以輸出編碼的如YUV格式的圖像,並提供了偏移翻轉,放大縮小的功能。與開發板配套的攝像頭模塊爲CAM130,採用ov9650的芯片。操作攝像頭接口實現視頻的採集與顯示,主要配置兩個部分的寄存器:ov9650的寄存器,攝像頭接口寄存器。
        ov9650寄存器在模塊的內部,s3c2440是以sccb總線來與ov9650通信。sccb總線類似iic總線,而且mini2440攝像頭接口的sccb總線就接在了他的iic接口上,所以可以通過Iic來配置ov9650的寄存器,同樣也可以用gpio來模擬sccb總線的時序。ov9650有大量的寄存器需要設置,但是一般不需要我們關心,廠商將一些常用的配置寫成數組,直接賦值就可以了。需要我們關心的是廠商ID寄存器,這個一般在攝像頭初始化之前用來判定攝像頭是否正確安裝。
        攝像頭接口寄存器的配置比較麻煩,大體上需要配置三類的寄存器。第一類是攝像頭接口輸入視頻格式寄存器CISRCFMT,功能是設置攝像頭接口的輸入數據的格式與長寬。s3c2440的攝像頭接口提供了兩個DMA通道,一個預覽輸出DMA,有四塊DMA緩衝區,這個通道用於將採集到的視頻圖像直接顯示到Lcd上。另外一個是編碼輸出DMA,也有四塊DMA緩衝區,用於後期處理視頻。所以第二類是預覽輸出視頻格式寄存器。這類寄存器主要有以下幾個:
CIPRTRGFMT      這個寄存器主要設置目標圖像的長寬與是否進行旋轉與鏡像處理
CIPRCTRL        突發長度寄存器,這裏的值與目標圖像的寬度有關,有計算公式,不需要關許只需要調用函數計算然後賦值給它就可以了
CIPRSCPRERATIO
CIPRSCPREDST
CIPRSCCTRL        這三個寄存器主要是設置縮放比例以及與縮放偏移相關的參數,需要以原始圖像以及目變圖像的大小作爲參數,通過一定的公式計算得出。公式是固定的直接用就可以了,不需要關心。CIPRSCCTRL這個寄存器尤其重要,因爲第30位是視頻輸出的格式,1爲RGB24,0爲RGB16格式,需要根據LCD的類型設置。我的mini2440採用的T35的lcd就是RGB16的屏,所以這裏需要設置成0,否則輸出到lcd的圖像顏色就不對,如果是RGB24的屏,則第30位要設置成1。
CIPRTAREA    目標圖像面積寄存器,這個主要用於決定DMA一次傳送的數據量
CIPRCLRSA1
CIPRCLRSA2
CIPRCLRSA3
CIPRCLRSA4   這四個寄存器是DMA目的寄存器,也就是攝像頭接口輸出存放數據的地方,如果直接顯示的話就要都賦值成Lcd的幀緩衝首地址
        第三類寄存器是編碼輸出視頻格式寄存器,與第二類相似。攝像頭接口還有一些功能寄存器需要設置,如時鐘寄存器CAMDIVN,與控制寄存器CIGCTRL,負責設置信號的極性以及攝像頭的復位。綜上所述,操作攝像頭需要以下幾個步驟:

    (1) 讀取廠商ID,來判定攝像頭是否安裝正確,這首先需要正確操作sccb總線,這一步也可以用來判定sccb總線時序是否正確。   

    (2) 配置攝像頭,事先將寄存器的地址以及對應的值寫入數組,直接通過循環完成配置,配置完成之後就不需要操作sccb總線了,也就是不需要管ov9650這端了。以下的操作設置攝像頭接口這端的寄存器就可以了。

    (3) 設置攝像頭所需的時鐘,設置控制寄存器,復位攝像頭。
    (4) 根據lcd的類型以及需要顯示視頻的大小,設置源圖像寄存器,預覽輸出寄存器等
        以上是使用攝像頭接口的預覽輸出功能的基本操作步驟,還有每採集一幀圖像,攝像頭都會產生中斷。具體程序在我的下載資源裏:http://download.csdn.net/detail/yaozhenguo2006/4001720 是在ubuntu下用amr-linux-gcc編譯的,如果安裝了arm-linux-gcc並且將命令導入到了環境變量裏,直接在代碼目錄下make就可以了,程序參考了http://blog.csdn.net/zhaocj/article/details/5653479,感謝博主對攝像頭詳盡的講述。在mini2440開發板上(配套lcd爲統寶3.5寸屏)程序是可以正確運行的,如果其他的屏幕需要改一下參數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章