# libcamera (Surface Pro 12" Gen 1) Fedora's `libcamera`, rebuilt with the patches this board needs. Used by [Fedora KIWI descriptions, modified by me for Surface Pro 12"](https://sayag.it/fedora-linux-surface-pro-12in/kiwi-descriptions). ## Why a rebuild libcamera compiles its per-sensor knowledge into `libcamera.so`. A `CameraSensorHelper` carries the analogue gain model and the black level, and there is no plugin mechanism for either, so a sensor libcamera does not know gets no usable AGC from the software ISP. The Surface Pro 12"'s front camera is an `ov02c10`, which upstream libcamera has never heard of: ``` WARN IPASoft soft_simple.cpp:104 IPASoft: Failed to create camera sensor helper for ov02c10 INFO IPASoft soft_simple.cpp:257 IPASoft: Exposure 4-2320, gain 16-248 (1) ``` Those numbers are the raw gain register, not a gain: AGC believes the sensor cannot go below 16x, balances exposure against a fiction, and leaves the preview dark under a green-grey veil, because it also has no black level to subtract. With the helper in place the same sensor reports what it really is: ``` INFO IPASoft soft_simple.cpp:258 IPASoft: Exposure 4-3206, gain 1-15.5 (0.145) ``` which matches the kernel driver, where `OV02C10_REG_ANALOG_GAIN` runs from `0x10` to `0xf8` with four fractional bits. ## What gets applied | Patch | Fixes | | --- | --- | | `patches/0001-libipa-camera_sensor-add-ov02c10.patch` | Adds the `ov02c10` `CameraSensorHelper` (gain `code/16`, black level `0x40` at 10 bits) and its `camera_sensor_properties` entry. | | `patches/0002-pipeline-simple-capture-bayer-order-from-mbus-code.patch` | Takes the capture device's Bayer order from the media bus code the pipeline reports instead of deriving it from the transform, so the rear camera streams. | | `patches/0003-ipa-simple-data-add-ov02c10-tuning-file.patch` | Adds `ov02c10.yaml`, enabling a CCM for the front camera. Hand-tuned, not measured against a colour target. | | `patches/0004-ipa-simple-awb-keep-gains-across-reconfiguration.patch` | Keeps the AWB gains over a reconfiguration, so a still captured right after one is not rendered with the sensor's raw white balance. | ## Versioning The rebuild takes Fedora's release and appends a suffix, so `0.7.2-4.fc45` becomes `0.7.2-4.sp12in1.fc45`. That sorts above the build it came from, which is what makes the repository's `priority="1"` produce the patched package. ## Building Must run on aarch64, and needs the source repositories reachable (`dnf download --source` comes from `dnf5-plugins`). ```bash # Resolve only: print the RPMs the build would produce, and exit ./build.sh -n # Build them into ./RPMS ./build.sh # Override the release suffix (the pipeline sets it from the tag) RELEASE_SUFFIX=sp12in2 ./build.sh ``` `build.sh` downloads Fedora's source RPM, copies `patches/*.patch` into it, appends a `PatchNN:` line for each after the last one Fedora ships (the spec uses `%autosetup -p1`, so nothing has to call `%patch`), rewrites `Release:`, then runs `dnf builddep` and `rpmbuild -bb`. The scratch tree is reused between runs, so `-n` followed by a real build does not download twice. ## Publishing Tagging `fedora--libcamera-`, e.g. `fedora-45-libcamera-sp12in1`, runs the pipeline: the tag picks the build container and supplies `RELEASE_SUFFIX`, and the resulting packages go to the same repository as the kernel, served at https://rpm.sayag.it/kernel-sp12in/fedora/45/aarch64/