系统识别到两个WIFI的问题
在连接WIFI时,系统可能识别到两个无线设备。经过排查,发现其中一个是由 p2p0 设备创建的信号。

图1:通过ifconfig查看网络接口状态
解决此问题有两种方法:一是直接关闭 p2p0 接口,二是通过 udev 规则禁止其创建。
ifconfig p2p0 down
或者通过修改NetworkManager配置,使其不管理 p2p0 设备:
# 修改配置文件,或直接删除p2p0节点
vi /etc/NetworkManager/NetworkManager.conf
[device]
match-device=interface-name:p2p0
managed=false
关于 WIFI p2p0 接口
p2p0 接口通常与 WiFi Direct(也称为 Wi-Fi Peer-to-Peer,简称 P2P)协议相关。这套由 Wi-Fi 联盟发展的协议,允许设备无需通过无线路由器即可直接相互连接,进行高速数据传输。例如,两台手机通过 Wi-Fi 直连功能传输文件就会用到这种接口。
而模拟AP(SoftAP)功能,则是将无线网卡转换为一个Wi-Fi热点,使其他设备(如手机、平板)能够通过连接该热点共享网络。

图2:设备通过无线热点互联示意图
热点无法联网的解决方法
如果创建的热点无法让连接的设备访问互联网,通常需要启用系统的IP转发功能。
编辑系统配置文件:
vim /etc/sysctl.conf
# 取消对 net.ipv4.ip_forward=1 这一行的注释
# 修改后保存
然后使配置生效:
sudo sysctl -p
USB Camera视频格式解析
不同的USB摄像头支持不同的视频压缩格式,了解它们有助于选择合适设备:
- YUYV:传输未经压缩的YUV数据,数据量很大,通常分辨率和帧率较低。这种原始数据一般由后端进行再处理,常用于虹膜识别、红外人脸识别等特殊用途。
- MJPEG:一种Motion-JPEG压缩格式,通常用于分辨率相对较低(如720P、VGA)的USB摄像头,传输数据量依然较大。
- H.264:高效的视频压缩编码,通常用于较高分辨率(如1080p、720p)的USB摄像头,能显著减小传输数据量。
使用 v4l2-ctl 调试摄像头
v4l2-ctl 是Linux下调试V4L2摄像头设备的常用工具,其内核模块功能丰富。

图3:使用命令查看USB摄像头支持的离散分辨率列表
USB Camera驱动路径
标准的USB视频类(UVC)摄像头驱动位于内核源码的以下路径:
kernel-5.10/drivers/media/usb/uvc
摄像头前后置标识问题
在Android等系统中,摄像头有前后置之分。如果默认是后置摄像头,需要修改为前置,可以调整驱动代码:
// 文件:hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
// const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL;
const uint8_t facing = ANDROID_LENS_FACING_FRONT;
UPDATE(ANDROID_LENS_FACING, &facing, 1);
RKISP1 图像信号处理器
RKISP驱动基于V4L2和media framework实现,负责硬件配置、中断处理、缓冲区轮转以及控制如MIPI DPHY和Sensor等子设备。
RKISP1驱动架构
驱动代码位于 drivers/media/platform/rockchip/rkisp1,使用媒体控制器API。该驱动提供了4个视频设备节点和3个子设备。

图4:RKISP1驱动的默认媒体管道拓扑结构图
视频设备包括:
rkisp1_mainpath:用于捕获图像的主路径设备,通常支持较高分辨率。
rkisp1_selfpath:用于捕获图像的辅路径设备。
rkisp1_stats:元数据捕获设备,用于输出统计信息。
rkisp1_params:元数据输出设备,用于接收来自用户空间的参数配置。
子设备包括:
rkisp1_resizer_mainpath:用于调整主路径捕获帧的大小和下采样。
rkisp1_resizer_selfpath:用于调整自路径捕获帧的大小和下采样。
rkisp1_isp:连接传感器,执行所有ISP操作。
如何关闭RKISP1驱动
如果不需要使用ISP功能,可以通过修改设备树(DTS)文件将其状态设置为 disabled。以下是一个diff示例:
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rb-rk3568-evb1-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rb-rk3568-evb1-ddr4-v10.dtsi
index ac1d7a945..4bc6d7736 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rb-rk3568-evb1-ddr4-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rb-rk3568-evb1-ddr4-v10.dtsi
@@ -452,15 +452,15 @@ uart8_gpios: uart8-gpios {
&rkisp {
- status = "okay";
+ status = "disabled";
};
&rkisp_mmu {
- status = "okay";
+ status = "disabled";
};
&rkisp_vir0 {
- status = "okay";
+ status = "disabled";
启动USB摄像头时的注意事项
在使用 cheese、guvcview 或 Qt V4L2 Test Utility 等工具测试摄像头时,默认可能会打开 video0(即 rkisp_mainpath,这是RK ISP处理器捕获的设备)。若要直接测试USB摄像头,请确保在工具中切换到 HD Web Camera 对应的设备节点。注意,cheese 等工具在切换设备后可能需要重启才能生效。
解决识别到双摄像头的问题
某些USB摄像头驱动会同时创建视频流设备和元数据设备,导致系统识别出两个摄像头(如 video0 和 video1)。如果只需要一个,可以通过修改驱动来避免创建元数据设备。
打开UVC驱动文件 kernel/drivers/media/usb/uvc/uvc_driver.c,找到并注释掉注册元数据节点的代码行:
/* Register a metadata node, but ignore a possible failure,
* complete registration of video nodes anyway.
*/
// uvc_meta_register(stream); // 注释掉这一行
term->vdev = &stream->vdev;
}
Linux udev规则详解
用户空间设备管理器(udev)允许我们为设备定义持久化的命名规则,这些规则存储在 .rules 扩展名的文件中。
/etc/udev/rules.d/:用于存放自定义规则,拥有更高优先级。
/usr/lib/udev/rules.d/:存放软件包安装的默认规则。
使用udev规则的主要目的包括:为热插拔设备创建确定的设备映射、解决主/辅设备号不足、管理 /dev 目录下过多的文件,以及提供更灵活的命名方式。

图5:udev接收内核事件并处理设备文件的流程图
udev规则语法与关键字
一个规则文件由一系列键值对组成,分为匹配键和赋值键。
常见关键字示例:
ACTION:事件行为,如 add(添加设备)、remove(删除设备)。
SUBSYSTEM:子系统名称,例如块设备的子系统为 block。
KERNEL:内核设备名称。
ATTRS{idVendor}, ATTRS{idProduct}:设备的供应商ID和产品ID。
SYMLINK:在 /dev/ 下为设备创建符号链接。这是推荐做法,可以避免覆盖系统默认规则生成的文件。
MODE:设备文件的权限(八进制)。
NAME:创建的设备文件名(仅第一行有效)。
GOTO / LABEL:用于规则内部的跳转控制。
操作符说明:
| 操作符 |
匹配或赋值 |
解释 |
== |
匹配 |
相等比较 |
!= |
匹配 |
不等比较 |
= |
赋值 |
分配一个特定值,可被后续规则覆盖 |
+= |
赋值 |
向已存在的键追加特定值 |
:= |
赋值 |
分配一个特定值,后续规则无法覆盖 |
实战:为USB摄像头创建udev规则
假设我们有一个供应商ID为 05a3,产品ID为 9332 的USB摄像头,我们希望为其创建一个固定且权限为777的符号链接。
创建规则文件 /etc/udev/rules.d/99-usb-camera.rules,内容如下:
KERNEL=="video*", ATTRS{idVendor}=="05a3", ATTRS{idProduct}=="9332", MODE="0777", SYMLINK+="camera"
保存后,重新加载udev规则并触发事件使新规则生效:
# 重新加载规则文件
udevadm control --reload-rules
# 触发UDEV事件以重新处理已连接的设备
sudo udevadm trigger
执行后,该摄像头除了默认的 /dev/videoX 节点外,还会有一个永久的 /dev/camera 符号链接,这在进行稳定的驱动开发和应用程序配置时非常有用。
参考资料
- rk3568 Debian11 如何打开热点
- ubuntu搭建wifi热点,共享网络,超简单
本文由云栈社区整理发布,旨在为RK3568开发者提供实用的调试参考。