系统识别到两个WIFI问题
在RK3568的Linux系统中,有时会意外地识别出两个WIFI接口。
对其中一个进行连接发现,一个WIFI是 p2p0设备

将 p2p0关掉 可以解决此问题 或者 通过 udev 规则 禁止p2p0文件的创建。
ifconfig p2p0 down
# 修改如下 ,或者直接删掉p2p0节点。
vi /etc/NetworkManager/NetworkManager.conf
[device]
match-device=interface-name:p2p0
managed=false
WIFI p2p0
WiFi Direct的协议是Wi-Fi联盟发展,支持与授权认证的一套软件协议,也被称为Wi-Fi点对点(Wi-Fi Peer-to-Peer,简称P2P)。这套协议允许无线网络中的设备无需通过无线路由器即可相互连接,以点对点的方式直接与另一个WiFi设备连线,进行数据高速传输。
p2p0 一般指 Wi-Fi点对点(P2P)接口,用于设备之间进行无线连接,无需通过无线路由器,比如两台手机通过 Wi-Fi直连功能传输文件 就会用到这种接口
模拟AP 也叫做 SoftAP ,在可以上网的电脑上开启无线网卡的模拟AP功能后,无线网卡就可以将电脑的网络转换成Wi-Fi无线信号,手机,pad等终端连接该无线信号后即可上网

热点无法联网
为什么开启了热点,设备却无法联网?这可能是因为系统的IP转发功能没有开启。
启动路由转发
vim /etc/sysctl.conf
# 解除对 net.ipv4.ip_forward=1 的注释
# 修改后保存
# 使其生效
sudo sysctl -p
USB Camera格式
不同类型的USB摄像头支持不同的视频压缩格式,了解它们有助于选择合适设备和排查问题。
YUYV : 传输 的是 YUV数据,数据量很大,分辨率和帧率较低,一般由后端对数据进行再处理,用于一些特殊用途(虹膜,红外人脸识别等)
MJPEG : 一般用于分辨率相对较低的USB Camera(720P,VGA),传输数据较大
H.264: 一般用于分辨率较高的USB Camera(1080p ,720p) 传输数据较小。
v2l2-ctl 调试
v4l2-ctl 是调试视频设备的利器,可以帮助我们快速了解摄像头的能力。
# 列出支持的所有视频设备
v4l2-ctl --list-devices
# 列出特定设备支持的格式
v4l2-ctl --device=/dev/video0 --list-formats
# 设备支持的分辨率
v4l2-ctl -d /dev/video0 --list-framesizes=YUYV

USB Camera驱动
大多数现代USB摄像头遵循UVC标准,其驱动位于内核源码中。
kernel-5.10/drivers/media/usb/uvc
前后置问题
如果你使用的摄像头被系统识别为后置,但实际是前置摄像头,可以这样修改。
默认是后摄,前摄如下修改
# 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是瑞芯微平台上负责图像信号处理的核心驱动模块。
RKISP驱动主要是依据 v4l2 / media framework 实现硬件的配置,中断处理,控制 buffer轮转,以及控制subdevice (如 mipi dphy 及 sensor的上下电 功能)
RKISP1 Rockchip图像信号处理器
了解其驱动架构和组件,对于调试摄像头问题至关重要。
程序驱动位于 drivers/media/platform/rockchip/ rkisp1 并使用 媒体控制器 API

该驱动 有 4个 视频设备
- rkisp1_mainpath: 用于检索图像的捕获设备,通常具有较高的分辨率
- rkisp1_selfpath: 用于检索图像的捕获设备
- rkisp1_stats: 一个元数据的捕获设备,用于发送统计信息
- rkisp1_params: 一个元数据输出设备,用于接受来自用户空间的参数配置。
该驱动有三个子设备
- rkisp1_resizer_mainpath: 用于调整主路径捕获设备帧的大小和下采样。
- rkisp1_resizer_selfpath: 用于调整自路径捕获设备帧的大小和下采样
- rkisp_isp:连接到传感器,复制所有isp操作。
关闭RKISP1
在某些应用场景下,如果不需要使用内置的ISP功能,可以将其在设备树中禁用。
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rb-rk3568-evb.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rb-rk3568-evb.dtsi
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";
port {
#address-cells = <1>;
Linux启动USB摄像头注意事项
使用图形化工具测试USB摄像头时,需要特别注意选择的视频设备节点。
无论是 cheese(拍照) 还是 guvcview 还是Qt V4L2 Test Utility默认启动的都是Video0 即 rkisp_mainpath(RK的图像处理器捕获的设备) ,在进行测试的时候,请切换到 HD Web Camera即可正常打开设备,注意 cheese 需要重新运行。
识别到双摄像头问题
系统将一个USB摄像头识别成两个设备?这可能是UVC驱动注册了元数据节点导致的。
可以通过修改驱动将video1给删除掉,来避免双摄像头问题
打开驱动文件 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);
// 注释掉 下面这行
// uvc_meta_register(stream);
term->vdev = &stream->vdev;
}
Linux文件 udev规则
udev是Linux系统中管理/dev目录下设备节点的核心机制,掌握其规则编写能有效解决设备命名和权限问题。
用户空间设备管理器(udev)子系统允许您为设备 分配持久名称定义规则,这些规则存储在 带有 .rule 扩展名的文件中,
/etc/udev/rules.d 用于自定义 udev 规则 ,拥有更高优先级,优先进行修改。
/usr/lib/udev/rules.d/ 目录包含安装的软件包附带的默认规则。
规则的目的 是 确保存储设备的识别一致且可预测,即使系统重启和配置发生变化也是如此。
- 创建确定的设备映射,尤其是针对热拔插设备
- 解决没有足够的 主/辅 设备号
- 解决 dev目录下文件太多
- 解决命名不够灵活

对于存储设备,udev规则控制在 /dev/disk/ 目录中创建符号链接。这些符号链接为存储设备提供用户友好的别名,从而引用和管理这些设备更为方便。
# This is used to change the default configuration of Realtek USB ethernet adapters
# ACtion 事件uevent的行为,例如 add(添加设备)remove(删除设备)
# GOTO 跳到匹配的规则 通过label标识
# != 使用不等比较,不相等直接退出
ACTION!="add", GOTO="usb_realtek_net_end"
# SUBSYSTEM 子系统的名称,例如 sda的子系统为block
SUBSYSTEM!="usb", GOTO="usb_realtek_net_end"
# ENV{value} 环境变量,可以表示任意
ENV{DEVTYPE}!="usb_device", GOTO="usb_realtek_net_end"
# Modify this to change the default value
ENV{REALTEK_MODE1}="1"
ENV{REALTEK_MODE2}="3"
# Realtek
ATTR{idVendor}=="0bda", ATTR{idProduct}=="815[2,3,5,6]", ATTR{bConfigurationValue}!="$env{REALTEK_MODE1}", ATTR{bConfigurationValue}="$env{REALTEK_MODE1}"
ATTR{idVendor}=="0bda", ATTR{idProduct}=="8053", ATTR{bcdDevice}=="e???", ATTR{bConfigurationValue}!="$env{REALTEK_MODE2}", ATTR{bConfigurationValue}="$env{REALTEK_MODE2}"
ATTR{idVendor}=="0bda", ATTR{idProduct}=="c820", ATTR{bcdDevice}=="e???", ATTR{bConfigurationValue}!="$env{REALTEK_MODE2}", ATTR{bConfigurationValue}="$env{REALTEK_MODE2}"
# LABEL 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务)
LABEL="usb_realtek_net_end"
- BUS : 总线的名字
- DRIVER:设备驱动的名字
- ID:独立于内核名字的设备名称
- SYSFS{value} sysfs属性值,它可以表示任意
- FROGRAM: 可执行的外部程序,如果程序返回0值,该键则认为为真true
- RESULT:上一个FROGRAM调用返回标准输出
- NAME: 根据这个规则创建的设备文件名,仅仅第一行的NAME描述有效,后面的均忽略,如果使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键
- SYMLINK : 为 /dev/ 下的设备产生符号链接。由于udev只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的udev规则所产生的文件,推荐使用符号链接。
- OWNER: 设备文件的属组
- GROUP: 设备文件所在的组
- MODE:设备文件的权限,采用8进制
- LABEL: 在配置文件里为内部控制而采用的名字标签
- GOTO:跳到匹配的规则,通过LABEL来表示
- IMPORT{type}:导入一个文件或一个程序执行后而生成的规则集到当前文件
- WAIT_FOR_SYSFS: 等待一个特定的设备文件的创建,主要是用作时序和依赖问题
- OPTIONS: 特定的选项
- last_rule 对这类设备终端规则执行
- ignore_device 忽略当前规则
- ignore_remove:忽略接下来的并移走请求
- all_partitions: 为所有的磁盘分区创建设备文件
匹配键 和 复制键 操作符
| 操作符 |
匹配或赋值t |
解释 |
| == |
匹配 |
相等比较 |
| != |
匹配 |
不等比较 |
| = |
赋值 |
分配一个特定的值给该键,他可以覆盖之前的赋值。 |
| += |
赋值 |
追加特定的值给已经存在的键 |
| := |
赋值 |
分配一个特定的值给该键,后面的规则不可能覆盖它。 |
创建文件 /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
掌握这些在RK3568等嵌入式Linux平台上的调试技巧,能帮助开发者更高效地解决USB摄像头和WIFI网络的集成问题。对于Linux系统中复杂的设备和网络管理,理解其底层机制是关键。
参考资料
- rk3568 Debian11 如何打开热点[1]
- ubuntu搭建wifi热点,共享网络,超简单 [2]
[1] rk3568 Debian11 如何打开热点: https://blog.csdn.net/YY2065/article/details/131976216
[2] ubuntu搭建wifi热点,共享网络,超简单 : https://www.cnblogs.com/mediocreWorld/p/16000916.html
希望这篇针对RK3568的调试指南能对你有所帮助。如果你想深入探讨或查看更多嵌入式Linux和系统调试内容,欢迎访问 云栈社区 进行交流。