include: uapi: Add header definitions for BCM2835 Unicam and ISP blocks

This commit adds the headers and definitions required for the
bcm2835_isp and bcm2835_unicam kernel modules.

The headers come from patches recently posted to the
linux-media@vger.kernel.org mailing list to add the Unicam and ISP
peripherals drivers to the kernel.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2020-03-26 10:35:33 +00:00 committed by Laurent Pinchart
parent 032e0ef6da
commit 43d81d43fe
4 changed files with 461 additions and 0 deletions

320
include/linux/bcm2835-isp.h Normal file
View file

@ -0,0 +1,320 @@
/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */
/*
* bcm2835-isp.h
*
* BCM2835 ISP driver - user space header file.
*
* Copyright © 2019-2020 Raspberry Pi (Trading) Ltd.
*
* Author: Naushir Patuck (naush@raspberrypi.com)
*
*/
#ifndef __BCM2835_ISP_H_
#define __BCM2835_ISP_H_
#include <linux/v4l2-controls.h>
#define V4L2_CID_USER_BCM2835_ISP_CC_MATRIX \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0001)
#define V4L2_CID_USER_BCM2835_ISP_LENS_SHADING \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0002)
#define V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0003)
#define V4L2_CID_USER_BCM2835_ISP_GEQ \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0004)
#define V4L2_CID_USER_BCM2835_ISP_GAMMA \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0005)
#define V4L2_CID_USER_BCM2835_ISP_DENOISE \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0006)
#define V4L2_CID_USER_BCM2835_ISP_SHARPEN \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0007)
#define V4L2_CID_USER_BCM2835_ISP_DPC \
(V4L2_CID_USER_BCM2835_ISP_BASE + 0x0008)
/*
* All structs below are directly mapped onto the equivalent structs in
* drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h
* for convenience.
*/
/**
* struct bcm2835_isp_rational - Rational value type.
*
* @num: Numerator.
* @den: Denominator.
*/
struct bcm2835_isp_rational {
__s32 num;
__s32 den;
};
/**
* struct bcm2835_isp_ccm - Colour correction matrix.
*
* @ccm: 3x3 correction matrix coefficients.
* @offsets: 1x3 correction offsets.
*/
struct bcm2835_isp_ccm {
struct bcm2835_isp_rational ccm[3][3];
__s32 offsets[3];
};
/**
* struct bcm2835_isp_custom_ccm - Custom CCM applied with the
* V4L2_CID_USER_BCM2835_ISP_CC_MATRIX ctrl.
*
* @enabled: Enable custom CCM.
* @ccm: Custom CCM coefficients and offsets.
*/
struct bcm2835_isp_custom_ccm {
__u32 enabled;
struct bcm2835_isp_ccm ccm;
};
/**
* enum bcm2835_isp_gain_format - format of the gains in the lens shading
* tables used with the
* V4L2_CID_USER_BCM2835_ISP_LENS_SHADING ctrl.
*
* @GAIN_FORMAT_U0P8_1: Gains are u0.8 format, starting at 1.0
* @GAIN_FORMAT_U1P7_0: Gains are u1.7 format, starting at 0.0
* @GAIN_FORMAT_U1P7_1: Gains are u1.7 format, starting at 1.0
* @GAIN_FORMAT_U2P6_0: Gains are u2.6 format, starting at 0.0
* @GAIN_FORMAT_U2P6_1: Gains are u2.6 format, starting at 1.0
* @GAIN_FORMAT_U3P5_0: Gains are u3.5 format, starting at 0.0
* @GAIN_FORMAT_U3P5_1: Gains are u3.5 format, starting at 1.0
* @GAIN_FORMAT_U4P10: Gains are u4.10 format, starting at 0.0
*/
enum bcm2835_isp_gain_format {
GAIN_FORMAT_U0P8_1 = 0,
GAIN_FORMAT_U1P7_0 = 1,
GAIN_FORMAT_U1P7_1 = 2,
GAIN_FORMAT_U2P6_0 = 3,
GAIN_FORMAT_U2P6_1 = 4,
GAIN_FORMAT_U3P5_0 = 5,
GAIN_FORMAT_U3P5_1 = 6,
GAIN_FORMAT_U4P10 = 7,
};
/**
* struct bcm2835_isp_lens_shading - Lens shading tables supplied with the
* V4L2_CID_USER_BCM2835_ISP_LENS_SHADING
* ctrl.
*
* @enabled: Enable lens shading.
* @grid_cell_size: Size of grid cells in samples (16, 32, 64, 128 or 256).
* @grid_width: Width of lens shading tables in grid cells.
* @grid_stride: Row to row distance (in grid cells) between grid cells
* in the same horizontal location.
* @grid_height: Height of lens shading tables in grid cells.
* @mem_handle_table: Memory handle to the tables.
* @ref_transform: Reference transform - unsupported, please pass zero.
* @corner_sampled: Whether the gains are sampled at the corner points
* of the grid cells or in the cell centres.
* @gain_format: Format of the gains (see enum &bcm2835_isp_gain_format).
*/
struct bcm2835_isp_lens_shading {
__u32 enabled;
__u32 grid_cell_size;
__u32 grid_width;
__u32 grid_stride;
__u32 grid_height;
__u32 mem_handle_table;
__u32 ref_transform;
__u32 corner_sampled;
__u32 gain_format;
};
/**
* struct bcm2835_isp_black_level - Sensor black level set with the
* V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL ctrl.
*
* @enabled: Enable black level.
* @black_level_r: Black level for red channel.
* @black_level_g: Black level for green channels.
* @black_level_b: Black level for blue channel.
*/
struct bcm2835_isp_black_level {
__u32 enabled;
__u16 black_level_r;
__u16 black_level_g;
__u16 black_level_b;
__u8 pad_[2]; /* Unused */
};
/**
* struct bcm2835_isp_geq - Green equalisation parameters set with the
* V4L2_CID_USER_BCM2835_ISP_GEQ ctrl.
*
* @enabled: Enable green equalisation.
* @offset: Fixed offset of the green equalisation threshold.
* @slope: Slope of the green equalisation threshold.
*/
struct bcm2835_isp_geq {
__u32 enabled;
__u32 offset;
struct bcm2835_isp_rational slope;
};
#define BCM2835_NUM_GAMMA_PTS 33
/**
* struct bcm2835_isp_gamma - Gamma parameters set with the
* V4L2_CID_USER_BCM2835_ISP_GAMMA ctrl.
*
* @enabled: Enable gamma adjustment.
* @X: X values of the points defining the gamma curve.
* Values should be scaled to 16 bits.
* @Y: Y values of the points defining the gamma curve.
* Values should be scaled to 16 bits.
*/
struct bcm2835_isp_gamma {
__u32 enabled;
__u16 x[BCM2835_NUM_GAMMA_PTS];
__u16 y[BCM2835_NUM_GAMMA_PTS];
};
/**
* struct bcm2835_isp_denoise - Denoise parameters set with the
* V4L2_CID_USER_BCM2835_ISP_DENOISE ctrl.
*
* @enabled: Enable denoise.
* @constant: Fixed offset of the noise threshold.
* @slope: Slope of the noise threshold.
* @strength: Denoise strength between 0.0 (off) and 1.0 (maximum).
*/
struct bcm2835_isp_denoise {
__u32 enabled;
__u32 constant;
struct bcm2835_isp_rational slope;
struct bcm2835_isp_rational strength;
};
/**
* struct bcm2835_isp_sharpen - Sharpen parameters set with the
* V4L2_CID_USER_BCM2835_ISP_SHARPEN ctrl.
*
* @enabled: Enable sharpening.
* @threshold: Threshold at which to start sharpening pixels.
* @strength: Strength with which pixel sharpening increases.
* @limit: Limit to the amount of sharpening applied.
*/
struct bcm2835_isp_sharpen {
__u32 enabled;
struct bcm2835_isp_rational threshold;
struct bcm2835_isp_rational strength;
struct bcm2835_isp_rational limit;
};
/**
* enum bcm2835_isp_dpc_mode - defective pixel correction (DPC) strength.
*
* @DPC_MODE_OFF: No DPC.
* @DPC_MODE_NORMAL: Normal DPC.
* @DPC_MODE_STRONG: Strong DPC.
*/
enum bcm2835_isp_dpc_mode {
DPC_MODE_OFF = 0,
DPC_MODE_NORMAL = 1,
DPC_MODE_STRONG = 2,
};
/**
* struct bcm2835_isp_dpc - Defective pixel correction (DPC) parameters set
* with the V4L2_CID_USER_BCM2835_ISP_DPC ctrl.
*
* @enabled: Enable DPC.
* @strength: DPC strength (see enum &bcm2835_isp_dpc_mode).
*/
struct bcm2835_isp_dpc {
__u32 enabled;
__u32 strength;
};
/*
* ISP statistics structures.
*
* The bcm2835_isp_stats structure is generated at the output of the
* statistics node. Note that this does not directly map onto the statistics
* output of the ISP HW. Instead, the MMAL firmware code maps the HW statistics
* to the bcm2835_isp_stats structure.
*/
#define DEFAULT_AWB_REGIONS_X 16
#define DEFAULT_AWB_REGIONS_Y 12
#define NUM_HISTOGRAMS 2
#define NUM_HISTOGRAM_BINS 128
#define AWB_REGIONS (DEFAULT_AWB_REGIONS_X * DEFAULT_AWB_REGIONS_Y)
#define FLOATING_REGIONS 16
#define AGC_REGIONS 16
#define FOCUS_REGIONS 12
/**
* struct bcm2835_isp_stats_hist - Histogram statistics
*
* @r_hist: Red channel histogram.
* @g_hist: Combined green channel histogram.
* @b_hist: Blue channel histogram.
*/
struct bcm2835_isp_stats_hist {
__u32 r_hist[NUM_HISTOGRAM_BINS];
__u32 g_hist[NUM_HISTOGRAM_BINS];
__u32 b_hist[NUM_HISTOGRAM_BINS];
};
/**
* struct bcm2835_isp_stats_region - Region sums.
*
* @counted: The number of 2x2 bayer tiles accumulated.
* @notcounted: The number of 2x2 bayer tiles not accumulated.
* @r_sum: Total sum of counted pixels in the red channel for a region.
* @g_sum: Total sum of counted pixels in the green channel for a region.
* @b_sum: Total sum of counted pixels in the blue channel for a region.
*/
struct bcm2835_isp_stats_region {
__u32 counted;
__u32 notcounted;
__u64 r_sum;
__u64 g_sum;
__u64 b_sum;
};
/**
* struct bcm2835_isp_stats_focus - Focus statistics.
*
* @contrast_val: Focus measure - accumulated output of the focus filter.
* In the first dimension, index [0] counts pixels below a
* preset threshold, and index [1] counts pixels above the
* threshold. In the second dimension, index [0] uses the
* first predefined filter, and index [1] uses the second
* predefined filter.
* @contrast_val_num: The number of counted pixels in the above accumulation.
*/
struct bcm2835_isp_stats_focus {
__u64 contrast_val[2][2];
__u32 contrast_val_num[2][2];
};
/**
* struct bcm2835_isp_stats - ISP statistics.
*
* @version: Version of the bcm2835_isp_stats structure.
* @size: Size of the bcm2835_isp_stats structure.
* @hist: Histogram statistics for the entire image.
* @awb_stats: Statistics for the regions defined for AWB calculations.
* @floating_stats: Statistics for arbitrarily placed (floating) regions.
* @agc_stats: Statistics for the regions defined for AGC calculations.
* @focus_stats: Focus filter statistics for the focus regions.
*/
struct bcm2835_isp_stats {
__u32 version;
__u32 size;
struct bcm2835_isp_stats_hist hist[NUM_HISTOGRAMS];
struct bcm2835_isp_stats_region awb_stats[AWB_REGIONS];
struct bcm2835_isp_stats_region floating_stats[FLOATING_REGIONS];
struct bcm2835_isp_stats_region agc_stats[AGC_REGIONS];
struct bcm2835_isp_stats_focus focus_stats[FOCUS_REGIONS];
};
#endif /* __BCM2835_ISP_H_ */

View file

@ -192,6 +192,10 @@ enum v4l2_colorfx {
* We reserve 16 controls for this driver. */
#define V4L2_CID_USER_IMX_BASE (V4L2_CID_USER_BASE + 0x10b0)
/* The base for the bcm2835-isp driver controls.
* We reserve 16 controls for this driver. */
#define V4L2_CID_USER_BCM2835_ISP_BASE (V4L2_CID_USER_BASE + 0x10c0)
/* MPEG-class control IDs */
/* The MPEG controls are applicable to all codec controls
* and the 'MPEG' part of the define is historical */

View file

@ -0,0 +1,135 @@
/*
Copyright (c) 2012, Broadcom Europe Ltd
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright 2019 Raspberry Pi (Trading) Ltd. All rights reserved.
*
* Based on vmcs_sm_ioctl.h Copyright Broadcom Corporation.
*/
#ifndef __VC_SM_CMA_IOCTL_H
#define __VC_SM_CMA_IOCTL_H
/* ---- Include Files ---------------------------------------------------- */
#include <linux/types.h> /* Needed for standard types */
#include <linux/ioctl.h>
/* ---- Constants and Types ---------------------------------------------- */
#define VC_SM_CMA_RESOURCE_NAME 32
#define VC_SM_CMA_RESOURCE_NAME_DEFAULT "sm-host-resource"
/* Type define used to create unique IOCTL number */
#define VC_SM_CMA_MAGIC_TYPE 'J'
/* IOCTL commands on /dev/vc-sm-cma */
enum vc_sm_cma_cmd_e {
VC_SM_CMA_CMD_ALLOC = 0x5A, /* Start at 0x5A arbitrarily */
VC_SM_CMA_CMD_IMPORT_DMABUF,
VC_SM_CMA_CMD_CLEAN_INVALID2,
VC_SM_CMA_CMD_LAST /* Do not delete */
};
/* Cache type supported, conveniently matches the user space definition in
* user-vcsm.h.
*/
enum vc_sm_cma_cache_e {
VC_SM_CMA_CACHE_NONE,
VC_SM_CMA_CACHE_HOST,
VC_SM_CMA_CACHE_VC,
VC_SM_CMA_CACHE_BOTH,
};
/* IOCTL Data structures */
struct vc_sm_cma_ioctl_alloc {
/* user -> kernel */
__u32 size;
__u32 num;
__u32 cached; /* enum vc_sm_cma_cache_e */
__u32 pad;
__u8 name[VC_SM_CMA_RESOURCE_NAME];
/* kernel -> user */
__s32 handle;
__u32 vc_handle;
__u64 dma_addr;
};
struct vc_sm_cma_ioctl_import_dmabuf {
/* user -> kernel */
__s32 dmabuf_fd;
__u32 cached; /* enum vc_sm_cma_cache_e */
__u8 name[VC_SM_CMA_RESOURCE_NAME];
/* kernel -> user */
__s32 handle;
__u32 vc_handle;
__u32 size;
__u32 pad;
__u64 dma_addr;
};
/*
* Cache functions to be set to struct vc_sm_cma_ioctl_clean_invalid2
* invalidate_mode.
*/
#define VC_SM_CACHE_OP_NOP 0x00
#define VC_SM_CACHE_OP_INV 0x01
#define VC_SM_CACHE_OP_CLEAN 0x02
#define VC_SM_CACHE_OP_FLUSH 0x03
struct vc_sm_cma_ioctl_clean_invalid2 {
__u32 op_count;
__u32 pad;
struct vc_sm_cma_ioctl_clean_invalid_block {
__u32 invalidate_mode;
__u32 block_count;
void * /*__user */start_address;
__u32 block_size;
__u32 inter_block_stride;
} s[0];
};
/* IOCTL numbers */
#define VC_SM_CMA_IOCTL_MEM_ALLOC\
_IOR(VC_SM_CMA_MAGIC_TYPE, VC_SM_CMA_CMD_ALLOC,\
struct vc_sm_cma_ioctl_alloc)
#define VC_SM_CMA_IOCTL_MEM_IMPORT_DMABUF\
_IOR(VC_SM_CMA_MAGIC_TYPE, VC_SM_CMA_CMD_IMPORT_DMABUF,\
struct vc_sm_cma_ioctl_import_dmabuf)
#define VC_SM_CMA_IOCTL_MEM_CLEAN_INVALID2\
_IOR(VC_SM_CMA_MAGIC_TYPE, VC_SM_CMA_CMD_CLEAN_INVALID2,\
struct vc_sm_cma_ioctl_clean_invalid2)
#endif /* __VC_SM_CMA_IOCTL_H */

View file

@ -751,6 +751,8 @@ struct v4l2_pix_format {
#define V4L2_META_FMT_VSP1_HGT v4l2_fourcc('V', 'S', 'P', 'T') /* R-Car VSP1 2-D Histogram */
#define V4L2_META_FMT_UVC v4l2_fourcc('U', 'V', 'C', 'H') /* UVC Payload Header metadata */
#define V4L2_META_FMT_D4XX v4l2_fourcc('D', '4', 'X', 'X') /* D4XX Payload Header metadata */
#define V4L2_META_FMT_SENSOR_DATA v4l2_fourcc('S', 'E', 'N', 'S') /* Sensor Ancillary metadata */
#define V4L2_META_FMT_BCM2835_ISP_STATS v4l2_fourcc('B', 'S', 'T', 'A') /* BCM2835 ISP image statistics output */
/* Vendor specific - used for RK_ISP1 camera sub-system */
#define V4L2_META_FMT_RK_ISP1_PARAMS v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 params */