基于V4L2的視頻驅動開發(1)
時間(jian):2017-01-05作者:華清(qing)遠見
編寫基于V4L2視頻驅動主要涉及(ji)到以下(xia)幾個知(zhi)識點(dian):
● 攝像頭方面的知識
● Camera解碼器、控制器
● V4L2的API和數據結構
● V4L2的驅動架構 本文介紹(shao)基于S3C2440硬件平臺的(de)V4L2視頻驅動開發(fa)。攝(she)像頭采用(yong)OmniVision公司的(de)OV9650和OV9655。主(zhu)要包含以下幾個方面的(de)內容: 視頻驅(qu)動的整(zheng)體驅(qu)動框架
● 3C2440 camera控制器+ov9650(ov9655) 一、 視頻驅動的(de)整體框架 視頻驅(qu)動的整體框(kuang)架見下圖(tu):
二、S3C2440 camera控制器+ov9650(ov9655) (1)S3C2440 camera控制器介紹 S3C2440支持(chi)ITU-R BT601/656格式的數字圖(tu)像輸入(ru),支持(chi)的2個通(tong)(tong)道的DMA,Preview通(tong)(tong)道和(he)Codec通(tong)(tong)道,參見下(xia)圖(tu)。
Preview通道可以(yi)將YCbCr4:2:2格式(shi)的(de)圖像(xiang)轉(zhuan)換為(wei)RGB(16bit或24bit)格式(shi)的(de)數據,并存(cun)(cun)放于為(wei)Preview DMA分(fen)配的(de)內(nei)存(cun)(cun)中,大(da)分(fen)辨率為(wei)640*480。主(zhu)要用于本地液晶屏顯示。如果(guo)將Preview DMA的(de)內(nei)存(cun)(cun)和Framebuffer內(nei)存(cun)(cun)重疊的(de)話,就可以(yi)實現采集直接輸出到液晶屏上了。 Codec通道可以輸出YCbCr4:2:0或(huo)YCbCr4:2:2格式(shi)到為Codec DMA分配的內存中。大分辨率(lv)為4096*4096。主要用(yong)于圖(tu)像(xiang)的編解碼處理。
上圖(tu)中的(de)window cut功能(neng)是指在圖(tu)像(xiang)可(ke)以先做一個裁(cai)剪。通過設置(zhi)CIWDOFST完成(cheng)此(ci)功能(neng),見(jian)下圖(tu)。圖(tu)像(xiang)進(jin)入P、C通道后,各自的(de)scaler單(dan)元還(huan)可(ke)以對其進(jin)行縮放(fang)、旋(xuan)轉等處(chu)理。
S3C2440 camera控制器支持乒乓存(cun)(cun)儲(chu)(chu)。為(wei)了防止采(cai)集和輸(shu)出之(zhi)間的沖突,采(cai)用(yong)了乒乓存(cun)(cun)儲(chu)(chu)方式。每次(ci)采(cai)集一幀后,自(zi)動轉到(dao)(dao)下(xia)一個存(cun)(cun)儲(chu)(chu)區。如果你因(yin)為(wei)內(nei)存(cun)(cun)空間不足,不想使用(yong)此功能的話,可(ke)以將四個區域設置(zhi)到(dao)(dao)同一塊空間。 在做(zuo)圖像處理時,需要關注到(dao)后存儲區中的圖像格式(shi),如codec通(tong)道硬件自動把Y、Cb、Cr分(fen)離存儲。
S3C2440 camera 控制器(qi)Last IRQ功能的使用,也是需要掌(zhang)握的。如果處理不好,輸(shu)出的圖像效果會(hui)受影響。
控制器(qi)會(hui)在(zai)每個(ge)VSYNC下降(jiang)(jiang)沿(yan)判(pan)斷ImgCptEn信號等(deng)命令。如(ru)果在(zai)下降(jiang)(jiang)沿(yan)發現ImgCptEn信號有效,則(ze)產生(sheng)IRQ中斷。然后才開(kai)始一(yi)(yi)幀(zhen)圖像的(de)真正(zheng)采集。而如(ru)果在(zai)VSYNC下降(jiang)(jiang)沿(yan)判(pan)斷到ImgCptEn為(wei)低電平且之(zhi)前LastIRQEn沒有使能,則(ze)不會(hui)產生(sheng)任何中斷,且不會(hui)再進行下一(yi)(yi)幀(zhen)的(de)采集。如(ru)果你想在(zai)ImgCptEn關閉后,一(yi)(yi)幀(zhen)采集完后產生(sheng)一(yi)(yi)個(ge)中斷通知你,那么就需要在(zai)后一(yi)(yi)次中斷產生(sheng)前(stop capturing后的(de)vysnc下將沿(yan))使能lastirq就可(ke)以(yi)了。 我(wo)在移植linux驅動時就遇到(dao)了一(yi)個Last IRQ的問題(ti)。現(xian)象是輸出圖(tu)像(xiang)上面總(zong)是有(you)一(yi)條比其它部分反應慢。采集運動圖(tu)像(xiang),就能看出現(xian)象。查看代碼是因為(wei)(wei)沒有(you)設立(li)lastirq,因為(wei)(wei)每次如果不在lastirq產生的情況下讀取,圖(tu)像(xiang)緩沖中的數據(ju)是不穩定的,可能照成(cheng)圖(tu)像(xiang)不完整。修(xiu)改代碼支持(chi)lastirq后,問題(ti)解(jie)決。 Camera控(kong)制器(qi)時(shi)鐘(zhong)設置也是需要(yao)注(zhu)意(yi)的,ov9650需要(yao)Camera控(kong)制器(qi)為(wei)其提供時(shi)鐘(zhong)。
提供(gong)(gong)給外部攝像頭(tou)的(de)時(shi)鐘是由(you)UPLL輸出時(shi)鐘分頻得到的(de)。而(er)CAMIF的(de)時(shi)鐘是由(you)HCLK提供(gong)(gong)的(de)。本例中(zhong),提供(gong)(gong)給ov9650的(de)時(shi)鐘為24M。 (2)ov9650(ov9655)設置方法 OV9650是OmniVision公(gong)司的(de)COMS攝像頭,130萬像素,支持SXVGA、VGA、QVGA、CIF等圖(tu)像輸出格式。 大速率在SXVGA時(shi)為15fps,在VGA時(shi)為30fps。 OV9650攝像頭時(shi)序如下圖:
上(shang)圖中D[9:2]用(yong)于(yu)8-bitYUV或者RGB565/RGB555(D[9]MSB、D[2]LSB)。D[9:0]用(yong)于(yu)10-bit RGB。本例中使用(yong)8-bit YUV模式。 我手邊(bian)開發板(ban)的(de)(de)Camera和S3C2440的(de)(de)接線原理圖(tu)如下(對應camera中具(ju)體的(de)(de)信號名稱參見前文的(de)(de)驅(qu)動整體架(jia)構圖(tu))。 注:GPG12用于PWEN信號
OV9650攝像頭設置(zhi)方法(fa)是(shi)通(tong)過SCCB總(zong)線設置(zhi) SCCB可(ke)以看作是(shi)一種簡化的I2C總線(xian),可(ke)以使用(yong)IO模擬SCCB時序。 (3)編寫ARM測試代碼測試camera功能 在(zai)Keil環境下(xia)編寫(xie)一個測試代碼完成從攝(she)像頭采集圖像輸出到液晶屏。下(xia)面列(lie)出程(cheng)序的流程(cheng)。
(4)編寫測試代碼過程中常見的問題 ● 攝像頭寄存器的配置(zhi) 因為攝(she)(she)像(xiang)頭(tou)有(you)很多寄(ji)存器(qi)(qi),可(ke)能一(yi)(yi)(yi)下(xia)無法(fa)理解(jie)里(li)面所(suo)有(you)的(de)(de)(de)(de)配置含義,所(suo)以(yi)開始時(shi)(shi)希(xi)望得(de)到一(yi)(yi)(yi)份可(ke)用的(de)(de)(de)(de)配置。但往往從別人的(de)(de)(de)(de)測試代碼(ma)中(zhong)拿到配置后,仍然無法(fa)使用。我這里(li)列出幾個(ge)可(ke)能的(de)(de)(de)(de)原因:(1)攝(she)(she)像(xiang)頭(tou)中(zhong)的(de)(de)(de)(de)圖像(xiang)輸(shu)出格(ge)式(shi)(shi)和(he)(he)你在(zai)camera控制(zhi)器(qi)(qi)中(zhong)設置的(de)(de)(de)(de)不一(yi)(yi)(yi)致(zhi),同一(yi)(yi)(yi)個(ge)攝(she)(she)像(xiang)頭(tou)可(ke)以(yi)設置多種輸(shu)入格(ge)式(shi)(shi),如:YCbYCr或(huo)CbYCrY。(2)圖像(xiang)輸(shu)出的(de)(de)(de)(de)一(yi)(yi)(yi)些(xie)時(shi)(shi)序和(he)(he)你的(de)(de)(de)(de)camera控制(zhi)器(qi)(qi)設置不一(yi)(yi)(yi)致(zhi),攝(she)(she)像(xiang)頭(tou)可(ke)以(yi)設置一(yi)(yi)(yi)些(xie)時(shi)(shi)序,如:圖像(xiang)數據在(zai)CAMPCLK的(de)(de)(de)(de)上升沿(yan)有(you)效還(huan)是下(xia)降沿(yan)有(you)效。(3)注意輸(shu)出圖像(xiang)的(de)(de)(de)(de)格(ge)式(shi)(shi)和(he)(he)Framebuffer控制(zhi)器(qi)(qi)的(de)(de)(de)(de)匹配,如字節順(shun)序等問(wen)題。 ● Ov9650和ov9655的使用區別 這里主(zhu)要列出兩(liang)者(zhe)之間在復位信號上(shang)有差(cha)別,ov9650是高電平(ping)(ping)復位,而ov9655是低電平(ping)(ping)復位。
相關資訊
發表評論
|