日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

MTK6577+Android之Camera驱动

發(fā)布時(shí)間:2023/12/16 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MTK6577+Android之Camera驱动 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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
  • CUSTOM_HAL_IMGSENSOR=ov5640_yuv??
  • CUSTOM_HAL_LENS=fm50afdummy_lens??
  • CUSTOM_HAL_MAIN_BACKUP_IMGSENSOR=??
  • CUSTOM_HAL_MAIN_BACKUP_LENS=??
  • CUSTOM_HAL_MAIN_IMGSENSOR=ov5640_yuv??
  • CUSTOM_HAL_MAIN_LENS=fm50af??
  • CUSTOM_HAL_MATV=??
  • CUSTOM_HAL_MSENSORLIB=mmc328xakm8975?ami304?yamaha530?mag3110?akmd8963??
  • CUSTOM_HAL_SENSORS=sensor??
  • CUSTOM_HAL_SUB_BACKUP_IMGSENSOR=??
  • CUSTOM_HAL_SUB_BACKUP_LENS=??
  • CUSTOM_HAL_SUB_IMGSENSOR=??
  • CUSTOM_HAL_SUB_LENS=dummy_lens??

  • 修改之后的kernel層的配置:

    [html]?view plaincopy
  • CUSTOM_KERNEL_IMGSENSOR=ov5640_yuv??
  • CUSTOM_KERNEL_JOGBALL=??
  • CUSTOM_KERNEL_KPD=kpd??
  • CUSTOM_KERNEL_LCM=ili9806e??
  • CUSTOM_KERNEL_LEDS=mt65xx??
  • CUSTOM_KERNEL_LENS=fm50afdummy_lens??
  • CUSTOM_KERNEL_MAGNETOMETER=akm8975??
  • CUSTOM_KERNEL_MAIN_BACKUP_IMGSENSOR=??
  • CUSTOM_KERNEL_MAIN_BACKUP_LENS=??
  • CUSTOM_KERNEL_MAIN_IMGSENSOR=ov5640_yuv??
  • CUSTOM_KERNEL_MAIN_LENS=fm50af??
  • CUSTOM_KERNEL_MATV=??
  • CUSTOM_KERNEL_OFN=??
  • CUSTOM_KERNEL_RTC=rtc??
  • CUSTOM_KERNEL_SOUND=amp_6329pmic_2in1_spk??
  • CUSTOM_KERNEL_SUB_BACKUP_IMGSENSOR=??
  • CUSTOM_KERNEL_SUB_BACKUP_LENS=??
  • CUSTOM_KERNEL_SUB_IMGSENSOR=??
  • CUSTOM_KERNEL_SUB_LENS=dummy_lens??


  • 雖然我們沒有后置攝像頭,但不能去掉dummy_lens,我嘗試過去掉之后用./mk r dr編譯會(huì)提示下面的錯(cuò)誤:

    [plain]?view plaincopy
  • prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld:out/target/product/hsimobile77_ics2/obj/SHARED_LIBRARIES/libcameracustom_intermediates/common/hal/lens/lenslist.o:in?function?global?constructors?keyed?tolenslist.cpp:mediatek/source/external/mhal/src/custom/common/hal/lens/lenslist.cpp:82:error:?undefined?reference?to?'pDummy_getDefaultData'??
  • make[3]:?***[out/target/product/hsimobile77_ics2/obj/SHARED_LIBRARIES/libcameracustom_intermediates/LINKED/libcameracustom.so]Error?1??


  • 4.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
  • //kandi?add?startat?2014.11.29??
  • #defineOV5640_FULL_PERIOD_PIXEL_NUMS_HTS??OV5640_FULL_PERIOD_PIXEL_NUMS??
  • #define??OV5640_FULL_PERIOD_LINE_NUMS_VTS???OV5640_FULL_PERIOD_LINE_NUMS??
  • ???
  • #defineOV5640_PV_PERIOD_PIXEL_NUMS_HTS??OV5640_PV_PERIOD_PIXEL_NUMS??
  • #define??OV5640_PV_PERIOD_LINE_NUMS_VTS???OV5640_PV_PERIOD_LINE_NUMS??

  • 這是參考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
  • ACDK_KD_SENSOR_INIT_FUNCTION_STRUCTkdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1]?=??
  • {??
  • ???????………….??
  • ???????#if?defined(OV5640_YUV)??
  • {OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV,?OV5640_YUV_SensorInit},??
  • #endif??
  • …………….??
  • }??

  • 也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc);

    mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h

    ?

    (3)??增加sensor ID和字符串的定義

    [cpp]?view plaincopy
  • #defineOV5640_SENSOR_ID????????????0x5640??
  • #defineSENSOR_DRVNAME_OV5640_YUV??"ov5640yuv"??

  • 4.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
  • MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[]?=??
  • {??
  • ………..??
  • #ifdefined(OV5640_YUV)??
  • ????YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV,?NULL),??
  • #endif??
  • …………??
  • }??

  • 注意:在 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
  • //?Capture?Size??
  • ???CONFIG_FEATURE_SI(FID_CAP_SIZE,??
  • ???????BY_DEFAULT(CAPTURE_SIZE_2560_1920),??
  • ???????CAPTURE_SIZE_1280_960,??CAPTURE_SIZE_1600_1200,??
  • ???????CAPTURE_SIZE_2048_1536,CAPTURE_SIZE_2560_1920??
  • ???)??
  • 4.4? Camera物理角度旋轉(zhuǎn)

    Cfg_setting_imgsensor.h

    [cpp]?view plaincopy
  • /*******************************************************************************?
  • *?Image?SensorOrientation?
  • *******************************************************************************/??
  • SensorOrientation_Tconst&??
  • getSensorOrientation()??
  • {??
  • ????static?SensorOrientation_T?const?inst?=?{??
  • ????????u4Degree_0??:?0,//270,//180,//90,???//?main?sensor?in?degree?(0,?90,?180,?270),kandi?change?from?90?to?180??
  • ????????u4Degree_1??:?0,???//??sub??sensor?in?degree?(0,?90,?180,?270)??
  • ????};??
  • ????return?inst;??
  • }??

  • 這幾種都試過了,但都不行,預(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
  • /*?
  • ????//?Capture?Size?
  • ????CONFIG_FEATURE_SI(FID_CAP_SIZE,?
  • ????????BY_DEFAULT(CAPTURE_SIZE_2560_1920),?
  • ????????CAPTURE_SIZE_1280_960,??CAPTURE_SIZE_1600_1200,?
  • ????????CAPTURE_SIZE_2048_1536,CAPTURE_SIZE_2560_1920?
  • ????)?
  • ????*/??
  • ?????//?Capture?Size??
  • ????CONFIG_FEATURE_SI(FID_CAP_SIZE,??
  • ????????BY_DEFAULT(CAPTURE_SIZE_1920_2560),??
  • ????????CAPTURE_SIZE_960_1280,??CAPTURE_SIZE_1200_1600,??
  • ????????CAPTURE_SIZE_1536_2048,CAPTURE_SIZE_1920_2560??
  • )??


  • ?

    我試過做上面的修改,但打開攝像頭的時(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。