MTK6577+Android之Camera驱动
MTK6577+Android之Camera驅(qū)動(dòng)
《MTK安卓平臺的Camera效果在線調(diào)試》
1.?????Camera拍照相關(guān)概念
?
1.1? ISP
?
isp——(Image Signal Processor)——影視處理
?
無論數(shù)碼相機(jī)、攝像機(jī)或者攝像手機(jī),其影像數(shù)據(jù)從前端感應(yīng)后,皆須經(jīng)過ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像處理(Pre-ISP)與后端影像處理(Post-ISP)四個(gè)階段后,影像數(shù)據(jù)才能最終呈現(xiàn)于終端設(shè)備上
?
1.2? 720p
720P是美國電影電視工程師協(xié)會(huì)(SMPTE)制定的高等級高清數(shù)字電視的格式標(biāo)準(zhǔn),有效顯示格式為:1280×720.SMPTE(美國電影電視工程協(xié)會(huì))將數(shù)字高清信號數(shù)字電視掃描線的不同分為1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一種在逐行掃描下達(dá)到1280×720的分辨率的顯示格式。是數(shù)字電影成像技術(shù)和計(jì)算機(jī)技術(shù)的融合。
?
分辨率為1280×720p/60Hz,行頻為45kHz
?
?
2.?????MTK6577Camera控制器部分
?
2.1? camera控制器概述
MT6577 camera可接受RAM和SOC傳感器處理之后的圖像數(shù)據(jù)(sensor image data),并輸出YUV數(shù)據(jù)給MDP(什么的簡稱)。Camera控制器可同時(shí)連接2個(gè)并行SOC傳感器,它提供像素缺陷補(bǔ)償(bad pixel compensation)、去馬賽克(demosaic)、邊緣曾強(qiáng)(edge enhancement)、標(biāo)準(zhǔn)色自適應(yīng)(preference color adaptation)、空間和暫時(shí)噪聲消除(spatial and temporal noise reduction)這些特征,用于圖像處理。
?
2.2? camera特征
?
MT6577內(nèi)部集成的ISP,包含了一個(gè)功能強(qiáng)大的圖像信號處理器,用于連接各種各樣的圖像傳感器模組,這個(gè)處理器由時(shí)序產(chǎn)生單元(timing generated unit: TG)、鏡頭/傳感器補(bǔ)償(lens/sensor compensation)單元和圖像處理單元。
?
支持的特征如下:(1)?? 抓圖分辨率達(dá)8M像素(image capture resolution)。
? ? ? ? ? ? ? ? ? ? ?? ? ??(2)?? 錄像分辨率達(dá)720p(video recording resolution)。
? ? ? ? ? ??(3)?? 原始圖像數(shù)據(jù)轉(zhuǎn)儲(chǔ)幀率8M@15(raw dump frame rate)。
? ? ?(4)?? 曝光抓圖率8M@7(burst capture rate)。(5)?? 圖像處理
低像素補(bǔ)償(poor pix compensation)、鏡頭陰影補(bǔ)償(lens shading compensation)、去馬賽克(demosaic)、色彩削波(color clipping)、局部對比度增強(qiáng)(local contrast enhancement)、伽瑪校正(gamma correction)、邊緣曾強(qiáng)(edge enhancement)、噪聲消除(noise reduction)、標(biāo)準(zhǔn)色自適應(yīng)(preference color adaptation)、空間和暫時(shí)噪聲消除(spatial and temporal noise reduction)。
?
(6)?? 3A統(tǒng)計(jì)和校正(statistics and correction)
(7)?? 閃爍檢測(flicker detection)。
?
2.3? camera框圖
TG只配合主圖像傳感器(master type image sensor),也就是說主圖像傳感器應(yīng)發(fā)送垂直和水平信號給TG。TG通過內(nèi)部自動(dòng)同步 (internal auto synchronization)或外部像素時(shí)鐘同步來提供傳感器所需要的數(shù)據(jù)時(shí)鐘和接收傳感器Bayer模式原始數(shù)據(jù)(Bayer pattern raw data)。TG的主要目的是為主圖像傳感器創(chuàng)建數(shù)據(jù)時(shí)鐘和接收垂直/水平同步信號與sensor數(shù)據(jù),然后產(chǎn)生Bayer數(shù)據(jù)的捕獲區(qū)域(grabbed area of Bayer data)或是YUV422/RGB565數(shù)據(jù)給鏡頭/傳感器補(bǔ)償(lens/sensor compensation)單元。
?
在Bayer原始數(shù)據(jù)輸入模式,鏡頭/傳感器補(bǔ)償(lens/sensor compensation)單元產(chǎn)生補(bǔ)償?shù)脑紨?shù)據(jù)給色彩處理單元(color process unit);在YUV422/RGB565 輸入模式,這步被忽略。
?
色彩處理單元接受來之鏡頭/傳感器補(bǔ)償(lens/sensor compensation)單元產(chǎn)生補(bǔ)償?shù)脑紨?shù)據(jù)或是YUV422/RGB565數(shù)據(jù)。ISP的輸出的是很容易被壓縮引擎(compress engine,JPEG編碼器和MPEG4編碼器)編碼的YCbCr888數(shù)據(jù)格式,它是其他數(shù)據(jù)格式轉(zhuǎn)化的基本數(shù)據(jù)域(比如R/G/B domain)(it can be the basic data domain of otherdata format translation such as the R/G/B domain)。ISP是流水線式(pipelined),在處理階段ISP硬件能夠?yàn)楹竺娴腁E/AF/AWB計(jì)算提取有意義的信息,這些信息被臨時(shí)保存在ISP寄存器或是內(nèi)存中,并且能夠被MCU讀取出來。
?
下面給出一些性能參數(shù):
3.?????原理圖設(shè)計(jì)
?
MT6577支持兩路camera接口,一路是MIPI接口,一路是并行接口,這里我們采用的是并行接口,下面給出MT6577 CAM并行接口定義:
Camera sensor連接座如下:
(1)??OV5640輸出的數(shù)據(jù)格式
《Y1MT6577 design notice V0.1.pdf》文檔給出這樣的說明:
Sensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9]
Sensor outputformat is RAM10,connect sensor output to CMDAT[0:9]
而我們采用攝像頭模組的驅(qū)動(dòng)IC為OV5640(500萬像素: active array size: 2592 x 1944) Sensor :outputformats: 8-/10-bit RGB RAW output,這是由OV5640寄存器0x4745決定的。原則就是:首先看硬件上采用的是8根數(shù)據(jù)線還是10根數(shù)據(jù)線,然后初始化參數(shù)-也就是寄存器設(shè)定也可以設(shè)定是8位或10位。如下圖:
(2)??OV5640IIC地址
?
IIC 8bit寫地址為0x78,讀地址為0x79,查詢Sensor規(guī)格書可以看到
(2)??OV5640IIC地址
?
IIC 8bit寫地址為0x78,讀地址為0x79,查詢Sensor規(guī)格書可以看到
圖7
IIC 8bit地址最后一位為0時(shí)是寫地址,為1時(shí)是讀地址。這屬于IIC通訊規(guī)則
?
?
?
4.?????驅(qū)動(dòng)實(shí)現(xiàn)
?
?
4.1? 相關(guān)代碼
(1)??CameraSensor驅(qū)動(dòng)相關(guān)文件
\mediatek\custom\common\kernel\imgsensor\ov5642_yuv
?
(2)??SensorID和一些枚舉類型的定義
\mediatek\custom\common\kernel\imgsensor\inc
kd_imgsensor.h---------SensorID
kd_imgsensor_define.h--------------一些枚舉類型的定義
?
(3)??Sensor供電
\mediatek\custom\common\kernel\camera\camera
kd_camera_hw.c和kd_camera_hw.h
?
(4)??KernelSpace的SensorList,imgsensor模塊注冊
\mediatek\custom\common\kernel\imgsensor\src
kd_sensorlist.c和kd_sensorlist.h-----------camera模塊加載
?
(5)??UserSpace的SensorList,向用戶空間提供支持的SensorList
\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
提供給用戶空間的SensorList
?
?
(6)??Sensor效果調(diào)整的接口
\mediatek\custom\common\hal\imgsensor\ov5642_yuv
?
?
4.2? 針對OV5640的修改
?
4.2.1???????mediatek\config\hsimobile77_ics2\ProjectConfig.mk
?
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv
mt9p017_raw表示后置攝像頭(也就是主攝像頭),mt9p017是攝像頭sensor驅(qū)動(dòng)IC,raw是sensor一種輸出的數(shù)據(jù)格式,是CCD或CMOS在將光信號轉(zhuǎn)換為電信號時(shí)的電平高低的原始記錄,單純地沒有將沒有進(jìn)行任何處理的圖像數(shù)據(jù),即攝像元件直接得到的電信號進(jìn)行數(shù)字化處理而得到的。
?
gc0329_yuv是前置攝像頭,yuvsensor一種輸出的數(shù)據(jù)格式,支持YUV/RGB格式的模組,一般會(huì)帶有ISP(image single processor),經(jīng)過A/D轉(zhuǎn)換過的原始數(shù)據(jù)經(jīng)過ISP處理生成YUV標(biāo)準(zhǔn)格式傳到BB。
?
我們采用的OV5640就帶有ISP,輸出YUV格式
?
(1)??把mt9p017_raw 改為ov5640_yuv,去掉gc0329_yuv因?yàn)槲覀兊漠a(chǎn)品沒有后置攝像頭
(2)??去掉類似CUSTOM_KERNEL_LENS后面的dummy_lens因?yàn)闆]有后置攝像頭
?
修改之后的HAL層的配置:
[html]?view plaincopy修改之后的kernel層的配置:
[html]?view plaincopy雖然我們沒有后置攝像頭,但不能去掉dummy_lens,我嘗試過去掉之后用./mk r dr編譯會(huì)提示下面的錯(cuò)誤:
[plain]?view plaincopy4.2.2???????mediatek\custom\common\kernel\imgsensor----------kernel層
?
(1)??創(chuàng)建ov5640_yuv并建立需要的文件
?
創(chuàng)建文件夾ov5640_yuv,把sensor IC廠家提供的ov5640yuv_Sensor.c放到此目錄下。另外拷貝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷貝過來改為ov5640yuv_Sensor.h等。
?
編譯發(fā)現(xiàn)mediatek\custom\common\kernel\imgsensor\ov5640_yuv\ov5640yuv_Sensor.c文件用到的OV5640_FULL_PERIOD_PIXEL_NUMS_HTS、OV5640_FULL_PERIOD_LINE_NUMS_VTS、OV5640_PV_PERIOD_PIXEL_NUMS_HTS和OV5640_PV_PERIOD_LINE_NUMS_VTS沒有定義,但ov5642yuv_Sensor.c是沒有這幾個(gè)宏定義,我暫時(shí)定義如下:
[cpp]?view plaincopy這是參考o(jì)v5642的相關(guān)定義來定義的。
?
(2)??在支持的sensor列表中增加目標(biāo)sensor
?
mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
在數(shù)組增加OV5640的內(nèi)容,如下:
[cpp]?view plaincopy也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc);
mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h
?
(3)??增加sensor ID和字符串的定義
[cpp]?view plaincopy4.2.3???????mediatek\custom\common\hal\imgsensor---------------HAL層
?
(1)??創(chuàng)建ov5640_yuv文件夾
但這些文件夾下該有哪些文件,有需要哪些內(nèi)容了,首先我對比了
ov3640_yuv和ov5642_yuv文件夾,只有cfg_ftbl_ov5642_yuv.h有差別:
?
圖8
這里主要是不同驅(qū)動(dòng)IC支持的分辨率不同,以及設(shè)置默認(rèn)的分辨率。
圖9
此文件下有兩個(gè)這樣的地方不同,這里是指自動(dòng)對焦模式。
?
因?yàn)槲覀兊腛V5640和OV5642非常接近,所以就直接把OV5642的目錄復(fù)制過來修改為OV5640即可。
?
所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷貝到imgsensor目錄下,改為ov5640_yuv
?
(2)??在支持的sensor列表中增加目標(biāo)sensor
?
\src\ sensorlist.cpp
[cpp]?view plaincopy注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驅(qū)動(dòng)的時(shí)候要注意,Sensor 添加的位置要一樣。否則驅(qū)動(dòng)會(huì)跑亂,輕則 ISP 參數(shù)不對,重則 Sensor 無法啟動(dòng)。
?
?
4.3? 拍照圖片尺寸設(shè)置
?
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
[cpp]?view plaincopy
4.4? Camera物理角度旋轉(zhuǎn)
Cfg_setting_imgsensor.h
[cpp]?view plaincopy這幾種都試過了,但都不行,預(yù)覽和實(shí)際的都是成某種鏡像關(guān)系。這是平臺是提供旋轉(zhuǎn)的功能。這個(gè)配置好了之后,如果方向不正確,可以通過驅(qū)動(dòng)中的方向調(diào)整函數(shù)進(jìn)行調(diào)整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)
參考:http://blog.csdn.net/loongembedded/article/details/41679977
?
?
?
看了OV5640的數(shù)據(jù)手冊,寄存器0x3820和0x3821是用于控制圖像發(fā)射(mirror)和翻轉(zhuǎn)(flip)的,在u4Degree_0=270情況下,OV5640YUVPreview()調(diào)用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),預(yù)覽和拍照后的預(yù)覽都是OK,但拍好的照片在電腦上打開的時(shí)候發(fā)現(xiàn)是順時(shí)針翻轉(zhuǎn)了90度。
http://bbs.csdn.net/topics/390837150
?
可是我在OV5640YUV_Sensor_Init()調(diào)用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)卻問題依舊,很奇怪。
?
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
[cpp]?view plaincopy?
我試過做上面的修改,但打開攝像頭的時(shí)候,提示”Unfortunately, Camera has stopped”
?
?
?
參考鏈接:
MTKAndroid Driver:camera
http://blog.csdn.net/cbk861110/article/details/17437283
?
?
MTK cameraimage sensor driver
http://blog.csdn.net/sunweizhong1024/article/details/8497790
?
MTK平臺的ISP架構(gòu)問題
http://bbs.52rd.com/forum.php?mod=viewthread&tid=272727
?
OV5640 YUV的自動(dòng)對焦功能為何沒有開啟
http://www.16rd.com/thread-10480-1-1.html
?
MTK Android Driver知識大全
http://blog.csdn.net/cbk861110/article/details/40931835
?
mtk camera移植步驟
http://blog.csdn.net/vasvas/article/details/39250473
?
關(guān)于 前置攝像頭安裝0度或者180度
http://blog.csdn.net/kkkvvv123/article/details/8809823
?
Camera 涉及的文件70
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html
?
OV5640全景模式預(yù)覽倒180度,拍照正常的問題
http://blog.csdn.net/guoguo295/article/details/21245815
總結(jié)
以上是生活随笔為你收集整理的MTK6577+Android之Camera驱动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AppUpdate
- 下一篇: MTK6577+Android启动---