MTK6577+Android之Camera驱动) ~% d
生活随笔
收集整理的這篇文章主要介紹了
MTK6577+Android之Camera驱动) ~% d
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
" L$ S, u5 d
7 O/ `??z??x, N6 i
& V* |2 h3 h* j3 W1 s
MTK6577+Android之Camera驅動 ! I& i??w$ \??G; F5 V- H??N& n
圖1
1.? ???Camera拍照相關概念 # r& y. L5 L6 p0 z7 o
1.1??ISP + y! d/ P8 t2 K- d3 l
* @5 ^- d' \, G4 D' n! h) T
isp——(Image Signal Processor)——影視處理 & J' D9 G" I$ X, c
& P7 A0 u; [??S; U4 z8 N8 K4 d6 C5 L
無論數碼相機、攝像機或者攝像手機,其影像數據從前端感應后,皆須經過ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像處理(Pre-ISP)與后端影像處理(Post-ISP)四個階段后,影像數據才能最終呈現于終端設備上
$ Z4 B& c! I, t5 s' v5 }??l4 X( W' l* n
1.2??720p $ g9 v( U+ L8 R" U( X! L' b3 K
720P是美國電影電視工程師協會(SMPTE)制定的高等級高清數字電視的格式標準,有效顯示格式為:1280×720.SMPTE(美國電影電視工程協會)將數字高清信號數字電視掃描線的不同分為1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一種在逐行掃描下達到1280×720的分辨率的顯示格式。是數字電影成像技術和計算機技術的融合。
分辨率為1280×720p/60Hz,行頻為45kHz
???% O: e. l6 v
2.? ???MTK6577Camera控制器部分 / ~$ I# Y: w" ?7 i
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)這些特征,用于圖像處理。
6 i' y9 |& j( j% a
2.2??camera特征
/ j/ P$ \3 L" p
MT6577內部集成的ISP,包含了一個功能強大的圖像信號處理器,用于連接各種各樣的圖像傳感器模組,這個處理器由時序產生單元(timing generated unit: TG)、鏡頭/傳感器補償(lens/sensor compensation)單元和圖像處理單元。 * m+ b' j# w- S% T5 E3 w7 o/ f
7 b/ n. C1 S9 [9 K
支持的特征如下: 9 N7 z$ E# o8 i; c
(1)? ?抓圖分辨率達8M像素(image capture resolution)。
(2)? ?錄像分辨率達720p(video recording resolution)。 9 H4 ]# u1 ]1 {5 H& k
(3)? ?原始圖像數據轉儲幀率8M@15(raw dump frame rate)。 % ?. k6 a2 g8 N' d% [+ c7 L
(4)? ?曝光抓圖率8M@7(burst capture rate)。
(5)? ?圖像處理 1 f1 D. v; e+ ^, K
低像素補償(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)。
3 |, l' d+ `* ^' R
(6)? ?3A統計和校正(statistics and correction)
(7)? ?閃爍檢測(flicker detection)。
2.3??camera框圖 - N3 F- s7 j6 N' D( _' @( s
+ }5 v* I??X9 j! |. Y1 H* K( ]
1 i0 J/ s' f6 Q7 \4 t+ U0 B
圖2 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 輸入模式,這步被忽略。 $ s9 ^2 C% m1 ^: p, o
% ]' C7 E( V7 Y# T
色彩處理單元接受來之鏡頭/傳感器補償(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讀取出來。
下面給出一些性能參數:
' x8 `6 _/ s/ j5 V??v- G
圖3 : i5 L4 M7 \' ]2 [9 W6 m" J4 }
3.? ???原理圖設計 ; d7 x: j6 F! D, n" `0 I
( Y- G8 [: a- u0 W5 L0 V/ B2 [
MT6577支持兩路camera接口,一路是MIPI接口,一路是并行接口,這里我們采用的是并行接口,下面給出MT6577 CAM并行接口定義: ??[3 w# m3 k; ]3 V; H- \
8 d2 S# b% {7 i2 D" z
圖4 Camera sensor連接座如下:
5 U- }! R# `/ t. V
6 W$ ~??w8 u+ F8 t8 b1 J
圖5
(1)??OV5640輸出的數據格式 4 z( `: Q# l2 V) ^! N" y9 U
《Y1MT6577 design notice V0.1.pdf》文檔給出這樣的說明: 4 ^. u7 R' |??Z7 B* R! f+ d
Sensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9] ' n- l2 J/ p1 d% y! h; M/ v??O5 ^! X3 B
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位。如下圖:
' s) s' H- Q* I5 {6 T" B4 F
圖6
+ p8 x+ I& Y4 ^; H1 K) ?0 b5 G
(2)??OV5640IIC地址
) ?! [& a2 G6 w! K
IIC 8bit寫地址為0x78,讀地址為0x79,查詢Sensor規格書可以看到:
圖7 IIC 8bit地址最后一位為0時是寫地址,為1時是讀地址。這屬于IIC通訊規則
$ K" X' m) V6 G; g
4.? ???驅動實現 9 c- A2 _- e( v- Z
4.1??相關代碼
(1)??CameraSensor驅動相關文件 9 _6 M, V0 K3 `% F! G) n* {$ W??V
\mediatek\custom\common\kernel\imgsensor\ov5642_yuv
(2)??SensorID和一些枚舉類型的定義
\mediatek\custom\common\kernel\imgsensor\inc
kd_imgsensor.h---------SensorID
kd_imgsensor_define.h--------------一些枚舉類型的定義 3 e# y5 @2 `0 i' E+ z& ]( Y5 X/ ]1 i
(3)??Sensor供電
\mediatek\custom\common\kernel\camera\camera 4 F$ k: E. a+ j; i1 @9 Y: J
kd_camera_hw.c和kd_camera_hw.h
(4)??KernelSpace的SensorList,imgsensor模塊注冊 2 M3 f, h2 I" r4 q4 I
\mediatek\custom\common\kernel\imgsensor\src
kd_sensorlist.c和kd_sensorlist.h-----------camera模塊加載 4 ?7 Q3 k9 {7 e! k' e/ ^
8 V8 N* j5 j1 b1 }, I??Q" R9 {+ ]
(5)??UserSpace的SensorList,向用戶空間提供支持的SensorList , g$ ~: y' T4 h6 {$ S
\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
提供給用戶空間的SensorList
(6)??Sensor效果調整的接口 ; c) m- i: I% ]2 b) o2 f8 n1 L
\mediatek\custom\common\hal\imgsensor\ov5642_yuv 2 J4 ^# ^/ T. ~, b2 o: H
- M& ?" [8 R% [; }4 m" t9 c( w6 i
: X6 }$ a: G2 p; L# o
4.2??針對OV5640的修改 * ^" |8 K5 q" E9 n2 ?6 X??@1 v8 P3 c
4.2.1? ?? ? mediatek\config\hsimobile77_ics2\ProjectConfig.mk ! g' d) C7 i3 I5 Q' p. r9 y- O
) u??]' o- y??e3 q/ @7 g5 _, Y
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv & X, W7 J! C??q7 `8 {3 M$ @# ], a
mt9p017_raw表示后置攝像頭(也就是主攝像頭),mt9p017是攝像頭sensor驅動IC,raw是sensor一種輸出的數據格式,是CCD或CMOS在將光信號轉換為電信號時的電平高低的原始記錄,單純地沒有將沒有進行任何處理的圖像數據,即攝像元件直接得到的電信號進行數字化處理而得到的。 6 K??[??G" L??[8 O
gc0329_yuv是前置攝像頭,yuvsensor一種輸出的數據格式,支持YUV/RGB格式的模組,一般會帶有ISP(image single processor),經過A/D轉換過的原始數據經過ISP處理生成YUV標準格式傳到BB。
我們采用的OV5640就帶有ISP,輸出YUV格式
(1)??把mt9p017_raw 改為ov5640_yuv,去掉gc0329_yuv因為我們的產品沒有后置攝像頭 3 s# p% \/ `3 w
(2)??去掉類似CUSTOM_KERNEL_LENS后面的dummy_lens因為沒有后置攝像頭
修改之后的HAL層的配置: & s??j??l; B7 {; D# {( W
5 `$ V* p& a. p5 q* M0 S: A
[html]?view plaincopy
* K$ \??H9 A% l5 U
4 `% ]- ^+ _& `" o9 G9 V1 V
修改之后的kernel層的配置:
[html]?view plaincopy
* W2 `3 [0 ^% r/ g+ G
4 t& ~0 {7 f* h' S
/ p! I" j9 `& O& f* l% F3 G
雖然我們沒有后置攝像頭,但不能去掉dummy_lens,我嘗試過去掉之后用./mk r dr編譯會提示下面的錯誤: % A* _4 y- J7 n6 q
* S$ ^& g. l1 F" ?
[plain]?view plaincopy3 b: s, q( s! y0 E, \
% D6 N1 t0 S6 [7 u0 }
" H& B" Z% K4 M2 i' P& R
4.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是沒有這幾個宏定義,我暫時定義如下: : I/ w/ ^: y1 ?
[cpp]?view plaincopy
( d/ V, p# T3 b??c' f7 S2 b+ Z
??^; e" Q/ l' Y??c/ x
這是參考ov5642的相關定義來定義的。 8 D0 L" b7 d( f8 M6 F
( P+ W8 Y. z- [, a% `
(2)??在支持的sensor列表中增加目標sensor 5 E& G% u+ w! U) i
* |5 ]* e# V+ {; k1 Y: a7 K& |. D
mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
在數組增加OV5640的內容,如下:
[cpp]?view plaincopy: ?9 [' ^5 ?4 d& u0 S/ C3 T
" s" t1 O/ k# k. R7 U9 X
也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc); ( K8 H9 {/ N8 c5 \! D& r
mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h 5 Y% k# S+ w??Q) K. z7 J$ Z
$ L, C- @. h/ E" F??G- V
(3)??增加sensor ID和字符串的定義 # s+ o7 _8 M& \& q9 f
[cpp]?view plaincopy
! r, {4 d3 H. D??B
4.2.3? ?? ? mediatek\custom\common\hal\imgsensor---------------HAL層 8 N# g! N2 a1 R& I! w6 `# l
(1)??創建ov5640_yuv文件夾
但這些文件夾下該有哪些文件,有需要哪些內容了,首先我對比了 2 p2 X8 Z8 q8 j- @
ov3640_yuv和ov5642_yuv文件夾,只有cfg_ftbl_ov5642_yuv.h有差別:
圖8 " a$ h0 N& p& r9 r
這里主要是不同驅動IC支持的分辨率不同,以及設置默認的分辨率。
圖9
此文件下有兩個這樣的地方不同,這里是指自動對焦模式。 8 A) C7 r! J* d7 G, F9 G0 S
% S' y# A( T; V6 h: Y, J
因為我們的OV5640和OV5642非常接近,所以就直接把OV5642的目錄復制過來修改為OV5640即可。 9 I- s, _, `: b0 ^/ _/ J
/ i; m" a3 A3 Y$ b4 O' [' b
所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷貝到imgsensor目錄下,改為ov5640_yuv * v7 h???$ n2 F' f" I% l9 [5 p, A
(2)??在支持的sensor列表中增加目標sensor
\src\ sensorlist.cpp
[cpp]?view plaincopy
??A# _??g2 B& S- y: x. c* M% Z/ s
) v/ i* N* @# i8 p* T; a; d5 _! a
; B: j0 ?5 d3 G; `+ [) H
注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驅動的時候要注意,Sensor 添加的位置要一樣。否則驅動會跑亂,輕則 ISP 參數不對,重則 Sensor 無法啟動。 1 i% v% I' H1 X; d
2 o3 F! j! [) V5 F) q
" o??X' b) n) E??d6 f5 r. r
4.3??拍照圖片尺寸設置 % F1 W# }$ p) B. K5 [6 H
( q5 E: m3 |??`5 V" j% s
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
0 m& ^# h, Q# |1 M, ~??M0 e
[cpp]?view plaincopy
- g. `4 W- l??{9 G. T
4.4??Camera物理角度旋轉 " T! I$ N$ W* H
Cfg_setting_imgsensor.h 0 N% f! I% O6 b??F7 _
[cpp]?view plaincopy
6 F7 J* H8 U7 m& y" E
這幾種都試過了,但都不行,預覽和實際的都是成某種鏡像關系。這是平臺是提供旋轉的功能。這個配置好了之后,如果方向不正確,可以通過驅動中的方向調整函數進行調整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)
參考:http://blog.csdn.net/loongembedded/article/details/41679977 1 U1 t& m3 @4 B' N% Y
9 V3 T% n1 B: k3 M5 H. N2 H( \
看了OV5640的數據手冊,寄存器0x3820和0x3821是用于控制圖像發射(mirror)和翻轉(flip)的,在u4Degree_0=270情況下,OV5640YUVPreview()調用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),預覽和拍照后的預覽都是OK,但拍好的照片在電腦上打開的時候發現是順時針翻轉了90度。
http://bbs.csdn.net/topics/390837150 ( y$ y6 C3 \7 L- s" r
??U0 L5 ^6 S, Q
可是我在OV5640YUV_Sensor_Init()調用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)卻問題依舊,很奇怪。 ) m/ `& S6 t- e2 R$ m
# ~& U3 z% o( m9 S7 S
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
% f- O4 a, p& A# Q( I
[cpp]?view plaincopy
* n??J2 _9 q8 R5 R8 f
) N) N! o2 S$ G8 m2 Y% ?1 Z
7 j$ O" m$ B% {/ _/ m* z& a1 h
2 D8 Q8 C: l& F8 b" `??U# H
我試過做上面的修改,但打開攝像頭的時候,提示”Unfortunately, Camera has stopped” 3 m- \) W( b8 `+ s1 L7 C) B
9 X" C, W??x% d" @7 j. z! j1 j
% i/ y1 K/ e3 i9 e7 u! J
參考鏈接: ! p! g, h+ o+ Q8 }2 }% z; ~
MTKAndroid Driver:camera
http://blog.csdn.net/cbk861110/article/details/17437283
) C/ g, h2 k9 f3 @$ ~
MTK cameraimage sensor driver
http://blog.csdn.net/sunweizhong1024/article/details/8497790
8 D2 U: Q1 x??h* o+ R% @
MTK平臺的ISP架構問題
http://bbs.52rd.com/forum.php?mod=viewthread&tid=272727 2 M/ ^7 `2 @% Y/ G8 l+ z
- Q8 z+ l9 u2 U2 h! o; e
OV5640 YUV的自動對焦功能為何沒有開啟 ; s* Z6 K# y. W' x6 }( n
http://www.16rd.com/thread-10480-1-1.html " J7 h5 R" x# Z& \: P7 f
7 J! `$ ]/ d) N3 ~% q6 A
MTK Android Driver知識大全 # B! _. n# x4 }8 ^7 B; I
http://blog.csdn.net/cbk861110/article/details/40931835
mtk camera移植步驟
http://blog.csdn.net/vasvas/article/details/39250473 ! L1 ~) R/ c' O??N7 N0 v
6 l8 m8 J' U7 Z+ p9 u% B9 l' h4 y
關于 前置攝像頭安裝0度或者180度
http://blog.csdn.net/kkkvvv123/article/details/8809823
Camera 涉及的文件70 8 Y# o: F% L; y0 y7 ^- K
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html
OV5640全景模式預覽倒180度,拍照正常的問題
http://blog.csdn.net/guoguo295/article/details/21245815
7 O/ `??z??x, N6 i
& V* |2 h3 h* j3 W1 s
MTK6577+Android之Camera驅動 ! I& i??w$ \??G; F5 V- H??N& n
圖1
1.? ???Camera拍照相關概念 # r& y. L5 L6 p0 z7 o
1.1??ISP + y! d/ P8 t2 K- d3 l
* @5 ^- d' \, G4 D' n! h) T
isp——(Image Signal Processor)——影視處理 & J' D9 G" I$ X, c
& P7 A0 u; [??S; U4 z8 N8 K4 d6 C5 L
無論數碼相機、攝像機或者攝像手機,其影像數據從前端感應后,皆須經過ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像處理(Pre-ISP)與后端影像處理(Post-ISP)四個階段后,影像數據才能最終呈現于終端設備上
$ Z4 B& c! I, t5 s' v5 }??l4 X( W' l* n
1.2??720p $ g9 v( U+ L8 R" U( X! L' b3 K
720P是美國電影電視工程師協會(SMPTE)制定的高等級高清數字電視的格式標準,有效顯示格式為:1280×720.SMPTE(美國電影電視工程協會)將數字高清信號數字電視掃描線的不同分為1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一種在逐行掃描下達到1280×720的分辨率的顯示格式。是數字電影成像技術和計算機技術的融合。
分辨率為1280×720p/60Hz,行頻為45kHz
???% O: e. l6 v
2.? ???MTK6577Camera控制器部分 / ~$ I# Y: w" ?7 i
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)這些特征,用于圖像處理。
6 i' y9 |& j( j% a
2.2??camera特征
/ j/ P$ \3 L" p
MT6577內部集成的ISP,包含了一個功能強大的圖像信號處理器,用于連接各種各樣的圖像傳感器模組,這個處理器由時序產生單元(timing generated unit: TG)、鏡頭/傳感器補償(lens/sensor compensation)單元和圖像處理單元。 * m+ b' j# w- S% T5 E3 w7 o/ f
7 b/ n. C1 S9 [9 K
支持的特征如下: 9 N7 z$ E# o8 i; c
(1)? ?抓圖分辨率達8M像素(image capture resolution)。
(2)? ?錄像分辨率達720p(video recording resolution)。 9 H4 ]# u1 ]1 {5 H& k
(3)? ?原始圖像數據轉儲幀率8M@15(raw dump frame rate)。 % ?. k6 a2 g8 N' d% [+ c7 L
(4)? ?曝光抓圖率8M@7(burst capture rate)。
(5)? ?圖像處理 1 f1 D. v; e+ ^, K
低像素補償(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)。
3 |, l' d+ `* ^' R
(6)? ?3A統計和校正(statistics and correction)
(7)? ?閃爍檢測(flicker detection)。
2.3??camera框圖 - N3 F- s7 j6 N' D( _' @( s
+ }5 v* I??X9 j! |. Y1 H* K( ]
1 i0 J/ s' f6 Q7 \4 t+ U0 B
圖2 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 輸入模式,這步被忽略。 $ s9 ^2 C% m1 ^: p, o
% ]' C7 E( V7 Y# T
色彩處理單元接受來之鏡頭/傳感器補償(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讀取出來。
下面給出一些性能參數:
' x8 `6 _/ s/ j5 V??v- G
圖3 : i5 L4 M7 \' ]2 [9 W6 m" J4 }
3.? ???原理圖設計 ; d7 x: j6 F! D, n" `0 I
( Y- G8 [: a- u0 W5 L0 V/ B2 [
MT6577支持兩路camera接口,一路是MIPI接口,一路是并行接口,這里我們采用的是并行接口,下面給出MT6577 CAM并行接口定義: ??[3 w# m3 k; ]3 V; H- \
8 d2 S# b% {7 i2 D" z
圖4 Camera sensor連接座如下:
5 U- }! R# `/ t. V
6 W$ ~??w8 u+ F8 t8 b1 J
圖5
(1)??OV5640輸出的數據格式 4 z( `: Q# l2 V) ^! N" y9 U
《Y1MT6577 design notice V0.1.pdf》文檔給出這樣的說明: 4 ^. u7 R' |??Z7 B* R! f+ d
Sensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9] ' n- l2 J/ p1 d% y! h; M/ v??O5 ^! X3 B
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位。如下圖:
' s) s' H- Q* I5 {6 T" B4 F
圖6
+ p8 x+ I& Y4 ^; H1 K) ?0 b5 G
(2)??OV5640IIC地址
) ?! [& a2 G6 w! K
IIC 8bit寫地址為0x78,讀地址為0x79,查詢Sensor規格書可以看到:
圖7 IIC 8bit地址最后一位為0時是寫地址,為1時是讀地址。這屬于IIC通訊規則
$ K" X' m) V6 G; g
4.? ???驅動實現 9 c- A2 _- e( v- Z
4.1??相關代碼
(1)??CameraSensor驅動相關文件 9 _6 M, V0 K3 `% F! G) n* {$ W??V
\mediatek\custom\common\kernel\imgsensor\ov5642_yuv
(2)??SensorID和一些枚舉類型的定義
\mediatek\custom\common\kernel\imgsensor\inc
kd_imgsensor.h---------SensorID
kd_imgsensor_define.h--------------一些枚舉類型的定義 3 e# y5 @2 `0 i' E+ z& ]( Y5 X/ ]1 i
(3)??Sensor供電
\mediatek\custom\common\kernel\camera\camera 4 F$ k: E. a+ j; i1 @9 Y: J
kd_camera_hw.c和kd_camera_hw.h
(4)??KernelSpace的SensorList,imgsensor模塊注冊 2 M3 f, h2 I" r4 q4 I
\mediatek\custom\common\kernel\imgsensor\src
kd_sensorlist.c和kd_sensorlist.h-----------camera模塊加載 4 ?7 Q3 k9 {7 e! k' e/ ^
8 V8 N* j5 j1 b1 }, I??Q" R9 {+ ]
(5)??UserSpace的SensorList,向用戶空間提供支持的SensorList , g$ ~: y' T4 h6 {$ S
\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
提供給用戶空間的SensorList
(6)??Sensor效果調整的接口 ; c) m- i: I% ]2 b) o2 f8 n1 L
\mediatek\custom\common\hal\imgsensor\ov5642_yuv 2 J4 ^# ^/ T. ~, b2 o: H
- M& ?" [8 R% [; }4 m" t9 c( w6 i
: X6 }$ a: G2 p; L# o
4.2??針對OV5640的修改 * ^" |8 K5 q" E9 n2 ?6 X??@1 v8 P3 c
4.2.1? ?? ? mediatek\config\hsimobile77_ics2\ProjectConfig.mk ! g' d) C7 i3 I5 Q' p. r9 y- O
) u??]' o- y??e3 q/ @7 g5 _, Y
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv & X, W7 J! C??q7 `8 {3 M$ @# ], a
mt9p017_raw表示后置攝像頭(也就是主攝像頭),mt9p017是攝像頭sensor驅動IC,raw是sensor一種輸出的數據格式,是CCD或CMOS在將光信號轉換為電信號時的電平高低的原始記錄,單純地沒有將沒有進行任何處理的圖像數據,即攝像元件直接得到的電信號進行數字化處理而得到的。 6 K??[??G" L??[8 O
gc0329_yuv是前置攝像頭,yuvsensor一種輸出的數據格式,支持YUV/RGB格式的模組,一般會帶有ISP(image single processor),經過A/D轉換過的原始數據經過ISP處理生成YUV標準格式傳到BB。
我們采用的OV5640就帶有ISP,輸出YUV格式
(1)??把mt9p017_raw 改為ov5640_yuv,去掉gc0329_yuv因為我們的產品沒有后置攝像頭 3 s# p% \/ `3 w
(2)??去掉類似CUSTOM_KERNEL_LENS后面的dummy_lens因為沒有后置攝像頭
修改之后的HAL層的配置: & s??j??l; B7 {; D# {( W
5 `$ V* p& a. p5 q* M0 S: A
[html]?view plaincopy
* K$ \??H9 A% l5 U
- 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??; M/ M* R/ A# j- ???F
4 `% ]- ^+ _& `" o9 G9 V1 V
修改之后的kernel層的配置:
[html]?view plaincopy
* W2 `3 [0 ^% r/ g+ G
4 t& ~0 {7 f* h' S
- 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??4 Y6 f& _. _$ A! V" Q??m/ J2 [
/ p! I" j9 `& O& f* l% F3 G
雖然我們沒有后置攝像頭,但不能去掉dummy_lens,我嘗試過去掉之后用./mk r dr編譯會提示下面的錯誤: % A* _4 y- J7 n6 q
* S$ ^& g. l1 F" ?
[plain]?view plaincopy3 b: s, q( s! y0 E, \
% D6 N1 t0 S6 [7 u0 }
- 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??' |! s( |2 f0 v- J
" H& B" Z% K4 M2 i' P& R
4.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是沒有這幾個宏定義,我暫時定義如下: : I/ w/ ^: y1 ?
[cpp]?view plaincopy
( d/ V, p# T3 b??c' f7 S2 b+ Z
- //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??
??^; e" Q/ l' Y??c/ x
這是參考ov5642的相關定義來定義的。 8 D0 L" b7 d( f8 M6 F
( P+ W8 Y. z- [, a% `
(2)??在支持的sensor列表中增加目標sensor 5 E& G% u+ w! U) i
* |5 ]* e# V+ {; k1 Y: a7 K& |. D
mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
在數組增加OV5640的內容,如下:
[cpp]?view plaincopy: ?9 [' ^5 ?4 d& u0 S/ C3 T
" s" t1 O/ k# k. R7 U9 X
- 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??
- …………….??
- }??: o7 E( F$ n$ [! N3 Q
也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc); ( K8 H9 {/ N8 c5 \! D& r
mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h 5 Y% k# S+ w??Q) K. z7 J$ Z
$ L, C- @. h/ E" F??G- V
(3)??增加sensor ID和字符串的定義 # s+ o7 _8 M& \& q9 f
[cpp]?view plaincopy
- #defineOV5640_SENSOR_ID? ?? ?? ?? ?0x5640??
- #defineSENSOR_DRVNAME_OV5640_YUV??"ov5640yuv"??& N- M6 n??h" M% \) K/ e
! r, {4 d3 H. D??B
4.2.3? ?? ? mediatek\custom\common\hal\imgsensor---------------HAL層 8 N# g! N2 a1 R& I! w6 `# l
(1)??創建ov5640_yuv文件夾
但這些文件夾下該有哪些文件,有需要哪些內容了,首先我對比了 2 p2 X8 Z8 q8 j- @
ov3640_yuv和ov5642_yuv文件夾,只有cfg_ftbl_ov5642_yuv.h有差別:
圖8 " a$ h0 N& p& r9 r
這里主要是不同驅動IC支持的分辨率不同,以及設置默認的分辨率。
圖9
此文件下有兩個這樣的地方不同,這里是指自動對焦模式。 8 A) C7 r! J* d7 G, F9 G0 S
% S' y# A( T; V6 h: Y, J
因為我們的OV5640和OV5642非常接近,所以就直接把OV5642的目錄復制過來修改為OV5640即可。 9 I- s, _, `: b0 ^/ _/ J
/ i; m" a3 A3 Y$ b4 O' [' b
所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷貝到imgsensor目錄下,改為ov5640_yuv * v7 h???$ n2 F' f" I% l9 [5 p, A
(2)??在支持的sensor列表中增加目標sensor
\src\ sensorlist.cpp
[cpp]?view plaincopy
??A# _??g2 B& S- y: x. c* M% Z/ s
) v/ i* N* @# i8 p* T; a; d5 _! a
- MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[] =??
- {??
- ………..??
- #ifdefined(OV5640_YUV)??
- ? ? YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, NULL),??
- #endif??
- …………??
- }??/ j* |9 _5 M5 D
; B: j0 ?5 d3 G; `+ [) H
注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驅動的時候要注意,Sensor 添加的位置要一樣。否則驅動會跑亂,輕則 ISP 參數不對,重則 Sensor 無法啟動。 1 i% v% I' H1 X; d
2 o3 F! j! [) V5 F) q
" o??X' b) n) E??d6 f5 r. r
4.3??拍照圖片尺寸設置 % F1 W# }$ p) B. K5 [6 H
( q5 E: m3 |??`5 V" j% s
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
0 m& ^# h, Q# |1 M, ~??M0 e
[cpp]?view plaincopy
- g. `4 W- l??{9 G. T
- // 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??
- ? ?)??( X7 ~# c+ U3 }! k5 D4 @) g. c
4.4??Camera物理角度旋轉 " T! I$ N$ W* H
Cfg_setting_imgsensor.h 0 N% f! I% O6 b??F7 _
[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;??
- }??/ u( v& e1 X( H6 W& y* X
6 F7 J* H8 U7 m& y" E
這幾種都試過了,但都不行,預覽和實際的都是成某種鏡像關系。這是平臺是提供旋轉的功能。這個配置好了之后,如果方向不正確,可以通過驅動中的方向調整函數進行調整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)
參考:http://blog.csdn.net/loongembedded/article/details/41679977 1 U1 t& m3 @4 B' N% Y
9 V3 T% n1 B: k3 M5 H. N2 H( \
看了OV5640的數據手冊,寄存器0x3820和0x3821是用于控制圖像發射(mirror)和翻轉(flip)的,在u4Degree_0=270情況下,OV5640YUVPreview()調用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),預覽和拍照后的預覽都是OK,但拍好的照片在電腦上打開的時候發現是順時針翻轉了90度。
http://bbs.csdn.net/topics/390837150 ( y$ y6 C3 \7 L- s" r
??U0 L5 ^6 S, Q
可是我在OV5640YUV_Sensor_Init()調用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)卻問題依舊,很奇怪。 ) m/ `& S6 t- e2 R$ m
# ~& U3 z% o( m9 S7 S
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
% f- O4 a, p& A# Q( I
[cpp]?view plaincopy
* n??J2 _9 q8 R5 R8 f
- /*
- ? ? // 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??
- )??
) N) N! o2 S$ G8 m2 Y% ?1 Z
7 j$ O" m$ B% {/ _/ m* z& a1 h
2 D8 Q8 C: l& F8 b" `??U# H
我試過做上面的修改,但打開攝像頭的時候,提示”Unfortunately, Camera has stopped” 3 m- \) W( b8 `+ s1 L7 C) B
9 X" C, W??x% d" @7 j. z! j1 j
% i/ y1 K/ e3 i9 e7 u! J
參考鏈接: ! p! g, h+ o+ Q8 }2 }% z; ~
MTKAndroid Driver:camera
http://blog.csdn.net/cbk861110/article/details/17437283
) C/ g, h2 k9 f3 @$ ~
MTK cameraimage sensor driver
http://blog.csdn.net/sunweizhong1024/article/details/8497790
8 D2 U: Q1 x??h* o+ R% @
MTK平臺的ISP架構問題
http://bbs.52rd.com/forum.php?mod=viewthread&tid=272727 2 M/ ^7 `2 @% Y/ G8 l+ z
- Q8 z+ l9 u2 U2 h! o; e
OV5640 YUV的自動對焦功能為何沒有開啟 ; s* Z6 K# y. W' x6 }( n
http://www.16rd.com/thread-10480-1-1.html " J7 h5 R" x# Z& \: P7 f
7 J! `$ ]/ d) N3 ~% q6 A
MTK Android Driver知識大全 # B! _. n# x4 }8 ^7 B; I
http://blog.csdn.net/cbk861110/article/details/40931835
mtk camera移植步驟
http://blog.csdn.net/vasvas/article/details/39250473 ! L1 ~) R/ c' O??N7 N0 v
6 l8 m8 J' U7 Z+ p9 u% B9 l' h4 y
關于 前置攝像頭安裝0度或者180度
http://blog.csdn.net/kkkvvv123/article/details/8809823
Camera 涉及的文件70 8 Y# o: F% L; y0 y7 ^- K
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html
OV5640全景模式預覽倒180度,拍照正常的問題
http://blog.csdn.net/guoguo295/article/details/21245815
總結
以上是生活随笔為你收集整理的MTK6577+Android之Camera驱动) ~% d的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自学白帽黑客第一年总结
- 下一篇: [《回家寄事》闲笔记事集]2010年1月