Cubieboard2(五) 安装无线网卡驱动

1 前情提要

1.1 硬件情况

  • 1)Cubieboard2:http://cubieboard.org/model/cb2/

Cubieboard2 是一个由珠海的 Cubietech 团队推出,采用全志 A20 处理器的开发板。

手头上的是生产于 2012.9.9 的是 MMC + SDCard 而非 dual_card 款,也是饱经风霜了。

  • 2)无线网卡:

Tenda 生产的型号为 U2 v5.0 AX300 Wi-Fi6 高增益 USB 无线网卡。

  • 3)CB2 与无线网卡组装图:

不相干的话:
(1)买无线网卡前以为房间没有可用网线接口,买完才发现有网口,那买都买了不折腾一下不是亏大了吗?
(2)开始折腾了发现网卡的 USB 公头短而延长部分太宽,无法插入到带盒子的 Cubieboard2 的 USB 母口上,那这不再整个 USB 转接头那我网卡不白买了吗?
(3)再买一个 USB 的直角转接头(本来想买 U 型的,脑海中 3D 建模一下发现 U 型的插上后,网卡天线要么水平,要么朝下),买回来后发现转接头的 USB 公头部分也短,没有什么是一把指甲刀解决不了的,打磨一下终于可以插上了。
(4)去官网下载 Linux 下的网卡驱动包,安装,报错,啊! —— 来自土拨鼠的嘶吼!
回过头去研究某宝的详情页,发现该网卡支持 Linux 内核版本为 V3.10-V6.2,而 CB2 的内核为 linux-3.4,那这不折腾一下那我网卡和 USB 转换头不白买了吗?

1.2 软件环境

  • 1)OS 选择基于微软的 WSL(Windows Subsystem for Linux)的 Ubuntu 22.04

  • 2)交叉编译工具链:arm-linux-gnueabihf-gcc 7.5.0 版本

  • 3)Linux 源码:选择 v6.1-rc8(这里是我的一个误区,原以为这些 rc 版本是 v6.1 的升级版本,实际上 v6.1 才是包含 patch 的稳定版本,即应该直接选择 v6.1 版本)

  • 4)U-Boot 源码:直接 master 分支

2 编译

具体的编译过程详见前置文章,这里记录一下其中的问题。

  • 1)升级完内核后再安装无线网卡驱动包 ax300-wifi-adapter-linux-driver.deb,报错:
# 内核版本如下
uname -r
6.1.0-rc8-dirty

情况1:编译时出现以下错误
/lib/modules/6.1.0-rc8-dirty/build 目录不存在

情况2:安装头文件
apt-get install linux-headers-$(uname -r)
E: Unable to locate package linux-headers-6.1.0-rc8-dirty

情况3:尝试安装 linux-headers-5.13.0-generic,并通过 ln 将软连接定位过来
编译成功,但使用 insmod 安装时出现 Invalid format module 问题

情况4:通过 make install_headers 将内核头文件安装上
依然报错:/lib/modules/6.1.0-rc8-dirty/build 目录不存在
  • 2)山重水复间,观察驱动包安装时的日志,发现它会将驱动源码解压到 /usr/src/tenda/aic8800 目录,有源码就好办了。直接把驱动源码复制到 Linux 源码中编译即可,遇到的问题:
情况1:Kconfig:3: unknown statement "---help---"
应该是新版本 Kconfig 不兼容其中的 “--help--”,修改成 help 指令即可。
  • 3)编译成功,且生成了无线网卡驱动,内核烧录见前置文章。
/usr/lib/modules/6.1.0-rc8-dirty/kernel/drivers/net/wireless/aic8800/aic_load_fw/aic_load_fw.ko
/usr/lib/modules/6.1.0-rc8-dirty/kernel/drivers/net/wireless/aic8800/aic8800_fdrv/aic8800_fdrv.ko

3 安装驱动

  • 1)重启系统后发现,两个驱动文件没有安装,配置开机自动进行驱动加载:
# 建立驱动 map 文件
depmod -a

# 添加自动加载的驱动名(aic_load_fw 应该在 aic8800_fdrv 之前)
echo "aic_load_fw" >> /etc/modprobe.d/aic8800.conf
echo "aic8800_fdrv" >> /etc/modprobe.d/aic8800.conf
  • 参考:https://blog.youkuaiyun.com/huiyuanliyan/article/details/120882037

  • 2)重启后驱动正常加载,但是通过 ifconfig/iwconfig 命令依然看不到无线网卡,查看 /var/log/messages 日志,报错:

AICWFDBG(LOGINFO)    ###Upload fmacfw patch 8800dc u02 bin firmware,180000
AICWFDBG(LOGINFO)    ###Load file fmacfw patch 8800dc u02 bin 
AICWFDBG(LOGINFO)    rwnx load firmware firmware path /lib/firmware/aic8800DC/fmacfw patch 8800dc u02 bin 
AICWFDBG(LOGERROR)   rwnx load firmware:fmacfw patch 8800dc u02bin file failed to open
AICWFDBG(LOGERROR)   No such file or directory 
AICWFDBG(LOGINFO)    load patch bin fail:-1

猜测这些 bin 文件应该是驱动的依赖库,去驱动的源码目录 find 一下,果然 /fw/aic8800DC/ 目录下由包含这个 bin 文件的一堆依赖文件,通过 scp 拷贝到 Cubieboard2 的对应目录。

  • 3)在 /etc/network/interfaces.d/wlan0.conf 文件中配置自动获取 IP、WIFI 账户密码后,再次重启,通过 ifconfig/iwconfig 命令依然看不到无线网卡。依稀记得官方《安装驱动方法》文档中提到会出现系统识别是 U 盘的情况:
# 配置 /etc/network/interfaces.d/wlan0.conf
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "WIFI name"
wpa-psk  "WIFI password"

# 查看所有挂载点
mount

# 查看块设备
lsblk

mount 命令没有找到被挂载的网卡,块设备中倒是发现了它,3.7M 的那个就是

  • 4)根据官方《安装驱动方法》文档提示,使用 eject /dev/sda1 弹出 U 盘,发现没有该命令,尝试安装:
apt-get install eject

奇怪,明明提示无法弹出,但结果确实弹出了。

  • 5)再次通过 iwconfig 终于出现了无线网卡,不过名称有点奇怪,先修改下网络配置文件:
# 配置 /etc/network/interfaces.d/wlan0.conf
auto wlxc83a35120088
allow-hotplug wlxc83a35120088
iface wlxc83a35120088 inet dhcp
wpa-ssid "WIFI name"
wpa-psk  "WIFI password"

网卡名称为 wlxc83a35120088,根据该名称修改 /etc/network/interfaces.d/wlan0.conf 文件。

  • 5)通过以下命令重启网络,结果:
systemctl restart networking

通过 ssh 测试,可以使用该网卡正常登录。

  • 6)还剩最后一个问题:每次重启后,无线都被识别为 U 盘,需要通过 eject 指令弹出,再重启网络才能正常使用。
### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值