HiFlyway Wireless Technologies Ltd.
CAM 调试总结
Vvv
一、原理......................................................................................................... 2
二、实现......................................................................................................... 6
三、CAM 驱动调试时遇到的问题................................................................ 7
四、总结......................................................................................................... 7
HiFlyway Wireless Technologies Ltd.
一、原理
调试 F7 camera:只有一个后置摄像头 OV7675。F7 为 6085 平台。首
先看 6085 平台的 camera 接口。
CAMIF 通过 I2C 和 Camera Sensor 通信,提供 CLK 和 RST 信号给
Camera Sensor。Camera Sensor 将 8bit 或者 10bit 的数据以及水平同步、
帧同步、PCLK 输出给 CAMIF. CAMIF 接受的数据类型为 Bayer RAW 和
YCbCr 4:2:2。VSYNC,HSYNC,PCLK 的极性是可以改变的。
本次用的是 OV7675 的 Sensor。OV7675 兼容 OV7670。
硬件线路图 D:\Project\F7\E-COOL_MB1022T100_SCH_091118.sch
OV7670 的内部图如下
HiFlyway Wireless Technologies Ltd.
它里面有一个 656*488 的 image array,其中的 640*480 是激活的。DSP 可
以将 RAW RGB 转化为 YCBCR,通过 D[7:0]输出到 CAMIF。这个 DSP 还可以
做黑白像素点的纠正,去噪,镜头阴影的纠正等等。Image scaler 可以将输出的
图像从 VGA(640X480)向下裁剪。SCCB interface 是一个 I2C 的接口,通过
SIO_C,SIO_D 来和 I2C bus 通信。
下面是它的 timing 图:
对 于 一 个 RAW data , 一 个 像 素 点 是 一 个 BYTE, 所 以 Tp=Tpclk , 对 于
YUV/RGB data,一个像素点是 2 个 byte,所以 Tp=2Tpclk。
下面为 OV7670 的上电图
HiFlyway Wireless Technologies Ltd.
通过 reset 由 low 到 high 来给 OV7670 上电。
下面的是数据的流通图:
HiFlyway Wireless Technologies Ltd.
下图为 camera 的各个状态及其之间的转换
HiFlyway Wireless Technologies Ltd.
二、实现
1.打开相机,首先进入的是 priveiw 模式:
AEEClsCreateInstance 开始建一个 instance。
QCam_InitData 开始初始化数据。
QCam_HandleEvent 开始处理 event。
QCam_OnAppStart 开始
QCam_HorScreen 开始
Qcamera_ReadSetting,设置结束。
QCam_CreateCamera,这个函数调用 ISHELL_CreateInstance。
ISHELL_CreateInstance 会 调 用 camera_get_sensors 来 得 到 camera 的 个 数
camera_number_of_sensors 。 这 个 camera_number_of_sensors 由 camera_svcs_init
来改变。这个函数会在开机上电的时候被调用。
camera_svcs_select_sensor 来选择 sensor。
camera_svcs_start 开始,同时 camera_process_start 开始。
camera_process_start 首先会调用 camsensor_power_on,camsensor_power_up。
camsensor_power_on 主要调用 camsensor_config_camclk_po 来设置时钟,然后调
用 camsensor_select_camera 来选择 sensor,并设置 camsensor_id。
camsensor_power_up 主要调用 camsensor_init 来初始化 sensor。
camsensor_init 主要执行
这个 camsensor_detect_table[0]=camsensor_ov7670_init,执行 7670 的 init 了
camsensor_ov7670_init:
首先对 sensor 输出 MCLK:
然后硬件的 reset:将 reset pin 由 low 变 high,将 PWDN pin 由 low 变 high。
然后是 SW reset:ov7670_i2c_write_byte(0x12, 0x80)
然后调用 initialize_ov7670_registers 初始化 7670 的各个寄存器,写入 FAE 提供
的初始值。
然后读 sensor 的 id 和版本号,如果正确,初始化完成。
然后调用 camsensor_ov7670_register 注册 7670 的各个 function 函数。
camsensor_ov7670_start 初始化 7670 的参数,设置 sensor 的输出格式,这里为 CR
Y CB Y 即 V Y U Y
HiFlyway Wireless Technologies Ltd.
上述参数设置好以后,开始进入 Preview:
camera_svcs_start_preview,camera_process_start_preview。
调用 camsensor_ov7670_video_config 在判断 ov7670_set_sensor_mode 设置进入
privew 模式后,配置 preview 模式下的 sensor 参数。同时 QCam_CameraNotify 函数通
知 preview 开始。
Priview 的数据输出到 output1 通道用于显示:camera_process_qdsp_output1_msg
。此函数中有一个参数 number_of_frames_to_ignore,用于忽略开始的几个 frame。
如果设置为 0,那么它会把这个 frame 显示出来。显示 21frame 后设置:
camsensor_ov7670_set_brightness
camsensor_ov7670_set_effect,
camsensor_ov7670_set_wb,
camsensor_ov7670_set_frame_rate
2.按下相机拍照进入 snapshot 模式:
camsensor_ov7670_snapshot_config 在 判 断 ov7670_set_sensor_mode 设 置 进 入
snapshot 后设置 snapshot 下的 sensor 参数(也可以在里面设置特效)。
camsensor_ov7670_get_snapshot_fps 来得到 snapshot 的 fps,这里是 25。
拍下的照片由 QDSP 处理。按下“返回”后进入 priview 模式,同上。
3. 关 闭 相 机 会 调 用 camsensor_power_down 和 camsensor_power_off 。
camsensor_power_down 调用 camsensor_ov7670_power_down 将 MCLK 停掉,reset 拉 low,
PWDN 拉 low。camsensor_power_off 主要将 CAMIF_EN 引脚拉 low。
三、CAM 驱动调试时遇到的问题
1.点击照相机,提示“启动失败”,QXDM 里找到在 qcamera.c 的 QCam_CreateCamera
函数里的 ISHELL_CreateInstance 失败。这个函数调用了 camera.c 里的 camera_get_sensor 函
数。这个函数的返回值为 camera_number_of_sensors。这个 sensors 的值应该为 1,而得到
的值为 0.查找 camera_number_of_sensors,发现在 camera_svcs.c 里的 camera_svcs_init 里有
改变,改变的条件是 camsensor_initialized == TRUE。查找发现是 camsensor_select_camera 的
cmasensor_id 等 于 1 , 导 致 camsensor.c 里 的 camsensor_init 失 败 。 修 改
camsensor_select_camera 的宏定义。
2.点击照相机,预览全为粉红色。QXDM 里发现是 SW reset i2c error。确定是上电时序
有问题。修改上电时序,解决了这个问题。
3.预览时发现左右方位颠倒,修改 Mirror/Vflip 的 mirror bit。
4.priview 时由亮到暗移动,屏幕会变绿。修改初始化代码里的自动白平衡参数。
5.打开相机,有“绿屏”闪过。修改初始化代码里的自动白平衡参数。在进入 priview
模式时加延时,忽略了头 5 帧,不显示出来。
6.priview 时感觉屏幕有雾状。修改了亮度参数,将每阶的亮度降低。
四、总结
本次调试过程中,使用 QXDM 来查找问题,很快找到出错的地方,缩短了解决问题
的时间。与 FAE 的沟通要阐述明白问题的现象。