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_SELECT
为 PINMUX_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. 编译和烧录¶
CDK 编译
打开项目中提供的工程文件:usb_video.cdkproj
参照 Windows 下使用 CDK (类 MDK Keil)开发指南 的步骤编译下载即可
命令行编译
1 2 | $ cd <sdk_path>/bl_mcu_sdk
$ make BOARD=bl706_avb APP=usb_video
|
烧录
3.4.5. 实验现象¶
