Skip to content

Commit dcab84e

Browse files
committed
media: rockchip: vicap add MIPI-DSI RGB565 format support
Signed-off-by: Jianwei Fan <[email protected]> Change-Id: Ia5b08471bd00233951d5b0a065c0f07fd6c03d02
1 parent 53d3b87 commit dcab84e

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

drivers/media/platform/rockchip/cif/capture.c

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ static const struct cif_output_fmt out_fmts[] = {
154154
.cplanes = 1,
155155
.mplanes = 1,
156156
.bpp = { 16 },
157+
.csi_fmt_val = CSI_WRDDR_TYPE_RGB565,
157158
.fmt_type = CIF_FMT_TYPE_RAW,
158159
}, {
159160
.fourcc = V4L2_PIX_FMT_BGR666,
@@ -475,6 +476,10 @@ static const struct cif_input_fmt in_fmts[] = {
475476
.mbus_code = MEDIA_BUS_FMT_RGB888_1X24,
476477
.csi_fmt_val = CSI_WRDDR_TYPE_RGB888,
477478
.field = V4L2_FIELD_NONE,
479+
}, {
480+
.mbus_code = MEDIA_BUS_FMT_RGB565_1X16,
481+
.csi_fmt_val = CSI_WRDDR_TYPE_RGB565,
482+
.field = V4L2_FIELD_NONE,
478483
}, {
479484
.mbus_code = MEDIA_BUS_FMT_Y8_1X8,
480485
.dvp_fmt_val = INPUT_MODE_RAW | RAW_DATA_WIDTH_8,
@@ -631,6 +636,15 @@ static unsigned char get_data_type(u32 pixelformat, u8 cmd_mode_en, u8 dsi_input
631636
} else {
632637
return 0x24;
633638
}
639+
case MEDIA_BUS_FMT_RGB565_1X16:
640+
if (dsi_input) {
641+
if (cmd_mode_en) /* dsi command mode*/
642+
return 0x39;
643+
else /* dsi video mode */
644+
return 0x0e;
645+
} else {
646+
return 0x22;
647+
}
634648
case MEDIA_BUS_FMT_EBD_1X8:
635649
return 0x12;
636650
case MEDIA_BUS_FMT_SPD_2X8:
@@ -646,6 +660,8 @@ static int get_csi_crop_align(const struct cif_input_fmt *fmt_in)
646660
switch (fmt_in->csi_fmt_val) {
647661
case CSI_WRDDR_TYPE_RGB888:
648662
return 24;
663+
case CSI_WRDDR_TYPE_RGB565:
664+
return 16;
649665
case CSI_WRDDR_TYPE_RAW10:
650666
case CSI_WRDDR_TYPE_RAW12:
651667
return 4;
@@ -2069,7 +2085,8 @@ static unsigned char get_csi_fmt_val(const struct cif_input_fmt *cif_fmt_in,
20692085
csi_fmt_val = CSI_WRDDR_TYPE_RAW12;
20702086
break;
20712087
}
2072-
} else if (cif_fmt_in->csi_fmt_val == CSI_WRDDR_TYPE_RGB888) {
2088+
} else if (cif_fmt_in->csi_fmt_val == CSI_WRDDR_TYPE_RGB888 ||
2089+
cif_fmt_in->csi_fmt_val == CSI_WRDDR_TYPE_RGB565) {
20732090
csi_fmt_val = CSI_WRDDR_TYPE_RAW8;
20742091
} else {
20752092
csi_fmt_val = cif_fmt_in->csi_fmt_val;
@@ -2099,6 +2116,8 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
20992116

21002117
if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)
21012118
channel->crop_st_x = 3 * stream->crop[CROP_SRC_ACT].left;
2119+
else if (channel->fmt_val == CSI_WRDDR_TYPE_RGB565)
2120+
channel->crop_st_x = 2 * stream->crop[CROP_SRC_ACT].left;
21022121
else
21032122
channel->crop_st_x = stream->crop[CROP_SRC_ACT].left;
21042123

@@ -2130,13 +2149,14 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
21302149
* writing of ddr, aliged with 256
21312150
*/
21322151
if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
2133-
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
2152+
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888 &&
2153+
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB565) {
21342154
channel->virtual_width = ALIGN(channel->width * fmt->raw_bpp / 8, 256);
21352155
} else {
21362156
channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
21372157
}
21382158

2139-
if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)
2159+
if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888 || channel->fmt_val == CSI_WRDDR_TYPE_RGB565)
21402160
channel->width = channel->width * fmt->bpp[0] / 8;
21412161
/*
21422162
* rk cif don't support output yuyv fmt data
@@ -4660,11 +4680,13 @@ int rkcif_set_fmt(struct rkcif_stream *stream,
46604680
(dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_DPHY ||
46614681
dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_CPHY ||
46624682
dev->active_sensor->mbus.type == V4L2_MBUS_CCP2) &&
4663-
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
4683+
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888 &&
4684+
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB565) {
46644685
bpl = ALIGN(width * fmt->raw_bpp / 8, 256);
46654686
} else {
46664687
if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
46674688
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888 &&
4689+
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB565 &&
46684690
dev->chip_id >= CHIP_RK3588_CIF) {
46694691
bpl = ALIGN(width * fmt->raw_bpp / 8, 256);
46704692
} else {
@@ -6222,13 +6244,14 @@ static void rkcif_cal_csi_crop_width_vwidth(struct rkcif_stream *stream,
62226244
* writing of ddr, aliged with 256
62236245
*/
62246246
if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
6225-
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
6247+
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888 &&
6248+
fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB565) {
62266249
*crop_vwidth = ALIGN(raw_width * fmt->raw_bpp / 8, 256);
62276250
} else {
62286251
*crop_vwidth = ALIGN(raw_width * fmt->bpp[0] / 8, 8);
62296252
}
62306253

6231-
if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)
6254+
if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888 || channel->fmt_val == CSI_WRDDR_TYPE_RGB565)
62326255
*crop_width = raw_width * fmt->bpp[0] / 8;
62336256
/*
62346257
* rk cif don't support output yuyv fmt data
@@ -6263,6 +6286,8 @@ static void rkcif_dynamic_crop(struct rkcif_stream *stream)
62636286

62646287
if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)
62656288
crop_x = 3 * stream->crop[CROP_SRC_ACT].left;
6289+
else if (channel->fmt_val == CSI_WRDDR_TYPE_RGB565)
6290+
crop_x = 2 * stream->crop[CROP_SRC_ACT].left;
62666291
else
62676292
crop_x = stream->crop[CROP_SRC_ACT].left;
62686293

drivers/media/platform/rockchip/cif/regs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,7 @@ enum cif_reg_index {
767767
#define CSI_WRDDR_TYPE_YUV422 (0x4 << 1)
768768
#define CSI_WRDDR_TYPE_YUV420SP (0x5 << 1)
769769
#define CSI_WRDDR_TYPE_YUV400 (0x6 << 1)
770+
#define CSI_WRDDR_TYPE_RGB565 (0x7 << 1)
770771
#define CSI_DISABLE_COMMAND_MODE (0x0 << 4)
771772
#define CSI_ENABLE_COMMAND_MODE (0x1 << 4)
772773
#define CSI_DISABLE_CROP (0x0 << 5)

0 commit comments

Comments
 (0)