mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 12:46:17 +00:00
158 lines
4.5 KiB
C
158 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 ((unsigned int)(code - V4L2_MBUS_FMT_FIXED) > ARRAY_SIZE(mbus_fmt))
|
||
|
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");
|