@@ -21,6 +21,7 @@ LOG_MODULE_REGISTER(video_gc2145, CONFIG_VIDEO_LOG_LEVEL);
21
21
#define GC2145_REG_AMODE1_DEF 0x14
22
22
#define GC2145_REG_OUTPUT_FMT 0x84
23
23
#define GC2145_REG_OUTPUT_FMT_RGB565 0x06
24
+ #define GC2145_REG_OUTPUT_FMT_YCBYCR 0x02
24
25
#define GC2145_REG_SYNC_MODE 0x86
25
26
#define GC2145_REG_SYNC_MODE_DEF 0x23
26
27
#define GC2145_REG_SYNC_MODE_COL_SWITCH 0x10
@@ -699,18 +700,22 @@ struct gc2145_data {
699
700
.height_min = height, .height_max = height, .width_step = 0, .height_step = 0, \
700
701
}
701
702
702
- enum resolutions {
703
- QVGA_RESOLUTION = 0 ,
704
- VGA_RESOLUTION ,
705
- UXGA_RESOLUTION ,
706
- RESOLUTIONS_MAX ,
707
- };
703
+ #define RESOLUTION_QVGA_W 320
704
+ #define RESOLUTION_QVGA_H 240
705
+
706
+ #define RESOLUTION_VGA_W 640
707
+ #define RESOLUTION_VGA_H 480
708
+
709
+ #define RESOLUTION_UXGA_W 1600
710
+ #define RESOLUTION_UXGA_H 1200
708
711
709
712
static const struct video_format_cap fmts [] = {
710
- [QVGA_RESOLUTION ] = GC2145_VIDEO_FORMAT_CAP (320 , 240 , VIDEO_PIX_FMT_RGB565 ), /* QVGA */
711
- [VGA_RESOLUTION ] = GC2145_VIDEO_FORMAT_CAP (640 , 480 , VIDEO_PIX_FMT_RGB565 ), /* VGA */
712
- [UXGA_RESOLUTION ] = GC2145_VIDEO_FORMAT_CAP (1600 , 1200 , VIDEO_PIX_FMT_RGB565 ), /* UXGA */
713
- [RESOLUTIONS_MAX ] = {0 },
713
+ GC2145_VIDEO_FORMAT_CAP (RESOLUTION_QVGA_W , RESOLUTION_QVGA_H , VIDEO_PIX_FMT_RGB565 ),
714
+ GC2145_VIDEO_FORMAT_CAP (RESOLUTION_VGA_W , RESOLUTION_VGA_H , VIDEO_PIX_FMT_RGB565 ),
715
+ GC2145_VIDEO_FORMAT_CAP (RESOLUTION_UXGA_W , RESOLUTION_UXGA_H , VIDEO_PIX_FMT_RGB565 ),
716
+ GC2145_VIDEO_FORMAT_CAP (RESOLUTION_QVGA_W , RESOLUTION_QVGA_H , VIDEO_PIX_FMT_YUYV ),
717
+ GC2145_VIDEO_FORMAT_CAP (RESOLUTION_VGA_W , RESOLUTION_VGA_H , VIDEO_PIX_FMT_YUYV ),
718
+ GC2145_VIDEO_FORMAT_CAP (RESOLUTION_UXGA_W , RESOLUTION_UXGA_H , VIDEO_PIX_FMT_YUYV ),
714
719
};
715
720
716
721
static int gc2145_write_reg (const struct i2c_dt_spec * spec , uint8_t reg_addr , uint8_t value )
@@ -893,13 +898,17 @@ static int gc2145_set_output_format(const struct device *dev, int output_format)
893
898
return ret ;
894
899
}
895
900
896
- if (output_format != VIDEO_PIX_FMT_RGB565 ) {
901
+ /* Map format to sensor format */
902
+ if (output_format == VIDEO_PIX_FMT_RGB565 ) {
903
+ output_format = GC2145_REG_OUTPUT_FMT_RGB565 ;
904
+ } else if (output_format == VIDEO_PIX_FMT_YUYV ) {
905
+ output_format = GC2145_REG_OUTPUT_FMT_YCBYCR ;
906
+ } else {
897
907
LOG_ERR ("Image format not supported" );
898
908
return - ENOTSUP ;
899
909
}
900
910
901
- /* Disable JPEG compression and set output to RGB565 */
902
- ret = gc2145_write_reg (& cfg -> i2c , GC2145_REG_OUTPUT_FMT , GC2145_REG_OUTPUT_FMT_RGB565 );
911
+ ret = gc2145_write_reg (& cfg -> i2c , GC2145_REG_OUTPUT_FMT , output_format );
903
912
if (ret < 0 ) {
904
913
return ret ;
905
914
}
@@ -909,13 +918,11 @@ static int gc2145_set_output_format(const struct device *dev, int output_format)
909
918
return 0 ;
910
919
}
911
920
912
- static int gc2145_set_resolution (const struct device * dev , enum resolutions res )
921
+ static int gc2145_set_resolution (const struct device * dev , uint32_t w , uint32_t h )
913
922
{
914
923
int ret ;
915
924
const struct gc2145_config * cfg = dev -> config ;
916
925
917
- uint16_t w ;
918
- uint16_t h ;
919
926
uint16_t win_w ;
920
927
uint16_t win_h ;
921
928
uint16_t c_ratio ;
@@ -925,29 +932,22 @@ static int gc2145_set_resolution(const struct device *dev, enum resolutions res)
925
932
uint16_t win_x ;
926
933
uint16_t win_y ;
927
934
928
- if (res >= RESOLUTIONS_MAX ) {
929
- return - EIO ;
930
- }
931
-
932
- w = fmts [res ].width_min ;
933
- h = fmts [res ].height_min ;
934
-
935
935
/* Add the subsampling factor depending on resolution */
936
- switch (res ) {
937
- case QVGA_RESOLUTION :
936
+ switch (w ) {
937
+ case RESOLUTION_QVGA_W :
938
938
c_ratio = 3 ;
939
939
r_ratio = 3 ;
940
940
break ;
941
- case VGA_RESOLUTION :
941
+ case RESOLUTION_VGA_W :
942
942
c_ratio = 2 ;
943
943
r_ratio = 2 ;
944
944
break ;
945
- case UXGA_RESOLUTION :
945
+ case RESOLUTION_UXGA_W :
946
946
c_ratio = 1 ;
947
947
r_ratio = 1 ;
948
948
break ;
949
949
default :
950
- LOG_ERR ("Unsupported resolution %d" , res );
950
+ LOG_ERR ("Unsupported resolution %d %d " , w , h );
951
951
return - EIO ;
952
952
};
953
953
@@ -1027,29 +1027,23 @@ static int gc2145_set_fmt(const struct device *dev, enum video_endpoint_id ep,
1027
1027
struct video_format * fmt )
1028
1028
{
1029
1029
struct gc2145_data * drv_data = dev -> data ;
1030
- enum resolutions res = RESOLUTIONS_MAX ;
1030
+ size_t res = ARRAY_SIZE ( fmts ) ;
1031
1031
int ret ;
1032
1032
1033
- /* We only support RGB565 formats */
1034
- if (fmt -> pixelformat != VIDEO_PIX_FMT_RGB565 ) {
1035
- LOG_ERR ("gc2145 camera supports only RGB565" );
1036
- return - ENOTSUP ;
1037
- }
1038
-
1039
1033
if (memcmp (& drv_data -> fmt , fmt , sizeof (drv_data -> fmt )) == 0 ) {
1040
1034
/* nothing to do */
1041
1035
return 0 ;
1042
1036
}
1043
1037
1044
1038
/* Check if camera is capable of handling given format */
1045
- for (int i = 0 ; i < RESOLUTIONS_MAX ; i ++ ) {
1039
+ for (int i = 0 ; i < ARRAY_SIZE ( fmts ) ; i ++ ) {
1046
1040
if (fmts [i ].width_min == fmt -> width && fmts [i ].height_min == fmt -> height &&
1047
1041
fmts [i ].pixelformat == fmt -> pixelformat ) {
1048
- res = ( enum resolutions ) i ;
1042
+ res = i ;
1049
1043
break ;
1050
1044
}
1051
1045
}
1052
- if (res == RESOLUTIONS_MAX ) {
1046
+ if (res == ARRAY_SIZE ( fmts ) ) {
1053
1047
LOG_ERR ("Image format not supported" );
1054
1048
return - ENOTSUP ;
1055
1049
}
@@ -1064,7 +1058,8 @@ static int gc2145_set_fmt(const struct device *dev, enum video_endpoint_id ep,
1064
1058
}
1065
1059
1066
1060
/* Set window size */
1067
- ret = gc2145_set_resolution (dev , res );
1061
+ ret = gc2145_set_resolution (dev , fmt -> width , fmt -> height );
1062
+
1068
1063
if (ret < 0 ) {
1069
1064
LOG_ERR ("Failed to set the resolution" );
1070
1065
return ret ;
@@ -1161,9 +1156,9 @@ static int gc2145_init(const struct device *dev)
1161
1156
1162
1157
/* set default/init format QVGA RGB565 */
1163
1158
fmt .pixelformat = VIDEO_PIX_FMT_RGB565 ;
1164
- fmt .width = fmts [ QVGA_RESOLUTION ]. width_min ;
1165
- fmt .height = fmts [ QVGA_RESOLUTION ]. height_min ;
1166
- fmt .pitch = fmts [ QVGA_RESOLUTION ]. width_min * 2 ;
1159
+ fmt .width = RESOLUTION_QVGA_W ;
1160
+ fmt .height = RESOLUTION_QVGA_H ;
1161
+ fmt .pitch = RESOLUTION_QVGA_W * 2 ;
1167
1162
1168
1163
ret = gc2145_set_fmt (dev , VIDEO_EP_OUT , & fmt );
1169
1164
if (ret ) {
0 commit comments