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
## 实际帧画质
: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, 云资产清单, 安全渗透, 客户端加密, 摄像头驱动, 硬件适配, 移动开发, 逆向工具, 逆向工程