摄像头实验-捕获一张图像
硬件要求:
- DshanPI-CanMV开发板
- GC2093摄像头
- Type-C数据线 x2
开发环境:
- Ubuntu20.04
配套源码:https://pan.baidu.com/s/1VBd0n3FKO0bj8yHOWk4HEw?pwd=ov5d 提取码:ov5d
具体位置: 12_多媒体应用示例源码\01_sample_vi
注意:在学习前请按照《K230 SDK环境搭建》搭建好K230的开发环境或者直接获取资料光盘中搭建好环境的Ubuntu虚拟机。
1.摄像头架构
1.1 VICAP模块架构
VICAP模块是对整个图像采集处理单元的抽象描述。
VICAP硬件由Sensor,VI,ISP,Dewarp四大模块组成(如下图1-1所示)。最多支持3路sensor同时接入,ISP内部通过的MCM模块实现多路sensor的时分复用管理,多路sensor输出数据通过MCM的Memory Interface的Write 接口写入DDR,再通过Read接口读入并装载到ISP Pipeline进行处理。
VICAP软件架构如下图所示,从上到下依次是:应用接口层,媒体接口层,系统框架层,驱动层和硬件层。
- 应用层接口: 提供kd_mapi_vicap_xxx形式的API接口及使用说明。它是对媒体接口层各个子模块提供的功能接口的进一步封装,简化应用开发流程。
- 媒体接口层:该层由VICAP各个子模块组成,每个子模块提供各自的媒体接口API封装。
- 框架层:负责VICAP整个系统软件功能与业务逻辑的控制与管理。通过将各个子模块提供的接口与功能整合统一形成一套完整的VICAP系统控制逻辑和流程。
- 驱动层:VICAP各个硬件模块的内核驱动功能的集合。
硬件层:VICAP各个具体硬件模块的集合,包括sensor。
1.2 Sensor架构
Sensor模块是VICAP捕获图像的数据源之一,负责配置图像感光单元的运行参数及工作模式。
K230平台支持多种接口类型的sensor,我们以当前最常用的MIPI CSI接口Sensor为例进行说明。Sensor与主控平台的硬件连接示意图如下:
主控通过I2C接口下发配置寄存器控制sensor的工作方式,sensor通过MIPI CSI接口将图像数据发送至主控SOC。
Sensor模块系统架构如下图所示:
从上到下依次是:媒体接口层,硬件驱动层以及硬件层
- 媒体接口层:提供kd_mpi_sensor_xxx接口给外部模块操作和访问sensor设备。
- 驱动层:该层主要包两部分,分别是:sensor_dev,sensor_drv。
- sensor_dev:负责设备驱动文件的注册,提供文件操作接口的实现流程。通过注册设备文件节点/dev/sensorxx供用户空间的程序访问内核驱动。
- sensor_drv:具体sensor的硬件驱动,并将针对sensor的操作封装为统一的接口。
- 硬件层:sensor模组硬件,当前系统中最多同时支持三路硬件sensor。
2.应用程序编译
2.1 新增程序
2.1.1 新建工程文件夹
在k230_sdk/src/big/mpp/userapps/sample目录下新建工程
mkdir sample_vicap_100ask
2.1.2 修改Makefile
修改k230_sdk/src/big/mpp/userapps/sample目录下的Makefile文件,新增sample_vicap_100ask工程的编译规则
@cd sample_vicap_100ask; make || exit 1
@cd sample_vicap_100ask; make clean
2.1.3 进入工程目录
cd sample_vicap_100ask/
2.1.4 新建源码文件
vi sample_vicap_100ask.c
填入源码。
2.1.5 新建Makefile文件
vi Makefiel
填入一下内容:
include $(MPP_SRC_DIR)/userapps/sample/mpp.mk
include $(MPP_SRC_DIR)/userapps/sample/rt-smart.mk
CURRECT_DIR_NAME=$(shell basename `pwd`)
LOCAL_SRC_DIR = $(shell pwd)
BIN = $(MPP_SRC_DIR)/userapps/sample/elf/$(CURRECT_DIR_NAME).elf
LIBPATH = $(MPP_LIB_PATH)
LIBS = $(MPP_LIBS)
LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) \
-I$(LOCAL_SRC_DIR)/../sample_vo
SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) \
$(LOCAL_SRC_DIR)/../sample_vo/vo_test_case.c \
$(LOCAL_SRC_DIR)/../sample_vo/vo_bind_test.c
OBJS = $(patsubst %.c,%.o,$(SRCS))
all: $(BIN)
@-rm -f $(OBJS)
@echo "${PWD}/Makefile all"
$(OBJS): %.o : %.c
@echo CC $@
@$(CC) $(CC_CFLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@
$(BIN): $(OBJS)
@echo LD $@
@$(CC) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $(OBJS) -L$(LIBPATH) -Wl,--start-group $(LIBS) -Wl,--end-group
clean:
echo "${PWD}/Makefile clean"
-rm -rf $(BIN)
-rm -f $(OBJS)
.PHONY: all clean
~
2.2 程序编译
1.进入K230SDK目录
cd ~/k230_sdk
2.下载toolchain和准备源码
source tools/get_download_url.sh && make prepare_sourcecode
3.挂载工具链目录
sudo mount --bind $(pwd)/toolchain /opt/toolchain
4.配置板级型号
make CONF=k230_canmv_dongshanpi_defconfig prepare_memory
5.编译程序
make mpp-apps
等待编译完成,编译完成后,可执行程序sample_vicap_100ask.elf
会生成在k230_sdk/src/big/mpp/userapps/sample/elf
目录下。
使用ADB将可执行程序传输至开发板中
adb push src/big/mpp/userapps/sample/elf/sample_vicap_100ask.elf /sharefs/app