1212#include <zephyr/logging/log.h>
1313#include <zephyr/sys/byteorder.h>
1414#include <zephyr/drivers/video.h>
15+ #include <zephyr/drivers/video-controls.h>
1516#include <zephyr/drivers/i2c.h>
1617
1718LOG_MODULE_REGISTER (video_mt9m114 , CONFIG_VIDEO_LOG_LEVEL );
@@ -31,6 +32,7 @@ LOG_MODULE_REGISTER(video_mt9m114, CONFIG_VIDEO_LOG_LEVEL);
3132#define MT9M114_CAM_SENSOR_CFG_Y_ADDR_END 0xC804
3233#define MT9M114_CAM_SENSOR_CFG_X_ADDR_END 0xC806
3334#define MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW 0xC818
35+ #define MT9M114_CAM_SENSOR_CTRL_READ_MODE 0xC834
3436#define MT9M114_CAM_CROP_WINDOW_WIDTH 0xC858
3537#define MT9M114_CAM_CROP_WINDOW_HEIGHT 0xC85A
3638#define MT9M114_CAM_OUTPUT_WIDTH 0xC868
@@ -53,6 +55,10 @@ LOG_MODULE_REGISTER(video_mt9m114, CONFIG_VIDEO_LOG_LEVEL);
5355#define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV (0 << 8)
5456#define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB (1 << 8)
5557
58+ /* Camera control masks */
59+ #define MT9M114_CAM_SENSOR_CTRL_HORZ_FLIP_EN BIT(0)
60+ #define MT9M114_CAM_SENSOR_CTRL_VERT_FLIP_EN BIT(1)
61+
5662struct mt9m114_config {
5763 struct i2c_dt_spec i2c ;
5864};
@@ -462,12 +468,40 @@ static int mt9m114_get_caps(const struct device *dev, enum video_endpoint_id ep,
462468 return 0 ;
463469}
464470
471+ static int mt9m114_set_ctrl (const struct device * dev , unsigned int cid , void * value )
472+ {
473+ int ret = 0 ;
474+
475+ switch (cid ) {
476+ case VIDEO_CID_HFLIP :
477+ ret = mt9m114_modify_reg (dev , MT9M114_CAM_SENSOR_CTRL_READ_MODE , 2 ,
478+ MT9M114_CAM_SENSOR_CTRL_HORZ_FLIP_EN ,
479+ (int )value ? MT9M114_CAM_SENSOR_CTRL_HORZ_FLIP_EN : 0 );
480+ break ;
481+ case VIDEO_CID_VFLIP :
482+ ret = mt9m114_modify_reg (dev , MT9M114_CAM_SENSOR_CTRL_READ_MODE , 2 ,
483+ MT9M114_CAM_SENSOR_CTRL_VERT_FLIP_EN ,
484+ (int )value ? MT9M114_CAM_SENSOR_CTRL_VERT_FLIP_EN : 0 );
485+ break ;
486+ default :
487+ return - ENOTSUP ;
488+ }
489+
490+ if (ret < 0 ) {
491+ return ret ;
492+ }
493+
494+ /* Apply Config */
495+ return mt9m114_set_state (dev , MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE );
496+ }
497+
465498static DEVICE_API (video , mt9m114_driver_api ) = {
466499 .set_format = mt9m114_set_fmt ,
467500 .get_format = mt9m114_get_fmt ,
468501 .get_caps = mt9m114_get_caps ,
469502 .stream_start = mt9m114_stream_start ,
470503 .stream_stop = mt9m114_stream_stop ,
504+ .set_ctrl = mt9m114_set_ctrl ,
471505};
472506
473507static int mt9m114_init (const struct device * dev )
0 commit comments