|
@@ -0,0 +1,157 @@
|
|
|
+/*
|
|
|
+ * 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");
|