soc_camera: Add RGB666 & RGB888 formats
Commit Message
Based on work done by Katsuya Matsubara.
Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
---
drivers/media/platform/soc_camera/soc_mediabus.c | 42 ++++++++++++++++++++++
include/media/soc_camera.h | 6 +++-
include/media/soc_mediabus.h | 3 ++
include/uapi/linux/v4l2-mediabus.h | 6 +++-
4 files changed, 55 insertions(+), 2 deletions(-)
Comments
Hi Phil
On Thu, 14 Feb 2013, Phil Edworthy wrote:
> Based on work done by Katsuya Matsubara.
>
> Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
Looks mostly good to me, but please also provide format descriptions for
Documentation/DocBook/media/v4l/pixfmt-packed-rgb.xml, also see a couple
of minor notes below
> ---
> drivers/media/platform/soc_camera/soc_mediabus.c | 42 ++++++++++++++++++++++
> include/media/soc_camera.h | 6 +++-
> include/media/soc_mediabus.h | 3 ++
> include/uapi/linux/v4l2-mediabus.h | 6 +++-
> 4 files changed, 55 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/platform/soc_camera/soc_mediabus.c b/drivers/media/platform/soc_camera/soc_mediabus.c
> index a397812..d8acfd3 100644
> --- a/drivers/media/platform/soc_camera/soc_mediabus.c
> +++ b/drivers/media/platform/soc_camera/soc_mediabus.c
> @@ -97,6 +97,42 @@ static const struct soc_mbus_lookup mbus_fmt[] = {
> .layout = SOC_MBUS_LAYOUT_PACKED,
> },
> }, {
> + .code = V4L2_MBUS_FMT_RGB666_1X18,
> + .fmt = {
> + .fourcc = V4L2_PIX_FMT_RGB32,
> + .name = "RGB666/32bpp",
> + .bits_per_sample = 18,
> + .packing = SOC_MBUS_PACKING_EXTEND32,
> + .order = SOC_MBUS_ORDER_LE,
> + },
> +}, {
> + .code = V4L2_MBUS_FMT_RGB888_1X24,
> + .fmt = {
> + .fourcc = V4L2_PIX_FMT_RGB32,
> + .name = "RGB888/32bpp",
> + .bits_per_sample = 24,
> + .packing = SOC_MBUS_PACKING_EXTEND32,
> + .order = SOC_MBUS_ORDER_LE,
> + },
> +}, {
> + .code = V4L2_MBUS_FMT_RGB888_2X12_BE,
> + .fmt = {
> + .fourcc = V4L2_PIX_FMT_RGB32,
> + .name = "RGB888/32bpp",
> + .bits_per_sample = 12,
> + .packing = SOC_MBUS_PACKING_EXTEND32,
> + .order = SOC_MBUS_ORDER_BE,
> + },
> +}, {
> + .code = V4L2_MBUS_FMT_RGB888_2X12_LE,
> + .fmt = {
> + .fourcc = V4L2_PIX_FMT_RGB32,
> + .name = "RGB888/32bpp",
> + .bits_per_sample = 12,
> + .packing = SOC_MBUS_PACKING_EXTEND32,
> + .order = SOC_MBUS_ORDER_LE,
> + },
> +}, {
> .code = V4L2_MBUS_FMT_SBGGR8_1X8,
> .fmt = {
> .fourcc = V4L2_PIX_FMT_SBGGR8,
> @@ -358,6 +394,10 @@ int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
> *numerator = 1;
> *denominator = 1;
> return 0;
> + case SOC_MBUS_PACKING_EXTEND32:
> + *numerator = 1;
> + *denominator = 1;
> + return 0;
> case SOC_MBUS_PACKING_2X8_PADHI:
> case SOC_MBUS_PACKING_2X8_PADLO:
> *numerator = 2;
> @@ -395,6 +435,8 @@ s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
> return width * 3 / 2;
> case SOC_MBUS_PACKING_VARIABLE:
> return 0;
> + case SOC_MBUS_PACKING_EXTEND32:
> + return width * 4;
> }
> return -EINVAL;
> }
> diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
> index 6442edc..c820be2 100644
> --- a/include/media/soc_camera.h
> +++ b/include/media/soc_camera.h
> @@ -231,10 +231,14 @@ struct soc_camera_sense {
> #define SOCAM_DATAWIDTH_10 SOCAM_DATAWIDTH(10)
Didn't you forget to define SOCAM_DATAWIDTH_12 here?
> #define SOCAM_DATAWIDTH_15 SOCAM_DATAWIDTH(15)
> #define SOCAM_DATAWIDTH_16 SOCAM_DATAWIDTH(16)
> +#define SOCAM_DATAWIDTH_18 SOCAM_DATAWIDTH(18)
> +#define SOCAM_DATAWIDTH_24 SOCAM_DATAWIDTH(24)
>
> #define SOCAM_DATAWIDTH_MASK (SOCAM_DATAWIDTH_4 | SOCAM_DATAWIDTH_8 | \
> SOCAM_DATAWIDTH_9 | SOCAM_DATAWIDTH_10 | \
> - SOCAM_DATAWIDTH_15 | SOCAM_DATAWIDTH_16)
> + SOCAM_DATAWIDTH_12 | SOCAM_DATAWIDTH_15 | \
> + SOCAM_DATAWIDTH_16 | SOCAM_DATAWIDTH_18 | \
> + SOCAM_DATAWIDTH_24)
>
> static inline void soc_camera_limit_side(int *start, int *length,
> unsigned int start_min,
> diff --git a/include/media/soc_mediabus.h b/include/media/soc_mediabus.h
> index 0dc6f46..eea98d1 100644
> --- a/include/media/soc_mediabus.h
> +++ b/include/media/soc_mediabus.h
> @@ -26,6 +26,8 @@
> * @SOC_MBUS_PACKING_VARIABLE: compressed formats with variable packing
> * @SOC_MBUS_PACKING_1_5X8: used for packed YUV 4:2:0 formats, where 4
> * pixels occupy 6 bytes in RAM
> + * @SOC_MBUS_PACKING_EXTEND32: sample width (e.g., 24 bits) has to be extended
Please, use a TAB above
Thanks
Guennadi
> + * to 32 bits
> */
> enum soc_mbus_packing {
> SOC_MBUS_PACKING_NONE,
> @@ -34,6 +36,7 @@ enum soc_mbus_packing {
> SOC_MBUS_PACKING_EXTEND16,
> SOC_MBUS_PACKING_VARIABLE,
> SOC_MBUS_PACKING_1_5X8,
> + SOC_MBUS_PACKING_EXTEND32,
> };
>
> /**
> diff --git a/include/uapi/linux/v4l2-mediabus.h b/include/uapi/linux/v4l2-mediabus.h
> index 7d64e0e..e300e8e 100644
> --- a/include/uapi/linux/v4l2-mediabus.h
> +++ b/include/uapi/linux/v4l2-mediabus.h
> @@ -37,7 +37,7 @@
> enum v4l2_mbus_pixelcode {
> V4L2_MBUS_FMT_FIXED = 0x0001,
>
> - /* RGB - next is 0x1009 */
> + /* RGB - next is 0x100d */
> V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE = 0x1001,
> V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE = 0x1002,
> V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE = 0x1003,
> @@ -46,6 +46,10 @@ enum v4l2_mbus_pixelcode {
> V4L2_MBUS_FMT_BGR565_2X8_LE = 0x1006,
> V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007,
> V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008,
> + V4L2_MBUS_FMT_RGB666_1X18 = 0x1009,
> + V4L2_MBUS_FMT_RGB888_1X24 = 0x100a,
> + V4L2_MBUS_FMT_RGB888_2X12_BE = 0x100b,
> + V4L2_MBUS_FMT_RGB888_2X12_LE = 0x100c,
>
> /* YUV (including grey) - next is 0x2014 */
> V4L2_MBUS_FMT_Y8_1X8 = 0x2001,
> --
> 1.7.5.4
>
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Guennadi,
Thanks for the review, I'll try to find some time to fix & send a new
version.
Phil
> On Thu, 14 Feb 2013, Phil Edworthy wrote:
>
> > Based on work done by Katsuya Matsubara.
> >
> > Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
>
> Looks mostly good to me, but please also provide format descriptions for
> Documentation/DocBook/media/v4l/pixfmt-packed-rgb.xml, also see a couple
> of minor notes below
>
> > ---
> > drivers/media/platform/soc_camera/soc_mediabus.c | 42 +++++++++
> +++++++++++++
> > include/media/soc_camera.h | 6 +++-
> > include/media/soc_mediabus.h | 3 ++
> > include/uapi/linux/v4l2-mediabus.h | 6 +++-
> > 4 files changed, 55 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/media/platform/soc_camera/soc_mediabus.c b/
> drivers/media/platform/soc_camera/soc_mediabus.c
> > index a397812..d8acfd3 100644
> > --- a/drivers/media/platform/soc_camera/soc_mediabus.c
> > +++ b/drivers/media/platform/soc_camera/soc_mediabus.c
> > @@ -97,6 +97,42 @@ static const struct soc_mbus_lookup mbus_fmt[] = {
> > .layout = SOC_MBUS_LAYOUT_PACKED,
> > },
> > }, {
> > + .code = V4L2_MBUS_FMT_RGB666_1X18,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB666/32bpp",
> > + .bits_per_sample = 18,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_LE,
> > + },
> > +}, {
> > + .code = V4L2_MBUS_FMT_RGB888_1X24,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB888/32bpp",
> > + .bits_per_sample = 24,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_LE,
> > + },
> > +}, {
> > + .code = V4L2_MBUS_FMT_RGB888_2X12_BE,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB888/32bpp",
> > + .bits_per_sample = 12,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_BE,
> > + },
> > +}, {
> > + .code = V4L2_MBUS_FMT_RGB888_2X12_LE,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB888/32bpp",
> > + .bits_per_sample = 12,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_LE,
> > + },
> > +}, {
> > .code = V4L2_MBUS_FMT_SBGGR8_1X8,
> > .fmt = {
> > .fourcc = V4L2_PIX_FMT_SBGGR8,
> > @@ -358,6 +394,10 @@ int soc_mbus_samples_per_pixel(const struct
> soc_mbus_pixelfmt *mf,
> > *numerator = 1;
> > *denominator = 1;
> > return 0;
> > + case SOC_MBUS_PACKING_EXTEND32:
> > + *numerator = 1;
> > + *denominator = 1;
> > + return 0;
> > case SOC_MBUS_PACKING_2X8_PADHI:
> > case SOC_MBUS_PACKING_2X8_PADLO:
> > *numerator = 2;
> > @@ -395,6 +435,8 @@ s32 soc_mbus_bytes_per_line(u32 width, const
> struct soc_mbus_pixelfmt *mf)
> > return width * 3 / 2;
> > case SOC_MBUS_PACKING_VARIABLE:
> > return 0;
> > + case SOC_MBUS_PACKING_EXTEND32:
> > + return width * 4;
> > }
> > return -EINVAL;
> > }
> > diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
> > index 6442edc..c820be2 100644
> > --- a/include/media/soc_camera.h
> > +++ b/include/media/soc_camera.h
> > @@ -231,10 +231,14 @@ struct soc_camera_sense {
> > #define SOCAM_DATAWIDTH_10 SOCAM_DATAWIDTH(10)
>
> Didn't you forget to define SOCAM_DATAWIDTH_12 here?
>
> > #define SOCAM_DATAWIDTH_15 SOCAM_DATAWIDTH(15)
> > #define SOCAM_DATAWIDTH_16 SOCAM_DATAWIDTH(16)
> > +#define SOCAM_DATAWIDTH_18 SOCAM_DATAWIDTH(18)
> > +#define SOCAM_DATAWIDTH_24 SOCAM_DATAWIDTH(24)
> >
> > #define SOCAM_DATAWIDTH_MASK (SOCAM_DATAWIDTH_4 | SOCAM_DATAWIDTH_8 |
\
> > SOCAM_DATAWIDTH_9 | SOCAM_DATAWIDTH_10 | \
> > - SOCAM_DATAWIDTH_15 | SOCAM_DATAWIDTH_16)
> > + SOCAM_DATAWIDTH_12 | SOCAM_DATAWIDTH_15 | \
> > + SOCAM_DATAWIDTH_16 | SOCAM_DATAWIDTH_18 | \
> > + SOCAM_DATAWIDTH_24)
> >
> > static inline void soc_camera_limit_side(int *start, int *length,
> > unsigned int start_min,
> > diff --git a/include/media/soc_mediabus.h
b/include/media/soc_mediabus.h
> > index 0dc6f46..eea98d1 100644
> > --- a/include/media/soc_mediabus.h
> > +++ b/include/media/soc_mediabus.h
> > @@ -26,6 +26,8 @@
> > * @SOC_MBUS_PACKING_VARIABLE: compressed formats with variable
packing
> > * @SOC_MBUS_PACKING_1_5X8: used for packed YUV 4:2:0 formats,
where 4
> > * pixels occupy 6 bytes in RAM
> > + * @SOC_MBUS_PACKING_EXTEND32: sample width (e.g., 24 bits) has
> to be extended
>
> Please, use a TAB above
>
> Thanks
> Guennadi
>
> > + * to 32 bits
> > */
> > enum soc_mbus_packing {
> > SOC_MBUS_PACKING_NONE,
> > @@ -34,6 +36,7 @@ enum soc_mbus_packing {
> > SOC_MBUS_PACKING_EXTEND16,
> > SOC_MBUS_PACKING_VARIABLE,
> > SOC_MBUS_PACKING_1_5X8,
> > + SOC_MBUS_PACKING_EXTEND32,
> > };
> >
> > /**
> > diff --git a/include/uapi/linux/v4l2-mediabus.h b/include/uapi/
> linux/v4l2-mediabus.h
> > index 7d64e0e..e300e8e 100644
> > --- a/include/uapi/linux/v4l2-mediabus.h
> > +++ b/include/uapi/linux/v4l2-mediabus.h
> > @@ -37,7 +37,7 @@
> > enum v4l2_mbus_pixelcode {
> > V4L2_MBUS_FMT_FIXED = 0x0001,
> >
> > - /* RGB - next is 0x1009 */
> > + /* RGB - next is 0x100d */
> > V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE = 0x1001,
> > V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE = 0x1002,
> > V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE = 0x1003,
> > @@ -46,6 +46,10 @@ enum v4l2_mbus_pixelcode {
> > V4L2_MBUS_FMT_BGR565_2X8_LE = 0x1006,
> > V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007,
> > V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008,
> > + V4L2_MBUS_FMT_RGB666_1X18 = 0x1009,
> > + V4L2_MBUS_FMT_RGB888_1X24 = 0x100a,
> > + V4L2_MBUS_FMT_RGB888_2X12_BE = 0x100b,
> > + V4L2_MBUS_FMT_RGB888_2X12_LE = 0x100c,
> >
> > /* YUV (including grey) - next is 0x2014 */
> > V4L2_MBUS_FMT_Y8_1X8 = 0x2001,
> > --
> > 1.7.5.4
> >
>
> ---
> Guennadi Liakhovetski, Ph.D.
> Freelance Open-Source Software Developer
> http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Guennadi,
> From: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> To: Phil Edworthy <phil.edworthy@renesas.com>,
> Cc: Mauro Carvalho Chehab <mchehab@redhat.com>,
linux-media@vger.kernel.org
> Date: 08/03/2013 13:30
> Subject: Re: [PATCH] soc_camera: Add RGB666 & RGB888 formats
>
> Hi Phil
>
> On Thu, 14 Feb 2013, Phil Edworthy wrote:
>
> > Based on work done by Katsuya Matsubara.
> >
> > Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
>
> Looks mostly good to me, but please also provide format descriptions for
> Documentation/DocBook/media/v4l/pixfmt-packed-rgb.xml, also see a couple
> of minor notes below
I had a look at the doc you pointed to, but it appears to only describe
formats that can be accessed by userspace. I take it you meant
Documentation/DocBook/media/v4l/subdev-formats.xml?
> > ---
> > drivers/media/platform/soc_camera/soc_mediabus.c | 42 +++++++++
> +++++++++++++
> > include/media/soc_camera.h | 6 +++-
> > include/media/soc_mediabus.h | 3 ++
> > include/uapi/linux/v4l2-mediabus.h | 6 +++-
> > 4 files changed, 55 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/media/platform/soc_camera/soc_mediabus.c b/
> drivers/media/platform/soc_camera/soc_mediabus.c
> > index a397812..d8acfd3 100644
> > --- a/drivers/media/platform/soc_camera/soc_mediabus.c
> > +++ b/drivers/media/platform/soc_camera/soc_mediabus.c
> > @@ -97,6 +97,42 @@ static const struct soc_mbus_lookup mbus_fmt[] = {
> > .layout = SOC_MBUS_LAYOUT_PACKED,
> > },
> > }, {
> > + .code = V4L2_MBUS_FMT_RGB666_1X18,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB666/32bpp",
> > + .bits_per_sample = 18,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_LE,
> > + },
> > +}, {
> > + .code = V4L2_MBUS_FMT_RGB888_1X24,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB888/32bpp",
> > + .bits_per_sample = 24,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_LE,
> > + },
> > +}, {
> > + .code = V4L2_MBUS_FMT_RGB888_2X12_BE,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB888/32bpp",
> > + .bits_per_sample = 12,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_BE,
> > + },
> > +}, {
> > + .code = V4L2_MBUS_FMT_RGB888_2X12_LE,
> > + .fmt = {
> > + .fourcc = V4L2_PIX_FMT_RGB32,
> > + .name = "RGB888/32bpp",
> > + .bits_per_sample = 12,
> > + .packing = SOC_MBUS_PACKING_EXTEND32,
> > + .order = SOC_MBUS_ORDER_LE,
> > + },
> > +}, {
> > .code = V4L2_MBUS_FMT_SBGGR8_1X8,
> > .fmt = {
> > .fourcc = V4L2_PIX_FMT_SBGGR8,
> > @@ -358,6 +394,10 @@ int soc_mbus_samples_per_pixel(const struct
> soc_mbus_pixelfmt *mf,
> > *numerator = 1;
> > *denominator = 1;
> > return 0;
> > + case SOC_MBUS_PACKING_EXTEND32:
> > + *numerator = 1;
> > + *denominator = 1;
> > + return 0;
> > case SOC_MBUS_PACKING_2X8_PADHI:
> > case SOC_MBUS_PACKING_2X8_PADLO:
> > *numerator = 2;
> > @@ -395,6 +435,8 @@ s32 soc_mbus_bytes_per_line(u32 width, const
> struct soc_mbus_pixelfmt *mf)
> > return width * 3 / 2;
> > case SOC_MBUS_PACKING_VARIABLE:
> > return 0;
> > + case SOC_MBUS_PACKING_EXTEND32:
> > + return width * 4;
> > }
> > return -EINVAL;
> > }
> > diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
> > index 6442edc..c820be2 100644
> > --- a/include/media/soc_camera.h
> > +++ b/include/media/soc_camera.h
> > @@ -231,10 +231,14 @@ struct soc_camera_sense {
> > #define SOCAM_DATAWIDTH_10 SOCAM_DATAWIDTH(10)
>
> Didn't you forget to define SOCAM_DATAWIDTH_12 here?
Yes, I forgot this.
> > #define SOCAM_DATAWIDTH_15 SOCAM_DATAWIDTH(15)
> > #define SOCAM_DATAWIDTH_16 SOCAM_DATAWIDTH(16)
> > +#define SOCAM_DATAWIDTH_18 SOCAM_DATAWIDTH(18)
> > +#define SOCAM_DATAWIDTH_24 SOCAM_DATAWIDTH(24)
> >
> > #define SOCAM_DATAWIDTH_MASK (SOCAM_DATAWIDTH_4 | SOCAM_DATAWIDTH_8 |
\
> > SOCAM_DATAWIDTH_9 | SOCAM_DATAWIDTH_10 | \
> > - SOCAM_DATAWIDTH_15 | SOCAM_DATAWIDTH_16)
> > + SOCAM_DATAWIDTH_12 | SOCAM_DATAWIDTH_15 | \
> > + SOCAM_DATAWIDTH_16 | SOCAM_DATAWIDTH_18 | \
> > + SOCAM_DATAWIDTH_24)
> >
> > static inline void soc_camera_limit_side(int *start, int *length,
> > unsigned int start_min,
> > diff --git a/include/media/soc_mediabus.h
b/include/media/soc_mediabus.h
> > index 0dc6f46..eea98d1 100644
> > --- a/include/media/soc_mediabus.h
> > +++ b/include/media/soc_mediabus.h
> > @@ -26,6 +26,8 @@
> > * @SOC_MBUS_PACKING_VARIABLE: compressed formats with variable
packing
> > * @SOC_MBUS_PACKING_1_5X8: used for packed YUV 4:2:0 formats,
where 4
> > * pixels occupy 6 bytes in RAM
> > + * @SOC_MBUS_PACKING_EXTEND32: sample width (e.g., 24 bits) has
> to be extended
>
> Please, use a TAB above
Of course.
Thanks
Phil
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
@@ -97,6 +97,42 @@ static const struct soc_mbus_lookup mbus_fmt[] = {
.layout = SOC_MBUS_LAYOUT_PACKED,
},
}, {
+ .code = V4L2_MBUS_FMT_RGB666_1X18,
+ .fmt = {
+ .fourcc = V4L2_PIX_FMT_RGB32,
+ .name = "RGB666/32bpp",
+ .bits_per_sample = 18,
+ .packing = SOC_MBUS_PACKING_EXTEND32,
+ .order = SOC_MBUS_ORDER_LE,
+ },
+}, {
+ .code = V4L2_MBUS_FMT_RGB888_1X24,
+ .fmt = {
+ .fourcc = V4L2_PIX_FMT_RGB32,
+ .name = "RGB888/32bpp",
+ .bits_per_sample = 24,
+ .packing = SOC_MBUS_PACKING_EXTEND32,
+ .order = SOC_MBUS_ORDER_LE,
+ },
+}, {
+ .code = V4L2_MBUS_FMT_RGB888_2X12_BE,
+ .fmt = {
+ .fourcc = V4L2_PIX_FMT_RGB32,
+ .name = "RGB888/32bpp",
+ .bits_per_sample = 12,
+ .packing = SOC_MBUS_PACKING_EXTEND32,
+ .order = SOC_MBUS_ORDER_BE,
+ },
+}, {
+ .code = V4L2_MBUS_FMT_RGB888_2X12_LE,
+ .fmt = {
+ .fourcc = V4L2_PIX_FMT_RGB32,
+ .name = "RGB888/32bpp",
+ .bits_per_sample = 12,
+ .packing = SOC_MBUS_PACKING_EXTEND32,
+ .order = SOC_MBUS_ORDER_LE,
+ },
+}, {
.code = V4L2_MBUS_FMT_SBGGR8_1X8,
.fmt = {
.fourcc = V4L2_PIX_FMT_SBGGR8,
@@ -358,6 +394,10 @@ int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
*numerator = 1;
*denominator = 1;
return 0;
+ case SOC_MBUS_PACKING_EXTEND32:
+ *numerator = 1;
+ *denominator = 1;
+ return 0;
case SOC_MBUS_PACKING_2X8_PADHI:
case SOC_MBUS_PACKING_2X8_PADLO:
*numerator = 2;
@@ -395,6 +435,8 @@ s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
return width * 3 / 2;
case SOC_MBUS_PACKING_VARIABLE:
return 0;
+ case SOC_MBUS_PACKING_EXTEND32:
+ return width * 4;
}
return -EINVAL;
}
@@ -231,10 +231,14 @@ struct soc_camera_sense {
#define SOCAM_DATAWIDTH_10 SOCAM_DATAWIDTH(10)
#define SOCAM_DATAWIDTH_15 SOCAM_DATAWIDTH(15)
#define SOCAM_DATAWIDTH_16 SOCAM_DATAWIDTH(16)
+#define SOCAM_DATAWIDTH_18 SOCAM_DATAWIDTH(18)
+#define SOCAM_DATAWIDTH_24 SOCAM_DATAWIDTH(24)
#define SOCAM_DATAWIDTH_MASK (SOCAM_DATAWIDTH_4 | SOCAM_DATAWIDTH_8 | \
SOCAM_DATAWIDTH_9 | SOCAM_DATAWIDTH_10 | \
- SOCAM_DATAWIDTH_15 | SOCAM_DATAWIDTH_16)
+ SOCAM_DATAWIDTH_12 | SOCAM_DATAWIDTH_15 | \
+ SOCAM_DATAWIDTH_16 | SOCAM_DATAWIDTH_18 | \
+ SOCAM_DATAWIDTH_24)
static inline void soc_camera_limit_side(int *start, int *length,
unsigned int start_min,
@@ -26,6 +26,8 @@
* @SOC_MBUS_PACKING_VARIABLE: compressed formats with variable packing
* @SOC_MBUS_PACKING_1_5X8: used for packed YUV 4:2:0 formats, where 4
* pixels occupy 6 bytes in RAM
+ * @SOC_MBUS_PACKING_EXTEND32: sample width (e.g., 24 bits) has to be extended
+ * to 32 bits
*/
enum soc_mbus_packing {
SOC_MBUS_PACKING_NONE,
@@ -34,6 +36,7 @@ enum soc_mbus_packing {
SOC_MBUS_PACKING_EXTEND16,
SOC_MBUS_PACKING_VARIABLE,
SOC_MBUS_PACKING_1_5X8,
+ SOC_MBUS_PACKING_EXTEND32,
};
/**
@@ -37,7 +37,7 @@
enum v4l2_mbus_pixelcode {
V4L2_MBUS_FMT_FIXED = 0x0001,
- /* RGB - next is 0x1009 */
+ /* RGB - next is 0x100d */
V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE = 0x1001,
V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE = 0x1002,
V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE = 0x1003,
@@ -46,6 +46,10 @@ enum v4l2_mbus_pixelcode {
V4L2_MBUS_FMT_BGR565_2X8_LE = 0x1006,
V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007,
V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008,
+ V4L2_MBUS_FMT_RGB666_1X18 = 0x1009,
+ V4L2_MBUS_FMT_RGB888_1X24 = 0x100a,
+ V4L2_MBUS_FMT_RGB888_2X12_BE = 0x100b,
+ V4L2_MBUS_FMT_RGB888_2X12_LE = 0x100c,
/* YUV (including grey) - next is 0x2014 */
V4L2_MBUS_FMT_Y8_1X8 = 0x2001,