blob: a174e0a3e0228ad52d2cdc71a7f8e8aeb81b76ac (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
.. SPDX-License-Identifier: GPL-2.0
.. _v4l2-meta-fmt-rppx1-params:
.. _v4l2-meta-fmt-rppx1-stats:
*************************************************************************
V4L2_META_FMT_RPPX1_PARAMS ('DR1P'), V4L2_META_FMT_RPPX1_STATS ('DR1S')
*************************************************************************
Configuration Parameters
========================
The configuration parameters are passed to the metadata output video node, using
the :c:type:`v4l2_meta_format` interface. Rather than a single struct containing
sub-structs for each configurable area of the ISP, parameters for the Dreamchip
RPPX1 use the v4l2-isp parameters system, through which groups of parameters are
defined as distinct structs or "blocks" which may be added to the data member of
:c:type:`v4l2_isp_buffer`. Userspace is responsible for populating the data
member with the blocks that need to be configured by the driver. Each
block-specific struct embeds :c:type:`v4l2_isp_block_header` as its first member
and userspace must populate the type member with a value from
:c:type:`rppx1_params_block_type`.
.. code-block:: c
struct v4l2_isp_params_buffer *params =
(struct v4l2_isp_params_buffer *)buffer;
params->version = V4L2_ISP_PARAMS_VERSION_V1;
params->data_size = 0;
void *data = (void *)params->data;
struct rppx1_ccor_params *ccor =
(struct rppx1_ccor_params *)data;
ccor->header.type = RPPX1_PARAMS_BLOCK_TYPE_CCOR_POST;
ccor->header.flags |= V4L2_ISP_PARAMS_FL_BLOCK_ENABLE;
ccor->header.size = sizeof(struct rppx1_ccor_params);
ccor->coeff[0][0] = 0x1000;
ccor->coeff[0][1] = 0x0000;
ccor->coeff[0][2] = 0x0000;
ccor->coeff[1][0] = 0x0000;
ccor->coeff[1][1] = 0x1000;
ccor->coeff[1][2] = 0x0000;
ccor->coeff[2][0] = 0x0000;
ccor->coeff[2][1] = 0x0000;
ccor->coeff[2][2] = 0x1000;
ccor->offset[0] = 0x200000;
ccor->offset[1] = 0x200000;
ccor->offset[2] = 0x200000;
data += sizeof(struct rppx1_ccor_params);
params->data_size += sizeof(struct rppx1_ccor_params);
3A Statistics
=============
The ISP device collects different statistics over an input bayer frame. Those
statistics can be obtained by userspace from the metadata capture video node,
using the :c:type:`v4l2_meta_format` interface. Rather than a single struct
containing sub-structs for each statistics area of the ISP, statistics for the
Dreamchip RPPX1 use the v4l2-isp statistics system, through which groups of
statistics are defined as distinct structs or "blocks" which may be added to the
data member of :c:type:`v4l2_isp_buffer`. Userspace is responsible for parsing
the buffer and extracting the blocks of statistics. Each block-specific struct
embeds :c:type:`v4l2_isp_block_header` as its first member and userspace must
interpret the type member with a value from :c:type:`rppx1_stats_block_type`.
.. code-block:: C
const struct v4l2_isp_buffer *stats =
(struct v4l2_isp_buffer *)buf;
size_t block_offset = 0;
while (block_offset < stats->data_size) {
const struct v4l2_isp_stats_block_header *block =
(void*)(stats->data + block_offset);
block_offset += block->size;
switch (block->type) {
case RPPX1_STATS_BLOCK_TYPE_HIST_POST:
for (unsigned int i = 0; i < RPPX1_HIST_NUM_BINS; i++)
printf("hist.hist_bins[%u] = 0x%08x\n",
i, hist.hist_bins[%i]);
break;
default:
printf("Unknown block type 0x%04x", block->type);
break;
}
}
Dreamchip RPPX1 uAPI data types
===============================
.. kernel-doc:: include/uapi/linux/media/dreamchip/rppx1-config.h
|