6.2. DVP摄像头出图
代码路径
apps/common/example/video/camera/dvp/dvp_8bit_mode/main.c
使用工程
apps/demo/demo_DevKitBoard/board/wl82/AC791N_DEMO_DEMO_DEVKITBOARD.CBP
开发板提供了两个摄像头一个为1280x720大小的DVP摄像头另一个为640x480大小的SPI摄像头
找到
demo_config.h
文件,将USE_CAMERA_DVP_SHOW_TO_LCD_DEMO开起(确保其余宏全关闭)编译即可
6.2.1. 实验现象
屏幕出现摄像头的数据
6.2.2. 摄像头介绍
该摄像头型号为GC2145,最高分辨率1600x1200,最高帧数30帧。 代码里面采用1280x720大小,帧数20帧。
6.2.3. 代码讲解
代码流程: —>系统服务层—>系统设备层—>设备层驱动层—>摄像头驱动—>屏幕。
通过调用get_yuv_init(get_yuv); 开启摄像头。
驱动遍历所有摄像头驱动逐个读取摄像头ID到直达读对ID号
确认摄像头型号后将发送摄像头配置,收摄像头数据。
硬件接摄像头数据将YUV420数据传到应用层。
应用层在get_yuv();回调函数中进行取数据;
YV420数据进行缩放为屏幕大小的YUV数据传给屏驱动里面进行处理
屏驱数据处理里面会将YUV屏大小的数据转RGB565然后推到屏幕显示。
用户不需要关心底层是如何收数据,加快工程的开发进度。
6.2.4. 摄像头分辨率配置说明
app_config.h
中 进行配置摄像头的大小
//摄像头尺寸,此处需要和摄像头驱动可匹配,默认摄像头为640*480
//#define CONFIG_VIDEO_720P
#ifdef CONFIG_VIDEO_720P
#define CONFIG_VIDEO_IMAGE_W 1280
#define CONFIG_VIDEO_IMAGE_H 720
#else
#define CONFIG_VIDEO_IMAGE_W 640
#define CONFIG_VIDEO_IMAGE_H 480
#endif
文件路径: apps\demo\demo_DevKitBoard\board\wl82\JL_AC79_DevKitBoard
板级配置如下,工程默认是给配置好了的 以下的为举例说明
//---------------------------摄像头相关硬件配置------------------------//
/*
*摄像头软件IIC
*/
SW_IIC_PLATFORM_DATA_BEGIN(sw_iic0_data)
.clk_pin = IO_PORTC_01,//摄像头的IIC CLK IO
.dat_pin = IO_PORTC_02,//摄像头的IIC SDA IO
.sw_iic_delay = 50,//软件iic延时nop
SW_IIC_PLATFORM_DATA_END()
/*
*摄像头IO-PORT
*/
#ifdef CONFIG_VIDEO_ENABLE
#define CAMERA_GROUP_PORT ISC_GROUPA //摄像头数据接口接芯片的PA口
/* #define CAMERA_GROUP_PORT ISC_GROUPC //摄像头数据接口接芯片的PC口 */
static const struct camera_platform_data camera0_data = {
.xclk_gpio = IO_PORTC_00,//供时钟注意: 如果硬件xclk(mclk)接到芯片IO,24MHz会占用OUTPUT_CHANNEL1,12MHz会占用OUTPUT_CHANNEL0
.xclk_hz = 0, // 0或24-->xclk out:24MHz, 12-->xclk out:12MHz ,默认24M即可
.reset_gpio = IO_PORTC_03,//复位IO,一般该引脚可以直接接3.3V的高电平,不需要特定IO来控制
.online_detect = NULL,//默认NULL即可
.pwdn_gpio = -1,//pwdn引脚可以配合引脚写具体IO如IO_PORTC_04,一般摄像头pwdn引脚直接接地即可,具体要看摄像头数据手册
.power_value = 0,//pwdn引脚使用IO控制时的正常工作pwdn引脚电平
.interface = SEN_INTERFACE0,//SEN_INTERFACE_CSI2,//默认即可
.dvp={
#if (CAMERA_GROUP_PORT == ISC_GROUPA)//不同数据接口配置的摄像头pclk和hsync和vsync
.pclk_gpio = IO_PORTA_08,
.hsync_gpio = IO_PORTA_09,
.vsync_gpio = IO_PORTA_10,
#else
.pclk_gpio = IO_PORTC_08,
.hsync_gpio = IO_PORTC_09,
.vsync_gpio = IO_PORTC_10,
#endif
.group_port = CAMERA_GROUP_PORT,
.data_gpio={
#if (CAMERA_GROUP_PORT == ISC_GROUPA)//不同数据接口配置的摄像头数据接口IO
IO_PORTA_07,//从7到0
IO_PORTA_06,
IO_PORTA_05,
IO_PORTA_04,
IO_PORTA_03,
IO_PORTA_02,
IO_PORTA_01,
IO_PORTA_00,
-1,
-1,
#else
IO_PORTC_07,//从7到0
IO_PORTC_06,
IO_PORTC_05,
IO_PORTC_04,
IO_PORTC_03,
IO_PORTC_02,
IO_PORTC_01,
IO_PORTC_00,
-1,
-1,
#endif
},
}
};
static const struct video_subdevice_data video0_subdev_data[] = {//镜头设备参数
{
VIDEO_TAG_CAMERA, (void *)&camera0_data },
};
static const struct video_platform_data video0_data = {//video参数,设备列表参数需要该参数
.data = video0_subdev_data,
.num = ARRAY_SIZE(video0_subdev_data),
};
#endif
//---------------------------设备列表------------------------//
REGISTER_DEVICES(device_table) = {
{ "iic0", &iic_dev_ops, (void *)&sw_iic0_data },
{ "audio", &audio_dev_ops, (void *)&audio_data },
#ifdef CONFIG_VIDEO_ENABLE
{ "video0.*", &video_dev_ops, (void *)&video0_data },//添加vdeo设备
#endif
{"uart2", &uart_dev_ops, (void *)&uart2_data },
};
将设备注册到驱动,初始化的时候会通过该这些配置来初始化IO等配置。
6.2.5. 常见问题说明
- 1、摄像头IIC检测出错,id无法检测。
A)排查board.c :IIC、xclk、pwdn_gpio、power_value有没有配置正确,根据摄像头数据手册确定摄像头pwdn正常工作电平。
B)确定xclk输出到摄像头时钟正常(可以用示波器、逻辑分仪抓取),确定xclk IO是否被占用, 当供给摄像头的时钟xclk不正常时无法读取id!
C)确定摄像头是否已经损坏,当接通电源发热严重则可能电源不对或者电源接反!
2、摄像头id读取正常,但出现“isc line in err ”或者“isc line out err”打印,说明摄像头行数据输出到cpu的行数出错。
A)确定hsync和vsync接线是否正确。
B)确定app_config.h配置的CONFIG_VIDEO_IMAGE_W和CONFIG_VIDEO_IMAGE_H是否在镜头的输出范围内。
3、出现“isc bwerr !!!”和“osd bandwith err”,说明cpu带宽不足。
A)确定摄像头输出帧率和分辨率是否过高导致出现带宽不足。
B)把相应的video的buffer指定到内部sram,或者提高系统的频率。详见 系统各模块时钟介绍