3.4. VIDEO - 摄像头

本 demo 将演示 USB Device VIDEO 类实现的一个摄像头设备。

通过 usb 外设将其枚举成 VIDEO 类设备,从而可以使用摄像头模块将采集到的数据通过 usb 发送给主机进行显示,这里使用 windows 自带的相机进行显示,支持 usb video 类驱动。发送的数据需要满足一定的格式,这里我们选择 MJPEG,从 usb 官方手册中我们可以看到具体的数据头部信息以及传输示例。

video stream header

examples for isoch transfer IN

采集数据需要摄像头,我们使用的模块为 gc0308,支持 RGB555 或者 YUV 格式输出,这里我们选择输出 YUV 格式。除了摄像头模块,我们还需要外设来驱动摄像头,BL706 拥有 CAM 外设,可以驱动该摄像头。

3.4.1. 准备工具

BL706 AVB + GC0308摄像头模块 + windows 相机

3.4.2. 硬件连接

本 demo 基于 BL706_AVB 开发板,连接方式如下

   GPIO function         GPIO pin
----------------------------------
    CAM        <-->     GPIO0
    CAM        <-->     GPIO1
    CAM        <-->     GPIO2
    CAM        <-->     GPIO3
    CAM        <-->     GPIO4
    CAM        <-->     GPIO5
    CAM        <-->     GPIO6
    USB_DP     <-->     GPIO7
    USB_DM     <-->     GPIO8
    CLK_OUT    <-->     GPIO9
    I2C_SCL    <-->     GPIO11
    I2C_SDA    <-->     GPIO16
    CAM        <-->     GPIO29
    CAM        <-->     GPIO30
    CAM        <-->     GPIO31

3.4.3. 软件实现

  • 软件代码见 examples/usb/usb_video

1
2
3
4
5
#define BSP_I2C_CLOCK_SOURCE ROOT_CLOCK_SOURCE_BCLK
#define BSP_I2C_CLOCK_DIV    0

#define BSP_CAM_CLOCK_SOURCE ROOT_CLOCK_SOURCE_PLL_96M
#define BSP_CAM_CLOCK_DIV    3
  • 使用到的外设时钟源见 bsp/board/bl706_avb/clock_config.h,如有改动,请自行修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#define CONFIG_GPIO0_FUNC  GPIO_FUN_CAM
#define CONFIG_GPIO1_FUNC  GPIO_FUN_CAM
#define CONFIG_GPIO2_FUNC  GPIO_FUN_CAM
#define CONFIG_GPIO3_FUNC  GPIO_FUN_CAM
#define CONFIG_GPIO4_FUNC  GPIO_FUN_CAM
#define CONFIG_GPIO5_FUNC  GPIO_FUN_CAM
#define CONFIG_GPIO6_FUNC  GPIO_FUN_CAM
#define CONFIG_GPIO7_FUNC  GPIO_FUN_USB
#define CONFIG_GPIO8_FUNC  GPIO_FUN_USB
#define CONFIG_GPIO9_FUNC  GPIO_FUN_CLK_OUT
#define CONFIG_GPIO11_FUNC GPIO_FUN_I2C
#define CONFIG_GPIO12_FUNC GPIO_FUN_CAM
#define CONFIG_GPIO16_FUNC GPIO_FUN_I2C
#define CONFIG_GPIO29_FUNC GPIO_FUN_CAM
#define CONFIG_GPIO30_FUNC GPIO_FUN_CAM
#define CONFIG_GPIO31_FUNC GPIO_FUN_CAM
  • 使用到的 GPIO 配置见 bsp/board/bl706_avb/pinmux_config.h,默认提供了该 demo 的引脚配置

注解

bsp/board/bl706_avb/pinmux_config.h 当前给所有的示例 demo 使用,所以,需要先选定 PINMUX_SELECTPINMUX_UVC,开启 UVC demo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#define BSP_USING_CAM
#define BSP_USING_I2C0
#define BSP_USING_USB
#define BSP_USING_DMA0_CH2

#if defined(BSP_USING_I2C0)
#ifndef I2C0_CONFIG
#define I2C0_CONFIG          \
    {                        \
        .id = 0,             \
        .mode = I2C_HW_MODE, \
        .phase = 15,         \
    }
#endif
#endif

#if defined(BSP_USING_DMA0_CH2)
#ifndef DMA0_CH2_CONFIG
#define DMA0_CH2_CONFIG                       \
    {                                         \
        .id = 0,                              \
        .ch = 2,                              \
        .direction = DMA_MEMORY_TO_PERIPH,    \
        .transfer_mode = DMA_LLI_ONCE_MODE,   \
        .src_req = DMA_REQUEST_NONE,          \
        .dst_req = DMA_REQUEST_UART1_TX,      \
        .src_width = DMA_TRANSFER_WIDTH_8BIT, \
        .dst_width = DMA_TRANSFER_WIDTH_8BIT, \
    }
#endif
#endif
  • 使能外设并配置,见 bsp/board/bl706_avb/peripheral_config.h ,外设配置可以保持默认,在程序中修改,如下

1
2
DMA_DEV(dma_ch2)->dst_req = DMA_REQUEST_USB_EP1;
device_open(dma_ch2, 0);
1
#define FORMAT_SEL UYVY
  • gc0308 输出格式选择 UYVY,见 bsp/bsp_common/bsp_image_sensor.c

3.4.4. 编译和烧录

1
2
 $ cd <sdk_path>/bl_mcu_sdk
 $ make BOARD=bl706_avb APP=usb_video

3.4.5. 实验现象