S3C2440的camera接口特性及WinCE 下的驅(qū)動(dòng)
注意:C通道和P通道應(yīng)分別分配。分配成功后,應(yīng)將4組YCbCr信號(hào)的起始地址與分配給C通道的DMA緩沖區(qū)地址關(guān)聯(lián)起來,將4組RGB信號(hào)的起始地址與分配給P通道的DMA緩沖區(qū)地址關(guān)聯(lián)起來。格式不同時(shí),關(guān)聯(lián)的空間大小是不同的。如果C通道格式為YCbCr4:2:2,圖像寬度為CoDstWidtlh,圖像高度為CoDstHeight,分配的DMA地址為CoFrameBuffer,則二者的關(guān)聯(lián)關(guān)系為:
這樣分配的目的是,保證每一組YCbCr信號(hào)的地址空間是連續(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)寄存器
①把輸入視頻信號(hào)寬度配置為720像素,高度配置為288像素;
②把輸入視頻信號(hào)格式配置為BT.656 YCbcr 4:2:2格式;
③把輸入視頻信號(hào)順序配置為CbYCr;
④根據(jù)用戶的LCD顯示終端的分辨率配置P通道的圖像寬度、高度像素和格式;
⑤根據(jù)用戶對(duì)圖像的處理需求來配置C通道的圖像寬度、高度像素和格式;
⑥配置C通道的縮放系數(shù);
⑦配置P通道的縮放系數(shù);
⑧把C通道的DMA地址配置給4組起始地址寄存器;
⑨把P通道的DMA地址配置給4組起始地址寄存器。
2.4 創(chuàng)建camera流式驅(qū)動(dòng)接口函數(shù)
WinCE下的硬件驅(qū)動(dòng)程序大多采用流式驅(qū)動(dòng)來開發(fā),因?yàn)樗幸粋€(gè)一致的接口函數(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ū)動(dòng)程序每次被設(shè)備管理器加載時(shí)調(diào)用。其實(shí)現(xiàn)的功能如下:
配置SAA7113,分配C通道、P通道的DMA內(nèi)存空間,根據(jù)輸入信號(hào)源屬性和輸出圖像、預(yù)覽圖像屬性配置CAMIF寄存器。
創(chuàng)建一個(gè)事件CameraEvent,使用WinCE內(nèi)核函數(shù)InterruptInitialize(SYSINIR_CAM,CameraEvent,NULL,O)把該事件與camera的邏輯中斷號(hào)SYSINIR_CAM關(guān)聯(lián)起來,即當(dāng)中斷發(fā)生時(shí)激活該事件。
創(chuàng)建一個(gè)中斷服務(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ū)動(dòng)程序聯(lián)系的主要通道,用戶程序?qū)?a class="contentlabel" href="http://2s4d.com/news/listbylabel/label/camera">camera接口的控制及數(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的當(dāng)前狀態(tài),確定訪問哪一組緩沖區(qū)。
(3)CAM_Deinit()函數(shù)
當(dāng)卸載本驅(qū)動(dòng)時(shí),該函數(shù)負(fù)責(zé)釋放分配的內(nèi)存空間和資源。
(4)CAM_Open()函數(shù)
該函數(shù)內(nèi)部并沒有具體的功能代碼,只是當(dāng)用戶程序使用CreateFile(TEXT(“CAMl:”),GENERIC_READ|GENERIC WRITE,O,NULL,OP-EN_EXISTING,O,O)函數(shù)打開camera驅(qū)動(dòng)時(shí)調(diào)用該函數(shù),并返回一個(gè)文件句柄?;谠摼浔脩舨拍苓M(jìn)行后續(xù)操作。
(5)CAM_Close()函數(shù)
該函數(shù)內(nèi)部并沒有具體的功能代碼,只有當(dāng)用戶程序使用CloseFile(hfile)函數(shù)關(guān)閉camera驅(qū)動(dòng)時(shí)才調(diào)用該函數(shù),并釋放之前返回的文件句柄。其他接口函數(shù)沒用賦予其具體功能。
結(jié)語
按照上述方法開發(fā)的驅(qū)動(dòng)代碼,連同其他驅(qū)動(dòng)已在PB5.O環(huán)境下編譯通過,生成的內(nèi)核文件在原硬件平臺(tái)下成功運(yùn)行,P通道視頻圖像流暢,C通道圖像質(zhì)量較高。該方法彌補(bǔ)了目前國(guó)內(nèi)在WinCE 5.O/6.O操作系統(tǒng)環(huán)境下CCD攝像頭無法連接到S3C2440的camera接口的缺陷,為工程技術(shù)人員設(shè)計(jì)嵌入式圖像采集系統(tǒng)時(shí)提供了一種有效手段。
評(píng)論