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,或者提高系统的频率。详见 系统各模块时钟介绍