CMOS圖像傳感器分爲兩類,非智能和智能。非智能的這類圖像傳感器只是支持傳統的攝像頭時序(場同步和行同步),然後輸出一個Bayer(拜耳)以及
統計的數據,而智能傳感器支持CCIR656視頻解碼格式,並且還提供了額外的一些圖像處理(例如:圖像壓縮,圖像濾波預處理,以及多種數據輸出格式)
CSI的包含的能力如下:
.前端-配置邏輯接口以便支持大多數通用的可用的CMOS攝像頭接口。
.支持CCIR656視頻接口以及傳統的攝像頭接口。
.8位數據口,支持方便YCC,YUV,Bayer或者是RGB的數據格式輸入。
.完全可控的8-bit或16-bit數據到32-bit的FIFO進行打包
.32*32大小的FIFO存儲接受到的的圖像像素數據,該FIFO可以通過可編程的IO或者是DMA進行讀取.
.後端-提供了直接到eMMA的預處理PrP塊接口(PrP和PP組成了MX27圖形加速器eMMA,PrP和PP能夠用來給視頻做預處理和後期處理,例如,放大,縮小,顏色轉換)
.提供sensor的可屏蔽中斷源,該中斷源也是中斷可控的: 開始Frame,結束Frame,Change of Field,FIFO Full
.提供給外部sensor用的,可配置的主時鐘頻率
.由統計數據產生的自動曝光(AE)和自動白平衡(AWB)控制。
39.1 CSI結構
39-5圖,顯示了CMOS攝像頭接口的框圖,它包含了2個控制寄存器(Control Register 1和3)來建立接口的時序以及中斷產生,另外一個控制器
(Control Register 2)用來產生統計數據,還有一個狀態寄存器,接口邏輯,數據包邏輯,CCIR時序編碼,中斷控制,主時鐘產生源,統計數據產生,
32*32圖像數據接受FIFO(RxFIFO),還有16*32統計數據FIFO(StatFIFO).
39.2 CSI接口信號描述
CSI模塊和外部的CMOS圖像傳感器的接口如下:
.CSI_VSYNC input Vertical Sync(Start of Frame) 攝像頭傳輸進CSI接口,是場同步接口,提供起始幀
.CSI_HSYNC input Horizontal Sync(Blank Signal) 攝像頭傳輸進CSI接口,是行同步接口,提供行同步信號,判斷消隱信號
.CSI_D[7:0] input 8-bit攝像頭數據總線(傳輸YUV,YCC,RGB,或者Bayer等數據)
.CSI_MCLK output Sensor Master Clock 該接口是CSI輸出接口,提供給外部攝像頭的主時鐘
.CSI_PIXCLK input pixel Clock 該接口是攝像頭輸出的像素時鐘,一般都等於MCLK主時鐘
在CSI的RxFIFO和eMMA的預處理塊PrP之間有一條用來快速傳輸數據的數據線. 該數據線可以enabled或者disabled。
當該bus enabled時,CSI的RxFIFO會從AHB總線上取消,並且連接到PrP上。任何CPU或者DMA通道到RxFIFO寄存器的請求讀取都將被忽略(因爲連接到PrP上了)
所有的CSI中斷都被MASK防止軟件訪問FIFO以及相關的狀態寄存器。
RxFIFO設定Full level等級爲4/8/16 Words,如果是24words那麼內部邏輯認爲是8Words.
用戶使用RxFIFO的full level來參考數據格式和線性寬度,來確保傳輸的幀是一個完整的幀, 圖像的大小(in Words)必須是RxFIFO設定的full level
的整數倍。
關係如下:
數據格式 每個像素包含的byte數目 每個Words包含的像素數目 RxFIFO Full level等級 所需要的線寬(line Width)
YUV422 2 2 4/8/16Words 8/16/32的倍數
YCC422 2 2 同上 8/16/32的倍數
RGB565 2 2 同上 8/16/32的倍數
RGB888 4 1 同上 4/8/16的倍數
Bayer 1 4 16/32/64的倍數
39.3 操作原理
該小段描述sensor接口的操作模式
CSI設計是爲了支持普通的sensor接口時序以及CCIR656的視頻接口時序。傳統的CMOS傳感器典型使用SOF,HSYNC(消隱),和PIXCLK信號
給Bayer或者YUV輸出。智能CMOS傳感器,一般在片上都有圖像處理,並且通常都支持視頻模式的傳輸,它們使用了內嵌的時序編碼來取代了SOF和BLANK信號。
該時序編碼依據的標準就是CCIR656.
39.3.1 門選通時鐘模式(Gated Mode)
VSYNC,HSYNC,以及PIXCLK信號採用的都是門選時鐘模式(脈衝門)
一個幀通常都開始於VSYNC的上升沿_||__,然後HSYNC信號開始變高HIGH,並且hold高電平整行數據(line)。並且當HSYNC信號是高電平的時候,
pixel clock纔是合法的像素時鐘,Data數據就是每HSYNC高電平期間,每個pixel clock上升沿讀取的數據纔是有效數據。當HSYNC爲低電平的時候
那麼該行就結束了。pixel clock就是不合法了,並且CSI也停止從stream中接收數據。然後等待下一行的HSYNC重複開始,最後重複VSYNC進入下一幀。
39.3.2 非門選通時鐘模式(non-Gated Mode)
該模式下,只有VSYNC和pixel clock兩個信號使用到,HSYNC是被忽略的。
該模式下,總的時間是和gated mode一樣的,區別只是在於HSYNC信號。HSYNC是被CSI忽略的,所有的pixel clock時鐘所表示的數據都是合法的,
其實區別就是Gate模式的pixel clock是一直開着的,而該模式下是和HSYNC同步進行了與門的操作,只保留了有效數據的pixel clock.所以pixel clock
在非法數據時候是低電平。
39.3.3 CCIR656接口模式
在CCIR656模式中,只有pixel clock和DATA[7:0]信號被使用到。起始幀VSYHC和BLANK消隱信號都被攝像頭內直接內嵌的時序編碼根據時序直接替換
爲有效數據流,不需要後期進行數據流的處理。每一個有效行伴隨SAV碼激活,並且伴隨EAV碼結束。有一些方案,數字化的消隱信號是插在SAV和EAV之間的。
CSI會從數據流中進行編碼以及濾出相關的時序,來還原VSYHC和HSYNC信號,來給內部使用,例如統計塊控制和CSI-to-PrP互連時。
數據從直接轉發,以原來連續的方式進行打包。因此,第一幀是跟在第二幀後面的(如果得到了2幀的話)。所以,該幀序是需要重新進行排序的,來還原原來的圖像。
COF(Change of Field改變域/幀/場) ,它觸發奇偶場的變化。中斷服務會讀取狀態寄存器來確定是否是當前的幀。
依據CCIR656標準,圖像必須是625/50幀的PAL,或者是525/60幀的NTSC格式。另外,圖像還要交錯成奇偶場, 垂直和行消隱數據都被填入特定的行。
數據必須是YCC422格式,每個像素包含了2 bytes,Y+Cr+Y+Cb.這些都是TV模式的設定。
該CSI僅僅支持PAL和NTSC制式。
從39-3圖中可以看到,SOF是一箇中斷,時序編碼timing codec中斷產生,表示來了新的幀,SOV1和SOV2是表示奇偶域。
39-4,39-5兩圖表示具體的碼和有效數據位。
39.3.4 CCIR656更進模式
CMOS攝像頭系統提供的VGA或CIF分辨率,CIF標準中,奇偶場交錯不用很嚴格的指出,因爲CIF圖像本身就很小,使用奇場或偶場就可以了。
一般是使用奇場,即Field 1.大多數的sensor都支持該CCIR模式,因此在CIF下,只要一個SOF中斷進入新的一幀,而不需要SOV來判斷奇偶場了。
39.3.5 CCIR656編碼錯誤校驗
依據CCIR編碼表,SAV和EVAV之間的保護數據是被編碼過的,使用這種方法,編碼器可以糾正1-bit錯誤,可以檢查2-bit的錯誤。
該特徵只是在CSI的CCIR編碼中,僅僅是奇偶交錯模式中支持。
39.4 中斷產生
39.4.1起始幀中斷Start Of Frame Interrupt(SOF_INT)--- 一般都是VSYHC的上升沿開始,就觸發了
在傳統模式中,VSYHC信號來自傳感器,因此SOF_INT中斷是由VSYHC信號的上升沿或者是下降沿觸發的。
在CCIR模式中,SOF中斷信息是從嵌入的代碼檢索出來的,並且產生SOF_INT的。
在CCIR更進模式中,有下面兩個SOF中斷:
.內部VSYHC模式,SOF是從嵌入的代碼檢索出來
.外部VSYHC模式,來自外部攝像頭輸入的VSYHC信號,根據VSYHC的上升沿或下降沿來產生SOF.
39.4.2 結束幀中斷End of Frame Interrupt(EOF_INT)
當一幀結束或者是一個在RxFIFO中的完整的幀數據被全部讀出時,EOF中斷就產生了,EOF並不在CSI的PrP模式中使用。
39.4.3 改變幀中斷Change Of Field Interrupt(COF_INT)
該中斷是用在CCIR奇偶域交錯的模式下使用,該中斷當Field 1 和Field 2交錯的時候產生。F1_INT和F2_INT會產生
39.4.4 CCIR錯誤中斷(ECC_INT)
CCIR中斷僅僅用在CCIR奇偶場交錯的模式下使用,因爲如果沒有奇偶場交錯的話,不需要校驗該幀的奇偶幀,如果有的話,那麼如果是錯誤下,
還將該奇偶場拼接進行合成的話,那麼畫面肯定出問題了。
39.4.5 Data Packing Style數據打包格式
由於圖像在採集的過程中,不同的端口大小,不同的階段,數據的字節順序是非常重要的。
爲了能夠靈活的對圖像數據進行打包,CSI模塊提供了數據交換空間,通過PACK_DIR和SWAP16_EN bits(包含在CSIRC1--CSI Control Register1中)
數據在提交給RxFIFO之前,利用設置PACK_DIR的bit位來進行打包。
39.4.6 RxFIFO路徑
Bayer數據是一個從圖像傳感器獲得典型的行數據。該數據寬度一定要通過軟件轉化爲RGB空間或者是YUV空間的數據格式。
PACK_DIR bit設置爲0,表示系統是小端,不是大端系統。使用P0,P1,P2,P3存放了打包了的數據內容,P0是第一個Data,依次,P3是最後一個data.
Page 1438
39.4.6.1 RGB565數據
(我們用的ov9660-0xd7[1:0]是選擇YUV還是RGB模式,YUV=00,RGB=01)
RGB565數據是從圖像傳感器獲得的處理過的數據,該數據可以直接顯示到Video Buffer上面。
這個數據格式是16-bits的寬度,該數據可以直接通過CSI給Memory,然後Memory給LCDC.
39.4.6.2 RGB888數據格式 ----24位bit屏可用
總結:
MX27提供了一個非常專業的攝像頭CSI接口,可以配置相關的口進行接口匹配。
我們的攝像頭是ov9660,輸出設定爲YUV模式,因此,CSI獲取的數據也是YUV格式的數據,因此還需要通過軟件,將YUV的格式轉化爲
RGB565、RGB656、RGB888格式放到LCDC對應的Memory進行顯示輸出。
轉化公式如下:
From RGB to YUV
Y = 0.299R + 0.587G + 0.114B
U = 0.492 (B-Y)
V = 0.877 (R-Y)
It can also be represented as:
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
From YUV to RGB
R = Y + 1.140V
G = Y - 0.395U - 0.581V
B = Y + 2.032U
我的額外話題:
當前攝像頭的參數我們基本上主要看:
1.攝像頭像素是多少萬的? 我這邊羅列了一部分
2560*1960 =4915200,也就是通常說的500W
1600*1200 =1920000,也就是200W
1280*960 =1228800,也就是130W像素
640*480=307200,也就是30W
該像素可以放映到你的抓圖上面的大小,該像素就是說明你的CMOS或者是CCD感光元件的像素點多少,可以想象在相同的面積上,數量越多,感光元件肯定要越小,感光元件小,那麼圖像的質量其實會變差,這個當然可以理解,但是從大的方面來說,只要鏡頭好,光源充足,那麼效果也會變好,這樣畫面就比像素低的更加的細膩,所以高像素的好處就在這裏。有種專業上的說法,是你的攝像頭達到幾線幾線的?
2.幀率?也就是看你的最大分辨率的時候能夠達到的最大幀率是多少?
像OV系列來說,一般最大的分辨率下的幀率是30幀左右,也可以調頻率進行提高。我們人的眼睛一般情況下,只要圖像能夠達到每秒30幀,那麼利用眼睛的視覺殘留,基本上可以感覺到圖像是連續的,人眼的視覺殘留時間超過30ms。
我調試攝像頭的時候,可以發現有個非常嚴重的現象就是,加開夜光模式的時候,幀率掉的非常嚴重,這個估計就是DSP後期處理的時候,處理不了每秒30幀,只能往下降了,黑白的話效果好一些。
3. 鏡頭也是非常關鍵的,這個就要看不同的廠家,不同的顯示效果
題外篇
我們買到的數碼相機,現在都是1300W以上的,但是並不是說我們的攝像模式下可以達到這個分辨率,不信的話你可以去試試看,因爲攝像要求比較高,需要達到每秒30幀以上,這個對DSP處理的負荷很重(RGB--顏色空間轉換----H264編碼/JPG編碼),有人說我們爲什麼不利用數碼相機的連續抓拍功能,這樣既能保證分辨率又可以攝像,其實原理是一樣的,抓拍也不可能高像素下達到每秒30幀。
還有,我們有一些非常高的像素是如何達到的呢?
其實現在的做法都是靠拼裝,也就是說兩塊CCD感光模塊分別進行攝像,然後在末端進行同步,這樣就能提高像素,而且DSP的負荷不用太過進行提升,但是這樣的拼裝方法有一個缺陷就是,如果模塊太多,那麼在末端進行同步就很難把握了,所以現在一般都是2個CCD或者3個CCD,再多就不行了。