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.
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)

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.
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.
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.
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-gitThen 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.
rebootThe 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.shThe 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.
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
Clone this repo with its third-party source submodules:
git clone --recurse-submodules https://github.com/AlexDaichendt/gc2607-camera-linux
cd gc2607-camera-linuxIf this repo is already checked out, initialize or refresh the source submodules:
git submodule update --init --recursiveThe 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.
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-badThe 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
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 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-psys0Expected GC2607 bind target:
i2c-GCTI2607:00
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.
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-frameThat 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-ufThe 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.
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" startSelect GC2607 Virtual Camera in the application, then stop the real camera pipeline when done:
"$BRINGUP/scripts/virtual-camera.sh" stopinstall-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.
Use:
"$BRINGUP/scripts/check-runtime.sh"For lower-level raw capture checks, see docs/direct-raw.md.