Skip to content

Commit f2f85c6

Browse files
committed
drivers: video: Support controls of 64-bit integer type
Add supports for controls that need 64-bit integer such as pixel rate. Signed-off-by: Phi Bang Nguyen <phibang.nguyen@nxp.com>
1 parent 15b1dd8 commit f2f85c6

File tree

14 files changed

+167
-87
lines changed

14 files changed

+167
-87
lines changed

drivers/video/gc2145.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,12 +1136,14 @@ static int gc2145_init_controls(const struct device *dev)
11361136
struct gc2145_data *drv_data = dev->data;
11371137
struct gc2145_ctrls *ctrls = &drv_data->ctrls;
11381138

1139-
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP, 0, 1, 1, 0);
1139+
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP,
1140+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
11401141
if (ret) {
11411142
return ret;
11421143
}
11431144

1144-
return video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP, 0, 1, 1, 0);
1145+
return video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP,
1146+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
11451147
}
11461148

11471149
static int gc2145_init(const struct device *dev)

drivers/video/mt9m114.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -514,13 +514,14 @@ static int mt9m114_init_controls(const struct device *dev)
514514
struct mt9m114_data *drv_data = dev->data;
515515
struct mt9m114_ctrls *ctrls = &drv_data->ctrls;
516516

517-
518-
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP, 0, 1, 1, 0);
517+
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP,
518+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
519519
if (ret) {
520520
return ret;
521521
}
522522

523-
return video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP, 0, 1, 1, 0);
523+
return video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP,
524+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
524525
}
525526

526527
static int mt9m114_init(const struct device *dev)

drivers/video/ov2640.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -940,53 +940,63 @@ static int ov2640_init_controls(const struct device *dev)
940940
struct ov2640_data *drv_data = dev->data;
941941
struct ov2640_ctrls *ctrls = &drv_data->ctrls;
942942

943-
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP, 0, 1, 1, 0);
943+
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP,
944+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
944945
if (ret) {
945946
return ret;
946947
}
947948

948-
ret = video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP, 0, 1, 1, 0);
949+
ret = video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP,
950+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
949951
if (ret) {
950952
return ret;
951953
}
952954

953-
ret = video_init_ctrl(&ctrls->ae, dev, VIDEO_CID_EXPOSURE, 0, 1, 1, 1);
955+
ret = video_init_ctrl(&ctrls->ae, dev, VIDEO_CID_EXPOSURE,
956+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 1});
954957
if (ret) {
955958
return ret;
956959
}
957960

958-
ret = video_init_ctrl(&ctrls->awb, dev, VIDEO_CID_WHITE_BALANCE_TEMPERATURE, 0, 1, 1, 1);
961+
ret = video_init_ctrl(&ctrls->awb, dev, VIDEO_CID_WHITE_BALANCE_TEMPERATURE,
962+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 1});
959963
if (ret) {
960964
return ret;
961965
}
962966

963-
ret = video_init_ctrl(&ctrls->gain, dev, VIDEO_CID_GAIN, 0, 1, 1, 1);
967+
ret = video_init_ctrl(&ctrls->gain, dev, VIDEO_CID_GAIN,
968+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 1});
964969
if (ret) {
965970
return ret;
966971
}
967972

968-
ret = video_init_ctrl(&ctrls->brightness, dev, VIDEO_CID_BRIGHTNESS, -2, 2, 1, 0);
973+
ret = video_init_ctrl(&ctrls->brightness, dev, VIDEO_CID_BRIGHTNESS,
974+
(struct video_ctrl_range){.min = -2, .max = 2, .step = 1, .def = 0});
969975
if (ret) {
970976
return ret;
971977
}
972978

973-
ret = video_init_ctrl(&ctrls->contrast, dev, VIDEO_CID_CONTRAST, -2, 2, 1, 0);
979+
ret = video_init_ctrl(&ctrls->contrast, dev, VIDEO_CID_CONTRAST,
980+
(struct video_ctrl_range){.min = -2, .max = 2, .step = 1, .def = 0});
974981
if (ret) {
975982
return ret;
976983
}
977984

978-
ret = video_init_ctrl(&ctrls->saturation, dev, VIDEO_CID_SATURATION, -2, 2, 1, 0);
985+
ret = video_init_ctrl(&ctrls->saturation, dev, VIDEO_CID_SATURATION,
986+
(struct video_ctrl_range){.min = -2, .max = 2, .step = 1, .def = 0});
979987
if (ret) {
980988
return ret;
981989
}
982990

983-
ret = video_init_ctrl(&ctrls->saturation, dev, VIDEO_CID_JPEG_COMPRESSION_QUALITY, 5, 100,
984-
1, 50);
991+
ret = video_init_ctrl(
992+
&ctrls->saturation, dev, VIDEO_CID_JPEG_COMPRESSION_QUALITY,
993+
(struct video_ctrl_range){.min = 5, .max = 100, .step = 1, .def = 50});
985994
if (ret) {
986995
return ret;
987996
}
988997

989-
return video_init_ctrl(&ctrls->test_pattern, dev, VIDEO_CID_TEST_PATTERN, 0, 1, 1, 0);
998+
return video_init_ctrl(&ctrls->test_pattern, dev, VIDEO_CID_TEST_PATTERN,
999+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
9901000
}
9911001

9921002
static int ov2640_init(const struct device *dev)

drivers/video/ov5640.c

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,59 +1182,77 @@ static int ov5640_init_controls(const struct device *dev)
11821182
struct ov5640_data *drv_data = dev->data;
11831183
struct ov5640_ctrls *ctrls = &drv_data->ctrls;
11841184

1185-
ret = video_init_ctrl(&ctrls->gain, dev, VIDEO_CID_GAIN, 0, 1023, 1, 0);
1185+
ret = video_init_ctrl(
1186+
&ctrls->gain, dev, VIDEO_CID_GAIN,
1187+
(struct video_ctrl_range){.min = 0, .max = 1023, .step = 1, .def = 0});
11861188
if (ret) {
11871189
return ret;
11881190
}
11891191

1190-
ret = video_init_ctrl(&ctrls->brightness, dev, VIDEO_CID_BRIGHTNESS, -15, 15, 1, 0);
1192+
ret = video_init_ctrl(
1193+
&ctrls->brightness, dev, VIDEO_CID_BRIGHTNESS,
1194+
(struct video_ctrl_range){.min = -15, .max = 15, .step = 1, .def = 0});
11911195
if (ret) {
11921196
return ret;
11931197
}
11941198

1195-
ret = video_init_ctrl(&ctrls->contrast, dev, VIDEO_CID_CONTRAST, 0, 255, 1, 0);
1199+
ret = video_init_ctrl(&ctrls->contrast, dev, VIDEO_CID_CONTRAST,
1200+
(struct video_ctrl_range){.min = 0, .max = 255, .step = 1, .def = 0});
11961201
if (ret) {
11971202
return ret;
11981203
}
11991204

1200-
ret = video_init_ctrl(&ctrls->hue, dev, VIDEO_CID_HUE, 0, 359, 1, 0);
1205+
ret = video_init_ctrl(&ctrls->hue, dev, VIDEO_CID_HUE,
1206+
(struct video_ctrl_range){.min = 0, .max = 359, .step = 1, .def = 0});
12011207
if (ret) {
12021208
return ret;
12031209
}
12041210

1205-
ret = video_init_ctrl(&ctrls->saturation, dev, VIDEO_CID_SATURATION, 0, 255, 1, 64);
1211+
ret = video_init_ctrl(
1212+
&ctrls->saturation, dev, VIDEO_CID_SATURATION,
1213+
(struct video_ctrl_range){.min = 0, .max = 255, .step = 1, .def = 64});
12061214
if (ret) {
12071215
return ret;
12081216
}
12091217

1210-
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP, 0, 1, 1, 0);
1218+
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP,
1219+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
12111220
if (ret) {
12121221
return ret;
12131222
}
12141223

1215-
ret = video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP, 0, 1, 1, 0);
1224+
ret = video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP,
1225+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
12161226
if (ret) {
12171227
return ret;
12181228
}
12191229

1220-
ret = video_init_ctrl(&ctrls->light_freq, dev, VIDEO_CID_POWER_LINE_FREQUENCY,
1221-
VIDEO_CID_POWER_LINE_FREQUENCY_DISABLED,
1222-
VIDEO_CID_POWER_LINE_FREQUENCY_AUTO, 1,
1223-
VIDEO_CID_POWER_LINE_FREQUENCY_50HZ);
1230+
ret = video_init_ctrl(
1231+
&ctrls->light_freq, dev, VIDEO_CID_POWER_LINE_FREQUENCY,
1232+
(struct video_ctrl_range){.min = VIDEO_CID_POWER_LINE_FREQUENCY_DISABLED,
1233+
.max = VIDEO_CID_POWER_LINE_FREQUENCY_AUTO,
1234+
.step = 1,
1235+
.def = VIDEO_CID_POWER_LINE_FREQUENCY_50HZ});
12241236
if (ret) {
12251237
return ret;
12261238
}
12271239

1228-
ret = video_init_ctrl(&ctrls->test_pattern, dev, VIDEO_CID_TEST_PATTERN, 0,
1229-
ARRAY_SIZE(test_pattern_val) - 1, 1, 0);
1240+
ret = video_init_ctrl(
1241+
&ctrls->test_pattern, dev, VIDEO_CID_TEST_PATTERN,
1242+
(struct video_ctrl_range){
1243+
.min = 0, .max = ARRAY_SIZE(test_pattern_val) - 1, .step = 1, .def = 0});
12301244
if (ret) {
12311245
return ret;
12321246
}
12331247

12341248
return video_init_ctrl(
1235-
&ctrls->pixel_rate, dev, VIDEO_CID_PIXEL_RATE, mipi_vga_frmrate_params[0].pixelrate,
1236-
mipi_hd_frmrate_params[ARRAY_SIZE(mipi_hd_frmrate_params) - 1].pixelrate, 1,
1237-
drv_data->cur_pixrate);
1249+
&ctrls->pixel_rate, dev, VIDEO_CID_PIXEL_RATE,
1250+
(struct video_ctrl_range){
1251+
.min64 = mipi_qqvga_frmrate_params[0].pixelrate,
1252+
.max64 = mipi_hd_frmrate_params[ARRAY_SIZE(mipi_hd_frmrate_params) - 1]
1253+
.pixelrate,
1254+
.step64 = 1,
1255+
.def64 = mipi_hd_frmrate_params[1].pixelrate});
12381256
}
12391257

12401258
static int ov5640_init(const struct device *dev)

drivers/video/ov7670.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -464,12 +464,14 @@ static int ov7670_init_controls(const struct device *dev)
464464
struct ov7670_data *drv_data = dev->data;
465465
struct ov7670_ctrls *ctrls = &drv_data->ctrls;
466466

467-
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP, 0, 1, 1, 0);
467+
ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP,
468+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
468469
if (ret) {
469470
return ret;
470471
}
471472

472-
return video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP, 0, 1, 1, 0);
473+
return video_init_ctrl(&ctrls->vflip, dev, VIDEO_CID_VFLIP,
474+
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
473475
}
474476

475477
static int ov7670_init(const struct device *dev)

drivers/video/video_ctrls.c

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,29 @@
1515

1616
LOG_MODULE_REGISTER(video_ctrls, CONFIG_VIDEO_LOG_LEVEL);
1717

18-
static inline int check_range(enum video_ctrl_type type, int32_t min, int32_t max, uint32_t step,
19-
int32_t def)
18+
static inline int check_range(enum video_ctrl_type type, struct video_ctrl_range range)
2019
{
2120
switch (type) {
2221
case VIDEO_CTRL_TYPE_BOOLEAN:
23-
if (step != 1 || max > 1 || min < 0) {
22+
if (range.step != 1 || range.max > 1 || range.min < 0) {
2423
return -ERANGE;
2524
}
2625
return 0;
2726
case VIDEO_CTRL_TYPE_INTEGER:
27+
if (range.step == 0 || range.min > range.max ||
28+
!IN_RANGE(range.def, range.min, range.max)) {
29+
return -ERANGE;
30+
}
31+
return 0;
2832
case VIDEO_CTRL_TYPE_INTEGER64:
29-
if (step == 0 || min > max || !IN_RANGE(def, min, max)) {
33+
if (range.step64 == 0 || range.min64 > range.max64 ||
34+
!IN_RANGE(range.def64, range.min64, range.max64)) {
3035
return -ERANGE;
3136
}
3237
return 0;
3338
case VIDEO_CTRL_TYPE_MENU:
34-
if (!IN_RANGE(min, 0, max) || !IN_RANGE(def, min, max)) {
39+
if (!IN_RANGE(range.min, 0, range.max) ||
40+
!IN_RANGE(range.def, range.min, range.max)) {
3541
return -ERANGE;
3642
}
3743
return 0;
@@ -63,8 +69,8 @@ static inline void set_type_flag(uint32_t id, enum video_ctrl_type *type, uint32
6369
}
6470
}
6571

66-
int video_init_ctrl(struct video_ctrl *ctrl, const struct device *dev, uint32_t id, int32_t min,
67-
int32_t max, uint32_t step, int32_t def)
72+
int video_init_ctrl(struct video_ctrl *ctrl, const struct device *dev, uint32_t id,
73+
struct video_ctrl_range range)
6874
{
6975
int ret;
7076
uint32_t flags;
@@ -83,7 +89,7 @@ int video_init_ctrl(struct video_ctrl *ctrl, const struct device *dev, uint32_t
8389

8490
set_type_flag(id, &type, &flags);
8591

86-
ret = check_range(type, min, max, step, def);
92+
ret = check_range(type, range);
8793
if (ret) {
8894
return ret;
8995
}
@@ -92,11 +98,13 @@ int video_init_ctrl(struct video_ctrl *ctrl, const struct device *dev, uint32_t
9298
ctrl->id = id;
9399
ctrl->type = type;
94100
ctrl->flags = flags;
95-
ctrl->min = min;
96-
ctrl->max = max;
97-
ctrl->step = step;
98-
ctrl->def = def;
99-
ctrl->val = def;
101+
ctrl->range = range;
102+
103+
if (type == VIDEO_CTRL_TYPE_INTEGER64) {
104+
ctrl->val64 = range.def64;
105+
} else {
106+
ctrl->val = range.def;
107+
}
100108

101109
/* Insert in an ascending order of ctrl's id */
102110
SYS_DLIST_FOR_EACH_CONTAINER(&vdev->ctrls, vc, node) {
@@ -143,7 +151,11 @@ int video_get_ctrl(const struct device *dev, struct video_control *control)
143151
return -EACCES;
144152
}
145153

146-
control->val = ctrl->val;
154+
if (ctrl->type == VIDEO_CTRL_TYPE_INTEGER64) {
155+
control->val64 = ctrl->val64;
156+
} else {
157+
control->val = ctrl->val;
158+
}
147159

148160
return 0;
149161
}
@@ -163,7 +175,9 @@ int video_set_ctrl(const struct device *dev, struct video_control *control)
163175
return -EACCES;
164176
}
165177

166-
if (!IN_RANGE(control->val, ctrl->min, ctrl->max)) {
178+
if (ctrl->type == VIDEO_CTRL_TYPE_INTEGER64
179+
? !IN_RANGE(control->val64, ctrl->range.min64, ctrl->range.max64)
180+
: !IN_RANGE(control->val, ctrl->range.min, ctrl->range.max)) {
167181
LOG_ERR("Control value is invalid\n");
168182
return -EINVAL;
169183
}
@@ -179,7 +193,11 @@ int video_set_ctrl(const struct device *dev, struct video_control *control)
179193
}
180194

181195
/* Only update the ctrl in memory once everything is OK */
182-
ctrl->val = control->val;
196+
if (ctrl->type == VIDEO_CTRL_TYPE_INTEGER64) {
197+
ctrl->val64 = control->val64;
198+
} else {
199+
ctrl->val = control->val;
200+
}
183201

184202
return 0;
185203
}
@@ -254,10 +272,8 @@ int video_query_ctrl(const struct device *dev, struct video_ctrl_query *cq)
254272
cq->id = ctrl->id;
255273
cq->type = ctrl->type;
256274
cq->flags = ctrl->flags;
257-
cq->min = ctrl->min;
258-
cq->max = ctrl->max;
259-
cq->step = ctrl->step;
260-
cq->def = ctrl->def;
275+
cq->range = ctrl->range;
276+
261277
cq->name = video_get_ctrl_name(cq->id);
262278

263279
return 0;

drivers/video/video_ctrls.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,15 @@ struct video_ctrl {
4040
uint32_t id;
4141
enum video_ctrl_type type;
4242
unsigned long flags;
43-
int32_t min, max, def, val;
44-
uint32_t step;
43+
struct video_ctrl_range range;
44+
union {
45+
int32_t val;
46+
int64_t val64;
47+
};
4548
sys_dnode_t node;
4649
};
4750

48-
int video_init_ctrl(struct video_ctrl *ctrl, const struct device *dev, uint32_t id, int32_t min,
49-
int32_t max, uint32_t step, int32_t def);
51+
int video_init_ctrl(struct video_ctrl *ctrl, const struct device *dev, uint32_t id,
52+
struct video_ctrl_range range);
5053

5154
#endif /* ZEPHYR_INCLUDE_DRIVERS_VIDEO_VIDEO_CTRLS_H_ */

drivers/video/video_emul_imager.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,9 @@ static int emul_imager_init_controls(const struct device *dev)
366366
{
367367
struct emul_imager_data *drv_data = dev->data;
368368

369-
return video_init_ctrl(&drv_data->ctrls.custom, dev, EMUL_IMAGER_CID_CUSTOM, 0, 255, 1,
370-
128);
369+
return video_init_ctrl(
370+
&drv_data->ctrls.custom, dev, EMUL_IMAGER_CID_CUSTOM,
371+
(struct video_ctrl_range){.min = 0, .max = 255, .step = 1, .def = 128});
371372
}
372373

373374
int emul_imager_init(const struct device *dev)

0 commit comments

Comments
 (0)