S3C2440是應(yīng)用十分廣泛且適用于嵌入式系統(tǒng)的一款嵌入式處理器,。winCE 5.0/6.O是微軟公司開發(fā)的一款專用于嵌入式系統(tǒng)的實時操作系統(tǒng),。其模塊化設(shè)計使開發(fā)人員可以根據(jù)需求定制設(shè)備。目前,,國內(nèi)大部分OEM商都提供了對S3C2440的camera接口在WinCE5.O/6.0下的驅(qū)動支持,。遺憾的是,目前國內(nèi)OEM商提供的驅(qū)動僅限于對幾款微型攝像頭(如ov9650等)的驅(qū)動支持,。當用戶采用CCD攝像頭作為圖像采集的前端設(shè)備時,,原來的驅(qū)動已經(jīng)不能使用了,,而CCD攝像頭因其優(yōu)越的性能,在監(jiān)控領(lǐng)域扮演著主力軍角色,。本文從分析S3C2440的camera接口特性出發(fā),,詳細介紹當攝像設(shè)備為CCD攝像頭時,在WinCE 5.O/6.0操作系統(tǒng)環(huán)境下開發(fā)camera驅(qū)動的形式,、方法和主要的驅(qū)動代碼,。
1 camera接口特性
S3C2440處理器有一個專用的camera接口(CAMIF),該接口支持ITU-R BT.601/656 YCbCr 8位數(shù)據(jù)格式視頻數(shù)據(jù)輸入,,最大輸入視頻圖像大小為4 09* 096像素,。視頻輸入后分兩個通道逐幀保存圖像數(shù)據(jù),一個為預(yù)覽通道(即P通道),,另一個為編解碼通道(即C通道),。兩個通道均通過DMA方式將一幀圖像保存到系統(tǒng)內(nèi)存SDRAM中,在系統(tǒng)內(nèi)存*開辟了4組幀圖像緩沖,,從而保證了用戶應(yīng)用程序在讀取幀圖像數(shù)據(jù)時不影響另一幀圖像數(shù)據(jù)寫入,。其特性如下:
◆支持ITU-R BT.601/656 YCbCr 8位數(shù)據(jù)格式視頻數(shù)據(jù)輸入,并可調(diào)整Y,、Cb,、Cr三個信號的順序,以適應(yīng)不同的視頻信號源,;
◆具有DZI功能,,相當于數(shù)碼變焦;
◆C通道輸出圖像最大為4 09* 096像素,;
◆P通道輸出圖像最大為640×480像素,;
◆P通道輸出圖像格式可配置為RGBl6或GRB24;
◆C通道輸出圖像格式可配置為YCbCr 4:2:2或YCbCr 4:2:0:
◆輸出圖像可X方向鏡像翻轉(zhuǎn),、Y方向鏡像翻轉(zhuǎn),,或180°旋轉(zhuǎn);
◆DMA數(shù)據(jù)傳輸,,4組幀圖像緩沖,,2個對應(yīng)的中斷處理,保證視頻實時采集,;
◆2個通道不同圖像數(shù)據(jù)格式輸出,,便于用戶程序開發(fā)。
CAMIF對外接口信號定義如下:
CAMPCLK輸入的視頻像素同步時鐘,。
CAMVSYNC輸入的視頻幀同步時鐘,。
CAMHREF輸入的視頻行同步時鐘。
CAMDATA[7:0] 輸入的視頻8位數(shù)據(jù)。
CAMCLKOUT輸出的時鐘,,用于外接的沒有獨立時鐘的camera芯片的主時鐘。當外接的camera芯片有獨立的時鐘時,,該信號可不用,。
CAMRESET輸出的軟件復位信號,可對外接的camera芯片進行復位,。
信號的時序圖如圖1所示,。
使用CAMIF時,必須對CAMIF相關(guān)寄存器進行正確配置,,下面介紹主要寄存器的配置原理,。
CAMRCFMT 選擇輸入視頻信號源格式寄存器
①選擇輸入視頻信號源為ITU-R BT.601 YCbCr 8位數(shù)據(jù)格式,或ITU-R BT.656 YCbCr 8位數(shù)據(jù)格式,。
②選擇輸入視頻信號源水平像素大小和垂直像素大小,,一定要和外接的camera設(shè)備分辨率一致。
③選擇輸入視頻信號Ycbcr信號順序,,一定要和外接camera信號的實際順序一致,。
CIWDOFST 從輸入信號中截取中心部分的圖像寄存器
原理是:從輸入信號中截取中心部分的圖像輸出到大小不變的輸出圖像緩沖中,從而實現(xiàn)對圖像的放大或縮小,。
①配置該寄存器允許縮放或不允許縮放,。
②X方向圖像放大或縮小控制,原理是截切掉左部和右部的圖像像素數(shù),。
③Y方向圖像放大或縮小控制,,原理是截切掉上部和下部的圖像像素數(shù)。
CIGCTRL 全局控制寄存器
通過該寄存器對外接的camera進行復位,,即控制CAMRESET信號的電平高低,。
CICOTRGFMT C通道輸出圖像格式及大小配置寄存器
①可將C通道輸出圖像格式配置為YCbCr 4:2:2或YCbCr 4:2:0格式。
②可設(shè)置C通道輸出圖像X方向像素數(shù),。
③可設(shè)置C通道輸出圖像Y方向像素數(shù),。
④可設(shè)置C通道輸出圖像X方向鏡像。
⑤可設(shè)置C通道輸出圖像Y方向鏡像,。
⑥可設(shè)置C通道輸出圖像180°旋轉(zhuǎn),。
CIPRTRGFMT P通道輸出圖像大小配置寄存器
①可設(shè)置P通道輸出圖像X方向像素數(shù)。
②可設(shè)置P通道輸出圖像Y方向像素數(shù),。
③可設(shè)置P通道輸出圖像X方向鏡像,。
④可設(shè)置P通道輸出圖像Y方向鏡像。
⑤可設(shè)置P通道輸出圖像180°旋轉(zhuǎn),。
CICOSTATUS和CIPRSTATUS 狀態(tài)寄存器
CICOSTATUS反映C通道數(shù)據(jù)的寫入狀態(tài),,即4組緩沖的哪一組;CIPRSTATUS反映P通道數(shù)據(jù)的寫入狀態(tài),即4組緩沖的哪一組,。用戶程序采集圖像數(shù)據(jù)時,,應(yīng)根據(jù)狀態(tài)寄存器當前狀態(tài),決定從哪一組讀出數(shù)據(jù),。
此外,,CICOYSAl~CICOYSA4分別為C通道第1~4幀Y信號數(shù)據(jù)緩沖起始地址寄存器;CICOCBSAl~CICOCBSA4分別為C通道第1~4幀Cb信號數(shù)據(jù)緩沖起始地址寄存器,;CICOCRSAl~CICOCRSA4分別為C通道第1~4幀Cr信號數(shù)據(jù)緩沖起始地址寄存器,;CIPRCLRSAl~CIPRCLRSA4分別為P通道第1~4幀RGB信號數(shù)據(jù)緩沖起始地址寄存器。
2 WinCE下的驅(qū)動開發(fā)
目前,,我國市場上的CCD攝像頭只有模擬視頻輸出接口,,顯然它不能和S3C2440的camera接口直接連接,硬件上需要增加一塊解碼芯片,。解碼芯片把CCD的模擬信號解碼為BT.601/656 YUV4:2:2格式信號,,這個信號和CAMIF信號是匹配的,因此解碼芯片輸出就可以直接連接到S3C2440的camera接口,。典型的解碼芯片為SAA7113,,接口電路如圖2所示。
如果想簡化硬件電路和驅(qū)動代碼,,也可以根據(jù)需求向生產(chǎn)商定制CCD攝像頭,,要求生產(chǎn)商生產(chǎn)的CCD攝像頭直接按照ITU-R BT.601/656格式輸出視頻信號。具有這種接口的CCD攝像頭就可以直接和S3C2440的camera接口連接,,接口電路如圖3所示,。
兩種情況的驅(qū)動代碼開發(fā)過程基本上是相同的。區(qū)別是:前者需要S3C2440通過I2C總線對解碼芯片SAA7113的相關(guān)寄存器進行配置,,而后者則不需要,。下面以前者為例介紹驅(qū)動的開發(fā)方法。
2.1 配置解碼芯片SAA7113
SAA7113是NXP公司推出的視頻解碼系列芯片,,在很多視頻產(chǎn)品(如電視卡,、MPEG2、MPEG4)中都有應(yīng)用,。SAA7113的主要作用是把輸入模擬視頻信號解碼成標準的BT.656 YUV4:2:2數(shù)字信號,,相當于一種A/D器件。它兼容全球各種視頻標準,,在我國應(yīng)用時必須根據(jù)我國視頻標準來配置內(nèi)部寄存器,。
對SAA7113配置需要通過I2C總線進行,分配S3C2440的GPIO的E15模擬I2C的SDA線,,E14模擬I2C的SCL線,。OEM商提供的原驅(qū)動是針對手機攝像頭ov9650開發(fā)的,,二者的配置原理和過程是相同的,但配置內(nèi)容不同,,輸出圖像的格式也不同,。ov9650輸出的圖像是逐行掃描的,SAA7 113輸出的圖像則是隔行掃描的,。由圖1可知,,CAMIF是逐幀輸入的,所以必須把SAA3117的場同步信號VS作為CAMIF的幀同步信號CAMSYNC,,輸出圖像是逐場保存的,。配置內(nèi)容為:
①復位SAA3117,。
②模擬通道選擇,。
③配置亮度、色度,、對比度,、自動增益控制量。
④將RTSl引腳配置為場同步信號VS,,將RTSO信號配置為行同步信號HREF,,信號極性應(yīng)分別與圖1中CAMVSYNC和CAMHREF信號極性一致。
⑤配置圖像寬度為720像素,。
⑥配置幀圖像高度為576像素,,一幀圖像分奇偶兩場分時輸出,每場圖像高度為288像素,。
⑦配置數(shù)據(jù)格式為BT.656 YCbCr 4:2:2 8位格式輸出,。注意,數(shù)據(jù)口的信號順序為CB0 Y0 CR0 Y1 CBlY2…CR359 Y719,。
⑧時鐘采用24.576 MHz的獨立時鐘,,此時LLC的頻率為27 MHz,場頻為50Hz,,幀頻為25 Hz,。
2.2 為CAMlF分配DMA內(nèi)存空間
因為S3C2440從camera接口采集到的視頻數(shù)據(jù)是以DMA機制寫到內(nèi)存的,所以必須為C通道和P通道分別分配邏輯內(nèi)存(即DMA緩沖區(qū)),。Win CE有兩種分配DMA緩沖區(qū)的方法:使用CEDDK函數(shù)和使用winCE內(nèi)核函數(shù),。建議使用CEDDK函數(shù):
注意:C通道和P通道應(yīng)分別分配。分配成功后,,應(yīng)將4組YCbCr信號的起始地址與分配給C通道的DMA緩沖區(qū)地址關(guān)聯(lián)起來,,將4組RGB信號的起始地址與分配給P通道的DMA緩沖區(qū)地址關(guān)聯(lián)起來。格式不同時,,關(guān)聯(lián)的空間大小是不同的,。如果C通道格式為YCbCr4:2:2,,圖像寬度為CoDstWidtlh,圖像高度為CoDstHeight,,分配的DMA地址為CoFrameBuffer,,則二者的關(guān)聯(lián)關(guān)系為:
這樣分配的目的是,保證每一組YCbCr信號的地址空間是連續(xù)的,,便于用戶程序開發(fā),。
如果P通道格式為RGBl6,圖像寬度為PrDstWidth,,圖像高度為PrDstHeight,,分配的DMA地址為PrFrame. Buffer,則二者的關(guān)聯(lián)關(guān)系為:
如果P通道格式為RGB24,,圖像寬度為PrDstWidth,,圖像高度為PrDstHeight,分配的DMA地址為PrFrame. Buffer,,則二者的關(guān)聯(lián)關(guān)系為:
2.3 配置CAMIF相關(guān)寄存器
①把輸入視頻信號寬度配置為720像素,,高度配置為288像素;
②把輸入視頻信號格式配置為BT.656 YCbcr 4:2:2格式,;
③把輸入視頻信號順序配置為CbYCr,;
④根據(jù)用戶的LCD顯示終端的分辨率配置P通道的圖像寬度、高度像素和格式,;
⑤根據(jù)用戶對圖像的處理需求來配置C通道的圖像寬度,、高度像素和格式;
⑥配置C通道的縮放系數(shù),;
⑦配置P通道的縮放系數(shù),;
⑧把C通道的DMA地址配置給4組起始地址寄存器;
⑨把P通道的DMA地址配置給4組起始地址寄存器,。
2.4 創(chuàng)建camera流式驅(qū)動接口函數(shù)
WinCE下的硬件驅(qū)動程序大多采用流式驅(qū)動來開發(fā),,因為它有一個一致的接口函數(shù)供用戶調(diào)用。此處,,把接口函數(shù)命名為:CAM_Close(),、CAM_Deinit()、CAM_Init(),、CAM IOControl(),、CAM()pen()、CAM PowerDown(),、CAM_PowerUp(),、CAM_Read()、CAM_Seek()和CAM-_Write(),。
(1)CAM_Init()函數(shù)
該函數(shù)在驅(qū)動程序每次被設(shè)備管理器加載時調(diào)用,。其實現(xiàn)的功能如下:
配置SAA7113,,分配C通道、P通道的DMA內(nèi)存空間,,根據(jù)輸入信號源屬性和輸出圖像,、預(yù)覽圖像屬性配置CAMIF寄存器。
創(chuàng)建一個事件CameraEvent,,使用WinCE內(nèi)核函數(shù)InterruptInitialize(SYSINIR_CAM,,CameraEvent,NULL,,O)把該事件與camera的邏輯中斷號SYSINIR_CAM關(guān)聯(lián)起來,,即當中斷發(fā)生時激活該事件。
創(chuàng)建一個中斷服務(wù)線程,。在該線程內(nèi)用WaitForSintgleObjcet(CameraEvent,,INFINITE)函數(shù)阻塞線程,并等待CameraEvent激活,。把預(yù)覽視頻圖像的功能放到CameraEyent激活之后完成,,即把P通道緩沖區(qū)的內(nèi)容拷貝到顯示終端,。最后,,用InterruptDone(SYSINIR_CAM)函數(shù)結(jié)束本次中斷處理。
(2)CAM_IOControl()函數(shù)
可以說,,該函數(shù)才真正是用戶程序與驅(qū)動程序聯(lián)系的主要通道,,用戶程序?qū)amera接口的控制及數(shù)據(jù)采集均是通過該函數(shù)完成的,。其主要功能有:
①打開/關(guān)閉P通道或C通道輸出,。
②修改配置參數(shù)。
③控制輸出圖像的放大或縮小,。
④如果需要RGB數(shù)據(jù),,則讀取P通道緩沖區(qū)內(nèi)容,;
如果需要YCbCr數(shù)據(jù),則讀取C通道緩沖區(qū)內(nèi)容,。注意,,讀取之前要根據(jù)狀態(tài)寄存器CICOSTATUS或CIPRSTATUS的當前狀態(tài),確定訪問哪一組緩沖區(qū),。
(3)CAM_Deinit()函數(shù)
當卸載本驅(qū)動時,,該函數(shù)負責釋放分配的內(nèi)存空間和資源。
(4)CAM_Open()函數(shù)
該函數(shù)內(nèi)部并沒有具體的功能代碼,,只是當用戶程序使用CreateFile(TEXT(“CAMl:”),,GENERIC_READ|GENERIC WRITE,O,,NULL,,OP-EN_EXISTING,,O,,O)函數(shù)打開camera驅(qū)動時調(diào)用該函數(shù),并返回一個文件句柄,。基于該句柄用戶才能進行后續(xù)操作,。
(5)CAM_Close()函數(shù)
該函數(shù)內(nèi)部并沒有具體的功能代碼,,只有當用戶程序使用CloseFile(hfile)函數(shù)關(guān)閉camera驅(qū)動時才調(diào)用該函數(shù),,并釋放之前返回的文件句柄。其他接口函數(shù)沒用賦予其具體功能,。
結(jié)語
按照上述方法開發(fā)的驅(qū)動代碼,,連同其他驅(qū)動已在PB5.O環(huán)境下編譯通過,生成的內(nèi)核文件在原硬件平臺下成功運行,,P通道視頻圖像流暢,C通道圖像質(zhì)量較高,。該方法彌補了目前國內(nèi)在WinCE 5.O/6.O操作系統(tǒng)環(huán)境下CCD攝像頭無法連接到S3C2440的camera接口的缺陷,為工程技術(shù)人員設(shè)計嵌入式圖像采集系統(tǒng)時提供了一種有效手段,。