65
65
#define OV9282_REG_MIPI_CTRL00 0x4800
66
66
#define OV9282_GATED_CLOCK BIT(5)
67
67
68
+ /* Trigger mode registers */
69
+ #define OV9282_REG_POWER_CTRL 0x4F00
70
+ #define OV9282_REG_LOW_POWER_MODE_CTRL 0x3030
71
+ #define OV9282_REG_NUM_FRAME_ON_TRIG 0x303F
72
+ #define OV9282_REG_SLEEP_PERIOD_CTRL0 0x302C
73
+ #define OV9282_REG_SLEEP_PERIOD_CTRL3 0x302F
74
+ #define OV9282_REG_TIMING_23 0x3823
75
+
68
76
/* Input clock rate */
69
77
#define OV9282_INCLK_RATE 24000000
70
78
@@ -187,6 +195,7 @@ struct ov9282 {
187
195
const struct ov9282_mode * cur_mode ;
188
196
u32 code ;
189
197
struct mutex mutex ;
198
+ int trigger_mode ;
190
199
};
191
200
192
201
static const s64 link_freq [] = {
@@ -947,6 +956,56 @@ static int ov9282_get_selection(struct v4l2_subdev *sd,
947
956
return - EINVAL ;
948
957
}
949
958
959
+ /**
960
+ * ov9282_apply_trigger_config() - Configure sensor for FSIN external trigger mode
961
+ * @ov9282: pointer to ov9282 device
962
+ *
963
+ * Return: 0 on success, error code otherwise.
964
+ */
965
+ static int ov9282_apply_trigger_config (struct ov9282 * ov9282 )
966
+ {
967
+ int ret ;
968
+
969
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_MODE_SELECT , 1 , OV9282_MODE_STANDBY );
970
+ if (ret )
971
+ return ret ;
972
+
973
+ /* Low power mode */
974
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_POWER_CTRL , 1 , 0x01 );
975
+ if (ret )
976
+ return ret ;
977
+
978
+ /* External trigger snapshot */
979
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_LOW_POWER_MODE_CTRL , 1 , 0x04 );
980
+ if (ret )
981
+ return ret ;
982
+
983
+ /* 1 frame per trigger */
984
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_NUM_FRAME_ON_TRIG , 1 , 0x01 );
985
+ if (ret )
986
+ return ret ;
987
+
988
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_SLEEP_PERIOD_CTRL0 , 1 , 0x00 );
989
+ if (ret )
990
+ return ret ;
991
+
992
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_SLEEP_PERIOD_CTRL3 , 1 , 0x7F );
993
+ if (ret )
994
+ return ret ;
995
+
996
+ /* No auto wake */
997
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_TIMING_23 , 1 , 0x00 );
998
+ if (ret )
999
+ return ret ;
1000
+
1001
+ /* stay standby mode and wait for trigger signal */
1002
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_MODE_SELECT , 1 , OV9282_MODE_STANDBY );
1003
+ if (ret )
1004
+ return ret ;
1005
+
1006
+ return 0 ;
1007
+ }
1008
+
950
1009
/**
951
1010
* ov9282_start_streaming() - Start sensor stream
952
1011
* @ov9282: pointer to ov9282 device
@@ -964,13 +1023,12 @@ static int ov9282_start_streaming(struct ov9282 *ov9282)
964
1023
{OV9282_REG_ANA_CORE_2 , OV9282_ANA_CORE2_RAW8 },
965
1024
}
966
1025
};
967
- const struct ov9282_reg_list * reg_list ;
1026
+ struct ov9282_reg_list * reg_list ;
968
1027
int bitdepth_index ;
969
1028
int ret ;
970
1029
971
1030
/* Write common registers */
972
- ret = ov9282_write_regs (ov9282 , common_regs_list .regs ,
973
- common_regs_list .num_of_regs );
1031
+ ret = ov9282_write_regs (ov9282 , common_regs_list .regs , common_regs_list .num_of_regs );
974
1032
if (ret ) {
975
1033
dev_err (ov9282 -> dev , "fail to write common registers" );
976
1034
return ret ;
@@ -992,15 +1050,24 @@ static int ov9282_start_streaming(struct ov9282 *ov9282)
992
1050
}
993
1051
994
1052
/* Setup handler will write actual exposure and gain */
995
- ret = __v4l2_ctrl_handler_setup (ov9282 -> sd .ctrl_handler );
1053
+ ret = __v4l2_ctrl_handler_setup (ov9282 -> sd .ctrl_handler );
996
1054
if (ret ) {
997
1055
dev_err (ov9282 -> dev , "fail to setup handler" );
998
1056
return ret ;
999
1057
}
1000
1058
1059
+ /* Configure FSIN external trigger mode */
1060
+ if (ov9282 -> trigger_mode > 0 ) {
1061
+ ret = ov9282_apply_trigger_config (ov9282 );
1062
+ if (ret ) {
1063
+ dev_err (ov9282 -> dev , "failed to config external trigger mode" );
1064
+ return ret ;
1065
+ }
1066
+ return 0 ;
1067
+ }
1068
+
1001
1069
/* Start streaming */
1002
- ret = ov9282_write_reg (ov9282 , OV9282_REG_MODE_SELECT ,
1003
- 1 , OV9282_MODE_STREAMING );
1070
+ ret = ov9282_write_reg (ov9282 , OV9282_REG_MODE_SELECT , 1 , OV9282_MODE_STREAMING );
1004
1071
if (ret ) {
1005
1072
dev_err (ov9282 -> dev , "fail to start streaming" );
1006
1073
return ret ;
@@ -1392,6 +1459,7 @@ static int ov9282_probe(struct i2c_client *client)
1392
1459
{
1393
1460
struct ov9282 * ov9282 ;
1394
1461
int ret ;
1462
+ u32 trig_mod ;
1395
1463
1396
1464
ov9282 = devm_kzalloc (& client -> dev , sizeof (* ov9282 ), GFP_KERNEL );
1397
1465
if (!ov9282 )
@@ -1431,6 +1499,9 @@ static int ov9282_probe(struct i2c_client *client)
1431
1499
ov9282 -> code = MEDIA_BUS_FMT_Y10_1X10 ;
1432
1500
ov9282 -> vblank = ov9282 -> cur_mode -> vblank ;
1433
1501
1502
+ ret = of_property_read_u32 (client -> dev .of_node , "trigger-mode" , & trig_mod );
1503
+ ov9282 -> trigger_mode = (ret == 0 ) ? trig_mod : -1 ;
1504
+
1434
1505
ret = ov9282_init_controls (ov9282 );
1435
1506
if (ret ) {
1436
1507
dev_err (ov9282 -> dev , "failed to init controls: %d" , ret );
0 commit comments