/* *TheV4L2specdefinespackedRGBformatsinmemorybyteorder,whichfrom *pointofviewoftheIPUcorrespondstolittle-endianwordswiththefirst *componentintheleastsignificantbits. *TheDRMpixelformatsandIPUinternalrepresentationareorderedtheother *wayaround,withthefirstnamedcomponentorderedatthemostsignificant *bits.Further,V4L2formatsarenotwelldefined: *https://linuxtv.org/downloads/v4l-dvb-apis/packed-rgb.html *WechoosetheinterpretationwhichmatchesGStreamerbehavior.
*/ staticint v4l2_pix_fmt_to_drm_fourcc(u32 pixelformat)
{ switch (pixelformat) { case V4L2_PIX_FMT_RGB565: /* *Herewechoosethe'corrected'interpretationofRGBP,a *little-endian16-bitwordwiththeredcomponentatthemost *significantbits: *g[2:0]b[4:0]r[4:0]g[5:3]<=>[16:0]R:G:B
*/ return DRM_FORMAT_RGB565; case V4L2_PIX_FMT_BGR24: /* B G R <=> [24:0] R:G:B */ return DRM_FORMAT_RGB888; case V4L2_PIX_FMT_RGB24: /* R G B <=> [24:0] B:G:R */ return DRM_FORMAT_BGR888; case V4L2_PIX_FMT_BGR32: /* B G R A <=> [32:0] A:B:G:R */ return DRM_FORMAT_XRGB8888; case V4L2_PIX_FMT_RGB32: /* R G B A <=> [32:0] A:B:G:R */ return DRM_FORMAT_XBGR8888; case V4L2_PIX_FMT_ABGR32: /* B G R A <=> [32:0] A:R:G:B */ return DRM_FORMAT_ARGB8888; case V4L2_PIX_FMT_XBGR32: /* B G R X <=> [32:0] X:R:G:B */ return DRM_FORMAT_XRGB8888; case V4L2_PIX_FMT_BGRA32: /* A B G R <=> [32:0] R:G:B:A */ return DRM_FORMAT_RGBA8888; case V4L2_PIX_FMT_BGRX32: /* X B G R <=> [32:0] R:G:B:X */ return DRM_FORMAT_RGBX8888; case V4L2_PIX_FMT_RGBA32: /* R G B A <=> [32:0] A:B:G:R */ return DRM_FORMAT_ABGR8888; case V4L2_PIX_FMT_RGBX32: /* R G B X <=> [32:0] X:B:G:R */ return DRM_FORMAT_XBGR8888; case V4L2_PIX_FMT_ARGB32: /* A R G B <=> [32:0] B:G:R:A */ return DRM_FORMAT_BGRA8888; case V4L2_PIX_FMT_XRGB32: /* X R G B <=> [32:0] B:G:R:X */ return DRM_FORMAT_BGRX8888; case V4L2_PIX_FMT_UYVY: return DRM_FORMAT_UYVY; case V4L2_PIX_FMT_YUYV: return DRM_FORMAT_YUYV; case V4L2_PIX_FMT_YUV420: return DRM_FORMAT_YUV420; case V4L2_PIX_FMT_YUV422P: return DRM_FORMAT_YUV422; case V4L2_PIX_FMT_YVU420: return DRM_FORMAT_YVU420; case V4L2_PIX_FMT_NV12: return DRM_FORMAT_NV12; case V4L2_PIX_FMT_NV16: return DRM_FORMAT_NV16;
}
val = ipu_idmac_read(ipu, IDMAC_SEP_ALPHA);
val |= BIT(ch->num);
ipu_idmac_write(ipu, val, IDMAC_SEP_ALPHA);
}
int ipu_cpmem_set_fmt(struct ipuv3_channel *ch, u32 drm_fourcc)
{ switch (drm_fourcc) { case DRM_FORMAT_YUV420: case DRM_FORMAT_YVU420: /* pix format */
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 2); /* burst size */
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31); break; case DRM_FORMAT_YUV422: case DRM_FORMAT_YVU422: /* pix format */
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 1); /* burst size */
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31); break; case DRM_FORMAT_YUV444: case DRM_FORMAT_YVU444: /* pix format */
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 0); /* burst size */
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31); break; case DRM_FORMAT_NV12: /* pix format */
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 4); /* burst size */
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31); break; case DRM_FORMAT_NV16: /* pix format */
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 3); /* burst size */
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31); break; case DRM_FORMAT_UYVY: /* bits/pixel */
ipu_ch_param_write_field(ch, IPU_FIELD_BPP, 3); /* pix format */
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 0xA); /* burst size */
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31); break; case DRM_FORMAT_YUYV: /* bits/pixel */
ipu_ch_param_write_field(ch, IPU_FIELD_BPP, 3); /* pix format */
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 0x8); /* burst size */
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31); break; case DRM_FORMAT_ABGR8888: case DRM_FORMAT_XBGR8888:
ipu_cpmem_set_format_rgb(ch, &def_xbgr_32); break; case DRM_FORMAT_ARGB8888: case DRM_FORMAT_XRGB8888:
ipu_cpmem_set_format_rgb(ch, &def_xrgb_32); break; case DRM_FORMAT_RGBA8888: case DRM_FORMAT_RGBX8888: case DRM_FORMAT_RGBX8888_A8:
ipu_cpmem_set_format_rgb(ch, &def_rgbx_32); break; case DRM_FORMAT_BGRA8888: case DRM_FORMAT_BGRX8888: case DRM_FORMAT_BGRX8888_A8:
ipu_cpmem_set_format_rgb(ch, &def_bgrx_32); break; case DRM_FORMAT_BGR888: case DRM_FORMAT_BGR888_A8:
ipu_cpmem_set_format_rgb(ch, &def_bgr_24); break; case DRM_FORMAT_RGB888: case DRM_FORMAT_RGB888_A8:
ipu_cpmem_set_format_rgb(ch, &def_rgb_24); break; case DRM_FORMAT_RGB565: case DRM_FORMAT_RGB565_A8:
ipu_cpmem_set_format_rgb(ch, &def_rgb_16); break; case DRM_FORMAT_BGR565: case DRM_FORMAT_BGR565_A8:
ipu_cpmem_set_format_rgb(ch, &def_bgr_16); break; case DRM_FORMAT_ARGB1555:
ipu_cpmem_set_format_rgb(ch, &def_argb_16); break; case DRM_FORMAT_ABGR1555:
ipu_cpmem_set_format_rgb(ch, &def_abgr_16); break; case DRM_FORMAT_RGBA5551:
ipu_cpmem_set_format_rgb(ch, &def_rgba_16); break; case DRM_FORMAT_BGRA5551:
ipu_cpmem_set_format_rgb(ch, &def_bgra_16); break; case DRM_FORMAT_ARGB4444:
ipu_cpmem_set_format_rgb(ch, &def_argb_16_4444); break; default: return -EINVAL;
}
switch (drm_fourcc) { case DRM_FORMAT_RGB565_A8: case DRM_FORMAT_BGR565_A8: case DRM_FORMAT_RGB888_A8: case DRM_FORMAT_BGR888_A8: case DRM_FORMAT_RGBX8888_A8: case DRM_FORMAT_BGRX8888_A8:
ipu_ch_param_write_field(ch, IPU_FIELD_WID3, 7);
ipu_cpmem_set_separate_alpha(ch); break; default: break;
}
return0;
}
EXPORT_SYMBOL_GPL(ipu_cpmem_set_fmt);
int ipu_cpmem_set_image(struct ipuv3_channel *ch, struct ipu_image *image)
{ struct v4l2_pix_format *pix = &image->pix; int offset, u_offset, v_offset; int ret = 0;
ipu_cpmem_set_yuv_planar_full(ch, pix->bytesperline,
u_offset, v_offset); break; case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_RGB565:
offset = image->rect.left * 2 +
image->rect.top * pix->bytesperline; break; case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_BGR32: case V4L2_PIX_FMT_ABGR32: case V4L2_PIX_FMT_XBGR32: case V4L2_PIX_FMT_BGRA32: case V4L2_PIX_FMT_BGRX32: case V4L2_PIX_FMT_RGBA32: case V4L2_PIX_FMT_RGBX32: case V4L2_PIX_FMT_ARGB32: case V4L2_PIX_FMT_XRGB32:
offset = image->rect.left * 4 +
image->rect.top * pix->bytesperline; break; case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24:
offset = image->rect.left * 3 +
image->rect.top * pix->bytesperline; break; case V4L2_PIX_FMT_SBGGR8: case V4L2_PIX_FMT_SGBRG8: case V4L2_PIX_FMT_SGRBG8: case V4L2_PIX_FMT_SRGGB8: case V4L2_PIX_FMT_GREY:
offset = image->rect.left + image->rect.top * pix->bytesperline; break; case V4L2_PIX_FMT_SBGGR16: case V4L2_PIX_FMT_SGBRG16: case V4L2_PIX_FMT_SGRBG16: case V4L2_PIX_FMT_SRGGB16: case V4L2_PIX_FMT_Y16:
offset = image->rect.left * 2 +
image->rect.top * pix->bytesperline; break; default: /* This should not happen */
WARN_ON(1);
offset = 0;
ret = -EINVAL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.