# 【分享】Quectel Pi H1(QCS6490)跑上 Android 16 —— LineageOS 23.2 移植记录
手上一块 Quectel Pi H1(QSM565DWF 模组,高通 QCS6490),原本官方给的是 Linux/Buildroot,
Android 侧基本是空白。折腾了一个多月,现在整机能开机进桌面,Wi-Fi、蓝牙、以太网、
显示、音频、相机、4K 硬解都能用,把过程和固件一起放出来。
## 硬件长什么样
- SoC:QCS6490(4×A78 + 4×A55,Adreno 643),PM7325/PM7250B/PM8350C/PMK8350
- 内存 LPDDR4x,系统盘 UFS,另有 SD 卡槽
- 显示:Waveshare 8 寸 DSI 面板(1280×800),板载 GT911 触摸
- 视频输出:DSI→HDMI 桥 LT9611(UXC/UXD),Type-C 可出 DP,另有 eDP
- 音频:WCD9370 + 两颗 SoundWire 功放,3.5mm 耳机口
- 网络:SDIO Wi-Fi、UART 蓝牙、板载 YT6801 千兆以太网
- 扩展:M.2(PCIe1,可插 5G 模组或 NVMe)、USB-C(OTG+DP)、USB-A host
- 相机:CSI 接 IMX219
- 没有:蜂窝基带、GNSS、电池、加速度计/陀螺仪(这版是 WiFi-only SKU)
## 系统是什么
- Android 16 + LineageOS 23.2,userdebug,arm64
- 内核 6.6.116(高通下游树,不是 GKI),打了一批稳定版回流修复
- 引导方式比较特别:XBL → UEFI → ESP 分区里的 systemd-boot → Image + ramdisk + dtb,
Android 跑在 UEFI 后面,不是传统 ABL/bootloader 那套
- 分区:UFS 上 6 个 LUN,`super` 动态分区 10GB,`persist` 30MB 保留出厂 MAC/SN 不擦
## 现在能用什么
| 功能 | 状态 |
|—|—|
| 8 寸 DSI 屏 + 触摸 + 背光 | 正常,开机 logo 也做了 |
| HDMI 输出 / Type-C DP / eDP | 正常,HDMI 带音频 |
| GPU(Adreno 643) | 正常,走 GLES;Vulkan 合成关掉了(freedreno 那边会花屏) |
| 视频硬解 | Iris VPU + Codec2,H.264/HEVC/VP9 解码,4K 实测能播 |
| 相机 | IMX219 打通,camx/chi-cdk 那套,取景器/扫码正常 |
| 喇叭 / 耳机 / 麦克风 / HDMI 音频 | 正常,AudioReach(AGM/PAL) |
| Wi-Fi | 正常,MAC 取 persist 里的出厂值 |
| 蓝牙 | 正常,设置界面能开 |
| 千兆以太网 | 正常,MAC 同样是出厂值 |
| UFS / SD 卡 / U 盘 / 键鼠 | 正常 |
| 风扇调速 / RTC / 音量键 | 正常 |
| CDSP(FastRPC 算力) | 正常 |
踩过的坑顺手记一下,可能对同平台的人有用:
- 以太网驱动的 shutdown 路径有个空指针,会导致 `reboot edl` 直接 panic,进不了下载模式。
三个人排查了两天才定位到是网卡驱动,不是 PSCI、不是 UEFI。
- Wi-Fi/BT/以太网三个 MAC 都要从 `persist` 分区读,而 `persist` 是 first-stage
之后才挂上的——模块加载早于挂载就只能拿到随机 MAC。最后把网卡模块从 ramdisk
挪到 `vendor_dlkm` 才对。
- 相机取景器整片发绿:ISP 按 UBWC 写,应用按线性 NV12 读,中间没人转换。
- 开机要 80 多秒,一半时间花在往串口写 printk 上。关掉串口 console 直接砍到 41 秒。
- `super` 一开始是 5GB,动态分区组快满了,加到 10GB 给 GApps 和以后的 OTA 留空间。
## 已知问题
- SELinux 还是 `permissive`,没做策略收敛,别拿去当生产设备
- AVB 校验关着(为了能用 TWRP 刷 GApps),bootloader 锁没处理
- 没有蜂窝和 GNSS,`设置 → 关于` 里的 IMEI 行改成显示 SN
- 传感器 HAL 摘掉了(板上没器件,留着只会无限重启)
- 屏幕密度固定 170,换别的面板要自己调
## 怎么刷
固件是 UFS 全量包,走高通 EDL(9008)。Linux 下用 SDK 自带的 qdl,
Windows 用 QFIL,两种都能刷。
**Linux:**
```bash
source quectel_build/compile/build.sh
flash
```
脚本会先把 1–5 号 LUN 的引导链(xbl/uefi/tz/aop 等)刷进去,再刷 0 号 LUN 的
Android 部分(`super`/`boot`/ESP/GPT)。刷完自动重启。
`persist` 分区在烧录描述文件里是空的,出厂校准数据不会被覆盖。
**进 EDL:** 设备已经在跑 Android 的话 `auto_edl` 一条命令搞定(root → 重启进下载模式);
也可以断电后按住强制下载键上电。
**Windows / QFIL:**
1. Programmer 选 `prog_firehose_Qcm6490_ddr.elf`
2. Storage Type 选 **UFS**
3. `rawprogram0.xml` + `patch0.xml`(要重刷引导链就把 1–5 号一起选)
**只更新系统、不动引导链:**
```bash
cd device/quectel/quecpi/firmware
./../tools/qdl -s ufs -i . prog_firehose_Qcm6490_ddr.elf rawprogram0.xml patch0.xml
```
**从 SD 卡启动:** `build_sdimg` 会生成一张可启动的 SD 镜像,适合不想动 UFS 的人。
刷完可以这样自查:
```bash
adb shell getprop ro.build.version.release # 16
adb shell getprop ro.lineage.version # 23.2-…
adb shell getprop ro.boot.hardware.revision # QSM565DWF
adb shell cat /proc/version # 6.6.116
```
## 自己编
```bash
cd qpi-h1-android16
source quectel_build/compile/build.sh
build_all
```
`build_all` 会依次编内核 → 内核模块 → ramdisk → ESP → dtb → super → 辅助镜像,
最后同步到 `device/quectel/quecpi/firmware/`。
只想改一块可以单独跑 `build_kernel` / `build_modules` / `build_esp` / `build_super`。
内核配置基线已经入库,clean 之后从零编能复现。
调试串口默认关着(就是上面说的开机提速),要看 log 用 ESP 里的
`loader/entries/android-debug.conf` 那个启动项。
## 最后
这是个人折腾的移植,不是官方固件,刷坏了自己救(EDL 一般都能救回来)。
同平台(QCS6490/QCM6490、QSM565DWF)的朋友有问题可以留言,踩过的坑基本都记在
`skills/android-bringup/SKILL.md` 里了。