@@ -154,6 +154,7 @@ static const struct cif_output_fmt out_fmts[] = {
154
154
.cplanes = 1 ,
155
155
.mplanes = 1 ,
156
156
.bpp = { 16 },
157
+ .csi_fmt_val = CSI_WRDDR_TYPE_RGB565 ,
157
158
.fmt_type = CIF_FMT_TYPE_RAW ,
158
159
}, {
159
160
.fourcc = V4L2_PIX_FMT_BGR666 ,
@@ -475,6 +476,10 @@ static const struct cif_input_fmt in_fmts[] = {
475
476
.mbus_code = MEDIA_BUS_FMT_RGB888_1X24 ,
476
477
.csi_fmt_val = CSI_WRDDR_TYPE_RGB888 ,
477
478
.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 ,
478
483
}, {
479
484
.mbus_code = MEDIA_BUS_FMT_Y8_1X8 ,
480
485
.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
631
636
} else {
632
637
return 0x24 ;
633
638
}
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
+ }
634
648
case MEDIA_BUS_FMT_EBD_1X8 :
635
649
return 0x12 ;
636
650
case MEDIA_BUS_FMT_SPD_2X8 :
@@ -646,6 +660,8 @@ static int get_csi_crop_align(const struct cif_input_fmt *fmt_in)
646
660
switch (fmt_in -> csi_fmt_val ) {
647
661
case CSI_WRDDR_TYPE_RGB888 :
648
662
return 24 ;
663
+ case CSI_WRDDR_TYPE_RGB565 :
664
+ return 16 ;
649
665
case CSI_WRDDR_TYPE_RAW10 :
650
666
case CSI_WRDDR_TYPE_RAW12 :
651
667
return 4 ;
@@ -2069,7 +2085,8 @@ static unsigned char get_csi_fmt_val(const struct cif_input_fmt *cif_fmt_in,
2069
2085
csi_fmt_val = CSI_WRDDR_TYPE_RAW12 ;
2070
2086
break ;
2071
2087
}
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 ) {
2073
2090
csi_fmt_val = CSI_WRDDR_TYPE_RAW8 ;
2074
2091
} else {
2075
2092
csi_fmt_val = cif_fmt_in -> csi_fmt_val ;
@@ -2099,6 +2116,8 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
2099
2116
2100
2117
if (channel -> fmt_val == CSI_WRDDR_TYPE_RGB888 )
2101
2118
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 ;
2102
2121
else
2103
2122
channel -> crop_st_x = stream -> crop [CROP_SRC_ACT ].left ;
2104
2123
@@ -2130,13 +2149,14 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
2130
2149
* writing of ddr, aliged with 256
2131
2150
*/
2132
2151
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 ) {
2134
2154
channel -> virtual_width = ALIGN (channel -> width * fmt -> raw_bpp / 8 , 256 );
2135
2155
} else {
2136
2156
channel -> virtual_width = ALIGN (channel -> width * fmt -> bpp [0 ] / 8 , 8 );
2137
2157
}
2138
2158
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 )
2140
2160
channel -> width = channel -> width * fmt -> bpp [0 ] / 8 ;
2141
2161
/*
2142
2162
* rk cif don't support output yuyv fmt data
@@ -4660,11 +4680,13 @@ int rkcif_set_fmt(struct rkcif_stream *stream,
4660
4680
(dev -> active_sensor -> mbus .type == V4L2_MBUS_CSI2_DPHY ||
4661
4681
dev -> active_sensor -> mbus .type == V4L2_MBUS_CSI2_CPHY ||
4662
4682
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 ) {
4664
4685
bpl = ALIGN (width * fmt -> raw_bpp / 8 , 256 );
4665
4686
} else {
4666
4687
if (fmt -> fmt_type == CIF_FMT_TYPE_RAW && stream -> is_compact &&
4667
4688
fmt -> csi_fmt_val != CSI_WRDDR_TYPE_RGB888 &&
4689
+ fmt -> csi_fmt_val != CSI_WRDDR_TYPE_RGB565 &&
4668
4690
dev -> chip_id >= CHIP_RK3588_CIF ) {
4669
4691
bpl = ALIGN (width * fmt -> raw_bpp / 8 , 256 );
4670
4692
} else {
@@ -6222,13 +6244,14 @@ static void rkcif_cal_csi_crop_width_vwidth(struct rkcif_stream *stream,
6222
6244
* writing of ddr, aliged with 256
6223
6245
*/
6224
6246
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 ) {
6226
6249
* crop_vwidth = ALIGN (raw_width * fmt -> raw_bpp / 8 , 256 );
6227
6250
} else {
6228
6251
* crop_vwidth = ALIGN (raw_width * fmt -> bpp [0 ] / 8 , 8 );
6229
6252
}
6230
6253
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 )
6232
6255
* crop_width = raw_width * fmt -> bpp [0 ] / 8 ;
6233
6256
/*
6234
6257
* rk cif don't support output yuyv fmt data
@@ -6263,6 +6286,8 @@ static void rkcif_dynamic_crop(struct rkcif_stream *stream)
6263
6286
6264
6287
if (channel -> fmt_val == CSI_WRDDR_TYPE_RGB888 )
6265
6288
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 ;
6266
6291
else
6267
6292
crop_x = stream -> crop [CROP_SRC_ACT ].left ;
6268
6293
0 commit comments