jxlarrea/lineageos-echo-show-camera

GitHub: jxlarrea/lineageos-echo-show-camera

该项目为 Echo Show 5(第二代)的 LineageOS 18.1 移植版提供了完整的摄像头功能支持,涵盖内核驱动移植、用户空间 shim 及图像色彩调校。

Stars: 0 | Forks: 0

# Amazon Echo Show 5(第二代)在 LineageOS 上可用的摄像头 本仓库使得前置摄像头在非官方的 Amazon Echo Show 5 第二代(`cronos`,MT8163)LineageOS 18.1 上完全可用。原厂 ROM 的移植版完全没有搭载相机栈;应用本工作后,设备将获得: | 功能 | 状态 | | --- | --- | | 相机枚举(前置,方向正确) | 正常 | | 色彩正确的实时预览 | 正常 | | 静态图像拍摄(`takePicture`,camera2/CameraX) | 正常,完整的 1600x1200 JPEG | | 视频模式传感器时序 | 正常 | | 镜头阴影校正(出厂校准) | 正常 | | 自动曝光 | 正常 | | 自适应自动白平衡 | 正常,带有校准过的校正 | | 黑电平 | 已校正(原厂调校留下了 30% 的灰底) | ## Echo Show 5(第二代)上正常工作的摄像头 https://github.com/user-attachments/assets/1eb858ac-9401-4b0c-a1cb-05f1e1e1a768 ## 实际帧画质

这里的一切都是针对真实设备进行逆向工程得到的;完整的调查过程,包括每一个走入死胡同的尝试,都在 [docs/findings.md](docs/findings.md) 中。内容很长,但如果您在维护 MediaTek 设备移植版,这可能是本仓库中最有用的文件。 ## 为什么这很困难,用一段话解释 Echo Show 5 搭载了基于 Android 9 时代内核的 Android 7.1(API 25)相机栈,而这个 LineageOS 移植版在该内核上运行 Android 11 用户空间。一切都互相冲突:blobs 需要 Android 11 已移除的符号,需要比 ROM 搭载的更旧的 display 框架,需要内核不再支持的 cmdq 事件编码,以及需要 Amazon 的内核结构体布局而不是上游 MediaTek 的。最重要的是,ROM 的内核选择了第一代相机传感器(OV9734),而第二代设备使用的是 OV02B10,因此必须移植一个传感器驱动,并且 MediaTek 所有的图像调校(白平衡、黑电平)都是针对错误传感器的。这里的每一个问题都得到了层层解决。 ## 支持的设备 | 设备 | 代号 | 传感器 | 状态 | | --- | --- | --- | --- | | Echo Show 5(第二代) | `cronos` | OV02B10 | 完全正常,已验证 | | Echo Show 5 | `checkers` | OV9734 | 未经测试;应用了内核结构体补丁,不需要移植驱动 | | Echo Show 8 | `crown` | OV9734 | 未经测试;与 checkers 相同 | | Echo Spot | `rook` | GC0312 | 未经测试;同样是不同的传感器 | 以下所有内容均针对 `cronos` 编写。在 OV9734 设备上,只需应用内核结构体补丁(0001)——它们的传感器驱动已经在代码树中并被选中——并预期需要重新进行色彩校准,因为这是 OV02B10 特有的。 ## 前提条件 - 一台已经运行 R0rt1z2 的非官方 LineageOS 18.1 移植版的 Echo Show 5 第二代 - 来自 [amazon-oss/releases](https://github.com/amazon-oss/releases) 的 [lineage-18.1-cronos-v0.3](https://github.com/amazon-oss/releases/releases/tag/lineage-18.1-cronos-v0.3) - 已通过 amonet 解锁,且 TWRP 完好。如果您无法启动 TWRP,请停止操作:在没有恢复途径的设备上执行这些步骤可能会导致变砖。 - 一台装有 `adb` 和 `python3` 的 Linux 主机,以及一根 USB 数据线。USB 至关重要:TWRP 没有网络功能,因此刷入步骤必须使用它。对于其余步骤,网络 adb(`adb connect :5555`)很方便,但属于可选项。 - 一个用于 `cronos` 的 LineageOS 18.1 构建环境(用于构建修补过的 boot 镜像和修补过的系统库)。按照 amazon-oss 的说明设置源码树;`patches/local-manifest-fixes.xml` 包含了本工作所需的 manifest 修复。 ## 安装说明 **[docs/INSTALL.md](docs/INSTALL.md) 是完整的分步指南** - 涵盖了从原厂 LineageOS 安装到一个功能正常、经过色彩校准的相机的每一条命令,以及故障排除。下面的概述是地图;而该指南才是具体的路线。 共有三个层级。它们必须全部应用;每一层都修复了下一层原本会遇到的问题。 1. **内核**(boot 镜像):Amazon 结构体布局,OV02B10 驱动,传感器时序修复。需要构建并刷入 boot 镜像。 2. **ROM 系统库**(设备树 + AOSP 补丁):camera provider 声明,前置摄像头功能声明,传感器方向,两项 AOSP 相机修复。需要应用补丁后构建 ROM(或至少构建受影响的库)。 3. **Vendor blobs 和设备上调校**:专有相机栈(从公开的固件转储中获取,此处不提供分发)和修补过的私有 display 框架需在构建*之前*放入 vendor 树;`LD_PRELOAD` shim 和两项调校校正是在之后应用到设备上的,因为它们是基于设备上的内容构建的,或者是对设备上的内容进行补丁修复。 ### 层级 1:内核 按顺序将这三样东西放入 `kernel/amazon/mt8163-4.9` 中: 1. `patches/0001-imgsensor-use-the-Amazon-struct-layouts-on-all-echo-show.patch` (适用于所有 Echo Show 设备) 2. 解压到 `drivers/misc/mediatek/imgsensor/src/mt8163/` 的 `patches/ov02b10_mipi_raw-driver.tar.gz` - 完整的 OV02B10 驱动,已包含其所有修复(仅限 cronos) 3. `patches/0004-imgsensor-ov02b10-driver-support.patch` - 传感器 ID, 传感器列表条目,defconfig(仅限 cronos) 不要额外应用 0007/0008/0010(它们已包含在驱动 tar 包中;这些文件记录了这些修复是如何开发出来的),不要应用 0002(与 0001 冲突的替代方案),也不要手动编辑 defconfig - 0004 已经设置了经过验证的配置。0003 仅用于调试日志。 构建 boot 镜像(`mka bootimage`),然后使用 `scripts/flash-boot.sh ` 刷入。 **不要将普通的 boot 镜像直接 `dd` 到 boot 分区。** 在 amonet 解锁的设备上,该分区以 exploit 头部和 boot 头部的重定位副本开头;写入普通镜像,或者写入猜测的偏移量,会导致在 vendor logo 处卡死,看起来完全像是一个坏的内核。有两个设备就是在摸索这一点时变砖的。刷入脚本实现了正确的布局,首先备份了分区,并逐字节进行了验证。`scripts/flash-boot.sh --self-test ` 通过从设备的各个组件重建其自身正常工作的 boot 分区并要求完全匹配,来验证组装逻辑。 ### 层级 2:ROM 更改 应用: ``` patches/0005-camera-device-1.0-cookie-fallback-and-ANativeWindowBuffer-preview.patch patches/0006-camera-flatten-tolerate-zero-size-String8-from-legacy-HALs.patch patches/0011-device-tree-camera-enablement.patch ``` 0005 和 0006 对代码树构建的 AOSP 相机代码进行了补丁修改 (`camera.device@1.0-impl`,`libcamera_client`);0011 包含了所有设备树的更改(provider 声明、软件包、前置摄像头功能、传感器方向、HAL1 原生句柄标志)。 [patches/README.md](patches/README.md) 解释了每一项更改的用途。 还必须声明 blob 列表并重新生成 vendor makefile (`device/amazon/cronos/setup-makefiles.sh`)- 仅仅追加到 `proprietary-files.txt` 是没有用的,因为构建系统读取的是生成的 `vendor/amazon/cronos/*.mk`。 ### 层级 3:vendor blobs,然后是设备上调校 放入 vendor 树中,在构建 ROM **之前**: ``` scripts/fetch-camera-blobs.sh # 45 blobs from the public dump scripts/install-blobs-to-tree.sh # place them at their declared paths scripts/install-private-dpframework.sh # API 25 display framework: private # soname + 3 binary patches scripts/patch-shim-needed.sh # add the shim to the blobs' DT_NEEDED ``` 推送到设备上,在刷入 ROM **之后**: ``` shims/libcmdqevent/build.sh # built against the device's own bionic scripts/install-cmdq-event-shim.sh # cmdq event translation + AWB correction scripts/patch-awb-d65.sh # neutralize the double white balance scripts/patch-obc-pedestal.sh # correct the black level for the OV02B10 adb -s reboot ``` `scripts/install-camera.sh ` 可直接推送 vendor 树 blobs、provider 库、shim 和 manifest,方便在无需完整重新刷入的情况下进行迭代。 这些 blobs 来自公开的 [amazon_cronos_dump](https://github.com/el-vertedero/amazon_cronos_dump) 固件转储。本仓库不包含任何专有代码;脚本会在您自己的设备上获取、打补丁并安装它。 ## 验证 从冷启动开始,无需手动步骤: ``` adb shell 'pm list features | grep camera' # camera.any + camera.front, NO plain "camera" adb shell 'dumpsys media.camera | grep Orientation' # 0 adb shell 'logcat -d | grep -cE "startStream fail|deque DISPO fail"' # 0 ``` 打开相机应用:实时预览,然后拍照 - 它应该在大约一秒内生成一张完整的 1600x1200 分辨率 JPEG 照片。在完全黑暗的房间里,照片应该基本是黑色的(这就是黑电平修复;如果没有它,您会看到一层灰青色的雾)。 ## 色彩校准 blobs 中的 MediaTek 调校是针对 OV9734 传感器的,而不是 OV02B10,因此自适应白平衡在落地时会带有依赖于光源的偏差。shim 通过重新缩放 AWB 算法的输出来纠正这一问题,该输出在两个校准锚点(日光和暖色 LED)之间进行插值,并以算法自身的蓝色增益为键。有四个基于 512 的属性控制它,每 64 帧重新读取一次,因此调校无需重启: ``` persist.camera.awbtrim.r cool (daylight) anchor, red persist.camera.awbtrim.b cool anchor, blue persist.camera.awbtrim.r.warm warm (2600K) anchor, red persist.camera.awbtrim.b.warm warm anchor, blue ``` 默认值在 `shims/libcmdqevent/camera-bringup.rc` 中,是在一台设备上针对灰色表面校准的。要针对您的设备进行微调:将相机对准任何灰色或白色的物体,拍下快照,并以 2 或 3 为步长进行调整(色彩矩阵会将这里的更改在渲染图像中放大数倍,因此请使用小步长): - 图像偏品红色:降低 `.r`(或在暖光下降低 `.r.warm`) - 图像偏绿:调高它 - `.b` / `.b.warm` 对于蓝色逻辑相同 ## 已知限制 - **逐场景色彩差异约为 +-10%。** blob 的 AWB 输出在相同场景下的不同会话之间会有几个百分点的波动,色彩矩阵会将其放大。这是封闭算法固有的问题。 - **昏暗的混合照明可能会呈现偏绿色。** 当 AWB 分类器找不到可识别的光源时,它会回退到参考增益,从而绕过部分校正。计划为该状态添加一个处理程序。 - **老旧设备上的低太阳色彩渐变。** 阳光直接穿过前玻璃照射会在画面上产生从青色到品红色的渐变(IR 光穿透老化的 IR-cut 滤镜加上内部杂散光)。这在正午的漫射日光或人造光下是不可见的。没有任何全局校正可以解决这个问题,而且前玻璃无法从外部清洁。 - **单客户端。** 传统的 HAL1 栈一次只允许一个相机客户端。 ## 安全规则 这些都是惨痛的教训;这两种情况都可能使设备完全瘫痪。 1. **当 ISP 正在流式传输时,切勿对 cameraserver 执行 SIGKILL 或 `stop`。** 它会使内存管理单元指向已释放的缓冲区,由此产生的总线违规风暴会导致整个设备陷入活锁 - 没有 adb,没有 ping,也没有 watchdog。请使用 `adb reboot`,或者先对相机应用执行 `am force-stop` 并等待两秒钟。 2. **仅使用 `scripts/flash-boot.sh` 刷入 boot 镜像**(参见上面关于 amonet 分区布局的警告)。 ## 仓库内容 | 路径 | 内容说明 | | --- | --- | | [docs/INSTALL.md](docs/INSTALL.md) | 详细的安装、验证、校准和故障排除步骤 | | [docs/findings.md](docs/findings.md) | 完整的调查过程,按顺序排列,保留了每一个死胡同并进行了标记 | | [docs/building.md](docs/building.md) | 让这些设备的 LineageOS 代码树真正构建起来 | | [docs/handoff-takepicture.md](docs/handoff-takepicture.md) | 端到端调试一个 bug(捕获卡顿)的示例分析 | | [patches/](patches/) | 内核和 AOSP 补丁,按应用顺序编号 | | [shims/libcamera_shim/](shims/libcamera_shim/) | 源代码 shim,弥补了 API 25 blobs 与 Android 11 之间 11 个符号的差距 | | [shims/libcmdqevent/](shims/libcmdqevent/) | LD_PRELOAD shim:cmdq 事件 ID 转换、AWB 输出校正、诊断跟踪器 | | [scripts/](scripts/) | 获取、打补丁、安装、刷入、校准 | | [tools/cmd-trace/](tools/cmdq-trace/) | 设备上的诊断工具(ioctl 跟踪器、ISP 寄存器/IRQ 探测、传感器寄存器 Poke) | ## 上游 这项工作建立在 R0rt1z2 针对 MT8163 Amazon 设备的 LineageOS 移植版基础之上,正是它使这一切成为可能: | | | | --- | --- | | 发行版(可刷入的 ROM) | [amazon-oss/releases](https://github.com/amazon-oss/releases) | | Echo Show 5 第二代构建版 | [lineage-18.1-cronos-v0.3](https://github.com/amazon-oss/releases/releases/tag/lineage-18.1-cronos-v0.3) | | 用于构建的 manifest | [amazon-oss/local_manifests](https://github.com/amazon-oss/local_manifests) | | 设备树 | [android_device_amazon_cronos](https://github.com/amazon-oss/android_device_amazon_cronos) | | 通用设备树 | [android_device_amazon_mt8163-common](https://github.com/amazon-oss/android_device_amazon_mt8163-common) | | 内核 | [android_kernel_amazon_mt8163](https://github.com/amazon-oss/android_kernel_amazon_mt8163) | | 维护者 | [R0rt1z2](https://github.com/R0rt1z2) | 此处的补丁是针对这些代码树编写的。本仓库中的任何内容都不会替代该移植版 - 它只是为其添加了相机功能。 ## 致谢 CesarAmores 对 `crown` 的诊断 ([分析文章](https://github.com/CesarAmores/echo-show-crown-camera-diagnosis)) 理清了 HAL1 shim 崩溃链,并确认了原厂 blobs 是 2017 年时代的 camera1 代码。R0rt1z2 维护了这些设备运行的 LineageOS 移植版 ([amazon-oss](https://github.com/amazon-oss)),并在 [releases#5](https://github.com/amazon-oss/releases/issues/5) 中记录了 最初的内核/blob 不匹配问题。原厂 固件转储由 [el-vertedero/amazon_cronos_dump](https://github.com/el-vertedero/amazon_cronos_dump) 维护。 ## 许可证 原创代码(shims、脚本、工具)采用 MIT 许可证。内核补丁采用 GPL-2.0 许可;AOSP 补丁采用 Apache-2.0 许可。请参见 [LICENSE](LICENSE)。本仓库不分发任何专有二进制文件。
标签:Android, Cutter, DSL, LineageOS, MediaTek, 云资产清单, 安全渗透, 客户端加密, 摄像头驱动, 硬件适配, 移动开发, 逆向工具, 逆向工程