Fairphone 6 超广角摄像头实验性 Linux 支持
Fairphone 6 超广角摄像头实验性 Linux 支持
Fairphone 6 实验性 Linux 摄像头支持
通过在 mainline Linux 上实现对 Fairphone 6 超广角摄像头的实验性支持,现已能够实现基本功能,例如在 GNOME Snapshot 中进行二维码扫描和实时预览。这是通过将 qcom-camss 驱动移植到 Qualcomm milos (SM7635) SoC,并通过 libcamera 配置 OmniVision OV13B10 传感器而实现的。
硬件架构与驱动策略
Fairphone 6 使用 Qualcomm milos SoC,配备三个摄像头:一个 Sony IMX896(后置)、一个 Samsung S5KKD1(前置)和一个 OmniVision OV13B10(超广角)。由于 Sony 和 Samsung 传感器缺乏 mainline Linux 驱动,开发重点集中在 OV13B10 上,该传感器已有一个最初为 x86/ACPI 笔记本电脑设计的 mainline 驱动。
在 Qualcomm SoC 上,摄像头采集路径是一个复杂的链条:
image sensor (I2C) → CSI-2 D-PHY (MIPI lanes) → CSIPHY (decode) → CSID (demux) → ISP (VFE/TFE) (write engine) → memory (DMA)。
为了启用此路径,开发人员移植了 qcom-camss 驱动,利用了 Fairphone 6 上的 TFE665 ISP 在功能上与 mainline 支持的 TFE530 完全相同的事实,两者仅在寄存器基地址偏移量上有所不同。
内核级实现细节
ISP 与采集子系统移植
启动采集子系统需要对内核进行几项关键调整:
- TFE665 ISP 驱动: 基于 TFE530 驱动创建了一个新的
camss-vfe-665.c。主要变化是将总线寄存器基地址从0xa00移至0x1800。 - CSID 和 CSIPHY: CSID665 复用了 gen-2 操作。CSIPHY v2.2.1 需要一个新的 lane-configuration table 和从下游 Android 内核头文件中转录的 D-PHY 调优值(约为 1.1 Gbps/lane)。
- 时钟配置: 在
CAM_CC_SOC_AHB_CLK中发现了一个关键阻碍。如果没有这个时钟对 AHB 寄存器总线进行门控,所有寄存器访问都返回零,导致 ISP 看起来像是未通电状态。
传感器集成
为了使 OV13B10 传感器在 ARM/Device Tree 而不是 x86/ACPI 上正常工作,实施了以下更改:
- OpenFirmware 匹配表: 添加了
ovti,ov13b10以允许驱动程序从设备树进行探测。 - Lane 索引: 将 lane 编号从下游的 1-indexed 惯例 (
<1 2 3 4>) 修正为 mainline 的 0-indexed 惯例 (<0 1 2 3>),以允许 PHY 锁定。 - 路由: 超广角摄像头被识别为路由到 CSIPHY1。
解决全零帧 Bug
初步测试结果显示,帧的大小和速率是正确的,但仅包含零像素,即使使用传感器的内部色条测试图案也是如此。内核日志指示 VFE0: Bad config violation。
调查发现,RDI write-master 的打包格式取决于 ISP 总线宽度。mainline 驱动硬编码了 TFE530 使用的 64 位值 (PLAIN64 或 0xa)。然而,TFE665 (milos) 使用的是 128 位 RDI 总线,需要打包器 0x0。更新此寄存器值解决了该违规问题,并实现了向 DDR 内存传输真实的 Bayer 帧。
与 libcamera 的用户空间集成
使用 libcamera 0.7.2 将原始 Bayer 帧处理为 RGB 图像。
自动曝光与增益
由于 libcamera 缺乏 OV13B10 的传感器助手,图像最初曝光不正确。开发人员实现了一个 CameraSensorHelperOv13b10 类,将传感器的线性模拟增益 (0x80 = 1×) 映射到实际的增益乘数,从而使自动曝光循环能够收敛。
对焦与方向
- 自动对焦: 传感器使用 Awinic AW86017 VCM。虽然
dw9714驱动可以控制镜头,但libcamera的软件 ISP 缺乏对比度 AF 循环。因此,通过 udev 规则设置了针对二维码扫描和文档优化的固定对焦。 - 方向: 配置了设备树旋转和方向属性,以确保画面在纵向模式下显示为正向。
当前局限性与已知问题
虽然可以运行,但此实现仍处于实验阶段,并存在若干局限性:
- 有限的传感器支持: 仅超广角摄像头可以工作;主摄像头和前置摄像头仍不受支持。
- 裁剪视野: 2×2-binned 传感器模式会产生乱码输出。由于软件 ISP 是裁剪而非缩放,生成的 1080p 预览是中心裁剪,减小了超广角视野。
- 简化的电源管理: 电压调节器被强制开启而不是按顺序开启,导致 VCM 的空闲电流增加。
- 纯软件 ISP: 所有图像处理都在 GPU 辅助下通过软件完成,缺乏专用 Android 流水线那样的硬件调优质量。
社区背景
社区成员指出,Fairphone 6 正成为支持最完善的现代 postmarketOS 设备之一,其他开发人员正在致力于通话、音频、麦克风、NFC、GPS 和 IMU 的支持。一些用户还对使用 LLM 辅助编写这些小众驱动表示了兴趣,作者明确承认在本项目中使用了这种方法。