您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# A20 Linux如何同时使用Parallel CSI Camera及UVC
## 引言
在嵌入式Linux开发中,全志A20处理器因其多媒体处理能力和丰富的接口支持被广泛应用于图像采集场景。本文将深入探讨在A20平台上**同时驱动Parallel CSI接口摄像头和USB UVC摄像头**的技术方案,涵盖驱动配置、V4L2框架应用以及实际调试技巧。
---
## 一、硬件架构分析
### 1.1 A20的影像子系统
全志A20处理器包含以下关键组件:
- **CSI (Camera Serial Interface)**:支持并行接口的摄像头模块
- **VE (Video Engine)**:硬件视频编解码单元
- **USB 2.0 OTG**:支持UVC协议设备接入
```mermaid
graph TD
A[CSI Camera] -->|Parallel Bus| B(A20 CSI Interface)
C[UVC Camera] -->|USB 2.0| D(A20 USB Host)
B --> E[V4L2 Subsystem]
D --> E
E --> F[Application]
设备类型 | 推荐型号 | 备注 |
---|---|---|
CSI摄像头 | OV5640模组 | 需匹配A20电压电平 |
UVC摄像头 | Logitech C920 | 免驱认证设备 |
开发板 | Cubieboard2 | 带CSI接口和USB Host |
确保内核包含以下关键配置:
# CSI摄像头驱动
CONFIG_VIDEO_SUNXI_CEDAR=y
CONFIG_CSI_VFE=y
# UVC驱动
CONFIG_USB_VIDEO_CLASS=y
CONFIG_MEDIA_USB_SUPPORT=y
# V4L2框架
CONFIG_VIDEO_DEV=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y
&csi0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&csi0_pins_a>;
port {
csi0_ep: endpoint {
remote-endpoint = <&ov5640_ep>;
bus-width = <8>;
hsync-active = <1>;
vsync-active = <0>;
data-active = <1>;
pclk-sample = <1>;
};
};
};
&i2c1 {
ov5640: camera@3c {
compatible = "ovti,ov5640";
reg = <0x3c>;
clocks = <&ccu CLK_CSI0_MCLK>;
clock-names = "xclk";
port {
ov5640_ep: endpoint {
remote-endpoint = <&csi0_ep>;
};
};
};
};
# 查看已识别设备
v4l2-ctl --list-devices
# 预期输出示例:
# /dev/video0 (CSI摄像头)
# /dev/video1 (UVC摄像头)
# 检查格式支持
v4l2-ctl -d /dev/video0 --list-formats-ext
v4l2-ctl -d /dev/video1 --list-formats-ext
# 同时采集并合成画中画
gst-launch-1.0 \
v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720 ! \
tee name=t \
t. ! queue ! videobox border-alpha=0 top=-600 left=-400 ! \
compositor name=mix sink_0::alpha=1 sink_1::alpha=1 ! \
videoconvert ! autovideosink \
t. ! queue ! mix. \
v4l2src device=/dev/video1 ! video/x-raw,width=640,height=480 ! mix.
import cv2
import threading
def capture_csi():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# 处理CSI帧数据
def capture_uvc():
cap = cv2.VideoCapture(1)
while True:
ret, frame = cap.read()
# 处理UVC帧数据
threading.Thread(target=capture_csi).start()
threading.Thread(target=capture_uvc).start()
# 预先分配DMA缓冲区
echo 3 > /sys/module/videobuf2_core/parameters/default_buffers
echo 10 > /sys/module/videobuf2_vmalloc/parameters/buffers
# 将CSI中断绑定到特定CPU核心
echo 1 > /proc/irq/$(cat /proc/interrupts | grep csi0 | awk '{print $1}' | tr -d :) /smp_affinity
# 限制UVC设备带宽使用(单位:KB/s)
echo 30000 > /sys/bus/usb/devices/1-1.1/quota
现象 | 可能原因 | 解决方案 |
---|---|---|
CSI图像色彩异常 | 数据线序配置错误 | 检查DT中的bus-width参数 |
UVC设备频繁断开 | USB供电不足 | 外接5V电源或使用带供电HUB |
系统日志报DMA分配失败 | CMA内存池不足 | 修改bootargs增加cma参数 |
双摄同步采集掉帧 | CPU负载过高 | 启用硬件加速编码 |
# 监控内核消息
dmesg -w | grep -E 'csi|uvc|v4l2'
# 典型正常日志示例:
[ 5.123456] sunxi_csi0: Registered sensor ov5640
[ 5.234567] uvcvideo: Found UVC 1.00 device HD Pro Webcam C920
# 使用PyTorch进行双摄深度估计
import torch
from dual_cam_net import StereoDepthNet
model = StereoDepthNet.load_from_checkpoint('model.ckpt')
csi_frame = get_csi_frame() # 获取CSI图像
uvc_frame = get_uvc_frame() # 获取UVC图像
depth_map = model(csi_frame, uvc_frame)
<!-- ROS launch文件示例 -->
<launch>
<node pkg="uvc_camera" type="uvc_camera_node" name="uvc_cam">
<param name="device" value="/dev/video1"/>
</node>
<node pkg="csi_camera" type="csi_camera_node" name="csi_cam">
<param name="width" value="1280"/>
</node>
<node pkg="message_filters" type="time_synchronizer"
args="image csi/image_raw uvc/image_raw" />
</launch>
通过本文介绍的方法,开发者可以在A20平台上构建高效的双摄像头系统。实际部署时需注意: 1. 优先选择经过验证的摄像头硬件 2. 根据应用场景调整V4L2参数 3. 定期监控系统资源使用情况
附录资源: - A20 Datasheet - Linux V4L2文档 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。