找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2464

积分

0

好友

352

主题
发表于 昨天 02:01 | 查看: 2| 回复: 0

系统识别到两个WIFI问题

在RK3568的Linux系统中,有时会意外地识别出两个WIFI接口。

对其中一个进行连接发现,一个WIFI是 p2p0设备

ifconfig命令查看网络接口信息

将 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等终端连接该无线信号后即可上网

WiFi热点共享网络示意图

热点无法联网

为什么开启了热点,设备却无法联网?这可能是因为系统的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

v4l2-ctl命令列出设备支持的YUV格式分辨率

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

Diagram of the default media pipeline topology

该驱动 有 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处理设备事件的基本流程

对于存储设备,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和系统调试内容,欢迎访问 云栈社区 进行交流。




上一篇:Roofline模型实践指南:固定硬件下的算法性能优化技巧
下一篇:C++未定义行为深度解析:为何判空逻辑会被编译器优化移除?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-16 03:54 , Processed in 0.207733 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表