mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-22 18:44:44 +08:00
media: sun6i-csi: Introduce capture format structure, list and helper
Add a table that describes each pixel format and associated output register configuration with necessary tweaks. It will be used later on to configure the hardware. Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> Acked-by: Jernej Skrabec <jernej.skrabec@gmail.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
21818a2905
commit
53fd3926f5
@ -60,45 +60,171 @@ sun6i_csi_capture_remote_subdev(struct sun6i_csi_capture *capture, u32 *pad)
|
|||||||
|
|
||||||
/* Format */
|
/* Format */
|
||||||
|
|
||||||
static const u32 sun6i_csi_capture_formats[] = {
|
static const struct sun6i_csi_capture_format sun6i_csi_capture_formats[] = {
|
||||||
V4L2_PIX_FMT_SBGGR8,
|
/* Bayer */
|
||||||
V4L2_PIX_FMT_SGBRG8,
|
{
|
||||||
V4L2_PIX_FMT_SGRBG8,
|
.pixelformat = V4L2_PIX_FMT_SBGGR8,
|
||||||
V4L2_PIX_FMT_SRGGB8,
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
V4L2_PIX_FMT_SBGGR10,
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
V4L2_PIX_FMT_SGBRG10,
|
},
|
||||||
V4L2_PIX_FMT_SGRBG10,
|
{
|
||||||
V4L2_PIX_FMT_SRGGB10,
|
.pixelformat = V4L2_PIX_FMT_SGBRG8,
|
||||||
V4L2_PIX_FMT_SBGGR12,
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
V4L2_PIX_FMT_SGBRG12,
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
V4L2_PIX_FMT_SGRBG12,
|
},
|
||||||
V4L2_PIX_FMT_SRGGB12,
|
{
|
||||||
V4L2_PIX_FMT_YUYV,
|
.pixelformat = V4L2_PIX_FMT_SGRBG8,
|
||||||
V4L2_PIX_FMT_YVYU,
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
V4L2_PIX_FMT_UYVY,
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
V4L2_PIX_FMT_VYUY,
|
},
|
||||||
V4L2_PIX_FMT_NV12_16L16,
|
{
|
||||||
V4L2_PIX_FMT_NV12,
|
.pixelformat = V4L2_PIX_FMT_SRGGB8,
|
||||||
V4L2_PIX_FMT_NV21,
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
V4L2_PIX_FMT_YUV420,
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
V4L2_PIX_FMT_YVU420,
|
},
|
||||||
V4L2_PIX_FMT_NV16,
|
{
|
||||||
V4L2_PIX_FMT_NV61,
|
.pixelformat = V4L2_PIX_FMT_SBGGR10,
|
||||||
V4L2_PIX_FMT_YUV422P,
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_10,
|
||||||
V4L2_PIX_FMT_RGB565,
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_10,
|
||||||
V4L2_PIX_FMT_RGB565X,
|
},
|
||||||
V4L2_PIX_FMT_JPEG,
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_SGBRG10,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_10,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_10,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_SGRBG10,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_10,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_10,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_SRGGB10,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_10,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_10,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_SBGGR12,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_12,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_SGBRG12,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_12,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_SGRBG12,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_12,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_SRGGB12,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_12,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_12,
|
||||||
|
},
|
||||||
|
/* RGB */
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_RGB565,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RGB565,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RGB565,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_RGB565X,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RGB565,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RGB565,
|
||||||
|
},
|
||||||
|
/* YUV422 */
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_YUYV,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
|
.input_format_raw = true,
|
||||||
|
.hsize_len_factor = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_YVYU,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
|
.input_format_raw = true,
|
||||||
|
.hsize_len_factor = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_UYVY,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
|
.input_format_raw = true,
|
||||||
|
.hsize_len_factor = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_VYUY,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
|
.input_format_raw = true,
|
||||||
|
.hsize_len_factor = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_NV16,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422SP,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422SP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_NV61,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422SP,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422SP,
|
||||||
|
.input_yuv_seq_invert = true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_YUV422P,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422P,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422P,
|
||||||
|
},
|
||||||
|
/* YUV420 */
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_NV12_16L16,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420MB,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420MB,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_NV12,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420SP,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420SP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_NV21,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420SP,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420SP,
|
||||||
|
.input_yuv_seq_invert = true,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_YUV420,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420P,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420P,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_YVU420,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420P,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420P,
|
||||||
|
.input_yuv_seq_invert = true,
|
||||||
|
},
|
||||||
|
/* Compressed */
|
||||||
|
{
|
||||||
|
.pixelformat = V4L2_PIX_FMT_JPEG,
|
||||||
|
.output_format_frame = SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8,
|
||||||
|
.output_format_field = SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool sun6i_csi_capture_format_check(u32 format)
|
const
|
||||||
|
struct sun6i_csi_capture_format *sun6i_csi_capture_format_find(u32 pixelformat)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(sun6i_csi_capture_formats); i++)
|
for (i = 0; i < ARRAY_SIZE(sun6i_csi_capture_formats); i++)
|
||||||
if (sun6i_csi_capture_formats[i] == format)
|
if (sun6i_csi_capture_formats[i].pixelformat == pixelformat)
|
||||||
return true;
|
return &sun6i_csi_capture_formats[i];
|
||||||
|
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Capture */
|
/* Capture */
|
||||||
@ -821,8 +947,9 @@ static void sun6i_csi_capture_format_prepare(struct v4l2_format *format)
|
|||||||
&pix_format->height, SUN6I_CSI_CAPTURE_HEIGHT_MIN,
|
&pix_format->height, SUN6I_CSI_CAPTURE_HEIGHT_MIN,
|
||||||
SUN6I_CSI_CAPTURE_HEIGHT_MAX, 1, 0);
|
SUN6I_CSI_CAPTURE_HEIGHT_MAX, 1, 0);
|
||||||
|
|
||||||
if (!sun6i_csi_capture_format_check(pix_format->pixelformat))
|
if (!sun6i_csi_capture_format_find(pix_format->pixelformat))
|
||||||
pix_format->pixelformat = sun6i_csi_capture_formats[0];
|
pix_format->pixelformat =
|
||||||
|
sun6i_csi_capture_formats[0].pixelformat;
|
||||||
|
|
||||||
width = pix_format->width;
|
width = pix_format->width;
|
||||||
height = pix_format->height;
|
height = pix_format->height;
|
||||||
@ -881,7 +1008,7 @@ static int sun6i_csi_capture_enum_fmt(struct file *file, void *private,
|
|||||||
if (index >= ARRAY_SIZE(sun6i_csi_capture_formats))
|
if (index >= ARRAY_SIZE(sun6i_csi_capture_formats))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
fmtdesc->pixelformat = sun6i_csi_capture_formats[index];
|
fmtdesc->pixelformat = sun6i_csi_capture_formats[index].pixelformat;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1149,7 +1276,7 @@ int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev)
|
|||||||
/* V4L2 Format */
|
/* V4L2 Format */
|
||||||
|
|
||||||
format->type = queue->type;
|
format->type = queue->type;
|
||||||
pix_format->pixelformat = sun6i_csi_capture_formats[0];
|
pix_format->pixelformat = sun6i_csi_capture_formats[0].pixelformat;
|
||||||
pix_format->width = 1280;
|
pix_format->width = 1280;
|
||||||
pix_format->height = 720;
|
pix_format->height = 720;
|
||||||
pix_format->field = V4L2_FIELD_NONE;
|
pix_format->field = V4L2_FIELD_NONE;
|
||||||
|
@ -18,6 +18,15 @@
|
|||||||
|
|
||||||
struct sun6i_csi_device;
|
struct sun6i_csi_device;
|
||||||
|
|
||||||
|
struct sun6i_csi_capture_format {
|
||||||
|
u32 pixelformat;
|
||||||
|
u8 output_format_field;
|
||||||
|
u8 output_format_frame;
|
||||||
|
bool input_yuv_seq_invert;
|
||||||
|
bool input_format_raw;
|
||||||
|
u32 hsize_len_factor;
|
||||||
|
};
|
||||||
|
|
||||||
#undef current
|
#undef current
|
||||||
struct sun6i_csi_capture_state {
|
struct sun6i_csi_capture_state {
|
||||||
struct list_head queue;
|
struct list_head queue;
|
||||||
@ -46,6 +55,9 @@ void sun6i_csi_capture_dimensions(struct sun6i_csi_device *csi_dev,
|
|||||||
void sun6i_csi_capture_format(struct sun6i_csi_device *csi_dev,
|
void sun6i_csi_capture_format(struct sun6i_csi_device *csi_dev,
|
||||||
u32 *pixelformat, u32 *field);
|
u32 *pixelformat, u32 *field);
|
||||||
|
|
||||||
|
const
|
||||||
|
struct sun6i_csi_capture_format *sun6i_csi_capture_format_find(u32 pixelformat);
|
||||||
|
|
||||||
void sun6i_csi_capture_sync(struct sun6i_csi_device *csi_dev);
|
void sun6i_csi_capture_sync(struct sun6i_csi_device *csi_dev);
|
||||||
void sun6i_csi_capture_frame_done(struct sun6i_csi_device *csi_dev);
|
void sun6i_csi_capture_frame_done(struct sun6i_csi_device *csi_dev);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user