Skip to content

Implement video control framework #82158

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cmake/linker_script/common/common-ram.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@ if(CONFIG_UVB)
zephyr_iterable_section(NAME uvb_node GROUP DATA_REGION ${XIP_ALIGN_WITH_INPUT} SUBALIGN ${CONFIG_LINKER_ITERABLE_SUBALIGN})
endif()

if(CONFIG_VIDEO)
zephyr_iterable_section(NAME video_device GROUP DATA_REGION ${XIP_ALIGN_WITH_INPUT} SUBALIGN ${CONFIG_LINKER_ITERABLE_SUBALIGN})
endif()

if(CONFIG_LOG)
zephyr_iterable_section(NAME log_mpsc_pbuf GROUP DATA_REGION ${XIP_ALIGN_WITH_INPUT} SUBALIGN ${CONFIG_LINKER_ITERABLE_SUBALIGN})
Expand Down
8 changes: 8 additions & 0 deletions doc/releases/release-notes-4.2.rst
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ Removed APIs and options
* Removed :dtcompatible:`meas,ms5837` and replaced with :dtcompatible:`meas,ms5837-30ba`
and :dtcompatible:`meas,ms5837-02ba`.

* Removed the ``get_ctrl`` video driver API

Deprecated APIs and options
===========================

Expand Down Expand Up @@ -179,6 +181,12 @@ New APIs and options
* LoRaWAN
* :c:func:`lorawan_request_link_check`

* Video

* :c:func:`video_api_ctrl_t`
* :c:func:`video_query_ctrl`
* :c:func:`video_print_ctrl`

New Boards
**********

Expand Down
4 changes: 4 additions & 0 deletions drivers/video/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
zephyr_library()

zephyr_library_sources(video_common.c)
zephyr_library_sources(video_ctrls.c)
zephyr_library_sources(video_device.c)

zephyr_library_sources_ifdef(CONFIG_VIDEO_MCUX_CSI video_mcux_csi.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_MCUX_MIPI_CSI2RX video_mcux_mipi_csi2rx.c)
Expand All @@ -18,3 +20,5 @@ zephyr_library_sources_ifdef(CONFIG_VIDEO_ESP32 video_esp32_dvp.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_MCUX_SDMA video_mcux_smartdma.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_EMUL_IMAGER video_emul_imager.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_EMUL_RX video_emul_rx.c)

zephyr_linker_sources(DATA_SECTIONS video.ld)
41 changes: 36 additions & 5 deletions drivers/video/gc2145.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
#include <zephyr/drivers/gpio.h>

#include <zephyr/logging/log.h>

#include "video_ctrls.h"
#include "video_device.h"

LOG_MODULE_REGISTER(video_gc2145, CONFIG_VIDEO_LOG_LEVEL);

#define GC2145_REG_AMODE1 0x17
Expand Down Expand Up @@ -689,7 +693,13 @@ struct gc2145_config {
#endif
};

struct gc2145_ctrls {
struct video_ctrl hflip;
struct video_ctrl vflip;
};

struct gc2145_data {
struct gc2145_ctrls ctrls;
struct video_format fmt;
};

Expand Down Expand Up @@ -1100,13 +1110,15 @@ static int gc2145_get_caps(const struct device *dev, enum video_endpoint_id ep,
return 0;
}

static int gc2145_set_ctrl(const struct device *dev, unsigned int cid, void *value)
static int gc2145_set_ctrl(const struct device *dev, uint32_t id)
{
switch (cid) {
struct gc2145_data *drv_data = dev->data;

switch (id) {
case VIDEO_CID_HFLIP:
return gc2145_set_ctrl_hmirror(dev, (int)value);
return gc2145_set_ctrl_hmirror(dev, drv_data->ctrls.hflip.val);
case VIDEO_CID_VFLIP:
return gc2145_set_ctrl_vflip(dev, (int)value);
return gc2145_set_ctrl_vflip(dev, drv_data->ctrls.vflip.val);
default:
return -ENOTSUP;
}
Expand All @@ -1120,6 +1132,22 @@ static DEVICE_API(video, gc2145_driver_api) = {
.set_ctrl = gc2145_set_ctrl,
};

static int gc2145_init_controls(const struct device *dev)
{
int ret;
struct gc2145_data *drv_data = dev->data;
struct gc2145_ctrls *ctrls = &drv_data->ctrls;

ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP,
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
if (ret) {
return ret;
}

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

static int gc2145_init(const struct device *dev)
{
struct video_format fmt;
Expand Down Expand Up @@ -1166,7 +1194,8 @@ static int gc2145_init(const struct device *dev)
return ret;
}

return 0;
/* Initialize controls */
return gc2145_init_controls(dev);
}

/* Unique Instance */
Expand Down Expand Up @@ -1208,3 +1237,5 @@ static int gc2145_init_0(const struct device *dev)

DEVICE_DT_INST_DEFINE(0, &gc2145_init_0, NULL, &gc2145_data_0, &gc2145_cfg_0, POST_KERNEL,
CONFIG_VIDEO_INIT_PRIORITY, &gc2145_driver_api);

VIDEO_DEVICE_DEFINE(gc2145, DEVICE_DT_INST_GET(0), NULL);
50 changes: 41 additions & 9 deletions drivers/video/mt9m114.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#include <zephyr/drivers/video-controls.h>
#include <zephyr/drivers/i2c.h>

#include "video_ctrls.h"
#include "video_device.h"

LOG_MODULE_REGISTER(video_mt9m114, CONFIG_VIDEO_LOG_LEVEL);

#define MT9M114_CHIP_ID_VAL 0x2481
Expand Down Expand Up @@ -63,7 +66,13 @@ struct mt9m114_config {
struct i2c_dt_spec i2c;
};

struct mt9m114_ctrls {
struct video_ctrl hflip;
struct video_ctrl vflip;
};

struct mt9m114_data {
struct mt9m114_ctrls ctrls;
struct video_format fmt;
};

Expand Down Expand Up @@ -464,20 +473,23 @@ static int mt9m114_get_caps(const struct device *dev, enum video_endpoint_id ep,
return 0;
}

static int mt9m114_set_ctrl(const struct device *dev, unsigned int cid, void *value)
static int mt9m114_set_ctrl(const struct device *dev, uint32_t id)
{
int ret = 0;
struct mt9m114_data *drv_data = dev->data;

switch (cid) {
switch (id) {
case VIDEO_CID_HFLIP:
ret = mt9m114_modify_reg(dev, MT9M114_CAM_SENSOR_CTRL_READ_MODE, 2,
MT9M114_CAM_SENSOR_CTRL_HORZ_FLIP_EN,
(int)value ? MT9M114_CAM_SENSOR_CTRL_HORZ_FLIP_EN : 0);
ret = mt9m114_modify_reg(
dev, MT9M114_CAM_SENSOR_CTRL_READ_MODE, 2,
MT9M114_CAM_SENSOR_CTRL_HORZ_FLIP_EN,
drv_data->ctrls.hflip.val ? MT9M114_CAM_SENSOR_CTRL_HORZ_FLIP_EN : 0);
break;
case VIDEO_CID_VFLIP:
ret = mt9m114_modify_reg(dev, MT9M114_CAM_SENSOR_CTRL_READ_MODE, 2,
MT9M114_CAM_SENSOR_CTRL_VERT_FLIP_EN,
(int)value ? MT9M114_CAM_SENSOR_CTRL_VERT_FLIP_EN : 0);
ret = mt9m114_modify_reg(
dev, MT9M114_CAM_SENSOR_CTRL_READ_MODE, 2,
MT9M114_CAM_SENSOR_CTRL_VERT_FLIP_EN,
drv_data->ctrls.vflip.val ? MT9M114_CAM_SENSOR_CTRL_VERT_FLIP_EN : 0);
break;
default:
return -ENOTSUP;
Expand All @@ -499,6 +511,22 @@ static DEVICE_API(video, mt9m114_driver_api) = {
.set_ctrl = mt9m114_set_ctrl,
};

static int mt9m114_init_controls(const struct device *dev)
{
int ret;
struct mt9m114_data *drv_data = dev->data;
struct mt9m114_ctrls *ctrls = &drv_data->ctrls;

ret = video_init_ctrl(&ctrls->hflip, dev, VIDEO_CID_HFLIP,
(struct video_ctrl_range){.min = 0, .max = 1, .step = 1, .def = 0});
if (ret) {
return ret;
}

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

static int mt9m114_init(const struct device *dev)
{
struct video_format fmt;
Expand Down Expand Up @@ -544,7 +572,8 @@ static int mt9m114_init(const struct device *dev)
/* Suspend any stream */
mt9m114_set_state(dev, MT9M114_SYS_STATE_ENTER_SUSPEND);

return 0;
/* Initialize controls */
return mt9m114_init_controls(dev);
}

#if 1 /* Unique Instance */
Expand All @@ -569,4 +598,7 @@ static int mt9m114_init_0(const struct device *dev)

DEVICE_DT_INST_DEFINE(0, &mt9m114_init_0, NULL, &mt9m114_data_0, &mt9m114_cfg_0, POST_KERNEL,
CONFIG_VIDEO_INIT_PRIORITY, &mt9m114_driver_api);

VIDEO_DEVICE_DEFINE(mt9m114, DEVICE_DT_INST_GET(0), NULL);

#endif
Loading