Skip to content
Digital Rhyme

OV5693 Camera Sensor Driver

A readable map of ov5693.c: what it owns, how it talks to the sensor, how modes are programmed, and how userspace controls it.

Embedded camera sensor board with register-table and I2C control overlays

Big Picture

This file is a Linux kernel driver for the OmniVision OV5693 camera sensor. It exposes the sensor as an I2C-backed misc device, powers it up and down, programs resolution-specific register tables, and accepts userspace control through ioctl calls.

It does four main jobs:

  • Describes the sensor ID, pixel format, lens metadata, and supported modes.
  • Talks to the sensor over I2C using Linux regmap.
  • Manages MCLK, GPIO power-down/reset, and voltage regulators.
  • Provides userspace controls through a misc device.

Key Data Structures

struct ov5693_info is the main per-device state. It tracks the I2C client, platform data, clock, misc device, current power state, current mode, GPIOs, regulators, fuse ID, and register map.

struct ov5693_info {
    atomic_t in_use;
    struct i2c_client *i2c_client;
    struct ov5693_platform_data *pdata;
    struct clk *mclk;
    struct miscdevice miscdev;
    struct regmap *regmap;
};

struct ov5693_reg is a simple register write: a 16-bit address and a value. Most of the file is made of arrays of these writes.

Supported Modes

The driver defines four resolution-specific register tables:

2592 x 1944
1920 x 1080
1296 x 972
1280 x 720 at 120fps

Each mode table is effectively a script of sensor register writes for timing, PLL, crop/window configuration, analog setup, MIPI behavior, gain defaults, and streaming. The full-resolution table starts at ov5693_2592x1944_i2c, and the mode lookup table starts at mode_table.

I2C and Register Tables

The core register programming function is ov5693_i2c_wr_table. It walks a table, handles special pseudo-registers, and writes data with regmap_bulk_write where consecutive registers can be batched.

#define OV5693_TABLE_WAIT_MS 0
#define OV5693_TABLE_END     1
#define OV5693_TABLE_RESET   2

These pseudo-registers let a table request a delay, mark its end, or trigger a sensor reset. That keeps mode setup declarative instead of scattering timing logic throughout the driver. Their definitions start at OV5693_TABLE_WAIT_MS.

Exposure and Gain

The driver has small helpers that generate register writes for common controls:

The GROUP_HOLD macros wrap multi-register updates so gain, exposure, and frame length can change together cleanly.

Mode Setting

ov5693_set_mode is the main mode-control path. If the requested width and height are zero, the call either updates exposure only or stops streaming. Otherwise it matches the requested resolution to one of the supported mode tables and writes that full table if needed.

One thing worth noticing: if an unsupported resolution is requested, mode_index remains zero, which means the driver silently falls back to 2592x1944. A production cleanup would probably return -EINVAL instead.

Power Management

Power is handled through helpers for the 24 MHz master clock, regulator rails, and the power-down GPIO. ov5693_pm_wr is the central power-state function, while ov5693_platform_power_on and ov5693_platform_power_off perform the board-specific sequence.

Device-tree parsing wires in regulators such as avdd, dovdd, and optionally ext_vcm_vdd, then assigns platform power callbacks.

Userspace Interface

The driver registers a misc device. Userspace opens it, then controls the sensor via ioctl commands handled by ov5693_ioctl.

  • OV5693_IOCTL_SET_MODE
  • OV5693_IOCTL_GET_STATUS
  • OV5693_IOCTL_SET_GROUP_HOLD
  • OV5693_IOCTL_SET_FRAME_LENGTH
  • OV5693_IOCTL_SET_COARSE_TIME
  • OV5693_IOCTL_SET_GAIN
  • OV5693_IOCTL_GET_FUSEID

Opening the device powers the sensor on. Releasing it powers the sensor off.

Driver Registration

At the bottom of the file, the code registers a standard Linux I2C driver named ov5693. It matches device-tree nodes with compatible = "nvidia,ov5693".

module_i2c_driver(ov5693_i2c_driver);
MODULE_LICENSE("GPL v2");

In short: this is an older NVIDIA-style OV5693 kernel camera driver. The large register tables are the sensor setup data; the surrounding code handles power, mode selection, exposure/gain updates, and the misc-device userspace API.