SmartAudio/lichee/linux-4.9/drivers/media/platform/sunxi-vfe/bsp_common.c

342 lines
8.3 KiB
C

/*
* linux-4.9/drivers/media/platform/sunxi-vfe/bsp_common.c
*
* Copyright (c) 2007-2017 Allwinnertech Co., Ltd.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*
* sunxi video front end common function
* Author:raymonxiu
*/
#include "bsp_common.h"
enum bus_pixeltype find_bus_type(enum bus_pixelcode code)
{
switch (code) {
case BUS_FMT_BGR565_2X8_BE:
case BUS_FMT_BGR565_2X8_LE:
case BUS_FMT_RGB565_2X8_BE:
case BUS_FMT_RGB565_2X8_LE:
case BUS_FMT_RGB565_16X1:
return BUS_FMT_RGB565;
case BUS_FMT_UYVY8_2X8:
case BUS_FMT_UYVY8_1X16:
case BUS_FMT_UYVY8_16X1:
case BUS_FMT_UYVY10_20X1:
return BUS_FMT_UYVY;
case BUS_FMT_VYUY8_2X8:
case BUS_FMT_VYUY8_1X16:
return BUS_FMT_VYUY;
case BUS_FMT_YUYV8_2X8:
case BUS_FMT_YUYV10_2X10:
case BUS_FMT_YUYV8_1X16:
case BUS_FMT_YUYV10_1X20:
return BUS_FMT_YUYV;
case BUS_FMT_YVYU8_2X8:
case BUS_FMT_YVYU10_2X10:
case BUS_FMT_YVYU8_1X16:
case BUS_FMT_YVYU10_1X20:
return BUS_FMT_YVYU;
case BUS_FMT_SBGGR8_1X8:
case BUS_FMT_SBGGR10_DPCM8_1X8:
case BUS_FMT_SBGGR10_1X10:
case BUS_FMT_SBGGR12_1X12:
case BUS_FMT_SBGGR8_8X1:
case BUS_FMT_SBGGR10_10X1:
case BUS_FMT_SBGGR12_12X1:
return BUS_FMT_SBGGR;
case BUS_FMT_SGBRG8_1X8:
case BUS_FMT_SGBRG10_DPCM8_1X8:
case BUS_FMT_SGBRG10_1X10:
case BUS_FMT_SGBRG12_1X12:
case BUS_FMT_SGBRG8_8X1:
case BUS_FMT_SGBRG10_10X1:
case BUS_FMT_SGBRG12_12X1:
return BUS_FMT_SGBRG;
case BUS_FMT_SGRBG8_1X8:
case BUS_FMT_SGRBG10_DPCM8_1X8:
case BUS_FMT_SGRBG10_1X10:
case BUS_FMT_SGRBG12_1X12:
case BUS_FMT_SGRBG8_8X1:
case BUS_FMT_SGRBG10_10X1:
case BUS_FMT_SGRBG12_12X1:
return BUS_FMT_SGRBG;
case BUS_FMT_SRGGB8_1X8:
case BUS_FMT_SRGGB10_DPCM8_1X8:
case BUS_FMT_SRGGB10_1X10:
case BUS_FMT_SRGGB12_1X12:
case BUS_FMT_SRGGB8_8X1:
case BUS_FMT_SRGGB10_10X1:
case BUS_FMT_SRGGB12_12X1:
return BUS_FMT_SRGGB;
case BUS_FMT_YUV8_1X24:
return BUS_FMT_Y_U_V;
case BUS_FMT_YY8_UYVY8_12X1:
case BUS_FMT_YY10_UYVY10_15X1:
return BUS_FMT_YY_UYVY;
default:
return BUS_FMT_UYVY;
}
}
enum bit_width find_bus_width(enum bus_pixelcode code)
{
switch (code) {
case BUS_FMT_RGB565_16X1:
case BUS_FMT_UYVY8_16X1:
case BUS_FMT_UYVY10_20X1:
case BUS_FMT_SBGGR8_8X1:
case BUS_FMT_SBGGR10_10X1:
case BUS_FMT_SBGGR12_12X1:
case BUS_FMT_SGBRG8_8X1:
case BUS_FMT_SGBRG10_10X1:
case BUS_FMT_SGBRG12_12X1:
case BUS_FMT_SGRBG8_8X1:
case BUS_FMT_SGRBG10_10X1:
case BUS_FMT_SGRBG12_12X1:
case BUS_FMT_SRGGB8_8X1:
case BUS_FMT_SRGGB10_10X1:
case BUS_FMT_SRGGB12_12X1:
case BUS_FMT_YY8_UYVY8_12X1:
case BUS_FMT_YY10_UYVY10_15X1:
return W_1BIT;
case BUS_FMT_BGR565_2X8_BE:
case BUS_FMT_BGR565_2X8_LE:
case BUS_FMT_RGB565_2X8_BE:
case BUS_FMT_RGB565_2X8_LE:
case BUS_FMT_UYVY8_2X8:
case BUS_FMT_VYUY8_2X8:
case BUS_FMT_YUYV8_2X8:
case BUS_FMT_YVYU8_2X8:
case BUS_FMT_SBGGR8_1X8:
case BUS_FMT_SBGGR10_DPCM8_1X8:
case BUS_FMT_SGBRG8_1X8:
case BUS_FMT_SGBRG10_DPCM8_1X8:
case BUS_FMT_SGRBG8_1X8:
case BUS_FMT_SGRBG10_DPCM8_1X8:
case BUS_FMT_SRGGB8_1X8:
case BUS_FMT_SRGGB10_DPCM8_1X8:
return W_8BIT;
case BUS_FMT_YUYV10_2X10:
case BUS_FMT_YVYU10_2X10:
case BUS_FMT_SBGGR10_1X10:
case BUS_FMT_SGBRG10_1X10:
case BUS_FMT_SGRBG10_1X10:
case BUS_FMT_SRGGB10_1X10:
return W_10BIT;
case BUS_FMT_SBGGR12_1X12:
case BUS_FMT_SGBRG12_1X12:
case BUS_FMT_SGRBG12_1X12:
case BUS_FMT_SRGGB12_1X12:
return W_12BIT;
case BUS_FMT_UYVY8_1X16:
case BUS_FMT_VYUY8_1X16:
case BUS_FMT_YUYV8_1X16:
case BUS_FMT_YVYU8_1X16:
return W_16BIT;
case BUS_FMT_YVYU10_1X20:
case BUS_FMT_YUYV10_1X20:
return W_20BIT;
case BUS_FMT_YUV8_1X24:
return W_24BIT;
default:
return W_8BIT;
}
}
enum bit_width find_bus_precision(enum bus_pixelcode code)
{
switch (code) {
case BUS_FMT_RGB565_16X1:
case BUS_FMT_BGR565_2X8_BE:
case BUS_FMT_BGR565_2X8_LE:
case BUS_FMT_RGB565_2X8_BE:
case BUS_FMT_RGB565_2X8_LE:
case BUS_FMT_SBGGR8_8X1:
case BUS_FMT_SGBRG8_8X1:
case BUS_FMT_SGRBG8_8X1:
case BUS_FMT_SRGGB8_8X1:
case BUS_FMT_SBGGR8_1X8:
case BUS_FMT_SGBRG8_1X8:
case BUS_FMT_SGRBG8_1X8:
case BUS_FMT_SRGGB8_1X8:
case BUS_FMT_SBGGR10_DPCM8_1X8:
case BUS_FMT_SGBRG10_DPCM8_1X8:
case BUS_FMT_SGRBG10_DPCM8_1X8:
case BUS_FMT_SRGGB10_DPCM8_1X8:
case BUS_FMT_UYVY8_16X1:
case BUS_FMT_UYVY8_2X8:
case BUS_FMT_VYUY8_2X8:
case BUS_FMT_YUYV8_2X8:
case BUS_FMT_YVYU8_2X8:
case BUS_FMT_UYVY8_1X16:
case BUS_FMT_VYUY8_1X16:
case BUS_FMT_YUYV8_1X16:
case BUS_FMT_YVYU8_1X16:
case BUS_FMT_YUV8_1X24:
case BUS_FMT_YY8_UYVY8_12X1:
return W_8BIT;
case BUS_FMT_SBGGR10_10X1:
case BUS_FMT_SGBRG10_10X1:
case BUS_FMT_SGRBG10_10X1:
case BUS_FMT_SRGGB10_10X1:
case BUS_FMT_SBGGR10_1X10:
case BUS_FMT_SGBRG10_1X10:
case BUS_FMT_SGRBG10_1X10:
case BUS_FMT_SRGGB10_1X10:
case BUS_FMT_YUYV10_2X10:
case BUS_FMT_YVYU10_2X10:
case BUS_FMT_YVYU10_1X20:
case BUS_FMT_YUYV10_1X20:
case BUS_FMT_UYVY10_20X1:
case BUS_FMT_YY10_UYVY10_15X1:
return W_10BIT;
case BUS_FMT_SBGGR12_12X1:
case BUS_FMT_SGBRG12_12X1:
case BUS_FMT_SGRBG12_12X1:
case BUS_FMT_SRGGB12_12X1:
case BUS_FMT_SBGGR12_1X12:
case BUS_FMT_SGBRG12_1X12:
case BUS_FMT_SGRBG12_1X12:
case BUS_FMT_SRGGB12_1X12:
return W_12BIT;
default:
return W_8BIT;
}
}
enum pixel_fmt_type find_pixel_fmt_type(enum pixel_fmt code)
{
switch (code) {
case PIX_FMT_RGB565:
return RGB565;
case PIX_FMT_RGB888:
return RGB888;
case PIX_FMT_PRGB888:
return PRGB888;
case PIX_FMT_YUYV:
case PIX_FMT_YVYU:
case PIX_FMT_UYVY:
case PIX_FMT_VYUY:
return YUV422_INTLVD;
case PIX_FMT_YUV422P_8:
case PIX_FMT_YVU422P_8:
return YUV422_PL;
case PIX_FMT_YUV420P_8:
case PIX_FMT_YVU420P_8:
return YUV420_PL;
case PIX_FMT_YUV420SP_8:
case PIX_FMT_YVU420SP_8:
case PIX_FMT_YUV420SP_10:
case PIX_FMT_YVU420SP_10:
return YUV420_SPL;
case PIX_FMT_YUV422SP_8:
case PIX_FMT_YVU422SP_8:
case PIX_FMT_YUV422SP_10:
case PIX_FMT_YVU422SP_10:
return YUV422_SPL;
case PIX_FMT_YUV420MB_8:
case PIX_FMT_YVU420MB_8:
return YUV420_MB;
case PIX_FMT_YUV422MB_8:
case PIX_FMT_YVU422MB_8:
return YUV422_MB;
case PIX_FMT_SBGGR_8:
case PIX_FMT_SGBRG_8:
case PIX_FMT_SGRBG_8:
case PIX_FMT_SRGGB_8:
case PIX_FMT_SBGGR_10:
case PIX_FMT_SGBRG_10:
case PIX_FMT_SGRBG_10:
case PIX_FMT_SRGGB_10:
case PIX_FMT_SBGGR_12:
case PIX_FMT_SGBRG_12:
case PIX_FMT_SGRBG_12:
case PIX_FMT_SRGGB_12:
return BAYER_RGB;
default:
return BAYER_RGB;
}
}
enum pixel_fmt pix_fmt_v4l2_to_common(unsigned int pix_fmt)
{
switch (pix_fmt) {
case V4L2_PIX_FMT_RGB565:
return PIX_FMT_RGB565;
case V4L2_PIX_FMT_RGB24:
return PIX_FMT_RGB888;
case V4L2_PIX_FMT_RGB32:
return PIX_FMT_PRGB888;
case V4L2_PIX_FMT_YUYV:
return PIX_FMT_YUYV;
case V4L2_PIX_FMT_YVYU:
return PIX_FMT_YVYU;
case V4L2_PIX_FMT_UYVY:
return PIX_FMT_UYVY;
case V4L2_PIX_FMT_VYUY:
return PIX_FMT_VYUY;
case V4L2_PIX_FMT_YUV422P:
return PIX_FMT_YUV422P_8;
case V4L2_PIX_FMT_YUV420:
return PIX_FMT_YUV420P_8;
case V4L2_PIX_FMT_YVU420:
return PIX_FMT_YVU420P_8;
case V4L2_PIX_FMT_NV12:
return PIX_FMT_YUV420SP_8;
case V4L2_PIX_FMT_NV21:
return PIX_FMT_YVU420SP_8;
case V4L2_PIX_FMT_NV16:
return PIX_FMT_YUV422SP_8;
case V4L2_PIX_FMT_NV61:
return PIX_FMT_YVU422SP_8;
case V4L2_PIX_FMT_SBGGR8:
return PIX_FMT_SBGGR_8;
case V4L2_PIX_FMT_SGBRG8:
return PIX_FMT_SGBRG_8;
case V4L2_PIX_FMT_SGRBG8:
return PIX_FMT_SGRBG_8;
case V4L2_PIX_FMT_SRGGB8:
return PIX_FMT_SRGGB_8;
case V4L2_PIX_FMT_SBGGR10:
return PIX_FMT_SBGGR_10;
case V4L2_PIX_FMT_SGBRG10:
return PIX_FMT_SGBRG_10;
case V4L2_PIX_FMT_SGRBG10:
return PIX_FMT_SGRBG_10;
case V4L2_PIX_FMT_SRGGB10:
return PIX_FMT_SRGGB_10;
case V4L2_PIX_FMT_SBGGR12:
return PIX_FMT_SBGGR_12;
case V4L2_PIX_FMT_SGBRG12:
return PIX_FMT_SGBRG_12;
case V4L2_PIX_FMT_SGRBG12:
return PIX_FMT_SGRBG_12;
case V4L2_PIX_FMT_SRGGB12:
return PIX_FMT_SRGGB_12;
#ifdef CONFIG_ARCH_SUN3IW1P1
case V4L2_PIX_FMT_HM12:
return PIX_FMT_YUV420MB_8;
#endif
default:
return PIX_FMT_SBGGR_8;
}
}
enum field field_fmt_v4l2_to_common(enum v4l2_field field)
{
return (enum field)field;
}