在高通骁龙410主控的USB网卡上玩 GNU/Linux

 · 6 分钟
Last updated: 2022-09-13
Table of contents

动机

有段时间网上基于物联网卡的USB式移动数据终端(4G网卡)变多了,搞开车活动,设备很 便宜,价格10块上下,而且默认可以用 ADB 和 Fastboot。作为骁龙410,内核主线支持也 不错。是一个可玩性很高的小设备。我买了某品牌的设备,板号是 UFI001C_MB_V01,目前已经 有网友搞定了,可以跑主线内核的 Debian Bullseye。

后面又入了一个 UFI003,结构基本一致。

这东西好像可以拿来做下载机、签到、旁路由、渗透工具

目前可以公开的信息

  • 设备信息(UFI001C_MB_V01
    • CPU:MSM8916,Snapdragon 410,A53@4C,64bit
    • RAM/Storage:512M/4G,实际可用约382M/3.3G(因为Modem占用了一些内存)
    • 无线:802.11b/g/n,4G LTE,Bluetooth 4.1,其它SoC支持的也不一定能 用,因为没有接外设出来
    • 有线:USB(可模拟网卡设备,同时用于供电)
    • 其它说明
      • 板上有一颗 eSIM,应该是互联网卡注册用的。
      • 有一个 SIM 卡槽位置,但是没有焊接卡座
      • 有一颗按钮,按住它上电会进入 EDL/9008 模式。
  • 操作系统
    • 原版系统:安卓(没看版本,盲猜魔改 AOSP
    • 修改系统:Debian(融合部分Mobian)、OpenWrt,以及其它发行版
  • 刷机方式
    • 原版系统开放 ADB、Fastboot
    • 9008工具亦可

刷机流程

备份

刷机警告

道路千万条, 备份 第一条。
刷机太心急,锁网废机器。

先使用9008工具做全盘备份,ROOT之后用QPST备份基带(QCN),然后再刷系统。

9008 全盘备份

9008刷机用 Windows 方便一些。为了能使用高通测试签名的驱动,需要使用命令行开启测试模式。

# 设置后需重启以应用
bcdedit.exe -set testsigning on
# 刷完后用下面这条改回去
bcdedit.exe -set testsigning off

使用 Qualcomm Premium Tool 做完整的 eMMC 备份。需要使用 Windows。 做全盘备份请按图上顺序点击,在出现分区选择时选择最后一个分区(这样备份从0到最后 一个分区),后续按提示选择合适的位置存放全盘镜像。只需要保留这一份全盘备份就 行,其它分区、分区表等信息可以从中提取。

Qualcomm Premium Tool 操作提示,先进入qualcomm分页下的partitions分页,再按Read(9008)

基带备份

基带/QCN 备份,需要在安卓系统下开启高通的调试接口然后用 QPST 提取。基带芯片是一 个协处理器,其固件数据存储在一片 NVRAM 中,所以不能直接用 9008 模式读取。

Root有很多方法,在此不详叙,仅提一些操作要点。

  • 如果要用桌面投屏控制这个棒子,请先在投屏成功后再安装桌面应用并将其设置为默认 桌面,否则会一直黑;
  • 好像没了

开启测试端口的方法如下:

adb shell
# 接下来是在 adb shell 中操作
su
# 注意留住下面的 adb,不然adb就暂时用不了了
setprop sys.usb.config diag,adb

接下来就可以使用 QPST 的 Software Download 程序,在 Backup 分页中操作并读取当前 设备的基带固件了(记得选好自己的设备)。

另外串号什么的最好也备份一下。我这次有点浮躁忍不了 Windows(甩锅)。

驱动的事Windows好像并不是全都比GNU/Linux那边方便,感觉 Linux 那边通常更方便。

Debian 安装与使用

Warning

OpenStick 项目及其主页提供的部分内容有误,且 RootFS 配置上有 Bug,导致会出 现 USB 网络和 WiFi 热点不能同时开启的现象。如果有能力,建议自行重建 RootFS。

Note

刷 Debian 可以参考 OpenStick 的文档 3。此处略过。
不过 Modem 固件(运行时加载的固件)文档并没有写清,在一个 64MB 大小的分区里,所 有的固件都在一个 images 文件夹里。部分软件提取出来的分区镜像名是 NON-HLOS.bin

emm OpenStick小队整的 Debian RootFS 好像缺了不少常用的包,而且配置好像有点点小问题。 记录一下操作。

  • 更新时间 timedatectl set-ntp true
  • 安装编辑器:vim
  • 安装 curl/wget/ca-certificates 保证 https 连接
  • 换源到 USTC (网易163源貌似缺包,ftp.cn.debian.org 又是直接重定向到 USTC 会有证书错误)
  • 安装 Bluez 并加载相关模块而启用蓝牙
  • 安装 Zsh/OhMyZsh 方便操作
  • 安装 iproute2/iw 等网络工具
  • 更新到 Debian Bookworm
  • 安装 fake-hwclock 保证时间一致性 不用了,可以用 systemd-timesyncd
  • 写了个脚本做网络连接 failsafe,后面有写
  • 改了设备树,让按钮可以用

iperf3 测了一下速度,2.4G WiFi 速度有 33Mbps,USB 则有 112 Mbps。Modem 暂时没条 件测试。

编译与修改内核

本节内容有参考 OpenStick 文档4,并加入了自己的更新。

Warning

以下内容仅供参考,不保证准确可用,请灵活应变!

如果你用的是非 Debian 系的 GNU/Linux,建议创建一个 Chroot。BTW 我电脑用的是 Arch Linux,后面自行构建了一个 Debian bookworm RootFS,在 Chroot 内操作。

# Chroot on arch - optional approach
mkdir -p /home/user/CHROOT/bookworm-cache
cd /home/user/CHROOT/
sudo debootstrap --arch=amd64 --cache-dir /home/user/CHROOT/bookworm-cache --foreign bookworm bookworm http://mirrors.ustc.edu.cn/debian/
sudo arch-chroot bookworm
/debootstrap/debootstrap --second-stage

然后准备环境、制作 boot.img

# Debian bookworm environment
apt update && apt install -y git \
    build-essential \
    gcc-aarch64-linux-gnu \
    bc bison cpio flex rsync kmod libssl-dev

# build kernel
git clone --depth 1 [email protected]:OpenStick/linux.git linux-openstick
cd linux-openstick
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make msm8916_defconfig
make deb-pkg  # packages are generated in the parent directory

## prepare data for boot.img
mkdir ../android-boot
cp arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-ufi001c.dtb ../android-boot
cp arch/arm64/boot/Image.gz ../android-boot

# install kernel packages
scp ../linux-headers-5.15.0-handsomekernel_5.15.0-handsomekernel-1_arm64.deb [email protected]:
scp ../linux-image-5.15.0-handsomekernel_5.15.0-handsomekernel-1_arm64.deb [email protected]:
ssh [email protected] sudo apt remove "linux-image-5.15.0-handsomekernel+"
ssh [email protected] sudo apt remove "linux-headers-5.15.0-handsomekernel+"
ssh [email protected] sudo dpkg -i linux-image-5.15.0-handsomekernel_5.15.0-handsomekernel-1_arm64.deb linux-headers-5.15.0-handsomekernel_5.15.0-handsomekernel-1_arm64.deb

# get initrd.img
scp [email protected]:/boot/initrd.img-5.15.0-handsomekernel ../android-boot

# generate boot.img
cd ../android-boot
cat Image.gz msm8916-handsome-openstick-ufi001c.dtb > kernel-dtb
mkbootimg \
    --base 0x80000000 \
    --kernel_offset 0x00080000 \
    --ramdisk_offset 0x02000000 \
    --tags_offset 0x01e00000 \
    --pagesize 2048 \
    --second_offset 0x00f00000 \
    --ramdisk initrd.img-5.15.0-handsomekernel \
    --cmdline "earlycon root=PARTUUID=a7ab80e8-e9d1-e8cd-f157-93f69b1d141e console=ttyMSM0,115200 no_framebuffer=true rw"\
    --kernel kernel-dtb -o boot.img

# flash boot.img
adb reboot bootloader
fastboot flash boot boot.img

截止文章发布,该内核设备树的按钮电平配置还是反的,我已经改了,不多说了。

按钮修好后,可以配置 systemd-logind 设置 HandleRebootKeyHandleRebootKeyLongPressignore,然后用别的程序监控这个按钮发出别的操 作。不过也可以用 systemd-inhibithandle-reboot-key

其它说明

  • 这个设备 sim 卡热插拔不太稳的样子。所以尽量别热插拔了可能 Modem 会出现运行错 误;
  • 内核默认配置是激活外部 eSIM,所以自己插卡后需要手动切卡(通过SysFs写点东 西),然后可能需要重启 ModemManager,之后大概就能获取到网络信息了。至少我获取 到了。
  • 我也不知道全网通基带考不靠谱,虽然我刷了,但是没测试(这个测试起来太麻烦 了),后面感觉并不靠谱,没必要;
  • 想用按钮,或许要自己改 device tree
  • 这东西,Modem 发热严重,可以试试改用低功耗模式;另,使用不匹配的固件同样会造 成 Modem 发热严重。

有趣的应用

先让自己的设备断网也不怕

虽说可以用串口终端,不过也不是什么时候都方便。所以我写了一些脚本5帮我根据情况恢复网络。

其中一个服务会在网络断开时尝试启用所有的候选网络,开启恢复用的接入点;另一个则 是监控仅有的 GPIO 按钮,并根据用户配置执行对应操作。

感谢来自下面这些链接中内容的作者们,他们给了我很多启发:

  • https://github.com/beagleboard/linux/issues/20
  • https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe
  • https://unix.stackexchange.com/questions/428399/how-can-i-run-a-shell-script-on-input-device-event

添加 SIM 卡槽

网上很多把原来的 eSIM 干掉的做法,emm 实际上没必要。焊接卡槽可以用精密的尖头烙 铁。我用 936 就把 SIM 卡槽焊接好了。如图所示。 跳线是测试连通性时发现 GND 居然不通,所以额外跳了一根线到最近的测试点上(CPU 的金属罩子它不沾锡啊TvT)。 实际上不用跳线,因为这个卡槽的GND就是板子设计的使能控制脚,接地可能就只能用卡槽 了,会影响esim切卡。后来我把这根线剪掉了。

添加 SIM 卡槽从而能插自己的卡

切换 SIM 卡

该设备的 SIM 卡使用 GPIO 作为切换开关,但切换后需要重启 modem 以应用配置。下面 列出操作示例。

# 先设置激活你卡对应的led/gpio开关,比如说
echo 0 > /sys/class/leds/esim0_select/brightness  # 禁用 esim0
echo 1 > /sys/class/leds/sim0_select/brightness   # 启用 sim0
# 重新加载内核模块并重启相关服务
modprobe -r qcom-q6v5-mss
modprobe qcom-q6v5-mss
systemctl restart rmtfs
systemctl restart ModemManager
# 注意,有些设备的modem在使用跨运营商卡的时候会主动崩溃一次
# 此时视情况需要重启ModemManager

迷你短信平台

咕咕咕

Home Assistant

咕咕咕

测试了,太吃内存,就算禁用modem空内存出来还是不够用,还会令WiFi性能急剧下降。

结语

emm懒了,这里的内容晚点看情况随缘更新(咕咕咕)