Fairphone 6 실험적 Linux 지원: 초광각 카메라
Fairphone 6 실험적 Linux 지원: 초광각 카메라
Fairphone 6 실험적 Linux 카메라 지원
메인라인 Linux에서 Fairphone 6 초광각 카메라에 대한 실험적 지원이 달성되어 GNOME Snapshot에서 QR 스캔 및 라이브 프리뷰와 같은 기본 기능을 사용할 수 있게 되었습니다. 이는 Qualcomm milos (SM7635) SoC에 qcom-camss 드라이버를 포팅하고 libcamera를 통해 OmniVision OV13B10 센서를 구성함으로써 이루어졌습니다.
하드웨어 아키텍처 및 드라이버 전략
Fairphone 6는 세 개의 카메라(소니 IMX896(후면), 삼성 S5KKD1(전면), 옴니비전 OV13B10(초광각))을 갖춘 Qualcomm milos SoC를 사용합니다. 소니와 삼성 센서에는 메인라인 Linux 드라이버가 없어 개발은 x86/ACPI 노트북용으로 originalmente 설계된 기존 메인라인 드라이버가 있는 OV13B10에 집중되었습니다.
Qualcomm SoC에서는 카메라 캡처 경로가 다음과 같은 복잡한 체인을 형성합니다:
image sensor (I2C) → CSI-2 D-PHY (MIPI lanes) → CSIPHY (decode) → CSID (demux) → ISP (VFE/TFE) (write engine) → memory (DMA).
이 경로를 활성화하기 위해 개발자는 Fairphone 6의 TFE665 ISP가 메인라인에서 지원하는 TFE530과 기능적으로 동일하며 레지스터 베이스 오프셋만 다르다는 사실을 활용하여 qcom-camss 드라이버를 포팅했습니다.
커널 수준 구현 세부사항
ISP 및 캡처 서브시스템 포팅
캡처 서브시스템을 구동하기 위해 커널에 몇 가지 중요한 조정이 필요했습니다:
- TFE665 ISP 드라이버: TFE530 드라이버를 기반으로 새로운
camss-vfe-665.c파일이 생성되었습니다. 주요 변경 사항은 버스 레지스터 베이스을0xa00에서0x1800로 이동하는 것이었습니다. - CSID 및 CSIPHY: CSID665는 gen-2 작업을 재사용했습니다. CSIPHY v2.2.1은 다운스트림 Android 커널 헤더에서 옮겨온 새로운 레인 구성 테이블과 D-PHY 튜닝 값(대략 1.1 Gbps/레인)이 필요했습니다.
- 클럭 구성:
CAM_CC_SOC_AHB_CLK에서 중요한 블로커가 식별되었습니다. 이 클럭이 AHB 레지스터 버스를 게이트하지 않으면 모든 레지스터 접근이 0을 반환하여 ISP가 전원이 꺼진 것처럼 보였습니다.
센서 통합
OV13B10 센서를 x86/ACPI 대신 ARM/Device Tree에서 동작하도록 만들기 위해 다음과 같은 변경 사항이 구현되었습니다:
- OpenFirmware 매치 테이블: 디바이스 트리에서 드라이버가 프로브할 수 있도록
ovti,ov13b10이 추가되었습니다. - 레인 인덱싱: 다운스트림의 1-인덱스 관례(
<1 2 3 4>)를 메인라인의 0-인덱스 관례(<0 1 2 3>)로 수정하여 PHY가 잠길 수 있도록 했습니다. - 라우팅: 초광각 카메라가 CSIPHY1로 라우팅되어 있음이 확인되었습니다.
모든 0 프레임 버그 해결
초기 테스트에서는 올바른 크기와 비율을 가진 프레임이 생성되었지만, 센서의 내부 컬러바 테스트 패턴을 사용하더라도 픽셀이 모두 0인 경우가 있었습니다. 커널 로그에서 VFE0: Bad config violation이라는 오류가 표시되었습니다.
조사 결과 RDI write-master의 포맷 형식이 ISP 버스 너비에 따라 달라진다는 것이 밝혀졌습니다. 메인라인 드라이버는 TFE530에서 사용되는 64비트 값(PLAIN64 또는 0xa)를 하드코딩했습니다. 그러나 TFE665(milos)는 128비트 RDI 버스를 사용하므로 packer 0x0가 필요했습니다. 이 레지스터 값을 업데이트하여 위반을 해결하고 DDR 메모리로 진정한 Bayer 프레임을 전송할 수 있게 되었습니다.
libcamera와의 사용자 공간 통합
libcamera 0.7.2 버전이 원시 Bayer 프레임을 RGB 이미지로 처리하는 데 사용되었습니다.
자동 노출 및 게인
libcamera에 OV13B10용 센서 헬퍼가 없어 초기에는 이미지가 제대로 노출되지 않았습니다. 개발자는 CameraSensorHelperOv13b10 클래스를 구현하여 센서의 선형 아날로그 게인(0x80 = 1×)을 실제 게인 배수에 매핑함으로써 자동 노출 루프가 수렴하도록 했습니다.
초점 및 방향
- 자동 초점: 센서는 Awinic AW86017 VCM을 사용합니다.
dw9714드라이버는 렌즈를 제어할 수 있지만,libcamera의 소프트웨어 ISP는 대비-AF 루프가 없습니다. 따라서 QR 스캔 및 문서용으로 조정된 고정 초점을 udev 규칙을 통해 설정했습니다. - 방향: 디바이스 트리 회전 및 방향 속성을 구성하여 세로 모드에서 피드가 upright(바르게) 보이도록 했습니다.
현재 제한 사항 및 알려진 문제
기능은 구현되지만, 이 구현은 실험적이며 여러 가지 제한 사항이 있습니다:
- 제한된 센서 지원: 초광각 카메라만 작동하며, 메인 및 전면 카메라는 여전히 지원되지 않습니다.
- 잘린 시야각: 2×2-binned 센서 모드는 garbled 출력을 생성합니다. 소프트웨어 ISP가 스케일링 대신 크롭을 수행하기 때문에 결과 1080p 프리뷰는 중앙 크롭이 되어 초광각 시야각이 감소합니다.
- 간소화된 전원 관리: 레귤레이터가 시퀀싱 대신 강제로 켜져 있어 VCM에서 유휴 전류 소비가 증가합니다.
- 소프트웨어 전용 ISP: 모든 이미지 처리는 GPU 지원을 받아 소프트웨어에서 수행되며, proprietary Android 파이프라인의 하드웨어 튜닝 품질이 부족합니다.
커뮤니티 맥락
커뮤니티 구성원들은 Fairphone 6가 다른 개발자들이 통화, 오디오, 마이크, NFC, GPS, IMU 지원을 작업 중인 가장 현대적이고 잘 지원되는 postmarketOS 기기 중 하나가 되고 있다고 언급했습니다. 일부 사용자는 이러한 니치 드라이버 작성을 돕기 위해 LLM을 사용하는 것에 관심을 표했으며, 저자는 이 프로젝트에 해당 방법을 명시적으로 사용했다고 인정했습니다.