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