查看: 6321|回复: 0
收起左侧

MTK6577Camera驱动浅析

[复制链接]
发表于 2015-8-31 08:24:48 | 显示全部楼层 |阅读模式

1.png

/ w0 W) i% V# S

图1


1 H3 q2 T# q* {5 p6 p* j/ g

1.     Camera拍照相关概念

1.1  ISP


5 n, B$ `8 @" ?: F4 \

isp——(Image Signal Processor)——影视处理

$ {. F; i) ~# x& n+ D

无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上

6 v: _* i7 r0 b7 N8 e( _  M2 S

1.2  720p

720P是美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。


5 ^: s& w' B0 ?+ \

分辨率为1280×720p/60Hz,行频为45kHz


+ L0 W& r8 g' G$ g7 l" y2 s' A  n6 `. r! A" i8 m3 w8 a

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)这些特征,用于图像处理。

1 L: E! x& z+ u  `

2.2  camera特征


3 U" ~! ~0 E3 q- j

MT6577内部集成的ISP,包含了一个功能强大的图像信号处理器,用于连接各种各样的图像传感器模组,这个处理器由时序产生单元(timing generated unit: TG)、镜头/传感器补偿(lens/sensor compensation)单元和图像处理单元。


' D( J: ~7 f0 o3 J  t& b: N

支持的特征如下:

(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)。


+ z1 d  z- I1 l! P$ i' O

(6)   3A统计和校正(statistics and correction)

(7)   闪烁检测(flicker detection)。


( t  ~8 z: M/ @

2.3  camera框图

2.png


5 Q" q! ~& H' B8 Z( A8 S' d3 x9 I

图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)单元。

9 S' g  x$ W2 @. V; O  Q

在Bayer原始数据输入模式,镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据给色彩处理单元(color process unit);在YUV422/RGB565 输入模式,这步被忽略。

5 N! z" B: A) m4 W. R0 q! M

色彩处理单元接受来之镜头/传感器补偿(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读取出来。

0 y/ Q. Q6 L5 E* r

下面给出一些性能参数:

3.png


2 z. O; T# p0 t- b- d5 j1 u

图3

. C, K5 _1 ^/ [

3.     原理图设计


% }6 T: l: n& D

MT6577支持两路camera接口,一路是MIPI接口,一路是并行接口,这里我们采用的是并行接口,下面给出MT6577 CAM并行接口定义:

4.png

+ ^4 D7 t! X' W  M3 M4 w

图4

Camera sensor连接座如下:

5.png

5 k: _5 C4 q8 A/ g! Y$ o

图5

8 c5 g( O' Q2 k: o$ y, o

(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位。如下图:

6.png


. Q' G2 F9 d* _4 B" K+ H

图6


, |" ^9 o( t- Q1 r$ f4 A" n9 _' |4 c; U0 [& Q1 s! P. S

(2)  OV5640IIC地址

6 P# x; [8 {8 {; z9 Y2 u

IIC 8bit写地址为0x78,读地址为0x79,查询Sensor规格书可以看到:

7.png


/ {% q2 n  z# N: z% j

图7

IIC 8bit地址最后一位为0时是写地址,为1时是读地址。这属于IIC通讯规则

! [# Y- c# I9 u; T5 m8 r( J

7 y; }* i7 w2 {3 ^- Z$ i% J6 T9 x
4 z* `3 Q0 y; f3 o0 |

4.     驱动实现

& j3 ^# y, C6 ~5 j/ @1 K$ x/ M* G

* A( k: T1 K+ f+ s% d$ Z: @$ h

4.1  相关代码

(1)  CameraSensor驱动相关文件

\mediatek\custom\common\kernel\imgsensor\ov5642_yuv

. O( v8 M  _! m0 G& E

(2)  SensorID和一些枚举类型的定义

\mediatek\custom\common\kernel\imgsensor\inc

kd_imgsensor.h---------SensorID

kd_imgsensor_define.h--------------一些枚举类型的定义


) S& V, ~4 y4 B# B* x% v! \  B

(3)  Sensor供电

\mediatek\custom\common\kernel\camera\camera

kd_camera_hw.c和kd_camera_hw.h


" Z3 T" e/ G* E( f

(4)  KernelSpace的SensorList,imgsensor模块注册

\mediatek\custom\common\kernel\imgsensor\src

kd_sensorlist.c和kd_sensorlist.h-----------camera模块加载


+ u1 H3 y: Y2 t8 C! E# }; y9 d

(5)  UserSpace的SensorList,向用户空间提供支持的SensorList

\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp

提供给用户空间的SensorList

' S. _1 t! ]! ?7 o

. c& g4 r2 G3 a5 u0 d6 y+ q

(6)  Sensor效果调整的接口

\mediatek\custom\common\hal\imgsensor\ov5642_yuv

+ K( U# }1 z1 J: X9 |/ P9 A3 a+ n

- k1 o' n0 o- `& j4 ~- W, T

4.2  针对OV5640的修改

. l4 D& o+ B# m( L

4.2.1       mediatek\config\hsimobile77_ics2\ProjectConfig.mk


# h  Y, E8 t3 H) o; i

CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv

mt9p017_raw表示后置摄像头(也就是主摄像头),mt9p017是摄像头sensor驱动IC,raw是sensor一种输出的数据格式,是CCD或CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯地没有将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。


+ h* M' Y! n4 s' g2 I

gc0329_yuv是前置摄像头,yuvsensor一种输出的数据格式,支持YUV/RGB格式的模组,一般会带有ISP(image single processor),经过A/D转换过的原始数据经过ISP处理生成YUV标准格式传到BB。

4 H) x( A; f% ?) N) x! ]% Z

我们采用的OV5640就带有ISP,输出YUV格式

4 D# |$ Q$ v7 d  ?5 R- {- ^

(1)  把mt9p017_raw 改为ov5640_yuv,去掉gc0329_yuv因为我们的产品没有后置摄像头

(2)  去掉类似CUSTOM_KERNEL_LENS后面的dummy_lens因为没有后置摄像头


) F  z: |4 C+ w: N

修改之后的HAL层的配置:

- r% a! V, G+ I( N# h
  • 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  
    5 s) ?% [4 P. D7 l! [9 b9 I
) \; ], g# [* ]0 m( l( S$ }
5 W: m/ v! P, ]& |8 ^4 J1 s, `

7 D& n- Z' B9 |2 c: C% A5 h

修改之后的kernel层的配置:

! Q; P  A! E9 \8 o  H
  • 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  
    . w1 Q; \) S. V8 S+ G  p/ Y4 w

; z) W+ {  t* k2 D- }7 y4 r" ?' i0 ~. T: X; S/ U
6 ?4 b+ w7 S/ K/ m- g" t; u, v
7 ^5 s4 e. Z+ `2 W! Z& `8 J

虽然我们没有后置摄像头,但不能去掉dummy_lens,我尝试过去掉之后用./mk r dr编译会提示下面的错误:

, K! x, b# G5 b; a# [' D  B% p
$ @! H7 G7 _& X
  • 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  
    . C: |, ]" K" V* B6 r" |9 j1 r" d

1 J; T* C7 u0 V0 ]$ n; F& D6 w6 |9 T7 r7 g

  e7 q, y  \, q' c4 Q; R! D* L1 t" w  `1 B

4.2.2       mediatek\custom\common\kernel\imgsensor----------kernel层

, @. w2 r' B+ H+ F

(1)  创建ov5640_yuv并建立需要的文件


4 ]0 S! L5 S; ~, c! v/ K  I

创建文件夹ov5640_yuv,把sensor IC厂家提供的ov5640yuv_Sensor.c放到此目录下。另外拷贝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷贝过来改为ov5640yuv_Sensor.h等。

2 p3 p7 D* O# a7 J

编译发现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是没有这几个宏定义,我暂时定义如下:

; Z5 J* O4 k  k8 B+ B

* K. v! S' W, i- F7 E* u( q
  • //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    I+ f9 y- Q" Q* L: F$ N/ U

% Z# I2 i# Q) M0 U, L, U
8 v4 L/ o  N# P/ J- ~/ \- Y5 u% D; O  \! D% I% A7 H

这是参考ov5642的相关定义来定义的。

% P0 X7 [1 ]0 M- V' O

(2)  在支持的sensor列表中增加目标sensor


* T, [# x% U* b( g& W  z" M2 t; E: x

mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h

在数组增加OV5640的内容,如下:


6 E, ^2 I3 M& |4 j
9 M  c) Z9 h# t* m
  • 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  
  • …………….  
  • }  
    . K! s. _) ?7 L6 n, l

    9 O9 v& c9 _+ s6 u% f: [8 ]9 Z$ {

7 k- x/ d- {5 Q4 o% u
  [( _& C, Q$ }5 u, e) A: [7 X

  Y) y( |6 f. l0 z$ U6 J/ p

也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc);

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

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


! S. B0 C. n0 I. n/ h9 X; h9 J/ p) }' L; F4 J2 A. P
  • #defineOV5640_SENSOR_ID            0x5640  
  • #defineSENSOR_DRVNAME_OV5640_YUV  "ov5640yuv"  
    ) P$ s- Y+ h7 \

8 h$ o  h" j6 f3 [
- b  e& ~8 V7 {% A2 m
% J9 P1 O! K; j

4.2.3       mediatek\custom\common\hal\imgsensor---------------HAL层


7 x) r$ u* r( R9 N

(1)  创建ov5640_yuv文件夹

但这些文件夹下该有哪些文件,有需要哪些内容了,首先我对比了

ov3640_yuv和ov5642_yuv文件夹,只有cfg_ftbl_ov5642_yuv.h有差别:

8.png

图8

9 P5 \; c" ], ?. O, W! C1 F

这里主要是不同驱动IC支持的分辨率不同,以及设置默认的分辨率。

9.png

图9


* H( z' A( {* r; g7 N

此文件下有两个这样的地方不同,这里是指自动对焦模式。

& z. K+ H. F5 z9 f

因为我们的OV5640和OV5642非常接近,所以就直接把OV5642的目录复制过来修改为OV5640即可。

3 u' G5 i  @; B; k

所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷贝到imgsensor目录下,改为ov5640_yuv

+ a, y" S; h5 S

(2)  在支持的sensor列表中增加目标sensor


" D/ C9 y- [0 v3 ^2 ?8 j

\src\ sensorlist.cpp


4 P  y! O9 W3 `/ I
* D; I, i, r& s$ I
  • MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[] =  
  • {  
  • ………..  
  • #ifdefined(OV5640_YUV)  
  •     YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, NULL),  
  • #endif  
  • …………  
  • }  
    . g3 k! v* j- _" x2 ^9 u4 o

' M  E5 l7 \0 S+ k& N/ `6 P  E- A' h! ~8 C4 n+ H0 t" [+ J, e

8 r5 I% `4 l' w- a  i

注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。


! f# |2 q! c& B, r3 K- e; a# d% y8 i9 f6 e3 u: D

4.3  拍照图片尺寸设置


+ s" ~, H* B" _+ Y5 j

mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h

3 ]9 f5 A) V% q- S2 n% T' ^; s
+ W- l$ \3 {7 u# V2 F4 u
' }' ], z+ I8 s6 M
  • // 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  
  •    )  
    $ r9 M, \) K! k: K! ~: W7 w

    ( L6 X" x- M, ?( j. l9 @% _) K8 U
0 H4 x/ q/ B2 _9 W' g/ e$ b

: D* \" q+ Y/ p2 A$ g  S' X

4.4  Camera物理角度旋转

Cfg_setting_imgsensor.h


1 G/ s5 |" r  Y, V, r
5 g/ T0 n8 Z  R! A  f' H
  • /*******************************************************************************
  • * 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;  
  • }  7 ^- Q; ^/ U. V  s
    3 p! [" I$ L: k5 i

) v5 Z- H! X% D! R$ Z2 A! w* |& H0 E8 C$ B$ \% I$ J
8 j0 z/ t1 e* F  }

        这几种都试过了,但都不行,预览和实际的都是成某种镜像关系。这是平台是提供旋转的功能。这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)

参考:http://blog.csdn.net/loongembedded/article/details/41679977


% Z) \, t4 x  l, O) r1 s8 \- C8 f1 R) s5 U- z6 Q4 G

; Z* ]7 I- Y- O. K

      看了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)却问题依旧,很奇怪。


7 L' G. S' Q$ O" ]+ l

mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h

2 J, O  z. h$ _% F3 y* C
  • /*
  •     // 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  
  • )  1 J4 Z) J; t  O' c" z; J

5 S! p- h0 [7 S  [- B3 g" D3 H
7 J: S  n/ W' ]: M5 e

我试过做上面的修改,但打开摄像头的时候,提示”Unfortunately, Camera has stopped”

本文作者:LoongEmbedded
4 R9 `0 w# C- R: M7 J- }, [3 A) g  S3 s$ ]' B) A+ x* I
高级模式
B Color Image Link Quote Code Smilies @朋友 |上传

本版积分规则

在线客服

客服电话

欢迎来电咨询

188-9985 8350

微信关注

手机APP程序:
扫码下载访问

微信公众平台:
摄像头之家公众号

微信小程序:
摄像头小程序

返回顶部

QQ|站点统计|小黑屋|手机版|Archiver|摄像头模组论坛网-摄像头方案网CCM99 ( 粤ICP备18155214号 )

Powered by Discuz! X3.4 Licensed© 2001-2013 Comsenz Inc.