CMOS攝像頭 ov7740驅動

源碼地址:https://github.com/yogach/linux-drive/tree/master/cmos_ov7740

硬件原理

自然景觀->攝像頭模塊->硬件接口->S3C2440的攝像頭控制器->LCD

 

ov7740(攝像頭模塊)

輸入信號: 自然景觀等的模擬信號

輸出信號: RGB、YUV格式的數字信號

 

1). ov7740參數

輸入信號: 自然景觀等的模擬信號

輸出信號:

可輸出格式爲:RAW RGB、YUV

可輸出分辨率爲:VGA(640*480)、QVGA(240*320)、CIF(352*288)、更小的任意大小

 

有效感光陣列的大小:656*488 = 320128(30W)像素

鏡頭的大小:1/5寸

像素點顆粒的大小: 4.2um * 4.2um

總結:

以上三個參數,用來描述感光陣列,同爲30W像素的攝像頭,鏡頭尺寸越小,那麼對應的像素點顆粒就越小,從而感光性就越差,進而拍攝的效果就越差。

 

 

輸入時鐘頻率: 6~27MHz 即0V7740攝像頭模組的工作頻率範圍。

 

掃描模式: 連續掃描

概念介紹:

連續掃描(P):從左到右 一行一行掃描。(720p的p就是代表連續掃描)

隔行掃描(I):每次間隔一行進行掃描

 

2).ov7740內部數據的處理流程

a.image sensor core 圖像傳感器核心部分:

翻轉、增益大小調整、黑電平校準、飽和度的控制、OTP存儲器

 

b.image sensor processor 圖像傳感器處理( 由自帶DSP處理)部分:

提供測試功能(可默認採集到的圖片是一塊固定的圖片)、鏡頭補償功能、自動白平衡、RAW RGB->RGB、RGB->YUV、窗口功能(將採集到原始進行裁剪)、縮小放大功能。

 

c.image output interface 圖像輸出接口部分:

輸出數據格式RAW RGB/YUV、輸出分辨率VGA/QVGA、數據傳輸方式BT601/BT656。

 

問:以上這些處理過程,不需要我們人爲的做任何設置,它們都能自動完成嗎?

答:以上這些處理過程,只有極少部分是自動完成的,而剩餘部分是需要我們設置後,才能完成。

 

問:怎麼對它們進行設置呢?

答:是通過IIC總線,操作OV7740的寄存器來進行設置的。

 

 

問:RAW RGB與RGB的區別是什麼?

答:所謂的RAW RGB就是隻有紅綠藍三種顏色的數據。而RGB數據,它不僅只表示紅綠藍三種顏色,而且還能表示由紅綠藍組合成的任何一種顏色。

 

問:RGB、YUV又分別是什麼?

答:RGB、YUV是兩種完全不同的顏色空間,它們之間可以相互轉換。

 

 

3). 原理圖(硬件接口)

控制類:

IICSDA -- IIC總線的數據線

IICSCL -- IIC總線的時鐘線

 

數據傳輸類:

CAMRST -- 復位CMOS攝像頭模塊

CAMCLK -- 攝像頭模塊工作的系統時鐘(24MHz)

CAM_HREF -- 行同步信號

CAM_VSYNC -- 幀同步信號

CAM_PCLK -- 像素時鐘

CAMDATA0~7 -- 數據線

 

總結:

1.CMOS攝像頭模塊的接口分爲兩類:

(1)控制類

-- 初始化:對攝像頭模塊進行相應的初始化操作,讓攝像頭模塊能夠正常的輸出攝像頭數據

-- 控制: 設置亮度、旋轉、縮放等等的操作

 

(2)數據傳輸類: 與LCD的接口完全一樣。

 

2.ov7740攝像頭模塊的控制類是一個IIC設備,需要給它寫符合IIC設備那套架構的驅動,從而實現初始化和靈活的控制。

 

此驅動進行設置之後,攝像頭輸出的數據格式如下:

分辨率爲640*480、30fps、格式YUV、傳輸方式BT601

 

 

 

4)s3c2440攝像頭控制器(CAMIF)

s3c2440攝像頭控制器支持BT601、BT656傳輸方式,支持YUV方式輸入編碼、支持最高分辨率爲4096*4096

 

問:BT601與BT656的傳輸方式有什麼區別?

答:BT601有獨立的行同步信號線、幀同步信號線,而BT656是將這兩種信號內嵌到數據中。

 

支持輸入的數據: BT601/656 分辨率4096*4096 8bitYUV

 

數據處理:可分爲預覽通道和編碼通道。

預覽通道:用於預覽(畫中畫)最大支持640*480分辨率,支持縮放、顏色空間轉化、旋轉,支持RGB16/24格式輸出,也支持輸出到緩存。

 

編碼通道:用於編碼使用,最大支持4096*4096分辨率,支持縮放、編碼、旋轉,支持YCbCr422/422格式輸出,也支持輸出到緩存。

 

中斷:中斷會在幀同步信號的下降沿時觸發,此時可讀取幀數據。

 

二、驅動編寫

使用的內核:linux-3.4.2

 

參考源碼:

第32課_新內核下的I2C驅動\i2c\1th_i2c_new_device

第2課第1.1.7節文檔和圖片(從0寫USB攝像頭)\myuvc

 

// camif寄存器設置
// CAMIF
/*
CISRCFMT:
	bit[31]	-- 選擇傳輸方式爲BT601或者BT656(1-BT601)
	bit[30]	-- 設置偏移值(0 = +0 (正常情況下) - for YCbCr)
	bit[29]	-- 保留位,必須設置爲0
	bit[28:16]	-- 設置源圖片的水平像素值(640)
	bit[15:14]	-- 設置源圖片的顏色順序(存儲格式)(02 = CbYCrY )
	bit[12:0]	-- 設置源圖片的垂直像素值(480)
*/
static unsigned long* CISRCFMT;

/*
CIWDOFST:
	bit[31] 	  -- 1 = 使能窗口功能、0 = 不使用窗口功能(此處選1)
	bit[30、15:12]-- 清除溢出標誌位
	bit[26:16]	  -- 水平方向的裁剪的大小
	bit[10:0]	  -- 垂直方向的裁剪的大小
*/
static unsigned long* CIWDOFST;

/*
CIGCTRL:
	bit[31] 	-- 軟件復位CAMIF控制器
	bit[30] 	-- 用於復位外部攝像頭模塊
	bit[29] 	-- 保留位,必須設置爲1
	bit[28:27]	-- 用於選擇信號源(00 = 輸入源來自攝像頭模塊)
	bit[26] 	-- 設置是否翻轉像素時鐘的極性(猜0)
	bit[25] 	-- 設置是否翻轉VSYNC的極性(0)
	bit[24] 	-- 設置是否翻轉HREF的極性(0)
*/
static unsigned long* CIGCTRL;

//設置顯存物理起始地址 用於DMA
static unsigned long* CIPRCLRSA1;
static unsigned long* CIPRCLRSA2;
static unsigned long* CIPRCLRSA3;
static unsigned long* CIPRCLRSA4;
/*
CIPRTRGFMT:
	bit[28:16] -- 表示目標圖片的水平像素大小(TargetHsize_Pr)
	bit[15:14] -- 是否旋轉(00-不旋轉)
	bit[12:0]	 -- 表示目標圖片的垂直像素大小(TargetVsize_Pr)
*/
static unsigned long* CIPRTRGFMT;
/*
CIPRCTRL:
	bit[23:19] -- 主突發長度(Main_burst)
	bit[18:14] -- 剩餘突發長度(Remained_burst)
	bit[2]	  -- 是否使能LastIRQ功能(不使能)
*/
static unsigned long* CIPRCTRL;
/*
CIPRSCPRERATIO:
	bit[31:28]: 預覽縮放的變化係數(SHfactor_Pr)
	bit[22:16]: 預覽縮放的水平比(PreHorRatio_Pr)
	bit[6:0]: 預覽縮放的垂直比(PreVerRatio_Pr)

CIPRSCPREDST:
	bit[27:16]: 預覽縮放的目標寬度(PreDstWidth_Pr)
	bit[11:0]: 預覽縮放的目標高度(PreDstHeight_Pr)

CIPRSCCTRL:
	bit[29:28]: 告訴攝像頭控制器(圖片是縮小、放大)(ScaleUpDown_Pr)
	bit[24:16]: 預覽主縮放的水平比(MainHorRatio_Pr)
	bit[8:0]: 預覽主縮放的垂直比(MainVerRatio_Pr)

	bit[31]: 必須固定設置爲1
	bit[30]: 設置圖像輸出格式是0-RGB16、1-RGB24 
	bit[15]: 預覽縮放開始
*/
static unsigned long* CIPRSCPRERATIO;
static unsigned long* CIPRSCPREDST;
static unsigned long* CIPRSCCTRL;
/*
CIPRTAREA:
	表示預覽通道的目標區域大小 此區域用於DMA功能 值爲目標寬度*目標高度
*/
static unsigned long* CIPRTAREA;
/*
CIIMGCPT:
	bit[31]: 用來使能攝像頭控制器
	bit[30]: 使能編碼通道
	bit[29]: 使能預覽通道
*/
static unsigned long* CIIMGCPT;

如何得到設備地址?

在ov7740手冊中寫明瞭設備地址:

 

寫 -- 0x42(01000010)

讀 -- 0x43(01000011)

8bit的地址 = 7bit設備地址(高七位) + 1bit的讀/寫控制位(低一位)

設備地址 = 0100001 = 0x21

 

 

問:爲什麼需要復位攝像頭模塊?

答:IIC能夠正常操作CMOS攝像頭模塊內部的寄存器的前提是:

-- 提供符合它需求的系統時鐘(CAMCLK)

-- 需要給它一個復位信號

 

問:怎樣才能復位攝像頭模塊?

答:通過操作CAMIF控制器中相應的寄存器,讓CAMRST發出復位信號,從而復位攝像頭模塊,具體操作見驅動源碼。

 

主突發長度

如果我們需要傳輸48字節數據,但是DMA無法一次性傳輸48字節,我們就要分批發送

按每次10字節發,此時這個10字節就稱爲主突發長度 。

48字節 = 10字節 + 10字節 + 10字節 + 10字節 + 8字節

 

剩餘突發長度

繼續上述例子,48字節按每10字節發送完畢後,最後一個8字節就是剩餘突發長度。

 

三、驅動測試條件:

1.

要有IIC總線驅動;

要有LCD驅動;

 

2.

要配置上V4L2相關選項

Device Drivers --->

<*> Multimedia support --->

<*> Video For Linux

[*] Video capture adapters (NEW) --->

[*] V4L USB devices (NEW) --->

[*] V4L platform devices --->

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章