Quectel Pi H1 QCS6490 安卓16固件

# 【分享】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` 里了。

感谢分享这段调试记录,硬件配置、刷机流程与踩坑点描述清晰,对同平台(QCS6490 / QCM6490、QSM565DWF)的开发者很有参考价值。也感谢您将个人移植经验与自查命令一并整理,欢迎继续在社区交流。

本回答仅供参考。