跳到主要内容

高通 Primus 安装 Debian 13 分享

·3 分钟

我几年前买了一台高通 Primus 笔记本当玩具,这其实是高通骁龙 8cx 平台的参考设计平台,华硕代工。

作为高通参考设计,就有几个好处,其中一个是这玩意有比较完善的主线 Linux 支持 (8cx Gen 1/Gen 2 平台有主线支持的目前只有它和联想的 Yoga 5G)。

只可惜因为高通平台的特殊性(高通的笔记本平台本质上就是个大号 Windows Phone),想在这上面用 Linux 可不是一个有主线支持就能用这么简单的事情…

machine itself

基本现状 #

硬件支持已经基本完善,GPU 正常、WiFi 蓝牙正常、键盘触摸板触屏甚至笔都正常,续航耗电也是合理水平。

fastfetch

USB-C 可以充电和数据,但视频输出不能用。

音频无驱动。

虚拟化无法工作,后面会提到。

提前准备 #

事先打个预防针:这篇文章不太适合小白(或者说 Windows ARM 设备装 Linux 这件事本来就不太适合小白,高通平台要折腾的东西太多了)

请准备一个 USB 有线网卡(一般 Linux 有驱动的即可,我用的是 AX88172),在安装过程中 WiFi 无法工作,请确保你有办法连接到网络。

请先在 Windows 上调整分区为 Linux 预留相应空间。

这台机器一般可用的有 128GB UFS 和 256GB 的 NVME SSD,且 UEFI 只能从 UFS 启动。NVME SSD 在 Windows 下可能会在开机时不识别,需要进设备管理器手动刷新才能工作,但 Linux 下无此问题。

因此可以考虑在 NVME SSD 上放根分区 /,前提是在 UFS 上单独分一个 /boot。

设备固件 #

我目前使用的是 2140 版本的固件,一般来说只要足够新即可。

WOA-Project 一直在归档高通参考设计设备的驱动包,想要更新的话直接去 https://github.com/WOA-Project/Qualcomm-Reference-Drivers/tree/master/8180_CLS 下载就行(1.0.2140.0 对应 200.0.112.0)。

不过由于高通平台驱动依赖关系过于复杂,更新驱动在这里还是一件风险蛮高的事情。我一般要更新驱动和 UEFI 固件的时候会将整个打包下载下来,用 DISM 注入到 install.wim,然后直接重装 Windows 系统… (高通的固件更新走 Capsule 更新,作为一个驱动包推送)

当然我们现在在讨论 Linux。Linux 需要这些固件 blob,它们可以从上面的归档里下载到,也可以从当前的 Windows 安装中提取:

  • qcdxkmsuc8180.mbn (在 qcdx8180.cab,GPU 驱动)
  • wlanmdsp.mbn (在 qcwlan8180.cab,WiFi 网卡驱动,需要将文件名改成小写)
  • qcadsp8180.mbn (在 qcsubsys_ext_adsp8180.cab)
  • qcmpss8180.mbn (在 qcsubsys_ext_mpss8180.cab)

除了上面所列之外的固件都可以在 linux-firmware 里找到,trixie-backports 源提供了足够新的版本(20260410)。

详细安装配置过程 #

启动安装 #

将 Debian 13 的 ISO 写入到 U 盘,然后从 https://deb.debian.org/debian/dists/trixie/main/installer-arm64/current/images/device-tree/qcom/sc8180x-primus.dtb 下载 Primus 的设备树并放到 U 盘根目录。

从 U 盘启动到 Grub,按 c 进入命令行,然后输入

devicetree /sc8180x-primus.dtb

加载设备树,然后按 ESC 返回 Grub 菜单。

选中 Install 或 Graphical install (但不要按回车!),按 e 进入编辑界面。光标移到 linux 行的最后(quiet 的位置),删除 quiet,并加入以下参数

pd_ignore_unused clk_ignore_unused efi=novamap modprobe.blacklist=msm,dispcc_sm8250 nomodeset

前三个是高通平台笔记本运行 Linux 一般需要的参数,由 Renegade Project 整理。后面是临时禁用 GPU 驱动,避免因缺失固件导致安装后黑屏。

编辑好后如下:

    linux    /install.a64/vmlinuz  --- pd_ignore_unused clk_ignore_unused efi=novamap modprobe.blacklist=msm,dispcc_sm8250 nomodeset

按 Ctrl-X 启动内核开始安装。

分区 #

千万千万不要选择自动分区!这台机器的固件在 UFS 上,虽然放在了另一个逻辑卷,跟正常系统分区隔离(所以你在 Windows 下看不到固件分区),但 Linux 下会将它们也全部列出来(作为独立的磁盘显示),请勿手贱乱动固件分区上的数据,否则设备会直接变砖!

这机器的 lsblk 输出… 洋洋洒洒五十多个分区… 😐

其余的在前面准备环节已经讲得挺清楚了。

第一次启动 #

Primus 的 efivars 工作不太正常(高通平台上 efivars 是模拟出来的,Linux 对这个的支持还不太完善),所以安装时写入的 EFI 启动项不一定能生效。必要时请进入 EFI Shell (音量上 + 开机键进入 BDS Menu,然后选择 Enter Shell)手动运行 /efi/debian/grubaa64.efi。

进入 Grub 之后,一样按 c 进命令行加载 devicetree

如果你将 rootfs 放 UFS 上,那应该能直接在 Grub 上加载到(下面的 {xxx} 为你所使用的内核小版本,可以用 Tab 补全)

devicetree /lib/linux-image-6.12.{xxx}/qcom/sc8180x-primus.dtb

如果你跟我一样将 rootfs 放 NVME 上… 那你只能暂时从 U 盘加载设备树了。用补全先确认 U 盘是什么设备名(devicetree (hd 然后按tab),然后再继续补全整个加载命令,比如:

devicetree (hd6,msdos1)/sc8180x-primus.dtb

加载完之后 ESC 回到菜单。Debian 安装时会将安装盘内核接收到的额外参数填到安装后的 Grub 参数里,所以这里直接选 Debian 回车即可进入系统。

接下来我们开始修各种大小问题。

Grub 自动加载设备树及 EFI 启动项 #

首先将 dtb 复制到 /boot/efi (也就是 ESP),然后修改 /boot/efi/EFI/debian/grub.cfg,在最前面加上一行 devicetree /sc8180x-primus.dtb,这样每次进入 Grub 都会自动加载设备树了。

未来内核更新时,也建议复制新内核的设备树(如上所述,在 /lib/linux-image-6.12.{xxx}/qcom/sc8180x-primus.dtb) 到 ESP 下。

放在 ESP 而不是 /boot/grub/grub.cfg 是因为 ESP 下的 grub.cfg 除了 grub-install 别的情况下都不会被修改,一般不用担心改动被覆盖的问题。

至于 EFI 启动项,请在 Windows 下用 BOOTICE 之类的工具手动添加(x64 的 BOOTICE 可以正常工作)。

GPU #

注意:在进行以下操作之前先连上网,安装 SSH 服务并确定能正常连接上!因为一旦有问题,启动 GPU 内核模块会立即黑屏。有 SSH 访问可以方便排查问题。

将以下固件文件放入 /lib/firmware/qcom/sc8180x (不存在的目录请自行创建)

  • qcdxkmsuc8180.mbn

并且从 trixie-backports 源安装 firmware-qcom-soc 包,补充其他需要的固件 blob。

最后运行 sudo update-initramfs -u 重新生成 initramfs。

重启,在 Grub 下尝试去掉 modprobe.blacklist=msm,dispcc_sm8250 nomodeset 这几个内核参数启动。

如果没问题的话就可以修改 /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT 中的 modprobe.blacklist=msm,dispcc_sm8250 nomodeset 去掉了。去掉之后别忘了执行 sudo update-grub 更新 Grub 菜单。

WiFi & 蓝牙 #

将以下固件文件放入 /lib/firmware/qcom/sc8180x

  • qcadsp8180.mbn
  • qcmpss8180.mbn
  • wlanmdsp.mbn

运行 sudo update-initramfs -u 重新生成 initramfs。

并安装以下软件包:

sudo apt install qrtr-tools tqftpserv rmtfs

并且从 trixie-backports 源安装 firmware-atheros 包,补充其他需要的固件 blob。

然后重启,WiFi 应该就可以正常工作了。但因为目前驱动无法获取 MAC,每次开机时 WiFi MAC 地址都会随机生成。由于同样的原因,蓝牙无法工作。

可以通过创建 udev 规则给 WiFi 和蓝牙固定 MAC 地址。

创建 udev rule /etc/udev/rules.d/99-fix_mac_addresses.rules,内容如下:

ACTION=="add", SUBSYSTEM=="net", ENV{DEVPATH}=="/devices/platform/soc@0/18800000.wifi/*", \
  RUN+="/usr/bin/ip link set dev %k address XX:XX:XX:XX:XX:XX"
ACTION=="add", SUBSYSTEM=="bluetooth", ENV{DEVTYPE}=="host" \
  ENV{DEVPATH}=="*/serial[0-9]*/serial[0-9]*/bluetooth/hci[0-9]*", \
  TAG+="systemd", ENV{SYSTEMD_WANTS}="hci-btaddress@%k.service"

上面第一部分是给 WiFi 的,将 XX:XX:XX:XX:XX:XX 改为一个合法的 MAC 地址,可以在 Windows 下查询得到。

第二部分是给蓝牙的,调用一个 systemd 服务更新蓝牙 MAC 地址。所以我们需要创建该服务 /lib/systemd/system/hci-btaddress@.service,内容如下:

[Unit]
Description=HCI bluetooth address fix

[Service]
Type=simple
ExecStart=/bin/sh -c 'sleep 5 && yes | btmgmt -i %I public-addr XX:XX:XX:XX:XX:XX'

XX:XX:XX:XX:XX:XX 改为一个合法的蓝牙 MAC 地址,同样可以在 Windows 下查询得到。

运行 systemctl daemon-reload 更新,然后重启,WiFi 和蓝牙应该都可以正常工作。

虚拟化 #

高通 Windows ARM 设备运行 Linux 需要使用 slbounce 向固件获取 EL2 权限才能使用虚拟化。可惜目前 slbounce 在 Primus 下会导致固件崩溃(进 Qualcomm Crashdump Mode),所以暂时不可用。

需要使用虚拟化的话可以考虑在 Windows 上使用 Hyper-V,以及基于 Windows Hypervisor Platform 的 VirtualBox 7.2.x 和 QEMU 11.x。

Qualcomm Crashdump Mode #

上面提到了 Qualcomm Crashdump Mode,虽然设备提供了这个模式可以在系统/固件崩溃时获取 dump,但目前并没有公开的工具可以提取或解析这些 dump。所以可以考虑禁用崩溃时进入 Crashdump Mode,让机器在崩溃时自动重启(不然每次都得长按电源键重启也挺烦的)。

关机状态下按 音量上 + 电源 进入 BDS MENU,进入 UEFI Menu -> Toggle EnableOnstorageDump。

BDS Menu
UEFI Menu

然后按上方向键将配置改为 Enable。

Toggle EnableOnstorageDump

一路 ESC 退出到 EBL 命令行,输入 reset 重启即可。

EBL

从描述来看应该是让设备将 dump 写到磁盘上然后自动重启,不知道写在什么地方呢?

参考资料 #