mirror of https://gitee.com/openkylin/linux.git
174 lines
4.5 KiB
C
174 lines
4.5 KiB
C
/*
|
|
* soc-camera media bus helper routines
|
|
*
|
|
* Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
|
|
#include <media/v4l2-device.h>
|
|
#include <media/v4l2-mediabus.h>
|
|
#include <media/soc_mediabus.h>
|
|
|
|
#define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1)
|
|
|
|
static const struct soc_mbus_pixelfmt mbus_fmt[] = {
|
|
[MBUS_IDX(YUYV8_2X8_LE)] = {
|
|
.fourcc = V4L2_PIX_FMT_YUYV,
|
|
.name = "YUYV",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(YVYU8_2X8_LE)] = {
|
|
.fourcc = V4L2_PIX_FMT_YVYU,
|
|
.name = "YVYU",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(YUYV8_2X8_BE)] = {
|
|
.fourcc = V4L2_PIX_FMT_UYVY,
|
|
.name = "UYVY",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(YVYU8_2X8_BE)] = {
|
|
.fourcc = V4L2_PIX_FMT_VYUY,
|
|
.name = "VYUY",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(RGB555_2X8_PADHI_LE)] = {
|
|
.fourcc = V4L2_PIX_FMT_RGB555,
|
|
.name = "RGB555",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(RGB555_2X8_PADHI_BE)] = {
|
|
.fourcc = V4L2_PIX_FMT_RGB555X,
|
|
.name = "RGB555X",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(RGB565_2X8_LE)] = {
|
|
.fourcc = V4L2_PIX_FMT_RGB565,
|
|
.name = "RGB565",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(RGB565_2X8_BE)] = {
|
|
.fourcc = V4L2_PIX_FMT_RGB565X,
|
|
.name = "RGB565X",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(SBGGR8_1X8)] = {
|
|
.fourcc = V4L2_PIX_FMT_SBGGR8,
|
|
.name = "Bayer 8 BGGR",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_NONE,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(SBGGR10_1X10)] = {
|
|
.fourcc = V4L2_PIX_FMT_SBGGR10,
|
|
.name = "Bayer 10 BGGR",
|
|
.bits_per_sample = 10,
|
|
.packing = SOC_MBUS_PACKING_EXTEND16,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(GREY8_1X8)] = {
|
|
.fourcc = V4L2_PIX_FMT_GREY,
|
|
.name = "Grey",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_NONE,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(Y10_1X10)] = {
|
|
.fourcc = V4L2_PIX_FMT_Y10,
|
|
.name = "Grey 10bit",
|
|
.bits_per_sample = 10,
|
|
.packing = SOC_MBUS_PACKING_EXTEND16,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = {
|
|
.fourcc = V4L2_PIX_FMT_SBGGR10,
|
|
.name = "Bayer 10 BGGR",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = {
|
|
.fourcc = V4L2_PIX_FMT_SBGGR10,
|
|
.name = "Bayer 10 BGGR",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADLO,
|
|
.order = SOC_MBUS_ORDER_LE,
|
|
},
|
|
[MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = {
|
|
.fourcc = V4L2_PIX_FMT_SBGGR10,
|
|
.name = "Bayer 10 BGGR",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADHI,
|
|
.order = SOC_MBUS_ORDER_BE,
|
|
},
|
|
[MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = {
|
|
.fourcc = V4L2_PIX_FMT_SBGGR10,
|
|
.name = "Bayer 10 BGGR",
|
|
.bits_per_sample = 8,
|
|
.packing = SOC_MBUS_PACKING_2X8_PADLO,
|
|
.order = SOC_MBUS_ORDER_BE,
|
|
},
|
|
};
|
|
|
|
s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
|
|
{
|
|
switch (mf->packing) {
|
|
case SOC_MBUS_PACKING_NONE:
|
|
return width * mf->bits_per_sample / 8;
|
|
case SOC_MBUS_PACKING_2X8_PADHI:
|
|
case SOC_MBUS_PACKING_2X8_PADLO:
|
|
case SOC_MBUS_PACKING_EXTEND16:
|
|
return width * 2;
|
|
}
|
|
return -EINVAL;
|
|
}
|
|
EXPORT_SYMBOL(soc_mbus_bytes_per_line);
|
|
|
|
const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
|
|
enum v4l2_mbus_pixelcode code)
|
|
{
|
|
if (code - V4L2_MBUS_FMT_FIXED > ARRAY_SIZE(mbus_fmt) ||
|
|
code <= V4L2_MBUS_FMT_FIXED)
|
|
return NULL;
|
|
return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1;
|
|
}
|
|
EXPORT_SYMBOL(soc_mbus_get_fmtdesc);
|
|
|
|
static int __init soc_mbus_init(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static void __exit soc_mbus_exit(void)
|
|
{
|
|
}
|
|
|
|
module_init(soc_mbus_init);
|
|
module_exit(soc_mbus_exit);
|
|
|
|
MODULE_DESCRIPTION("soc-camera media bus interface");
|
|
MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
|
|
MODULE_LICENSE("GPL v2");
|