源碼地址: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 --->