Skip to content

Repository files navigation

GC2607 Linux Camera Bring-Up

This repo documents the Linux bring-up path for the GalaxyCore GC2607 camera on Intel IPU6 systems. It contains the kernel-driver patch, Intel IPU6 HAL patch, GC2607 HAL assets, and scripts needed to build the driver stack and verify processed camera output with GStreamer.

The validated pipeline is:

GC2607 sensor
  -> patched GC2607 V4L2 subdevice driver
  -> Intel IPU6 ISYS raw capture at 1920x1080 SGRBG10
  -> Intel IPU6 HAL/PSYS with GC2607 AIQB and graph XML
  -> processed NV12 1920x1080 frames from icamerasrc
  -> gst-launch frame capture

The checkpoint here is the kernel and HAL stack plus a known-good GStreamer validation path.

Architecture

How the pieces fit together. [P] marks a component this repo patches, [S] a component whose source this repo ships in-tree, [A] an asset or config this repo ships, and [D] a module installed via DKMS. Solid arrows are the frame data path; ~~~ arrows are I2C/ACPI control and power.

                              HARDWARE
  +-----------------------------------------------------------------+
  |   GalaxyCore GC2607 sensor            INT3472 PMIC              |
  |   ACPI HID: GCTI2607                  (power / reset / clk)     |
  +----------+--------------------------------+---------------------+
             | MIPI CSI-2                      ~ I2C + GPIO ~
             | SGRBG10 1920x1080               ~ (ACPI _CRS) ~
             v                                 v
  ===================================  KERNEL  =======================
  |                                                                  |
  |   gc2607 V4L2 subdev driver  [S][D]   <~~ binds to i2c-GCTI2607  |
  |   (gc2607-kernel/)                         via ACPI HID match     |
  |          |                                        ^              |
  |          | registers v4l2_subdev                  |              |
  |          v                                        |              |
  |   ipu-bridge  [P]  --- builds the software-node camera graph ----+
  |   (in-tree kmod + GCTI2607 sensor-table entry; see below)        |
  |          |                                                       |
  |          v                                                       |
  |   intel-ipu6 / intel-ipu6-isys  --- ISYS raw CSI-2 capture       |
  |          |                                                       |
  |          v                                                       |
  |   intel-ipu6-psys  [D]  --- PSYS image-processing device         |
  |   (third_party/ipu6-drivers)          exposes /dev/ipu-psys0     |
  |          |                                                       |
  +----------|--------------- /dev/video* + /dev/ipu-psys0 ----------+
             |
  =============================  USERSPACE  =========================
  |          v                                                      |
  |   Intel IPU6 HAL / libcamhal  [P]  +  PSYS pipeline             |
  |   (third_party/ipu6-camera-hal)                                 |
  |        uses:  gc2607 AIQB + graph XML  [A] (assets/hal/)        |
  |          |                                                      |
  |          v   processed NV12 1920x1080 @ 30fps                   |
  |   icamerasrc  (GStreamer source: device-name=gc2607-uf)         |
  |          |                                                      |
  |          v                                                      |
  |   GStreamer pipeline (verify-hal.sh / capture-gst-frame.sh)     |
  |          |                                                      |
  |          +--> JPEG / raw frame capture                          |
  |          |                                                      |
  |          v   (optional) feeder -> v4l2loopback                  |
  |   GC2607 Virtual Camera  /dev/video60  (virtual-camera.sh)      |
  |          |                                                      |
  |          v                                                      |
  |   Apps: Discord / Telegram / browser WebRTC                     |
  +-----------------------------------------------------------------+

Want to learn more about what the above means? See here.

Example image taken with the webcam in suboptimal lightning (evening) Example

Credits

This work builds on the initial GC2607 Linux V4L2 driver project:

https://github.com/abbood/gc2607-v4l2-driver

That project did the early sensor-driver bring-up, including ACPI binding, INT3472 power/reset handling, V4L2 subdevice support, IPU6 media-controller integration, and raw Bayer capture. This repo packages the later driver/HAL changes and GC2607 HAL assets needed for processed IPU6 output.

See CREDITS.md for more detail.

Hardware Scope

Validated hardware:

sensor: GalaxyCore GC2607
ACPI HID: GCTI2607
platform: Intel IPU6 / Meteor Lake class laptop
raw mode: SGRBG10_1X10 1920x1080
HAL output: NV12 1920x1080 @ 30 fps

The tested system exposes the sensor as i2c-GCTI2607:00.

Install

There are two ways to install the stack. The AUR packages are the recommended path on Arch/CachyOS — they rebuild the kernel modules automatically on every kernel upgrade (an out-of-tree module installed by hand is silently lost on the next kernel bump). The manual from-source path further down is for development or non-Arch systems.

Arch Linux / AUR packages (recommended)

Four packages mirror the stages of the bring-up; see packaging/aur/ for the full table and details.

A couple of dependencies live on the AUR and must be installed first (raw makepkg does not fetch AUR deps; an AUR helper does):

paru -S intel-ipu6-camera-bin icamerasrc-git

Then build the stack in dependency order:

git clone https://github.com/AlexDaichendt/gc2607-camera-linux.git
cd gc2607-camera-linux/packaging/aur

(cd gc2607-dkms              && makepkg -si)
(cd gc2607-ipu-bridge-dkms   && makepkg -si)
(cd gc2607-ipu6-camera-hal   && makepkg -si)
(cd gc2607-virtual-camera    && makepkg -si)

# Reboot for a clean first bring-up (the DKMS packages replace in-use kernel
# modules), then pick "GC2607 Virtual Camera" in your app.
reboot

The final gc2607-virtual-camera package enables v4l2-relayd.service and brings up the virtual webcam, so after the reboot the whole stack comes up on boot with no further steps. Removal is the reverse pacman -R (see packaging/aur/README.md).

If you previously installed via the manual scripts/install-*.sh path, back it out first so the packages take over cleanly:

sudo ./scripts/uninstall.sh

Manual / from-source build

The sections below (Required Sources through Use As An On-Demand Virtual Webcam) build and install everything by hand with the scripts/install-*.sh helpers. Use this for development, to inspect each step, or on non-Arch systems. The packaged path above wraps exactly these steps.

Repo Layout

assets/hal/       GC2607 AIQB and graph XML used by the HAL pipeline
config/           boot-time module and udev configuration
docs/             asset checksums, raw capture, and troubleshooting notes
gc2607-kernel/    in-tree GC2607 V4L2 sensor driver source (built via DKMS)
ipu-bridge-gc2607/
                  patched ipu-bridge module source (built via DKMS)
packaging/aur/    Arch Linux / AUR packages for the whole stack (recommended
                  install path; see packaging/aur/README.md)
patches/driver/   historical diff for the GC2607 driver, now baked into
                  gc2607-kernel/ (kept for reference only)
patches/hal/      patches for Intel ipu6-camera-hal
patches/ipu6-drivers/
                  patch for the older out-of-tree IPU bridge table
scripts/          clone, patch, install, validation, and uninstall scripts
                  (uninstall.sh backs out the manual install)
third_party/      upstream ipu6-camera-hal and ipu6-drivers, tracked as
                  git submodules

Required Sources

Clone this repo with its third-party source submodules:

git clone --recurse-submodules https://github.com/AlexDaichendt/gc2607-camera-linux
cd gc2607-camera-linux

If this repo is already checked out, initialize or refresh the source submodules:

git submodule update --init --recursive

The examples below assume:

export BRINGUP="$PWD"
export DRIVER="$BRINGUP/gc2607-kernel"
export HAL="$BRINGUP/third_party/ipu6-camera-hal"
export IPU6_DRIVERS="$BRINGUP/third_party/ipu6-drivers"

The GC2607 driver source lives in-tree under gc2607-kernel/; only the HAL and ipu6-drivers come from the third-party submodules.

Dependencies

Arch/CachyOS-style package names:

sudo pacman -S --needed \
  base-devel git cmake ninja dkms linux-headers \
  v4l-utils media-ctl \
  gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad

The Intel HAL also needs Intel's IPU6 userspace dependencies and camera binaries. Use the current Intel instructions for:

https://github.com/intel/ipu6-camera-hal
https://github.com/intel/ipu6-camera-bins
https://github.com/intel/icamerasrc/tree/icamerasrc_slim_api

Apply Patches And HAL Assets

Automatic:

"$BRINGUP/scripts/apply-patches.sh"

Manual equivalent (the GC2607 driver in gc2607-kernel/ needs no patching — its source already carries the timing/control fixes; only the third-party HAL and ipu6-drivers submodules are patched):

cd "$HAL"
git apply "$BRINGUP/patches/hal/0001-gc2607-profile-and-psys-padding.patch"
git apply "$BRINGUP/patches/hal/0002-add-gc2607-sensor-xml.patch"
git apply "$BRINGUP/patches/hal/0003-relax-werror-for-newer-toolchains.patch"
"$BRINGUP/scripts/install-hal-assets.sh" "$HAL"

cd "$IPU6_DRIVERS"
git apply "$BRINGUP/patches/ipu6-drivers/0001-cio2-bridge-add-gc2607-sensor.patch"

Included HAL assets:

assets/hal/gc2607_gc2607_MTL.aiqb
assets/hal/graph_settings_gc2607_gc2607_MTL.xml
assets/hal/graph_descriptor.xml

See docs/assets.md for checksums and asset notes.

Build And Install Kernel Modules

Build and install the GC2607 sensor module with DKMS:

sudo DRIVER="$DRIVER" "$BRINGUP/scripts/install-gc2607-dkms.sh"

Install Intel IPU6 PSYS support with DKMS:

IPU6_DRIVERS="$IPU6_DRIVERS" "$BRINGUP/scripts/install-ipu6-psys-dkms.sh"

The GC2607 also needs an IPU bridge sensor-table entry for ACPI HID GCTI2607 with link frequency 336000000. The included ipu6-drivers patch covers older out-of-tree bridge builds. On current kernels where modinfo ipu-bridge points at the distro kernel module, rebuild or override that kernel module with the same entry. See docs/ipu-bridge.md.

Install boot-time module loading and /dev/ipu-psys0 permissions:

"$BRINGUP/scripts/install-system-config.sh"

Expected kernel state:

dkms status -m gc2607
dkms status -m ipu6-drivers
lsmod | rg "^(gc2607|intel_ipu6|intel_ipu6_isys|intel_ipu6_psys)\b"
find /sys/bus/i2c/drivers/gc2607 -maxdepth 1 -mindepth 1 -printf "%f\n"
ls -l /dev/ipu-psys0

Expected GC2607 bind target:

i2c-GCTI2607:00

Build And Install The HAL

Configure and install the patched HAL into a prefix:

cd "$HAL"

cmake -S . -B build-gc2607 \
  -DCMAKE_BUILD_TYPE=Release \
  -DIPU_VER=ipu6epmtl \
  -DUSE_PG_LITE_PIPE=ON \
  -DBUILD_CAMHAL_PLUGIN=ON \
  -DBUILD_CAMHAL_ADAPTOR=ON \
  -DCMAKE_INSTALL_PREFIX="$HOME/opt/gc2607-ipu6"

cmake --build build-gc2607 -j"$(nproc)"
cmake --install build-gc2607

-DIPU_VER=ipu6epmtl selects the Meteor Lake target; the HAL's library targets are created inside a foreach(IPU_VER ...) loop, so without it cmake --build exits 0 having built nothing. BUILD_CAMHAL_PLUGIN/BUILD_CAMHAL_ADAPTOR produce the lib/libcamhal/plugins/ directory and the libcamhal.so adaptor that the runtime environment below expects.

On CMake 4.x the HAL's old cmake_minimum_required is rejected; add -DCMAKE_POLICY_VERSION_MINIMUM=3.5 to configure. Use whatever additional CMake options Intel's current HAL documentation requires for your distro.

Validate With GStreamer

Set up the HAL runtime environment:

export GC2607_PREFIX="$HOME/opt/gc2607-ipu6"
export LD_LIBRARY_PATH="$GC2607_PREFIX/lib:$GC2607_PREFIX/lib/libcamhal/plugins:${LD_LIBRARY_PATH:-}"
export GST_PLUGIN_PATH="$GC2607_PREFIX/lib/gstreamer-1.0"
export GST_REGISTRY="$GC2607_PREFIX/gstreamer-registry.bin"

Smoke-test streaming:

"$BRINGUP/scripts/verify-hal.sh"

Capture JPEG frames:

"$BRINGUP/scripts/capture-gst-frame.sh" /tmp/gc2607-frame

That writes a short frame sequence such as:

/tmp/gc2607-frame-00.jpg
/tmp/gc2607-frame-01.jpg
...

The GStreamer source is:

icamerasrc device-name=gc2607-uf

The expected negotiated stream is:

video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1

On the validated laptop the sensor is physically mounted inverted, so the capture script applies videoflip method=rotate-180 after HAL processing. Override with GC2607_FLIP_METHOD=identity if your hardware does not need that correction.

Use As An On-Demand Virtual Webcam

For compatibility with Discord, Telegram, and browser WebRTC camera pickers, use the GStreamer HAL output as a v4l2loopback virtual webcam:

"$BRINGUP/scripts/install-virtual-camera-desktop.sh"
"$BRINGUP/scripts/virtual-camera.sh" prepare
"$BRINGUP/scripts/virtual-camera.sh" start

Select GC2607 Virtual Camera in the application, then stop the real camera pipeline when done:

"$BRINGUP/scripts/virtual-camera.sh" stop

install-virtual-camera-desktop.sh hides the raw IPU6 and uncalibrated libcamera GC2607 sources from WirePlumber. prepare creates the cheap virtual V4L2 device and registers it with PipeWire without opening the real camera. start launches v4l2-relayd, which owns /dev/video60 as a producer (a black splash keeps it visible to WebRTC camera pickers) and powers the real icamerasrc pipeline only while an app actually has GC2607 Virtual Camera open, driven by v4l2loopback's CLIENT_USAGE event. The script is deliberately not installed as an autostart service, so messaging apps can remain open without keeping the camera active.

See docs/virtual-camera.md for status, logs, output-mode overrides, and unloading the loopback device.

Runtime Checks

Use:

"$BRINGUP/scripts/check-runtime.sh"

For lower-level raw capture checks, see docs/direct-raw.md.

About

Full guide to get the webcam (gc2607) for the Huawei Matebook X Pro 2024 to work on Linux

Resources

Stars

5 stars

Watchers

3 watching

Forks

Contributors

Languages