1
linux/drivers/media/i2c/ccs/ccs-data-defs.h
Sakari Ailus a6b396f410 media: ccs: Add CCS static data parser library
Add a parser library for parsing the CCS static data format.

The library may be also compiled in user space as the format has uses also
in the user space. Therefore it is dual licensed under the 3-clause BSD
license as well.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
2020-12-03 12:27:28 +01:00

222 lines
5.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
* CCS static data binary format definitions
*
* Copyright 2019--2020 Intel Corporation
*/
#ifndef __CCS_DATA_DEFS_H__
#define __CCS_DATA_DEFS_H__
#include "ccs-data.h"
#define CCS_STATIC_DATA_VERSION 0
enum __ccs_data_length_specifier_id {
CCS_DATA_LENGTH_SPECIFIER_1 = 0,
CCS_DATA_LENGTH_SPECIFIER_2 = 1,
CCS_DATA_LENGTH_SPECIFIER_3 = 2
};
#define CCS_DATA_LENGTH_SPECIFIER_SIZE_SHIFT 6
struct __ccs_data_length_specifier {
u8 length;
} __packed;
struct __ccs_data_length_specifier2 {
u8 length[2];
} __packed;
struct __ccs_data_length_specifier3 {
u8 length[3];
} __packed;
struct __ccs_data_block {
u8 id;
struct __ccs_data_length_specifier length;
} __packed;
#define CCS_DATA_BLOCK_HEADER_ID_VERSION_SHIFT 5
struct __ccs_data_block3 {
u8 id;
struct __ccs_data_length_specifier2 length;
} __packed;
struct __ccs_data_block4 {
u8 id;
struct __ccs_data_length_specifier3 length;
} __packed;
enum __ccs_data_block_id {
CCS_DATA_BLOCK_ID_DUMMY = 1,
CCS_DATA_BLOCK_ID_DATA_VERSION = 2,
CCS_DATA_BLOCK_ID_SENSOR_READ_ONLY_REGS = 3,
CCS_DATA_BLOCK_ID_MODULE_READ_ONLY_REGS = 4,
CCS_DATA_BLOCK_ID_SENSOR_MANUFACTURER_REGS = 5,
CCS_DATA_BLOCK_ID_MODULE_MANUFACTURER_REGS = 6,
CCS_DATA_BLOCK_ID_SENSOR_RULE_BASED_BLOCK = 32,
CCS_DATA_BLOCK_ID_MODULE_RULE_BASED_BLOCK = 33,
CCS_DATA_BLOCK_ID_SENSOR_PDAF_PIXEL_LOCATION = 36,
CCS_DATA_BLOCK_ID_MODULE_PDAF_PIXEL_LOCATION = 37,
CCS_DATA_BLOCK_ID_LICENSE = 40,
CCS_DATA_BLOCK_ID_END = 127,
};
struct __ccs_data_block_version {
u8 static_data_version_major[2];
u8 static_data_version_minor[2];
u8 year[2];
u8 month;
u8 day;
} __packed;
struct __ccs_data_block_regs {
u8 reg_len;
} __packed;
#define CCS_DATA_BLOCK_REGS_ADDR_MASK 0x07
#define CCS_DATA_BLOCK_REGS_LEN_SHIFT 3
#define CCS_DATA_BLOCK_REGS_LEN_MASK 0x38
#define CCS_DATA_BLOCK_REGS_SEL_SHIFT 6
enum ccs_data_block_regs_sel {
CCS_DATA_BLOCK_REGS_SEL_REGS = 0,
CCS_DATA_BLOCK_REGS_SEL_REGS2 = 1,
CCS_DATA_BLOCK_REGS_SEL_REGS3 = 2,
};
struct __ccs_data_block_regs2 {
u8 reg_len;
u8 addr;
} __packed;
#define CCS_DATA_BLOCK_REGS_2_ADDR_MASK 0x01
#define CCS_DATA_BLOCK_REGS_2_LEN_SHIFT 1
#define CCS_DATA_BLOCK_REGS_2_LEN_MASK 0x3e
struct __ccs_data_block_regs3 {
u8 reg_len;
u8 addr[2];
} __packed;
#define CCS_DATA_BLOCK_REGS_3_LEN_MASK 0x3f
enum __ccs_data_ffd_pixelcode {
CCS_DATA_BLOCK_FFD_PIXELCODE_EMBEDDED = 1,
CCS_DATA_BLOCK_FFD_PIXELCODE_DUMMY = 2,
CCS_DATA_BLOCK_FFD_PIXELCODE_BLACK = 3,
CCS_DATA_BLOCK_FFD_PIXELCODE_DARK = 4,
CCS_DATA_BLOCK_FFD_PIXELCODE_VISIBLE = 5,
CCS_DATA_BLOCK_FFD_PIXELCODE_MS_0 = 8,
CCS_DATA_BLOCK_FFD_PIXELCODE_MS_1 = 9,
CCS_DATA_BLOCK_FFD_PIXELCODE_MS_2 = 10,
CCS_DATA_BLOCK_FFD_PIXELCODE_MS_3 = 11,
CCS_DATA_BLOCK_FFD_PIXELCODE_MS_4 = 12,
CCS_DATA_BLOCK_FFD_PIXELCODE_MS_5 = 13,
CCS_DATA_BLOCK_FFD_PIXELCODE_MS_6 = 14,
CCS_DATA_BLOCK_FFD_PIXELCODE_TOP_OB = 16,
CCS_DATA_BLOCK_FFD_PIXELCODE_BOTTOM_OB = 17,
CCS_DATA_BLOCK_FFD_PIXELCODE_LEFT_OB = 18,
CCS_DATA_BLOCK_FFD_PIXELCODE_RIGHT_OB = 19,
CCS_DATA_BLOCK_FFD_PIXELCODE_TOP_LEFT_OB = 20,
CCS_DATA_BLOCK_FFD_PIXELCODE_TOP_RIGHT_OB = 21,
CCS_DATA_BLOCK_FFD_PIXELCODE_BOTTOM_LEFT_OB = 22,
CCS_DATA_BLOCK_FFD_PIXELCODE_BOTTOM_RIGHT_OB = 23,
CCS_DATA_BLOCK_FFD_PIXELCODE_TOTAL = 24,
CCS_DATA_BLOCK_FFD_PIXELCODE_TOP_PDAF = 32,
CCS_DATA_BLOCK_FFD_PIXELCODE_BOTTOM_PDAF = 33,
CCS_DATA_BLOCK_FFD_PIXELCODE_LEFT_PDAF = 34,
CCS_DATA_BLOCK_FFD_PIXELCODE_RIGHT_PDAF = 35,
CCS_DATA_BLOCK_FFD_PIXELCODE_TOP_LEFT_PDAF = 36,
CCS_DATA_BLOCK_FFD_PIXELCODE_TOP_RIGHT_PDAF = 37,
CCS_DATA_BLOCK_FFD_PIXELCODE_BOTTOM_LEFT_PDAF = 38,
CCS_DATA_BLOCK_FFD_PIXELCODE_BOTTOM_RIGHT_PDAF = 39,
CCS_DATA_BLOCK_FFD_PIXELCODE_SEPARATED_PDAF = 40,
CCS_DATA_BLOCK_FFD_PIXELCODE_ORIGINAL_ORDER_PDAF = 41,
CCS_DATA_BLOCK_FFD_PIXELCODE_VENDOR_PDAF = 41,
};
struct __ccs_data_block_ffd_entry {
u8 pixelcode;
u8 reserved;
u8 value[2];
} __packed;
struct __ccs_data_block_ffd {
u8 num_column_descs;
u8 num_row_descs;
} __packed;
enum __ccs_data_block_rule_id {
CCS_DATA_BLOCK_RULE_ID_IF = 1,
CCS_DATA_BLOCK_RULE_ID_READ_ONLY_REGS = 2,
CCS_DATA_BLOCK_RULE_ID_FFD = 3,
CCS_DATA_BLOCK_RULE_ID_MSR = 4,
CCS_DATA_BLOCK_RULE_ID_PDAF_READOUT = 5,
};
struct __ccs_data_block_rule_if {
u8 addr[2];
u8 value;
u8 mask;
} __packed;
enum __ccs_data_block_pdaf_readout_order {
CCS_DATA_BLOCK_PDAF_READOUT_ORDER_ORIGINAL = 1,
CCS_DATA_BLOCK_PDAF_READOUT_ORDER_SEPARATE_WITHIN_LINE = 2,
CCS_DATA_BLOCK_PDAF_READOUT_ORDER_SEPARATE_TYPES_SEPARATE_LINES = 3,
};
struct __ccs_data_block_pdaf_readout {
u8 pdaf_readout_info_reserved;
u8 pdaf_readout_info_order;
} __packed;
struct __ccs_data_block_pdaf_pix_loc_block_desc {
u8 block_type_id;
u8 repeat_x[2];
} __packed;
struct __ccs_data_block_pdaf_pix_loc_block_desc_group {
u8 num_block_descs[2];
u8 repeat_y;
} __packed;
enum __ccs_data_block_pdaf_pix_loc_pixel_type {
CCS_DATA_PDAF_PIXEL_TYPE_LEFT_SEPARATED = 0,
CCS_DATA_PDAF_PIXEL_TYPE_RIGHT_SEPARATED = 1,
CCS_DATA_PDAF_PIXEL_TYPE_TOP_SEPARATED = 2,
CCS_DATA_PDAF_PIXEL_TYPE_BOTTOM_SEPARATED = 3,
CCS_DATA_PDAF_PIXEL_TYPE_LEFT_SIDE_BY_SIDE = 4,
CCS_DATA_PDAF_PIXEL_TYPE_RIGHT_SIDE_BY_SIDE = 5,
CCS_DATA_PDAF_PIXEL_TYPE_TOP_SIDE_BY_SIDE = 6,
CCS_DATA_PDAF_PIXEL_TYPE_BOTTOM_SIDE_BY_SIDE = 7,
CCS_DATA_PDAF_PIXEL_TYPE_TOP_LEFT = 8,
CCS_DATA_PDAF_PIXEL_TYPE_TOP_RIGHT = 9,
CCS_DATA_PDAF_PIXEL_TYPE_BOTTOM_LEFT = 10,
CCS_DATA_PDAF_PIXEL_TYPE_BOTTOM_RIGHT = 11,
};
struct __ccs_data_block_pdaf_pix_loc_pixel_desc {
u8 pixel_type;
u8 small_offset_x;
u8 small_offset_y;
} __packed;
struct __ccs_data_block_pdaf_pix_loc {
u8 main_offset_x[2];
u8 main_offset_y[2];
u8 global_pdaf_type;
u8 block_width;
u8 block_height;
u8 num_block_desc_groups[2];
} __packed;
struct __ccs_data_block_end {
u8 crc[4];
} __packed;
#endif /* __CCS_DATA_DEFS_H__ */